{"version":3,"file":"static/js/8239.80e0dd04.chunk.js","mappings":"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","sources":["components/books/Description.tsx","components/books/VerticalBook.tsx","components/buttons/ReaderFollowButton.tsx","components/meta/Helmet.tsx","components/misc/AuthorLink.tsx","components/misc/CategoryLinkChip.tsx","components/misc/NewsletterBanner.tsx","components/misc/StoreLinks.tsx","statics/Homepage/NewsletterEmailSignup.tsx","statics/public-books/books/BookShow.tsx","store/stores/stores.ts","utils/casing.ts"],"sourcesContent":["import React from 'react';\nimport { Typography } from '@mui/material';\n\n/**\n * Pretty quiet in here, but `whiteSpace: 'pre-line'` is important\n * to show the newline characters.\n *\n * Separated with the goals of uniformity and ease of refactoring/extending.\n */\nconst Description = function ({ description }: { description: string }) {\n return (\n <Typography\n style={{ whiteSpace: 'pre-line' }}\n color=\"text.secondary\"\n data-description\n >\n {description}\n </Typography>\n );\n};\n\nexport default Description;\n","import React from 'react';\nimport { Box, Typography } from '@mui/material';\nimport { Book } from '../../store/books/booksSlice';\nimport MuiRouterLink from '../mui-wrappers/MuiRouterLink';\nimport { parameterize } from '../../utils/casing';\n\nconst VerticalBook = function ({ book }: { book: Book }) {\n return (\n <MuiRouterLink to={`/books/${book.id}/${parameterize(book.title)}`}>\n <Box\n component=\"img\"\n src={book.amazon_image_url}\n alt={book.title}\n sx={{ width: '100%', height: 'auto', boxShadow: '2px 2px 7px rgb(0 0 0 / 10%)', aspectRatio: '1 / 1.5' }}\n />\n <Typography sx={{ mt: 1 }}>{book.title}</Typography>\n </MuiRouterLink>\n );\n};\n\nexport default VerticalBook;\n","import React from 'react';\nimport {\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n Typography,\n} from '@mui/material';\nimport NewsletterEmailSignup from '../../statics/Homepage/NewsletterEmailSignup';\n\nconst ReaderFollowButton = function ({\n resource,\n extraParams,\n resourceType,\n}: {\n resource: string;\n extraParams: Object;\n resourceType: string;\n}) {\n const [open, setOpen] = React.useState(false);\n\n return (\n <>\n <Box sx={{ maxWidth: { xs: '100%', md: 220 }, pl: { xs: 0, md: 2 }, ml: { xs: 0, md: 2 }, mt: { xs: 2, md: 0 }, borderLeft: { xs: 0, md: '2px solid' }, borderColor: { xs: '#fff', md: '#7fd7ff' } }}>\n <Button fullWidth variant='contained' color=\"secondary\" sx={{ mb: 1 }} onClick={() => setOpen(true)}>\n Get Alerts\n </Button>\n <Typography variant='caption'>\n Want to be notified when {resource} is free or on sale? Click on the 'Get Alerts' button and we'll send you an email when the price drops.\n </Typography>\n </Box>\n\n <Dialog\n onClose={() => setOpen(false)}\n open={open}\n PaperProps={{ sx: { maxWidth: 400 } }}\n >\n <DialogContent>\n You'll be the first one to know when we find a new deal on {resource}!\n <NewsletterEmailSignup extraParams={extraParams} hideText btnText='Create Alert' follow={resourceType} handleSuccess={() => setOpen(false)} />\n </DialogContent>\n\n <DialogActions>\n <Button onClick={() => setOpen(false)}>\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n\nexport default ReaderFollowButton;\n","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 { Avatar } from \"@mui/material\";\nimport { parameterize } from \"../../utils/casing\";\nimport { Author } from \"../../store/authors/authorsSlice\";\nimport MuiRouterLink from \"../mui-wrappers/MuiRouterLink\";\n\nconst AuthorLink = function ({ author }: { author: Author }) {\n return (\n <MuiRouterLink\n sx={{ '&:hover': { textDecoration: 'underline' }, display: 'inline-flex', alignItems: 'center' }}\n to={`/authors/${author.id}/${parameterize(author.name)}`}\n >\n <Avatar\n sx={{ width: '1.5rem', height: '1.5rem', mr: 0.75 }}\n src={author.avatar_mini_url}\n alt={author.name}\n />\n {author.name}\n </MuiRouterLink>\n )\n}\n\nexport default AuthorLink;\n","import { Chip, darken, lighten } from \"@mui/material\";\nimport React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { camelize, parameterize } from \"../../utils/casing\";\nimport { Category } from \"../../store/categories/categoriesSlice\";\nimport { colors } from '../../theme/theme';\n\nconst CategoryLinkChip = function ({ category }: { category: Category }) {\n return (\n <Chip\n sx={{\n borderRadius: '4px',\n borderColor: darken(colors.categories[camelize(category.name)].backgroundColor, 0.1),\n '&:hover': {\n borderColor: darken(colors.categories[camelize(category.name)].backgroundColor, 0.2),\n backgroundColor: `${lighten(colors.categories[camelize(category.name)].backgroundColor, 0.6)} !important`,\n },\n }}\n clickable\n label={category.name}\n variant=\"outlined\"\n component={Link}\n to={`/categories/${category.id}/${parameterize(category.name)}`}\n />\n )\n}\n\nexport default CategoryLinkChip;\n","import { Box, Grid, Typography } from '@mui/material';\nimport React from 'react';\nimport NewsletterEmailSignup from '../../statics/Homepage/NewsletterEmailSignup';\n\nconst NewsletterBanner = function () {\n return (\n <Box sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n width: '100%',\n p: { xs: 2, md: 3, xl: 4 },\n backgroundColor: '#fff3ea',\n }}>\n <Grid container spacing={2} sx={{ maxWidth: 1400 }}>\n <Grid item xs={12} sm={7}>\n <Box sx={{ display: 'flex', justifyContent: 'center', flexDirection: 'column', height: '100%' }}>\n <Typography variant=\"h5\" sx={{ mb: 2, fontWeight: 'bold' }}>Join now to get limited time, exclusive deals on free and discounted eBooks</Typography>\n <Typography>We'll find amazing new authors and books for you to get excited about. You just have to worry about finding the time to read them all.</Typography>\n </Box>\n </Grid>\n <Grid item xs={0} sm={1} />\n <Grid item xs={12} sm={4}>\n <Box sx={{ display: 'flex', justifyContent: { xs: 'center', md: 'flex-end' }, alignItems: 'center', height: '100%' }}>\n <Box sx={{ backgroundColor: 'white', px: 3, pb: 3, pt: 1 }}>\n <NewsletterEmailSignup hideText />\n </Box>\n </Box>\n </Grid>\n </Grid>\n </Box>\n )\n}\n\nexport default NewsletterBanner;\n","import React from 'react';\nimport { styled } from '@mui/material/styles';\nimport { Typography } from '@mui/material';\nimport { colors } from '../../theme/theme';\nimport { Book } from '../../store/books/booksSlice';\nimport stores from '../../store/stores/stores';\nimport { Promotion } from '../../store/promotions/promotionsSlice';\n\nconst StyledLink = styled('a')<{ store: string }>(({ store }) => ({\n color: colors.stores[store].color,\n textDecoration: 'none',\n paddingRight: '1rem',\n fontWeight: 'bold',\n lineHeight: '2.5em',\n whiteSpace: 'nowrap',\n '&:hover': {\n textDecoration: 'underline',\n },\n}));\n\n/**\n * Display the links to the book.\n *\n * This partial can be used internally - in which case you don't pass in\n * a promotion. This will link directly to the books' retailer pages.\n *\n * If you want a redirect link for click tracking, pass in the promotion.\n *\n * @param book - the book to print stores from\n * @returns\n */\nconst StoreLinks = function ({\n book,\n promotion,\n useClickTracking,\n useAmznAffiliateUrl,\n}: {\n book: Book;\n promotion?: Promotion;\n useClickTracking?: Boolean;\n useAmznAffiliateUrl?: Boolean;\n}) {\n // This safeguards accidental use of click tracking if passing in a promotion.\n if ((useClickTracking && !promotion) || (!useClickTracking && promotion)) {\n throw new Error(\n 'To use click tracking, pass a promotion and enable useClickTracking'\n );\n }\n\n return (\n <Typography\n variant=\"body1\"\n sx={{\n wordBreak: 'break-all',\n }}\n >\n {stores.map((store) => {\n if (!book[store.urlProperty]) return <span key={store.title} />;\n\n const url = promotion\n ? `/${store.clickTrackingUrlPrefix}/${promotion.id}${useAmznAffiliateUrl && store.title === 'Amazon' ? '/1' : ''}?click_source=web`\n : book[store.urlProperty]?.toString();\n return (\n <StyledLink\n href={url}\n key={store.title}\n target=\"_blank\"\n rel=\"noreferrer\"\n store={store.camelCase}\n >\n {store.title}\n </StyledLink>\n );\n })}\n </Typography>\n );\n};\n\nStoreLinks.defaultProps = {\n promotion: null,\n useClickTracking: false,\n useAmznAffiliateUrl: false,\n};\n\nexport default StoreLinks;\n","import React from 'react';\nimport { Box, TextField, Typography } from '@mui/material';\nimport FacebookPixel from 'react-facebook-pixel';\nimport RedditPixel from 'react-reddit-pixel';\nimport ReactGA from 'react-ga4';\nimport ReactPinterestTag from 'react-pinterest-tag';\nimport { push } from 'connected-react-router';\nimport { LoadingButton } from '@mui/lab';\nimport { createReader } from '../../store/readers/readersSlice';\nimport { useAppDispatch } from '../../app/hooks';\nimport { addSnack } from '../../store/snacks/snacksSlice';\n\nconst NewsletterEmailSignup = function ({\n signupEmailFieldRef,\n hideText,\n extraParams,\n btnText,\n follow,\n handleSuccess,\n}: {\n signupEmailFieldRef?: any;\n hideText?: boolean;\n extraParams?: Object;\n btnText?: string;\n follow?: string;\n handleSuccess?: Function;\n}) {\n const [email, setEmail] = React.useState('');\n const [creating, setCreating] = React.useState(false);\n const dispatch = useAppDispatch();\n\n async function handleCreate(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setCreating(true);\n\n dispatch(createReader({ email, ...extraParams }))\n .unwrap()\n .then((e: any) => {\n FacebookPixel.trackCustom('ReaderSubscribed');\n RedditPixel.track('SignUp');\n ReactGA.event({\n category: 'Readers',\n action: 'ReadersSignUp',\n });\n ReactPinterestTag.track('checkout', {\n value: 100,\n order_quantity: 1,\n currency: 'USD',\n line_items: [\n {\n product_name: 'Newsletter subscription',\n product_id: '1',\n product_price: 1.0,\n product_quantity: 1,\n },\n ],\n });\n // reader conversion\n ReactGA.gtag('event', 'conversion', {\n send_to: process.env.REACT_APP_GTAG_READER_SIGNUP as string,\n });\n\n if (e.skip_categories) {\n dispatch(addSnack({ message: `Follow on ${follow} successfully created.`, variant: 'success' }))\n } else {\n let pushUrl = `/readers/${e.uuid}/edit`;\n if (follow) { pushUrl += `?follow=${follow}`; }\n dispatch(push(pushUrl));\n }\n if (handleSuccess) { handleSuccess(); }\n })\n .finally(() => {\n setCreating(false);\n })\n .catch(() => {\n // throw e;\n });\n\n return () => setCreating(false);\n }\n\n return (\n <Box sx={{ maxWidth: '350px', margin: '0 auto' }}>\n {!hideText && <Typography variant=\"h4\" component=\"h1\" color=\"secondary.main\" align=\"center\">\n Discounted & Free Bestselling Ebooks\n </Typography>}\n\n <form onSubmit={handleCreate}>\n <TextField\n onChange={(e) => setEmail(e.target.value)}\n ref={signupEmailFieldRef || null}\n variant=\"outlined\"\n margin=\"normal\"\n required\n fullWidth\n name=\"email\"\n label=\"Email\"\n value={email}\n />\n <LoadingButton\n loading={creating}\n variant=\"contained\"\n color=\"secondary\"\n type=\"submit\"\n fullWidth\n >\n {btnText}\n </LoadingButton>\n </form>\n </Box>\n );\n};\n\nNewsletterEmailSignup.defaultProps = {\n signupEmailFieldRef: null,\n hideText: false,\n extraParams: {},\n btnText: `Start Reading - It's Free`,\n follow: null,\n handleSuccess: null,\n};\n\nexport default NewsletterEmailSignup;\n","import React from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n Box,\n Container,\n Grid,\n Typography,\n} from '@mui/material';\nimport { useAppDispatch, useAppSelector } from '../../../app/hooks';\nimport {\n BookResponse,\n getBook,\n selectBook,\n} from '../../../store/books/booksSlice';\nimport LoadingSpinner from '../../../components/misc/LoadingSpinner';\nimport StoreLinks from '../../../components/misc/StoreLinks';\nimport { getAllPromotions, selectAllPromotions } from '../../../store/promotions/promotionsSlice';\nimport Description from '../../../components/books/Description';\nimport MuiRouterLink from '../../../components/mui-wrappers/MuiRouterLink';\nimport Helmet from '../../../components/meta/Helmet';\nimport NewsletterBanner from '../../../components/misc/NewsletterBanner';\nimport VerticalBook from '../../../components/books/VerticalBook';\nimport AuthorLink from '../../../components/misc/AuthorLink';\nimport CategoryLinkChip from '../../../components/misc/CategoryLinkChip';\nimport ReaderFollowButton from '../../../components/buttons/ReaderFollowButton';\nimport { parameterize } from '../../../utils/casing';\n\nconst BookShow = function () {\n const id = parseInt(useParams<{ id: string }>().id, 10);\n const dispatch = useAppDispatch();\n const [bookLoading, setBookLoading] = React.useState(true);\n const book = useAppSelector((state) => selectBook(state, id)) as BookResponse;\n const promotions = useAppSelector(selectAllPromotions);\n\n React.useEffect(() => {\n if (!id) {\n return;\n }\n dispatch(\n getBook({\n id,\n resourceType: 'partner',\n public: true,\n joins: [ 'category', { author: 'books' } ],\n })\n ).finally(() => {\n setBookLoading(false);\n });\n\n // Note that without this cleanup method in the return function,\n // we get memory leak warnings from react\n // https://stackoverflow.com/a/60907638\n // no return method gives a memory leak\n // return () => { }; // empty return gives a memory leak\n // return () => setBookLoading(true); // this gives a memory leak\n // eslint-disable-next-line consistent-return\n return () => setBookLoading(false); // this works\n }, [dispatch, id]);\n\n React.useEffect(() => {\n if (!bookLoading) {\n dispatch(\n getAllPromotions({\n joins: [{ book: { author: 'books' } }],\n status: ['Successfully Sent'],\n sort_col: 'promotion_date',\n sort_dir: 'desc',\n resourceType: 'partner',\n category_id: [book.id],\n })\n )\n }\n }, [dispatch, bookLoading]);\n\n\n if (bookLoading) {\n return <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', mt: 10 }}>\n <LoadingSpinner />\n </Box>\n }\n\n return (\n <Box>\n <NewsletterBanner />\n <Container component=\"main\" sx={{ mb: 12 }}>\n <Box sx={{ display: 'flex', mt: 4, alignItems: 'flex-start' }}>\n <Box sx={{ flex: '1 1 150px', maxWidth: '200px' }}>\n <Box\n component=\"img\"\n src={book.amazon_image_url}\n alt={book.title}\n sx={{ width: '100%', height: 'auto', boxShadow: '2px 2px 7px rgb(0 0 0 / 10%)' }}\n />\n </Box>\n <Box sx={{ flex: '1 1 400px', px: '1rem' }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', mb: 1 }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }} data-title>\n {book.title}\n </Typography>\n </Box>\n <AuthorLink author={book.author!} />\n <Box sx={{ mt: 1, mb: 1 }}>\n <CategoryLinkChip category={book.category!} />\n </Box>\n <Box sx={{ display: { xs: 'none', md: 'block' } }}>\n <StoreLinks book={book} useAmznAffiliateUrl />\n </Box>\n <Box sx={{\n my: 1,\n display: { xs: 'none', md: 'block' },\n // width: { xs: '100%', md: '85%', lg: '75%' }\n }}>\n <Description description={book.description} />\n </Box>\n </Box>\n <ReaderFollowButton\n resource={book.title}\n resourceType=\"book\"\n extraParams={{ book_ids: [book.id] }}\n />\n </Box>\n\n <Box sx={{ mt: 1, mb: 6, display: { xs: 'block', md: 'none' } }}>\n <StoreLinks book={book} useAmznAffiliateUrl />\n <Description description={book.description} />\n </Box>\n\n {book.latest_successful_promotion && (\n <Box sx={{ borderLeft: '2px solid', borderColor: '#7fd7ff', pl: 2, mt: 2 }}>\n <Typography sx={{ mb: 1 }}>Good news, it looks like we've promoted this book in the past. Want to catch it the next time it goes on sale? Sign up to get our latest deals and freebies by <MuiRouterLink to=\"/\">clicking here</MuiRouterLink>.</Typography>\n <Typography><b>Previous Sale:</b> Discounted to {book.latest_successful_promotion.sale_price === 0 ? 'Free' : `$${book.latest_successful_promotion.sale_price}`} on {new Date(book.latest_successful_promotion.promotion_date!).toDateString()}.</Typography>\n </Box>\n )}\n\n {promotions && promotions.length > 1 && (\n <>\n <Typography variant=\"h5\" sx={{ mt: 4, mb: 2 }}>You Might Also Like</Typography>\n <Grid container spacing={2}>\n {promotions\n .filter(promo => promo.category_id === book.category_id && promo.book_id !== book.id)\n .slice(0,6).map((promotion) => (\n <Grid item xs={6} sm={4} lg={2} key={promotion.id}>\n <VerticalBook book={promotion.book} />\n </Grid>\n ))}\n </Grid>\n </>\n )}\n\n <Helmet\n metaContent={{\n title: `${book.title} - BookRaid`,\n url: `https://bookraid.com/books/${book.id}/${parameterize(book.title)}`,\n description: `Book page for ${book.title} on BookRaid. Get notified when ${book.title} is free or on sale.`,\n }}\n schema={[\n {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Book\",\n \"bookFormat\": \"https://schema.org/EBook\",\n \"name\": book.title,\n \"description\": book.description,\n \"author\": {\n \"@type\": \"Person\",\n \"name\": book.author!.name,\n },\n },\n {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n \"itemListElement\": [{\n \"@type\": \"ListItem\",\n \"position\": 1,\n \"name\": \"eBook Deals\",\n \"item\": \"https://bookraid.com/ebook-deals\"\n },{\n \"@type\": \"ListItem\",\n \"position\": 2,\n \"name\": book.title,\n }]\n }\n ]}\n />\n </Container>\n </Box>\n );\n};\n\nexport default BookShow;\n","import { camelize } from '../../utils/casing';\n\nexport interface Store {\n title: string;\n snakeCase: string;\n camelCase: string;\n urlProperty: string;\n clickTrackingUrlPrefix: string;\n}\n\nconst storeTitles = [\n 'Amazon',\n 'iBooks',\n 'Kobo',\n 'Google Play',\n 'Barnes and Noble',\n];\n\n/**\n * Returns an array with objects holding various name casings:\n * [{\n * title: 'Barnes and Noble',\n * snakeCase: 'barnes_and_noble',\n * camelCase: 'barnes-and-noble',\n * },\n * {\n * title: 'Amazon',\n * snakeCase: 'amazon',\n * camelCase: 'amazon',\n * },\n * ...\n * ]\n */\nconst storesList: Array<Store> = storeTitles.map((storeTitle) => ({\n title: storeTitle,\n snakeCase: storeTitle.toLowerCase().replace(/\\s/g, '_'),\n camelCase: camelize(storeTitle),\n urlProperty: `${storeTitle.toLowerCase().replace(/\\s/g, '_')}_url`,\n clickTrackingUrlPrefix: `${storeTitle.toLowerCase().replace(/\\s/g, '_')}`,\n}));\n\nexport default storesList;\n","/**\n * Turns some \"Non Slug Case String\" to a \"slug-case-string\"\n *\n * Strips html entities out completely in the first `replace`.\n */\nexport const slugCase = function (token: string): string {\n return trimNonWhitespaceCharacters(token)\n .replace(/&[^;]*;/g, '')\n .replace(/&/g, '')\n .replace(/\\s+/g, '-')\n .toLowerCase();\n};\n\n// convert to camelCase\nexport const camelize = function (str: string) {\n const moddedStr = trimNonWhitespaceCharacters(str)\n .replace(/-/g, ' ')\n .toLowerCase();\n return moddedStr\n .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (word, index) =>\n index === 0 ? word.toLowerCase() : word.toUpperCase()\n )\n .replace(/\\s+/g, '');\n};\n\n/**\n * Turns some \"Non Slug Case String\" to a \"snake_case_string\"\n */\nexport const snakeCase = function (token: string): string {\n return trimNonWhitespaceCharacters(token)\n .replace(/\\s/g, '_')\n .replace(/-/g, '_')\n .toLowerCase();\n};\n\n/**\n * Remove some junk characters to reduce everything to letters only\n * @param textToTrim\n * @returns\n */\nconst trimNonWhitespaceCharacters = function (textToTrim: string): string {\n return textToTrim\n .trim()\n .replace(/'/g, '')\n .replace(/,/g, '')\n .replace(/_/g, ' ');\n};\n\nexport const parameterize = function (text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/ /g, '-')\n .replace(/[^\\w-]+/g, '');\n};\n"],"names":["description","style","whiteSpace","color","book","to","id","parameterize","title","component","src","amazon_image_url","alt","sx","width","height","boxShadow","aspectRatio","mt","resource","extraParams","resourceType","React","open","setOpen","maxWidth","xs","md","pl","ml","borderLeft","borderColor","fullWidth","variant","mb","onClick","onClose","PaperProps","hideText","btnText","follow","handleSuccess","Helmet","metaContent","schema","url","ogImage","currentOgImage","property","content","rel","href","type","JSON","stringify","map","sch","defaultProps","author","textDecoration","display","alignItems","name","mr","avatar_mini_url","category","borderRadius","darken","colors","camelize","backgroundColor","lighten","clickable","label","Link","justifyContent","p","xl","container","spacing","item","sm","flexDirection","fontWeight","px","pb","pt","StyledLink","styled","store","paddingRight","lineHeight","StoreLinks","promotion","useClickTracking","useAmznAffiliateUrl","Error","wordBreak","stores","urlProperty","clickTrackingUrlPrefix","toString","target","camelCase","NewsletterEmailSignup","signupEmailFieldRef","email","setEmail","creating","setCreating","dispatch","useAppDispatch","event","preventDefault","createReader","unwrap","then","e","FacebookPixel","RedditPixel","ReactGA","action","ReactPinterestTag","value","order_quantity","currency","line_items","product_name","product_id","product_price","product_quantity","send_to","process","skip_categories","addSnack","message","pushUrl","uuid","push","finally","catch","margin","align","onSubmit","onChange","ref","required","loading","parseInt","useParams","bookLoading","setBookLoading","useAppSelector","state","selectBook","promotions","selectAllPromotions","getBook","public","joins","getAllPromotions","status","sort_col","sort_dir","category_id","flex","my","book_ids","latest_successful_promotion","sale_price","Date","promotion_date","toDateString","length","filter","promo","book_id","slice","lg","storesList","storeTitle","snakeCase","toLowerCase","replace","slugCase","token","trimNonWhitespaceCharacters","str","word","index","toUpperCase","textToTrim","trim","text"],"sourceRoot":""}