{"version":3,"file":"static/js/598.03b5096c.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/DescriptionAi.tsx","utils/websocketConsumer.ts","../node_modules/@mui/icons-material/esm/ExpandMore.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 TextField,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Box,\n Typography,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n Alert,\n Link,\n} from '@mui/material';\nimport { LoadingButton } from '@mui/lab';\nimport ReCAPTCHA from 'react-google-recaptcha';\nimport { ExpandMore } from '@mui/icons-material';\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 { isLoggedInUser } from '../store/current-user/currentUserSlice';\nimport websocketConsumer from '../utils/websocketConsumer';\nimport { findCredentials } from '../utils/axios/middleware';\nimport AiPageRecommender from '../components/misc/AiPageRecommender';\n\nconst DescriptionAi = function () {\n const dispatch = useAppDispatch();\n const [content, setContent] = React.useState('');\n const [prompt, setPrompt] = React.useState('desc:rewrite');\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,\n inputs: { desc: content },\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 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 Description Generator\n </Typography>\n <Typography gutterBottom>\n <b>How can AI help you promote your book?</b>\n </Typography>\n <Typography gutterBottom>\n A great book description is one of your best marketing tools, but\n too often authors have a book description that isn't\n enticing, and doesn't convey what category the book is, and\n what the book is actually about.\n </Typography>\n <Typography sx={{ mb: 4 }}>\n With that in mind, we've put together an AI tool that you can\n use, for free, to help you understand your book's description\n a bit better, and even rewrite it for you! Give it a try and{' '}\n <MuiRouterLink to=\"/contact\">let us know</MuiRouterLink> what\n you think.\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <FormControl sx={{ mr: 1, minWidth: '300px' }}>\n <InputLabel id=\"status-select-label\">Choose a Prompt</InputLabel>\n <Select\n labelId=\"status-select-label\"\n id=\"status-select\"\n value={prompt}\n label=\"Choose a Prompt\"\n onChange={(e) => setPrompt(e.target.value)}\n >\n <MenuItem value=\"desc:rewrite\">Write a Book Description</MenuItem>\n <MenuItem value=\"desc:categorize\">\n Categorize My Description\n </MenuItem>\n <MenuItem value=\"desc:topic\">What's This Book About</MenuItem>\n </Select>\n </FormControl>\n </Grid>\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=\"My Book Description or Summary\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n />\n </Grid>\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 Have you perfected your book's description? 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} sx={{ mt: 2 }}>\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n FAQ\n </Typography>\n <Accordion>\n <AccordionSummary\n expandIcon={<ExpandMore />}\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n >\n <Typography>\n What do the different prompt options actually do?\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Typography gutterBottom>\n In the dropdown you have three options:\n </Typography>\n <ol>\n <li>\n <b>Categorize:</b> This will try to categorize your book in\n to one of the book categories we use in our newsletter.\n Scroll to the bottom of the page to see the list of our\n categories.\n </li>\n <li>\n <b>Topics:</b> This will try to pull out the basic topics or\n themes that best describe your book.\n </li>\n <li>\n <b>Rewrite:</b> This will try to rewrite your description\n for you. You can also provide a synopsis of your book, and\n the AI will tranform it in to a more compelling and succinct\n description.\n </li>\n </ol>\n </AccordionDetails>\n </Accordion>\n\n <Accordion>\n <AccordionSummary\n expandIcon={<ExpandMore />}\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n >\n <Typography>\n The AI gives me a different category if I re-submit the same\n book description. Why?\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Typography>\n This means the AI isn't entirely sure how to categorize\n your book, and it's sometimes coming up with a different\n answer.\n </Typography>\n <Typography>\n If the AI is not sure about what category your book belongs\n to, it's a sign that readers might also be confused,\n which is something you can work on. Of course, if you wrote a\n book that could be part of two categories and the AI gives you\n both of those categories, that's a good sign!\n </Typography>\n </AccordionDetails>\n </Accordion>\n\n <Accordion>\n <AccordionSummary\n expandIcon={<ExpandMore />}\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n >\n <Typography>What AI are you using?</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Typography>\n We're using an AI from Open AI, the same company that\n makes ChatGPT.\n </Typography>\n </AccordionDetails>\n </Accordion>\n\n <Accordion>\n <AccordionSummary\n expandIcon={<ExpandMore />}\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n >\n <Typography>\n I'd like the AI to do something not listed here. Is that\n possible?\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Typography>\n We want your feedback!{' '}\n <MuiRouterLink to=\"/contact\">Contact us</MuiRouterLink> and\n we'll see what we can do.\n </Typography>\n </AccordionDetails>\n </Accordion>\n\n <Accordion>\n <AccordionSummary\n expandIcon={<ExpandMore />}\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n >\n <Typography>What are the possible categories?</Typography>\n </AccordionSummary>\n <AccordionDetails>\n {superCategories.length > 0 &&\n superCategories.map((superCat) => (\n <React.Fragment key={superCat.id}>\n <Typography variant=\"h6\">{superCat.name}</Typography>\n <ul>\n {superCat.categories.map((cat) => (\n <li key={cat.id}>{cat.name}</li>\n ))}\n </ul>\n </React.Fragment>\n ))}\n </AccordionDetails>\n </Accordion>\n \n <Typography variant=\"h5\" sx={{ mt: 4, mb: 2 }}>The Importance of a Great Book Description</Typography>\n <Typography gutterBottom>In today's digital age, book descriptions are more important than ever. With so many books available to read, it's essential that authors capture the attention of potential readers in just a few sentences. A good book description can turn a curious browser into a buyer, and it's the key to driving sales and building an audience in today's competitive market.</Typography>\n <Typography gutterBottom>But what makes a good book description? In essence, it's a short summary that encapsulates the story, themes, and tone of the book in a way that is compelling and evocative. It should give readers a clear idea of what to expect from the book, while also intriguing them and making them want to know more.</Typography>\n <Typography gutterBottom>There are several key elements that go into crafting a great book description. First and foremost, it needs to be clear and concise. Readers don't want to wade through paragraphs of dense text to get to the heart of the story--they want to know what the book is about quickly and easily. A good rule of thumb is to keep the description between 100 and 200 words.</Typography>\n <Typography gutterBottom>Next, it's important to focus on the most compelling aspects of the story. What makes the book unique? What are the themes or issues it addresses that will resonate with readers? What kind of emotional journey will readers experience as they read the book? These are the questions that a good book description should answer, in a way that captures the essence of the story.</Typography>\n <Typography gutterBottom>Another key element of a good book description is a strong hook. This is the sentence or phrase that grabs the reader's attention from the very beginning and makes them want to keep reading. It might be a shocking revelation, an intriguing mystery, or a powerful emotional insight. Whatever it is, it should be something that sets the book apart from others in the same genre and gives readers a reason to pick it up.</Typography>\n <Typography gutterBottom>Finally, a good book description should be tailored to the target audience. This means understanding the genre and the readers who are most likely to be interested in the book. For example, a romance novel might emphasize the steamy passion between the main characters, while a suspense novel might focus on the dark mystery that unfolds throughout the story. By understanding what readers are looking for in a book, authors can create a book description that speaks directly to them and increases the chances that they will buy and enjoy the book.</Typography>\n <Typography gutterBottom>So why is a good book description so important? For one thing, it's often the first thing that potential readers will see when they come across a book online or in a bookstore. Just like website copy is important for engaging visitors and converting them into customers, a book description is the key to engaging readers and convincing them to purchase the book. A good book description sets the stage for the entire reading experience, giving readers a preview of what's to come and what they can expect from the story.</Typography>\n <Typography gutterBottom>In addition, a good book description can help to differentiate a book from other titles in the same genre. With so many options available to readers, it's easy for a great book to get lost in the shuffle. But a well-written description can help a book to stand out from the competition and attract the attention of readers who might have otherwise overlooked it.</Typography>\n <Typography gutterBottom>Finally, a good book description can help to build buzz and excitement for a book before it's even released. In today's social media-driven world, word of mouth is a powerful marketing tool. When readers are excited about a book and can't wait to read it, they're more likely to tell their friends, post about it on social media, and leave positive reviews online. This kind of buzz can help to generate interest in a book and drive sales, making it more likely to become a bestseller.</Typography>\n <Typography gutterBottom>At the end of the day, a good book description is the key to engaging readers and driving sales. By focusing on the unique aspects of the story, crafting a strong hook, and tailoring the description to the target audience, authors can create a book description that captivates readers and makes them want to buy the book. Whether you're a self-published author or part of a traditional publishing house, investing in a great book description is an essential tool for successfully marketing your book and building an audience.</Typography>\n </Grid>\n </Grid>\n </form>\n <Helmet\n metaContent={{\n title: 'AI Book Description Generator',\n url: 'https://bookraid.com/ai/book-description-generator',\n description:\n 'Our AI will help you write a compelling book description that appeals to readers and gets them to buy your book.',\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 DescriptionAi;\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 createSvgIcon from './utils/createSvgIcon';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon( /*#__PURE__*/_jsx(\"path\", {\n d: \"M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z\"\n}), 'ExpandMore');"],"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","setContent","prompt","setPrompt","apiResponse","setApiResponse","recaptcha","setRecaptcha","errorText","setErrorText","partnerLoggedIn","useAppSelector","isLoggedInPartner","superCategories","selectAllSuperCategories","userLoggedIn","isLoggedInUser","subscription","setSubscription","wsConnected","connected","consumer","websocketConsumer","formData","inputs","creds","findCredentials","send","categories","getAllSuperCategories","joins","resourceType","subscriptions","create","disconnected","received","data","finish","old","remove","disableGutters","maxWidth","mb","mr","minWidth","id","labelId","multiline","minRows","pl","borderLeft","whiteSpace","pb","sitekey","underline","cursor","disabled","expandIcon","superCat","cat","createConsumer","createSvgIcon","_jsx","d"],"sourceRoot":""}