{"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 &apos;Get Alerts&apos; button and we&apos;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&apos;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&apos;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 &amp; 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&apos;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":""}