{"version":3,"file":"static/js/2721.86a32652.chunk.js","mappings":"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","sources":["components/meta/Helmet.tsx","components/misc/AiPageRecommender.tsx","components/misc/Errors/InlineAlert.tsx","components/misc/SignUpDialog.tsx","components/partner/SignUpForm.tsx","statics/TitleAi.tsx","utils/websocketConsumer.ts","../node_modules/@mui/material/ListSubheader/listSubheaderClasses.js","../node_modules/@mui/material/ListSubheader/ListSubheader.js"],"sourcesContent":["import React from 'react';\nimport { Helmet as ReactHelmet } from 'react-helmet';\n\ninterface HelmetInput {\n title: string;\n url: string;\n description?: string;\n // Provide if there's a better image than the default\n ogImage?: string;\n}\n\nexport default function Helmet({ metaContent, schema }: { metaContent: HelmetInput, schema?: Array<Object> }) {\n const { title, url, description, ogImage } = metaContent;\n const defaultOgImage =\n 'https://website-assets-public.s3.us-west-2.amazonaws.com/opengraph/girl-in-hammock.jpg';\n const currentOgImage = ogImage || defaultOgImage;\n // Recent OG Images generated from Canva are 1200 x 600\n // So if one was set from Helmet, we use the smaller 600 size.\n // These will have to be redone and this discrepancy removed.\n const height = ogImage ? '600' : '630';\n return (\n <ReactHelmet>\n <title>{title}</title>\n <meta property=\"og:title\" content={title} />\n <link rel=\"canonical\" href={url} />\n <meta property=\"og:url\" content={url} />\n <meta property=\"og:description\" content={description} />\n <meta property=\"og:image\" content={currentOgImage} />\n <meta property=\"og:image:url\" content={currentOgImage} />\n <meta property=\"og:image:width\" content=\"1200\" />\n <meta property=\"og:image:height\" content={height} />\n\n <script type=\"application/ld+json\">\n {JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"Organization\",\n \"url\": \"https://bookraid.com\",\n \"logo\": \"https://bookraid.com/logo.png\",\n \"description\": \"BookRaid is a website and newsletter that lets you download free & bestselling discount eBooks for your Kindle, Nook, Kobo, or other eReader\"\n })}\n </script>\n {schema && (\n schema.map(sch => <script type=\"application/ld+json\">{JSON.stringify(sch)}</script>)\n )}\n </ReactHelmet>\n );\n}\n\nHelmet.defaultProps = {\n schema: [],\n};\n","import React from \"react\";\nimport { Box, Grid, ListItem, ListItemButton, ListItemText, Typography, lighten } from \"@mui/material\";\nimport { Link } from \"react-router-dom\";\n\nconst AiPageRecommender = function () {\n const currentPath = window.location.pathname;\n\n const recommendations = [\n { path: '/ai/book-title-generator', title: 'AI Book Title Generator', desc: 'Create a bestselling book title.' },\n { path: '/ai/book-plot-generator', title: 'AI Book Plot Generator', desc: 'Create a must-read book plot.' },\n { path: '/ai/pen-name-generator', title: 'AI Pen Name Generator', desc: 'Create a memorable pen name.' },\n { path: '/ai/book-character-generator', title: 'AI Book Character Generator', desc: 'Create a compelling protagonist.' },\n { path: '/ai/book-description-generator', title: 'AI Book Description Generator', desc: 'Create a book description that sells books.' },\n ]\n\n return (\n <Box>\n <Typography variant=\"h5\" gutterBottom>We've got other AI powered book tools that you might be interested in</Typography>\n <Grid container spacing={2}>\n {recommendations.filter(rec => rec.path !== currentPath).map(rec => (\n <Grid item xs={12} sm={6} key={rec.path}>\n <ListItem disablePadding sx={{ height: '100%' }}>\n <ListItemButton\n component={Link}\n to={rec.path}\n sx={{\n borderRadius: 4,\n border: '1px solid',\n borderColor: 'secondary.main',\n height: '100%',\n alignItems: 'flex-start',\n '&:hover': {\n borderColor: 'secondary.dark',\n backgroundColor: lighten('#b35ec2', 0.95),\n },\n }}\n >\n <ListItemText primary={rec.title} secondary={rec.desc} />\n </ListItemButton>\n </ListItem>\n </Grid>\n ))}\n </Grid>\n </Box>\n )\n};\n\nexport default AiPageRecommender;\n","/**\n * This component provides a basic wrapper around the native mui Alert\n * component.\n *\n * Extension is provided to allow easy modification, and enhancements.\n *\n * The component uses useEffect to listen for changes to `message`.\n * When a change is detected, the alert opens, or remains open for\n * another x seconds, set back to the fixed duration by each change.\n *\n * Two timers control whether the message will be hidden or its onDisappeared\n * callback called.\n *\n * Possible enhancements:\n * 1. Pass in the seconds for it to stay present/active.\n * 2. Allow prop passing to override default alert props.\n */\nimport React from 'react';\nimport Alert, { AlertColor } from '@mui/material/Alert';\nimport IconButton from '@mui/material/IconButton';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Collapse from '@mui/material/Collapse';\n\nconst alertCollapseDurationMs = 300;\nconst defaultAlertOpenTimeMs = 10 * 1000;\n\nconst InlineAlert = function ({\n message,\n severity,\n onDisappear,\n}: {\n message: string;\n severity?: AlertColor;\n onDisappear?: () => void;\n}) {\n const [open, setOpen] = React.useState<boolean>();\n const autoCloseTimer: { current: NodeJS.Timeout | null } = React.useRef(null);\n const clearTextTimer: { current: NodeJS.Timeout | null } = React.useRef(null);\n\n React.useEffect(() => {\n if (autoCloseTimer.current !== null || clearTextTimer.current !== null) {\n clearInterval(autoCloseTimer.current as NodeJS.Timeout);\n clearInterval(clearTextTimer.current as NodeJS.Timeout);\n }\n\n if (!message) {\n setOpen(false);\n return () => {};\n }\n\n setOpen(true);\n autoCloseTimer.current = setTimeout(() => {\n setOpen(false);\n autoCloseTimer.current = null;\n }, defaultAlertOpenTimeMs);\n\n if (onDisappear) {\n clearTextTimer.current = setTimeout(\n onDisappear,\n defaultAlertOpenTimeMs + alertCollapseDurationMs\n );\n }\n\n return () => {\n if (autoCloseTimer.current !== null)\n clearInterval(autoCloseTimer.current as NodeJS.Timeout);\n if (clearTextTimer.current !== null)\n clearInterval(clearTextTimer.current as NodeJS.Timeout);\n setOpen(false);\n };\n }, [message]);\n\n return (\n <Collapse in={!!open}>\n <Alert\n severity={severity}\n action={\n <IconButton\n aria-label=\"close\"\n color=\"inherit\"\n size=\"small\"\n onClick={() => {\n setOpen(false);\n clearInterval(autoCloseTimer.current as NodeJS.Timeout);\n clearInterval(clearTextTimer.current as NodeJS.Timeout);\n setTimeout(() => {\n if (onDisappear) onDisappear();\n }, alertCollapseDurationMs);\n }}\n >\n <CloseIcon fontSize=\"inherit\" />\n </IconButton>\n }\n >\n {message}\n </Alert>\n </Collapse>\n );\n};\n\nInlineAlert.defaultProps = {\n severity: 'error',\n onDisappear: null,\n};\n\nexport default InlineAlert;\n","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle, IconButton } from '@mui/material';\nimport { Close } from '@mui/icons-material';\nimport SignUpForm from '../partner/SignUpForm';\n\nconst SignUpDialog = function ({ openComponent }: { openComponent: JSX.Element }) {\n const [open, setOpen] = React.useState(false);\n\n const handleSuccess = () => {\n setOpen(false);\n };\n\n return (\n <>\n {React.cloneElement(openComponent, { onClick: () => setOpen(true) })}\n <Dialog onClose={() => setOpen(false)} open={open}>\n <DialogTitle>\n Create Account\n <IconButton\n aria-label=\"close\"\n onClick={() => setOpen(false)}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n color: 'secondary.main',\n }}\n >\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <SignUpForm\n handleSuccess={handleSuccess}\n snackExtraData={{ variant: 'success', message: 'Your account was sucessfully created' }}\n noFormElement\n />\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default SignUpDialog;\n","/* eslint-disable react/require-default-props */\nimport React, { useState } from 'react';\nimport ReactGA from 'react-ga4';\nimport LoadingButton from '@mui/lab/LoadingButton';\nimport LoginIcon from '@mui/icons-material/Login';\nimport FacebookPixel from 'react-facebook-pixel';\nimport RedditPixel from 'react-reddit-pixel';\nimport Cookies from 'universal-cookie';\nimport { Box, Grid, TextField, Typography } from '@mui/material';\nimport { push } from 'connected-react-router';\nimport { useAppDispatch } from '../../app/hooks';\nimport { signUpPartner } from '../../store/current-partner/currentPartnerSlice';\nimport MuiRouterLink from '../mui-wrappers/MuiRouterLink';\nimport theme from '../../theme/theme';\nimport { addSnack } from '../../store/snacks/snacksSlice';\n\nconst Copyright = function () {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\" align=\"center\">\n {'Copyright © '}\n BookRaid {new Date().getFullYear()}\n </Typography>\n );\n};\n\nconst SignUpForm = function ({\n formExtrasData,\n handleSuccess,\n snackExtraData,\n extraSetFormErrors,\n extraBtnText,\n noFormElement, // <form> within a <form> is invalid HTML\n}: {\n formExtrasData?: any;\n handleSuccess?: () => void;\n snackExtraData?: any;\n extraSetFormErrors?: any;\n extraBtnText?: string;\n noFormElement?: boolean;\n}) {\n const dispatch = useAppDispatch();\n\n const [formErrors, setFormErrors] = useState({} as any);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [passwordConfirmation, setPasswordConfirmation] = useState('');\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (event: any) => {\n event.preventDefault();\n setSubmitting(true);\n const cookies = new Cookies();\n let signUpData = {\n email,\n password,\n password_confirmation: passwordConfirmation,\n referrer_id: cookies.get('referrer_id') || '',\n signup_source: cookies.get('utm_source') || '',\n };\n if (formExtrasData) {\n signUpData = { ...signUpData, ...formExtrasData };\n }\n dispatch(signUpPartner(signUpData))\n .unwrap()\n .then(() => {\n setSubmitting(false);\n // Partner completes registration\n FacebookPixel.track('CompleteRegistration');\n RedditPixel.track('Lead');\n // \"sign_up\" is somewhat a duplicate of the event below, but \"sign_up\" is a recommended event and probably has some implications for GA reporting\n ReactGA.event(\"sign_up\")\n ReactGA.event({\n category: 'Partners',\n action: 'PartnersSignUp',\n });\n ReactGA.gtag('event', 'conversion', {\n send_to: process.env.REACT_APP_GTAG_PARTNER_SIGNUP,\n });\n if (snackExtraData) {\n dispatch(addSnack(snackExtraData));\n }\n if (handleSuccess) {\n handleSuccess();\n } else {\n dispatch(push('/partners/books/new?acct=new'));\n }\n })\n .catch((error) => {\n setFormErrors({ ...formErrors, ...error.errors });\n if (extraSetFormErrors) {\n extraSetFormErrors({ ...formErrors, ...error.errors });\n }\n })\n .finally(() => {\n setSubmitting(false);\n });\n return () => setSubmitting(false);\n };\n\n return (\n <>\n <Box\n component={noFormElement ? 'div' : 'form'}\n noValidate\n onSubmit={handleSubmit}\n sx={{ width: '100%', marginTop: theme.spacing(1) }}\n >\n <TextField\n variant=\"outlined\"\n margin=\"normal\"\n required\n fullWidth\n label=\"Email Address\"\n name=\"email\"\n autoComplete=\"email\"\n error={formErrors?.email?.length > 0}\n helperText={formErrors?.email?.join(', ')}\n autoFocus\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n\n <TextField\n variant=\"outlined\"\n margin=\"normal\"\n required\n fullWidth\n name=\"password\"\n label=\"Password\"\n type=\"password\"\n autoComplete=\"current-password\"\n error={formErrors?.password?.length > 0}\n helperText={formErrors?.password?.join(', ')}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n\n <TextField\n variant=\"outlined\"\n margin=\"normal\"\n required\n fullWidth\n name=\"password-confirmation\"\n label=\"Password Confirmation\"\n type=\"password\"\n autoComplete=\"current-password\"\n value={passwordConfirmation}\n error={formErrors?.password_confirmation?.length > 0}\n helperText={formErrors?.password_confirmation?.join(', ')}\n onChange={(e) => setPasswordConfirmation(e.target.value)}\n />\n\n <LoadingButton\n type=\"submit\"\n onClick={handleSubmit}\n fullWidth\n loading={submitting}\n endIcon={<LoginIcon />}\n loadingPosition=\"end\"\n variant=\"contained\"\n color=\"secondary\"\n style={{ margin: '10px 0' }}\n >\n Sign Up{extraBtnText ? ` ${extraBtnText}` : ''}\n </LoadingButton>\n\n <Grid container>\n <Grid item xs>\n <MuiRouterLink to=\"/partners/password/forgot\" variant=\"body2\">\n Forgot password?\n </MuiRouterLink>\n </Grid>\n <Grid item>\n <MuiRouterLink to=\"/partners/sign-in\" variant=\"body2\">\n Already have an account? Sign In\n </MuiRouterLink>\n </Grid>\n </Grid>\n </Box>\n <Typography my={4} align=\"center\" color=\"text.secondary\">\n We will never spam you or share your email address, but occasionally\n email helpful promotion tips and sales. <br />\n Unsubscribe anytime.\n </Typography>\n <Box mt={4}>\n <Copyright />\n </Box>\n </>\n );\n};\n\nexport default SignUpForm;\n","/* eslint-disable jsx-a11y/anchor-is-valid */\nimport React from 'react';\nimport {\n Container,\n Grid,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Box,\n Typography,\n Alert,\n ListSubheader,\n TextField,\n Link,\n} from '@mui/material';\nimport { LoadingButton } from '@mui/lab';\nimport ReCAPTCHA from 'react-google-recaptcha';\n\n\nimport { useAppDispatch, useAppSelector } from '../app/hooks';\nimport {\n getAllSuperCategories,\n selectAllSuperCategories,\n} from '../store/super-categories/superCategoriesSlice';\nimport InlineAlert from '../components/misc/Errors/InlineAlert';\nimport MuiRouterLink from '../components/mui-wrappers/MuiRouterLink';\nimport Helmet from '../components/meta/Helmet';\nimport { isLoggedInPartner } from '../store/current-partner/currentPartnerSlice';\nimport SignUpDialog from '../components/misc/SignUpDialog';\nimport websocketConsumer from '../utils/websocketConsumer';\nimport { isLoggedInUser } from '../store/current-user/currentUserSlice';\nimport { findCredentials } from '../utils/axios/middleware';\nimport AiPageRecommender from '../components/misc/AiPageRecommender';\n\nconst TitleAi = function () {\n const dispatch = useAppDispatch();\n const [category, setCategory] = React.useState('');\n const [desc, setDesc] = React.useState('');\n const [submitting, setSubmitting] = React.useState(false);\n const [apiResponse, setApiResponse] = React.useState('');\n // eslint-disable-next-line\n const [recaptcha, setRecaptcha] = React.useState<string | null>(null);\n const [errorText, setErrorText] = React.useState('');\n const partnerLoggedIn = useAppSelector(isLoggedInPartner);\n const superCategories = useAppSelector(selectAllSuperCategories);\n const userLoggedIn = useAppSelector(isLoggedInUser);\n const [subscription, setSubscription] = React.useState<any>(null);\n const wsConnected = subscription && subscription.connected;\n const consumer = websocketConsumer();\n\n React.useEffect(() => {\n // if there are no super categories in the store,\n // or if the super categories in the store don't have associated categories, then refetch\n if (superCategories.length === 0 || !superCategories[0].categories) {\n dispatch(\n getAllSuperCategories({\n joins: ['categories'],\n resourceType: 'partner',\n })\n );\n }\n }, []);\n\n React.useEffect(() => {\n setSubscription(consumer.subscriptions.create('AiToolsChannel', {\n connected: () => {},\n disconnected: () => {},\n received: (data: any) => {\n // Handle the received data\n if (data.finish) {\n setSubmitting(false);\n } else if (data.error) {\n setErrorText(data.error);\n setSubmitting(false);\n } else {\n setApiResponse(old => old + data.data);\n }\n }\n }));\n\n return () => {\n consumer.subscriptions.remove(subscription);\n }\n }, []);\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setSubmitting(true);\n setErrorText('');\n setApiResponse('');\n\n let formData = {\n prompt: 'title:generate',\n inputs: { category, desc },\n } as any;\n\n if (!partnerLoggedIn && !userLoggedIn) {\n formData.recaptcha = recaptcha;\n } else {\n const creds = findCredentials();\n formData = { ...formData, ...creds };\n }\n\n subscription.send(formData);\n }\n\n const generatedCategories = () => {\n const data = [] as any;\n\n superCategories.forEach((superCategory) => {\n data.push(\n <ListSubheader sx={{ fontWeight: 'bold', color: 'primary.main' }} key={superCategory.id}>{superCategory.name}</ListSubheader>,\n superCategory.categories.map((cat) => (\n <MenuItem key={cat.id} value={cat.name}>{cat.name}</MenuItem>\n ))\n )\n })\n\n return data;\n }\n\n return (\n <Container component=\"main\" disableGutters maxWidth=\"md\">\n <form onSubmit={handleSubmit}>\n <Grid container spacing={1}>\n <Grid item xs={12}>\n <Typography gutterBottom variant=\"h3\" sx={{ mb: 2 }}>\n AI Book Title Generator\n </Typography>\n <Typography sx={{ mb: 4 }}>\n Are you trying to figure out the perfect title for your next book? Let our AI do the work for you! Just fill out the form below and we'll generate 10 title options for you.\n </Typography>\n </Grid>\n\n <Grid item xs={12} sm={6} md={4}>\n <FormControl sx={{ width: '100%' }}>\n <InputLabel id=\"category-select-label\">Book Category</InputLabel>\n <Select\n labelId=\"category-select-label\"\n id=\"category-select\"\n value={category}\n label=\"Book Category\"\n onChange={(e) => setCategory(e.target.value)}\n >\n <MenuItem value=\"not specified\">\n <i>Any</i>\n </MenuItem>\n {generatedCategories()}\n </Select>\n </FormControl>\n </Grid>\n\n <Grid item xs={12}>\n <TextField\n required\n variant=\"outlined\"\n margin=\"normal\"\n fullWidth\n multiline\n minRows={3}\n name=\"content\"\n label=\"Book Description\"\n placeholder=\"Give us your book's description, or a brief overview of your book.\"\n InputLabelProps={{ shrink: true }}\n value={desc}\n onChange={(e) => setDesc(e.target.value)}\n />\n </Grid>\n\n {apiResponse && (\n <Grid item xs={12}>\n <Box\n sx={{\n pl: 2,\n mb: 2,\n borderLeft: '1px solid',\n borderColor: 'primary.main',\n }}\n >\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n AI Response:\n </Typography>\n <Typography sx={{ whiteSpace: 'pre-wrap' }}>\n {apiResponse}\n </Typography>\n </Box>\n </Grid>\n )}\n {errorText && (\n <Grid item xs={12} sx={{ pb: 1 }}>\n <InlineAlert message={errorText} severity=\"error\" />\n </Grid>\n )}\n <Grid item xs={12}>\n {!partnerLoggedIn && !userLoggedIn &&\n <>\n <ReCAPTCHA\n sitekey={process.env.REACT_APP_RECAPTCHA_SITE_KEY || ''}\n onChange={(value) => setRecaptcha(value)}\n />\n <Typography variant=\"caption\" sx={{ mt: 1, mb: 2 }}>\n <SignUpDialog openComponent={<Link underline='none' sx={{ '&:hover': { cursor: 'pointer' } }}>Sign up</Link>} />{' '}\n (or <MuiRouterLink to=\"/partners/sign-in\">sign in</MuiRouterLink>) so that we know you're not a robot, and we won't bug you with this recaptcha box :)\n </Typography>\n </>\n }\n\n <LoadingButton\n type=\"submit\"\n size=\"small\"\n fullWidth\n variant=\"contained\"\n color=\"secondary\"\n loading={submitting}\n disabled={!wsConnected}\n sx={{ mt: 2 }}\n >\n Submit\n </LoadingButton>\n\n {!wsConnected &&\n <Alert severity=\"warning\" sx={{ my: 2 }}>\n We're having trouble connecting to our AI. If this message doesn't disappear, try refreshing the page.\n </Alert>\n }\n\n <Alert severity=\"info\" sx={{ my: 2 }}>\n Once you've got the perfect title for your book, we've got{' '}\n <b>50,000 readers</b> in our newsletter who would love to read it.\n Get started <MuiRouterLink to=\"/partners\">here</MuiRouterLink>.\n </Alert>\n <AiPageRecommender />\n </Grid>\n\n <Grid item xs={12}>\n <Typography variant=\"h5\" sx={{ mt: 4, mb: 2 }}>Crafting the Perfect Book Title</Typography>\n <Typography gutterBottom>The importance of a good book title cannot be overstated. A good title is the first impression that readers have of your book, and it's one that can make or break a sale. It needs to be attention-grabbing and provocative, while still accurately conveying the content of your book.</Typography>\n <Typography gutterBottom>One of the most important aspects of a good book title is that it needs to evoke some sort of reaction. Whether it's curiosity, intrigue, or excitement, a title that elicits a strong emotion is more likely to grab a reader's attention than one that is bland or generic.</Typography>\n <Typography gutterBottom>An attention-grabbing title is particularly important in today's market, where there are countless books available both in print and online. With so many choices, readers are looking for something to catch their eye and make them stop and take notice.</Typography>\n <Typography gutterBottom>But a good title is not just about winning over potential readers; it can also have a major impact on sales. A memorable and effective title can be the difference between a book that languishes on the shelves and one that becomes a bestseller.</Typography>\n <Typography gutterBottom>One of the key things to keep in mind when crafting a book title is that it needs to be clear and concise. Readers want to know what they're getting into, and a title that is too cryptic or obscure can be off-putting. At the same time, a title that is too long or convoluted can be difficult to remember and can make it hard for readers to talk about your book with others.</Typography>\n <Typography gutterBottom>Another important consideration is the tone of your title. This should be informed by the genre of your book as well as the intended audience. For example, if you're writing a thriller, you'll want a title that is tense and suspenseful. On the other hand, if you're writing a romance, you'll want a title that is romantic and passionate.</Typography>\n <Typography gutterBottom>A good book title can also be a great marketing tool. A strong title can help build buzz and anticipation for a book before it's even released. Social media is a particularly powerful way to promote your book title, as it allows you to reach a large audience quickly and easily.</Typography>\n <Typography gutterBottom>In addition to being memorable and attention-grabbing, a good book title should also be unique. You want to avoid titles that are too similar to other books in your genre or that are overused clichés. This not only makes your book stand out, but it also prevents confusion among readers who may be searching for your book online or in a bookstore.</Typography>\n <Typography gutterBottom>It's also worth considering the potential cultural or historical connotations of your title. Is it similar to the title of another famous work, or does it have associations that could be controversial or off-putting to readers?</Typography>\n <Typography gutterBottom>Finally, it's important to remember that a book title is just the beginning. Once a reader picks up your book, they will be looking for a compelling story, engaging characters, and skillful writing. A good title may get readers through the door, but it's up to the rest of your book to keep them hooked.</Typography>\n </Grid>\n </Grid>\n </form>\n <Helmet\n metaContent={{\n title: 'AI Book Title Generator',\n url: 'https://bookraid.com/ai/book-title-generator',\n description:\n 'Struggling to title your book? Let our AI Book Title Generator do the work for you. Creative titles in seconds!',\n ogImage:\n 'https://website-assets-public.s3.us-west-2.amazonaws.com/opengraph/gpt-description-tool.jpg',\n }}\n />\n </Container>\n );\n};\n\nexport default TitleAi;\n","import { createConsumer } from \"@rails/actioncable\";\n\nconst websocketConsumer = function (): any {\n return createConsumer(process.env.REACT_APP_BOOKRAID_WS_URL)\n}\n\nexport default websocketConsumer\n","import { generateUtilityClass, generateUtilityClasses } from '@mui/base';\nexport function getListSubheaderUtilityClass(slot) {\n return generateUtilityClass('MuiListSubheader', slot);\n}\nconst listSubheaderClasses = generateUtilityClasses('MuiListSubheader', ['root', 'colorPrimary', 'colorInherit', 'gutters', 'inset', 'sticky']);\nexport default listSubheaderClasses;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"className\", \"color\", \"component\", \"disableGutters\", \"disableSticky\", \"inset\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { unstable_composeClasses as composeClasses } from '@mui/base';\nimport styled from '../styles/styled';\nimport useThemeProps from '../styles/useThemeProps';\nimport capitalize from '../utils/capitalize';\nimport { getListSubheaderUtilityClass } from './listSubheaderClasses';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n color,\n disableGutters,\n inset,\n disableSticky\n } = ownerState;\n const slots = {\n root: ['root', color !== 'default' && `color${capitalize(color)}`, !disableGutters && 'gutters', inset && 'inset', !disableSticky && 'sticky']\n };\n return composeClasses(slots, getListSubheaderUtilityClass, classes);\n};\n\nconst ListSubheaderRoot = styled('li', {\n name: 'MuiListSubheader',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.color !== 'default' && styles[`color${capitalize(ownerState.color)}`], !ownerState.disableGutters && styles.gutters, ownerState.inset && styles.inset, !ownerState.disableSticky && styles.sticky];\n }\n})(({\n theme,\n ownerState\n}) => _extends({\n boxSizing: 'border-box',\n lineHeight: '48px',\n listStyle: 'none',\n color: (theme.vars || theme).palette.text.secondary,\n fontFamily: theme.typography.fontFamily,\n fontWeight: theme.typography.fontWeightMedium,\n fontSize: theme.typography.pxToRem(14)\n}, ownerState.color === 'primary' && {\n color: (theme.vars || theme).palette.primary.main\n}, ownerState.color === 'inherit' && {\n color: 'inherit'\n}, !ownerState.disableGutters && {\n paddingLeft: 16,\n paddingRight: 16\n}, ownerState.inset && {\n paddingLeft: 72\n}, !ownerState.disableSticky && {\n position: 'sticky',\n top: 0,\n zIndex: 1,\n backgroundColor: (theme.vars || theme).palette.background.paper\n}));\nconst ListSubheader = /*#__PURE__*/React.forwardRef(function ListSubheader(inProps, ref) {\n const props = useThemeProps({\n props: inProps,\n name: 'MuiListSubheader'\n });\n\n const {\n className,\n color = 'default',\n component = 'li',\n disableGutters = false,\n disableSticky = false,\n inset = false\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const ownerState = _extends({}, props, {\n color,\n component,\n disableGutters,\n disableSticky,\n inset\n });\n\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/_jsx(ListSubheaderRoot, _extends({\n as: component,\n className: clsx(classes.root, className),\n ref: ref,\n ownerState: ownerState\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? ListSubheader.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The content of the component.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The color of the component. It supports those theme colors that make sense for this component.\n * @default 'default'\n */\n color: PropTypes.oneOf(['default', 'inherit', 'primary']),\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes.elementType,\n\n /**\n * If `true`, the List Subheader will not have gutters.\n * @default false\n */\n disableGutters: PropTypes.bool,\n\n /**\n * If `true`, the List Subheader will not stick to the top during scroll.\n * @default false\n */\n disableSticky: PropTypes.bool,\n\n /**\n * If `true`, the List Subheader is indented.\n * @default false\n */\n inset: PropTypes.bool,\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])\n} : void 0;\nexport default ListSubheader;"],"names":["Helmet","metaContent","schema","title","url","description","ogImage","currentOgImage","height","property","content","rel","href","type","JSON","stringify","map","sch","defaultProps","currentPath","window","location","pathname","variant","gutterBottom","container","spacing","path","desc","filter","rec","item","xs","sm","disablePadding","sx","component","Link","to","borderRadius","border","borderColor","alignItems","backgroundColor","lighten","primary","secondary","InlineAlert","message","severity","onDisappear","React","open","setOpen","autoCloseTimer","clearTextTimer","current","clearInterval","setTimeout","defaultAlertOpenTimeMs","in","action","color","size","onClick","fontSize","openComponent","onClose","position","right","top","handleSuccess","snackExtraData","noFormElement","Copyright","align","Date","getFullYear","formExtrasData","extraSetFormErrors","extraBtnText","dispatch","useAppDispatch","useState","formErrors","setFormErrors","email","setEmail","password","setPassword","passwordConfirmation","setPasswordConfirmation","submitting","setSubmitting","handleSubmit","event","preventDefault","cookies","Cookies","signUpData","password_confirmation","referrer_id","get","signup_source","signUpPartner","unwrap","then","FacebookPixel","RedditPixel","ReactGA","category","send_to","process","addSnack","push","catch","error","errors","finally","noValidate","onSubmit","width","marginTop","theme","margin","required","fullWidth","label","name","autoComplete","length","helperText","join","autoFocus","value","onChange","e","target","loading","endIcon","loadingPosition","style","my","mt","setCategory","setDesc","apiResponse","setApiResponse","recaptcha","setRecaptcha","errorText","setErrorText","partnerLoggedIn","useAppSelector","isLoggedInPartner","superCategories","selectAllSuperCategories","userLoggedIn","isLoggedInUser","subscription","setSubscription","wsConnected","connected","consumer","websocketConsumer","formData","prompt","inputs","creds","findCredentials","send","categories","getAllSuperCategories","joins","resourceType","subscriptions","create","disconnected","received","data","finish","old","remove","disableGutters","maxWidth","mb","md","id","labelId","forEach","superCategory","fontWeight","cat","generatedCategories","multiline","minRows","placeholder","InputLabelProps","shrink","pl","borderLeft","whiteSpace","pb","sitekey","underline","cursor","disabled","createConsumer","getListSubheaderUtilityClass","slot","generateUtilityClass","generateUtilityClasses","_excluded","ListSubheaderRoot","styled","overridesResolver","props","styles","ownerState","root","capitalize","gutters","inset","disableSticky","sticky","_extends","boxSizing","lineHeight","listStyle","vars","palette","text","fontFamily","typography","fontWeightMedium","pxToRem","main","paddingLeft","paddingRight","zIndex","background","paper","inProps","ref","useThemeProps","className","other","_objectWithoutPropertiesLoose","classes","slots","composeClasses","useUtilityClasses","_jsx","as","clsx"],"sourceRoot":""}