{"version":3,"file":"static/js/9157.7706da20.chunk.js","mappings":"iLAoBA,IAdqB,SAAH,GAAwC,IAAzBA,EAAI,EAAJA,KAC/B,OACE,UAAC,IAAa,CAACC,GAAE,iBAAYD,EAAKE,GAAE,aAAIC,EAAAA,EAAAA,IAAaH,EAAKI,QAAS,WACjE,SAAC,IAAG,CACFC,UAAU,MACVC,IAAKN,EAAKO,iBACVC,IAAKR,EAAKI,MACVK,GAAI,CAAEC,MAAO,OAAQC,OAAQ,OAAQC,UAAW,+BAAgCC,YAAa,cAE/F,SAAC,IAAU,CAACJ,GAAI,CAAEK,GAAI,GAAI,SAAEd,EAAKI,UAGvC,C,wICmCA,IA1C2B,SAAH,GAQpB,IAPFW,EAAQ,EAARA,SACAC,EAAW,EAAXA,YACAC,EAAY,EAAZA,aAMA,EAAwBC,EAAAA,UAAe,GAAM,eAAtCC,EAAI,KAAEC,EAAO,KAEpB,OACE,iCACE,UAAC,IAAG,CAACX,GAAI,CAAEY,SAAU,CAAEC,GAAI,OAAQC,GAAI,KAAOC,GAAI,CAAEF,GAAI,EAAGC,GAAI,GAAKE,GAAI,CAAEH,GAAI,EAAGC,GAAI,GAAKT,GAAI,CAAEQ,GAAI,EAAGC,GAAI,GAAKG,WAAY,CAAEJ,GAAI,EAAGC,GAAI,aAAeI,YAAa,CAAEL,GAAI,OAAQC,GAAI,YAAc,WACnM,SAAC,IAAM,CAACK,WAAS,EAACC,QAAQ,YAAYC,MAAM,YAAYrB,GAAI,CAAEsB,GAAI,GAAKC,QAAS,kBAAMZ,GAAQ,EAAK,EAAC,SAAC,gBAGrG,UAAC,IAAU,CAACS,QAAQ,UAAS,UAAC,4BACFd,EAAS,iHAIvC,UAAC,IAAM,CACLkB,QAAS,kBAAMb,GAAQ,EAAM,EAC7BD,KAAMA,EACNe,WAAY,CAAEzB,GAAI,CAAEY,SAAU,MAAQ,WAEtC,UAAC,IAAa,WAAC,8DACoDN,EAAS,KAC1E,SAAC,IAAqB,CAACC,YAAaA,EAAamB,UAAQ,EAACC,QAAQ,eAAeC,OAAQpB,EAAcqB,cAAe,kBAAMlB,GAAQ,EAAM,QAG5I,SAAC,IAAa,WACZ,SAAC,IAAM,CAACY,QAAS,kBAAMZ,GAAQ,EAAM,EAAC,SAAC,kBAOjD,C,2FCxCe,SAASmB,EAAO,GAAgF,IAA9EC,EAAW,EAAXA,YAAaC,EAAM,EAANA,OACpCrC,EAAqCoC,EAArCpC,MAAOsC,EAA8BF,EAA9BE,IAAKC,EAAyBH,EAAzBG,YAAaC,EAAYJ,EAAZI,QAG3BC,EAAiBD,GADrB,yFAKIjC,EAASiC,EAAU,MAAQ,MACjC,OACE,UAAC,IAAW,YACV,2BAAQxC,KACR,iBAAM0C,SAAS,WAAWC,QAAS3C,KACnC,iBAAM4C,IAAI,YAAYC,KAAMP,KAC5B,iBAAMI,SAAS,SAASC,QAASL,KACjC,iBAAMI,SAAS,iBAAiBC,QAASJ,KACzC,iBAAMG,SAAS,WAAWC,QAASF,KACnC,iBAAMC,SAAS,eAAeC,QAASF,KACvC,iBAAMC,SAAS,iBAAiBC,QAAQ,UACxC,iBAAMD,SAAS,kBAAkBC,QAASpC,KAE1C,mBAAQuC,KAAK,sBAAqB,SAC/BC,KAAKC,UAAU,CACd,WAAY,qBACZ,QAAS,eACT,IAAO,uBACP,KAAQ,gCACR,YAAe,mJAGlBX,GACCA,EAAOY,KAAI,SAAAC,GAAG,OAAI,mBAAQJ,KAAK,sBAAqB,SAAEC,KAAKC,UAAUE,IAAc,MAI3F,CAEAf,EAAOgB,aAAe,CACpBd,OAAQ,G,yGCtBV,IApByB,SAAH,GAAoD,IAArCe,EAAQ,EAARA,SACnC,OACE,SAAC,IAAI,CACH/C,GAAI,CACFgD,aAAc,MACd9B,aAAa+B,EAAAA,EAAAA,IAAOC,EAAAA,EAAAA,YAAkBC,EAAAA,EAAAA,IAASJ,EAASK,OAAOC,gBAAiB,IAChF,UAAW,CACTnC,aAAa+B,EAAAA,EAAAA,IAAOC,EAAAA,EAAAA,YAAkBC,EAAAA,EAAAA,IAASJ,EAASK,OAAOC,gBAAiB,IAChFA,gBAAgB,GAAD,QAAKC,EAAAA,EAAAA,IAAQJ,EAAAA,EAAAA,YAAkBC,EAAAA,EAAAA,IAASJ,EAASK,OAAOC,gBAAiB,IAAI,iBAGhGE,WAAS,EACTC,MAAOT,EAASK,KAChBhC,QAAQ,WACRxB,UAAW6D,EAAAA,GACXjE,GAAE,sBAAiBuD,EAAStD,GAAE,aAAIC,EAAAA,EAAAA,IAAaqD,EAASK,QAG9D,C,8FCSA,IA9ByB,WACvB,OACE,SAAC,IAAG,CAACpD,GAAI,CACP0D,QAAS,OACTC,eAAgB,SAChBC,WAAY,SACZ3D,MAAO,OACP4D,EAAG,CAAEhD,GAAI,EAAGC,GAAI,EAAGgD,GAAI,GACvBT,gBAAiB,WACjB,UACA,UAAC,KAAI,CAACU,WAAS,EAACC,QAAS,EAAGhE,GAAI,CAAEY,SAAU,MAAO,WACjD,SAAC,KAAI,CAACqD,MAAI,EAACpD,GAAI,GAAIqD,GAAI,EAAE,UACvB,UAAC,IAAG,CAAClE,GAAI,CAAE0D,QAAS,OAAQC,eAAgB,SAAUQ,cAAe,SAAUjE,OAAQ,QAAS,WAC9F,SAAC,IAAU,CAACkB,QAAQ,KAAKpB,GAAI,CAAEsB,GAAI,EAAG8C,WAAY,QAAS,SAAC,iFAC5D,SAAC,IAAU,UAAC,iJAGhB,SAAC,KAAI,CAACH,MAAI,EAACpD,GAAI,EAAGqD,GAAI,KACtB,SAAC,KAAI,CAACD,MAAI,EAACpD,GAAI,GAAIqD,GAAI,EAAE,UACvB,SAAC,IAAG,CAAClE,GAAI,CAAE0D,QAAS,OAAQC,eAAgB,CAAE9C,GAAI,SAAUC,GAAI,YAAc8C,WAAY,SAAU1D,OAAQ,QAAS,UACnH,SAAC,IAAG,CAACF,GAAI,CAAEqD,gBAAiB,QAASgB,GAAI,EAAGC,GAAI,EAAGC,GAAI,GAAI,UACzD,SAAC,IAAqB,CAAC7C,UAAQ,cAO7C,C,oQCpBM8C,EAAwB,SAAH,GAcvB,IAbFC,EAAmB,EAAnBA,oBACA/C,EAAQ,EAARA,SACAnB,EAAW,EAAXA,YACAoB,EAAO,EAAPA,QACAC,EAAM,EAANA,OACAC,EAAa,EAAbA,cASA,EAA0BpB,EAAAA,SAAe,IAAG,eAArCiE,EAAK,KAAEC,EAAQ,KACtB,EAAgClE,EAAAA,UAAe,GAAM,eAA9CmE,EAAQ,KAAEC,EAAW,KACtBC,GAAWC,EAAAA,EAAAA,KAEU,aAgD1B,OAhD0B,oBAA3B,WAA4BC,GAAuC,iEA6C5D,OA5CLA,EAAMC,iBACNJ,GAAY,GAEZC,GAASI,EAAAA,EAAAA,KAAa,QAAER,MAAAA,GAAUnE,KAC/B4E,SACAC,MAAK,SAACC,GAyBL,GAxBAC,IAAAA,YAA0B,oBAC1BC,IAAAA,MAAkB,UAClBC,EAAAA,GAAAA,MAAc,CACZzC,SAAU,UACV0C,OAAQ,kBAEVC,IAAAA,MAAwB,WAAY,CAClCC,MAAO,IACPC,eAAgB,EAChBC,SAAU,MACVC,WAAY,CACV,CACEC,aAAc,0BACdC,WAAY,IACZC,cAAe,EACfC,iBAAkB,MAKxBV,EAAAA,GAAAA,KAAa,QAAS,aAAc,CAClCW,QAASC,sCAGPf,EAAEgB,gBACJvB,GAASwB,EAAAA,EAAAA,IAAS,CAAEC,QAAQ,aAAD,OAAe3E,EAAM,0BAA0BR,QAAS,iBAC9E,CACL,IAAIoF,EAAO,mBAAenB,EAAEoB,KAAI,SAC5B7E,IAAU4E,GAAO,kBAAe5E,IACpCkD,GAAS4B,EAAAA,EAAAA,IAAKF,GAChB,CACI3E,GAAiBA,GACvB,IACC8E,SAAQ,WACP9B,GAAY,EACd,IACC+B,OAAM,WACL,IACC,mBAEE,kBAAM/B,GAAY,EAAO,IAAD,4CAChC,sBAED,OACE,UAAC,IAAG,CAAC7E,GAAI,CAAEY,SAAU,QAASiG,OAAQ,UAAW,WAC7CnF,IAAY,SAAC,IAAU,CAACN,QAAQ,KAAKxB,UAAU,KAAKyB,MAAM,iBAAiByF,MAAM,SAAQ,SAAC,0CAI5F,kBAAMC,SA1DwB,SAEN,GAAD,gCAwDM,WAC3B,SAAC,IAAS,CACRC,SAAU,SAAC3B,GAAC,OAAKV,EAASU,EAAE4B,OAAOtB,MAAM,EACzCuB,IAAKzC,GAAuB,KAC5BrD,QAAQ,WACRyF,OAAO,SACPM,UAAQ,EACRhG,WAAS,EACTiC,KAAK,QACLI,MAAM,QACNmC,MAAOjB,KAET,SAAC,IAAa,CACZ0C,QAASxC,EACTxD,QAAQ,YACRC,MAAM,YACNoB,KAAK,SACLtB,WAAS,WAERQ,SAKX,EAEA6C,EAAsB1B,aAAe,CACnC2B,oBAAqB,KACrB/C,UAAU,EACVnB,YAAa,CAAC,EACdoB,QAAQ,4BACRC,OAAQ,KACRC,cAAe,MAGjB,K,4RC4CA,UA/ImB,WACjB,IAAMpC,EAAK4H,UAASC,EAAAA,EAAAA,MAA4B7H,GAAI,IAC9CqF,GAAWC,EAAAA,EAAAA,KACjB,EAA0CtE,EAAAA,UAAe,GAAK,eAAvD8G,EAAa,KAAEC,EAAgB,KAChCC,GAASC,EAAAA,EAAAA,IAAe,SAACC,GAAK,OAAKC,EAAAA,EAAAA,IAAaD,EAAOlI,EAAG,IAChE,EAA4CgB,EAAAA,SAA2B,IAAG,eAAnEoH,EAAc,KAAEC,EAAiB,KAwCxC,OAtCArH,EAAAA,WAAgB,WACd,GAAKhB,EAqBL,OAlBAqF,GACEiD,EAAAA,EAAAA,IAAU,CACRtI,GAAAA,EACAe,aAAc,UACdwH,QAAQ,EACRC,MAAO,CAAC,CAAEC,MAAO,gBAEnBvB,SAAQ,WACRa,GAAiB,EACnB,IASO,kBAAMA,GAAiB,EAAO,CACvC,GAAG,CAAC1C,EAAUrF,IAEdgB,EAAAA,WAAgB,WACVgH,GAAUA,EAAOS,OACnBJ,EACEL,EAAOS,MACJtF,KAAI,SAACrD,GAAU,OAAKA,EAAKwD,QAAQ,IACjCoF,QACC,SAACpF,EAAoBqF,EAAeC,GAAgB,OAClDA,EAAKC,WAAU,SAACC,GAAC,OAAKA,EAAE9I,KAAOsD,EAAStD,EAAE,MAAM2I,CAAK,IAIjE,GAAG,CAACX,IAEAF,GACK,SAAC,IAAG,CAACvH,GAAI,CAAE0D,QAAS,OAAQC,eAAgB,SAAUC,WAAY,SAAUvD,GAAI,IAAK,UAC1F,SAAC,IAAc,OAKjB,UAAC,IAAG,YACF,SAAC,IAAgB,KACjB,UAAC,IAAS,CAACT,UAAU,OAAM,WACzB,SAAC,IAAG,CAACI,GAAI,CAAE0D,QAAS,OAAQrD,GAAI,EAAG8D,cAAe,UAAW,UAC3D,UAAC,IAAG,CAACnE,GAAI,CAAE0D,QAAS,OAAQS,cAAe,CAAEtD,GAAI,SAAUC,GAAI,OAAS8C,WAAY,CAAE/C,GAAI,SAAUC,GAAI,eAAiB,WACvH,SAAC,IAAM,CAACjB,IAAK4H,EAAOe,WAAYzI,IAAK0H,EAAOrE,KAAMpD,GAAI,CAAEC,MAAO,QAASC,OAAQ,QAASuI,GAAI,CAAE5H,GAAI,EAAGC,GAAI,GAAKQ,GAAI,CAAET,GAAI,EAAGC,GAAI,OAChI,UAAC,IAAG,CAACd,GAAI,CAAE0I,OAAQ,OAAQvE,cAAe,SAAUwE,SAAU,GAAI,WAChE,UAAC,IAAG,CAAC3I,GAAI,CAAE0D,QAAS,OAAQS,cAAe,SAAUP,WAAY,CAAE/C,GAAI,SAAUC,GAAI,eAAgB,WACnG,SAAC,IAAU,CAACM,QAAQ,KAAKxB,UAAU,KAAKI,GAAI,CAAEoE,WAAY,QAAS,SAAEqD,EAAOrE,QAE5E,UAAC,IAAG,CAACpD,GAAI,CAAE0D,QAAS,QAAS,UAC1B+D,EAAOmB,UAAW,SAAC,IAAU,CAC5BpG,KAAMiF,EAAOmB,QAAQC,WAAW,QAAUpB,EAAOmB,QAAO,kBAAcnB,EAAOmB,SAC7E5I,GAAI,CAAEyI,GAAI,GACVpH,MAAM,YACNyH,KAAK,QACL,aAAW,eAAc,UAEzB,SAAC,IAAI,MAENrB,EAAOsB,WAAY,SAAC,IAAU,CAC7BvG,KAAMiF,EAAOsB,SAASF,WAAW,QAAUpB,EAAOsB,SAAQ,kBAActB,EAAOsB,UAC/E/I,GAAI,CAAEyI,GAAI,GACVpH,MAAM,YACNyH,KAAK,QACL,aAAW,gBAAe,UAE1B,SAAC,IAAQ,MAEVrB,EAAOuB,YAAa,SAAC,IAAU,CAC9BxG,KAAMiF,EAAOuB,UAAUH,WAAW,QAAUpB,EAAOuB,UAAS,kBAAcvB,EAAOuB,WACjFhJ,GAAI,CAAEyI,GAAI,GACVpH,MAAM,YACNyH,KAAK,QACL,aAAW,iBAAgB,UAE3B,SAAC,IAAS,MAEXrB,EAAOwB,UAAW,SAAC,IAAU,CAC5BzG,KAAMiF,EAAOwB,QAAQJ,WAAW,QAAUpB,EAAOwB,QAAO,kBAAcxB,EAAOwB,SAC7E5H,MAAM,YACNyH,KAAK,QACL,aAAW,eAAc,UAEzB,SAAC,IAAO,YAKbrB,EAAOvF,cAAe,SAAC,IAAU,CAACgH,wBAAyB,CAAEC,OAAQ1B,EAAOvF,eAE5E2F,IAAkB,UAAC,IAAG,CAAC7H,GAAI,CAAE0D,QAAS,OAAQrD,GAAI,EAAG+I,SAAU,QAAS,WACvE,SAAC,IAAU,CAAChI,QAAQ,KAAKpB,GAAI,CAAEoE,WAAY,OAAQ/D,GAAI,GAAI,SAAC,YAC3DwH,EAAejF,KAAI,SAACG,GAAQ,OAC3B,SAAC,IAAG,CAAmB/C,GAAI,CAAEgB,GAAI,EAAGX,GAAI,GAAI,UAC1C,SAAC,IAAgB,CAAC0C,SAAUA,KADpBA,EAAStD,GAEb,WAIZ,SAAC,IAAkB,CACjBa,SAAQ,YAAOmH,EAAOrE,KAAI,SAC1B5C,aAAa,SACbD,YAAa,CAAE8I,WAAY,CAAC5B,EAAOhI,aAKzC,UAAC,KAAI,CAACsE,WAAS,EAACC,QAAS,EAAGhE,GAAI,CAAEsB,GAAI,IAAK,WACzC,SAAC,KAAI,CAAC2C,MAAI,EAACpD,GAAI,GAAG,UAChB,UAAC,IAAU,CAACO,QAAQ,KAAKpB,GAAI,CAAEoE,WAAY,OAAQ/D,GAAI,GAAI,UAAC,YAAUoH,EAAOrE,UAE9EqE,EAAOS,MAAOtF,KAAI,SAACrD,GAAI,OACtB,SAAC,KAAI,CAAC0E,MAAI,EAACpD,GAAI,EAAGqD,GAAI,EAAGoF,GAAI,EAAE,UAC7B,SAAC,IAAY,CAAC/J,KAAMA,KADeA,EAAKE,GAEnC,QAIX,SAAC,IAAM,CACLsC,YAAa,CACXpC,MAAM,GAAD,OAAK8H,EAAOrE,KAAI,uBACrBnB,IAAI,gCAAD,OAAkCwF,EAAOhI,GAAE,aAAIC,EAAAA,EAAAA,IAAa+H,EAAOrE,OACtElB,YAAY,mBAAD,OAAqBuF,EAAOrE,KAAI,2CAAmCqE,EAAOrE,KAAI,uCAMrG,C,yGC/JO,IAAMmG,EAAW,SAAUC,GAChC,OAAOC,EAA4BD,GAChCE,QAAQ,WAAY,IACpBA,QAAQ,KAAM,IACdA,QAAQ,OAAQ,KAChBC,aACL,EAGaxG,EAAW,SAAUyG,GAIhC,OAHkBH,EAA4BG,GAC3CF,QAAQ,KAAM,KACdC,cAEAD,QAAQ,uBAAuB,SAACG,EAAMzB,GAAK,OAChC,IAAVA,EAAcyB,EAAKF,cAAgBE,EAAKC,aAAa,IAEtDJ,QAAQ,OAAQ,GACrB,EAiBMD,EAA8B,SAAUM,GAC5C,OAAOA,EACJC,OACAN,QAAQ,KAAM,IACdA,QAAQ,KAAM,IACdA,QAAQ,KAAM,IACnB,EAEahK,EAAe,SAAUuK,GACpC,OAAOA,EACJN,cACAK,OACAN,QAAQ,KAAM,KACdA,QAAQ,WAAY,GACzB,C,2DCnDA,KAAeQ,EAAAA,EAAAA,IAA4BC,EAAAA,EAAAA,KAAK,OAAQ,CACtDC,EAAG,wJACD,W,kDCHJ,KAAeF,EAAAA,EAAAA,IAA4BC,EAAAA,EAAAA,KAAK,OAAQ,CACtDC,EAAG,wCACD,O,2DCDJ,KAAeF,EAAAA,EAAAA,IAA4BC,EAAAA,EAAAA,KAAK,OAAQ,CACtDC,EAAG,ocACD,Y,2DCFJ,KAAeF,EAAAA,EAAAA,IAA4BC,EAAAA,EAAAA,KAAK,OAAQ,CACtDC,EAAG,weACD,U","sources":["components/books/VerticalBook.tsx","components/buttons/ReaderFollowButton.tsx","components/meta/Helmet.tsx","components/misc/CategoryLinkChip.tsx","components/misc/NewsletterBanner.tsx","statics/Homepage/NewsletterEmailSignup.tsx","statics/public-authors/AuthorShow.tsx","utils/casing.ts","../node_modules/@mui/icons-material/esm/Facebook.js","../node_modules/@mui/icons-material/esm/Home.js","../node_modules/@mui/icons-material/esm/Instagram.js","../node_modules/@mui/icons-material/esm/Twitter.js"],"sourcesContent":["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 { 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 { 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 Avatar,\n Box,\n Container,\n Grid,\n IconButton,\n Typography,\n} from '@mui/material';\nimport { Facebook, Home, Instagram, Twitter } from '@mui/icons-material';\nimport { useAppDispatch, useAppSelector } from '../../app/hooks';\nimport { Book } from '../../store/books/booksSlice';\nimport LoadingSpinner from '../../components/misc/LoadingSpinner';\nimport Helmet from '../../components/meta/Helmet';\nimport NewsletterBanner from '../../components/misc/NewsletterBanner';\nimport VerticalBook from '../../components/books/VerticalBook';\nimport { Author, getAuthor, selectAuthor } from '../../store/authors/authorsSlice';\nimport { Category } from '../../store/categories/categoriesSlice';\nimport CategoryLinkChip from '../../components/misc/CategoryLinkChip';\nimport ReaderFollowButton from '../../components/buttons/ReaderFollowButton';\nimport { parameterize } from '../../utils/casing';\n\nconst AuthorShow = function () {\n const id = parseInt(useParams<{ id: string }>().id, 10);\n const dispatch = useAppDispatch();\n const [authorLoading, setAuthorLoading] = React.useState(true);\n const author = useAppSelector((state) => selectAuthor(state, id)) as Author;\n const [uniqCategories, setUniqCategories] = React.useState<Category[]>([]);\n\n React.useEffect(() => {\n if (!id) {\n return;\n }\n dispatch(\n getAuthor({\n id,\n resourceType: 'partner',\n public: true,\n joins: [{ books: 'category' }],\n })\n ).finally(() => {\n setAuthorLoading(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 () => setAuthorLoading(false); // this works\n }, [dispatch, id]);\n\n React.useEffect(() => {\n if (author && author.books) {\n setUniqCategories(\n author.books!\n .map((book: Book) => book.category!)\n .filter(\n (category: Category, index: number, self: Category[]) =>\n self.findIndex((c) => c.id === category.id) === index\n )\n );\n }\n }, [author]);\n\n if (authorLoading) {\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\">\n <Box sx={{ display: 'flex', mt: 4, flexDirection: 'column' }}>\n <Box sx={{ display: 'flex', flexDirection: { xs: 'column', md: 'row' }, alignItems: { xs: 'center', md: 'flex-start' } }}>\n <Avatar src={author.avatar_url} alt={author.name} sx={{ width: '200px', height: '200px', mr: { xs: 0, md: 2 }, mb: { xs: 2, md: 0 } }} />\n <Box sx={{ dislay: 'flex', flexDirection: 'column', flexGrow: 1 }}>\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: { xs: 'center', md: 'flex-start' }}}>\n <Typography variant=\"h3\" component=\"h1\" sx={{ fontWeight: 'bold' }}>{author.name}</Typography>\n\n <Box sx={{ display: 'flex' }}>\n {author.website && <IconButton\n href={author.website.startsWith('http') ? author.website : `https://${author.website}`}\n sx={{ mr: 1 }}\n color=\"secondary\"\n size=\"small\"\n aria-label=\"website link\"\n >\n <Home />\n </IconButton>}\n {author.facebook && <IconButton\n href={author.facebook.startsWith('http') ? author.facebook : `https://${author.facebook}`}\n sx={{ mr: 1 }}\n color=\"secondary\"\n size=\"small\"\n aria-label=\"facebook link\"\n >\n <Facebook />\n </IconButton>}\n {author.instagram && <IconButton\n href={author.instagram.startsWith('http') ? author.instagram : `https://${author.instagram}`}\n sx={{ mr: 1 }}\n color=\"secondary\"\n size=\"small\"\n aria-label=\"instagram link\"\n >\n <Instagram />\n </IconButton>}\n {author.twitter && <IconButton\n href={author.twitter.startsWith('http') ? author.twitter : `https://${author.twitter}`}\n color=\"secondary\"\n size=\"small\"\n aria-label=\"twitter link\"\n >\n <Twitter />\n </IconButton>}\n </Box>\n </Box>\n\n {author.description && <Typography dangerouslySetInnerHTML={{ __html: author.description }} />}\n\n {uniqCategories && <Box sx={{ display: 'flex', mt: 1, flexWrap: 'wrap' }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 'bold', mt: 1 }}>Genres:</Typography>\n {uniqCategories.map((category) => (\n <Box key={category.id} sx={{ ml: 1, mt: 1 }}>\n <CategoryLinkChip category={category} />\n </Box>\n ))}\n </Box>}\n </Box>\n <ReaderFollowButton\n resource={`a ${author.name} book`}\n resourceType='author'\n extraParams={{ author_ids: [author.id] }}\n />\n </Box>\n </Box>\n\n <Grid container spacing={2} sx={{ mb: 12 }}>\n <Grid item xs={12}>\n <Typography variant=\"h4\" sx={{ fontWeight: 'bold', mt: 4 }}>Books by {author.name}</Typography>\n </Grid>\n {author.books!.map((book) => (\n <Grid item xs={6} sm={4} lg={2} key={book.id}>\n <VerticalBook book={book} />\n </Grid>\n ))}\n </Grid>\n\n <Helmet\n metaContent={{\n title: `${author.name} Profile - BookRaid`,\n url: `https://bookraid.com/authors/${author.id}/${parameterize(author.name)}`,\n description: `Author page for ${author.name} on BookRaid. Get notified when ${author.name} books are free or on sale.`,\n }}\n />\n </Container>\n </Box>\n );\n};\n\nexport default AuthorShow;\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","import * as React from 'react';\nimport createSvgIcon from './utils/createSvgIcon';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon( /*#__PURE__*/_jsx(\"path\", {\n d: \"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2m13 2h-2.5A3.5 3.5 0 0 0 12 8.5V11h-2v3h2v7h3v-7h3v-3h-3V9a1 1 0 0 1 1-1h2V5z\"\n}), 'Facebook');","import createSvgIcon from './utils/createSvgIcon';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon( /*#__PURE__*/_jsx(\"path\", {\n d: \"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\"\n}), 'Home');","import * as React from 'react';\nimport createSvgIcon from './utils/createSvgIcon';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon( /*#__PURE__*/_jsx(\"path\", {\n d: \"M7.8 2h8.4C19.4 2 22 4.6 22 7.8v8.4a5.8 5.8 0 0 1-5.8 5.8H7.8C4.6 22 2 19.4 2 16.2V7.8A5.8 5.8 0 0 1 7.8 2m-.2 2A3.6 3.6 0 0 0 4 7.6v8.8C4 18.39 5.61 20 7.6 20h8.8a3.6 3.6 0 0 0 3.6-3.6V7.6C20 5.61 18.39 4 16.4 4H7.6m9.65 1.5a1.25 1.25 0 0 1 1.25 1.25A1.25 1.25 0 0 1 17.25 8 1.25 1.25 0 0 1 16 6.75a1.25 1.25 0 0 1 1.25-1.25M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3z\"\n}), 'Instagram');","import * as React from 'react';\nimport createSvgIcon from './utils/createSvgIcon';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon( /*#__PURE__*/_jsx(\"path\", {\n d: \"M22.46 6c-.77.35-1.6.58-2.46.69.88-.53 1.56-1.37 1.88-2.38-.83.5-1.75.85-2.72 1.05C18.37 4.5 17.26 4 16 4c-2.35 0-4.27 1.92-4.27 4.29 0 .34.04.67.11.98C8.28 9.09 5.11 7.38 3 4.79c-.37.63-.58 1.37-.58 2.15 0 1.49.75 2.81 1.91 3.56-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.22 4.22 0 0 1-1.93.07 4.28 4.28 0 0 0 4 2.98 8.521 8.521 0 0 1-5.33 1.84c-.34 0-.68-.02-1.02-.06C3.44 20.29 5.7 21 8.12 21 16 21 20.33 14.46 20.33 8.79c0-.19 0-.37-.01-.56.84-.6 1.56-1.36 2.14-2.23z\"\n}), 'Twitter');"],"names":["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","color","mb","onClick","onClose","PaperProps","hideText","btnText","follow","handleSuccess","Helmet","metaContent","schema","url","description","ogImage","currentOgImage","property","content","rel","href","type","JSON","stringify","map","sch","defaultProps","category","borderRadius","darken","colors","camelize","name","backgroundColor","lighten","clickable","label","Link","display","justifyContent","alignItems","p","xl","container","spacing","item","sm","flexDirection","fontWeight","px","pb","pt","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","target","ref","required","loading","parseInt","useParams","authorLoading","setAuthorLoading","author","useAppSelector","state","selectAuthor","uniqCategories","setUniqCategories","getAuthor","public","joins","books","filter","index","self","findIndex","c","avatar_url","mr","dislay","flexGrow","website","startsWith","size","facebook","instagram","twitter","dangerouslySetInnerHTML","__html","flexWrap","author_ids","lg","slugCase","token","trimNonWhitespaceCharacters","replace","toLowerCase","str","word","toUpperCase","textToTrim","trim","text","createSvgIcon","_jsx","d"],"sourceRoot":""}