{"version":3,"file":"static/js/7439.19aca238.chunk.js","mappings":"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","sources":["components/promotion-site-reviews/ReviewPolicyDialog.tsx","statics/best-promotion-sites/Index.tsx","../node_modules/@mui/icons-material/esm/ExpandMore.js","../node_modules/@mui/material/DialogActions/dialogActionsClasses.js","../node_modules/@mui/material/DialogActions/DialogActions.js"],"sourcesContent":["/* eslint-disable jsx-a11y/anchor-is-valid */\nimport React from 'react';\nimport {\n Button,\n Dialog,\n DialogTitle,\n DialogActions,\n DialogContent,\n Typography,\n Link,\n} from '@mui/material';\n\n\nconst ReviewPolicyDialog = function () {\n const [open, setOpen] = React.useState(false);\n\n return (\n <>\n <Link underline='none' onClick={() => setOpen(true)} sx={{ display: 'inline-block', color: \"primary.main\" }}>\n <Typography variant=\"body2\" color=\"primary.main\" sx={{ mb: 4, '&:hover': { cursor: 'pointer' } }}>Review Policy</Typography>\n </Link>\n <Dialog onClose={() => setOpen(false)} open={open}>\n <DialogTitle>Review Policy</DialogTitle>\n <DialogContent>\n <Typography>We do not edit or modify user-generated content, including reviews, ratings, and comments. We are impartial and do not interfere with the content our users submit. We only remove reviews that violate our community guidelines designed to maintain a safe and respectful environment. We believe our users' opinions and experiences are valuable and should be shared freely without censorship.</Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setOpen(false)}>Close</Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n\nexport default ReviewPolicyDialog;\n","import React from 'react';\nimport {\n Container,\n Grid,\n Box,\n Typography,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n Link as MuiLink,\n Tooltip,\n Rating,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n FormControlLabel,\n Checkbox,\n} from '@mui/material';\nimport { ExpandMore, Star } from '@mui/icons-material';\nimport { useAppDispatch, useAppSelector } from '../../app/hooks';\nimport { getAllPromotionSites, PromotionSite, selectAllPromotionSites } from '../../store/promotion-sites/promotionSitesSlice';\nimport LoadingSpinner from '../../components/misc/LoadingSpinner';\nimport { getAllPromotionSiteReviews, PromotionSiteReview, selectAllPromotionSiteReviews } from '../../store/promotion-site-reviews/promotionSiteReviewsSlice';\nimport { isLoggedInPartner } from '../../store/current-partner/currentPartnerSlice';\nimport NewReviewDialog from '../../components/promotion-site-reviews/NewReview';\nimport ReviewSignUp from '../../components/promotion-site-reviews/ReviewSignUp';\nimport Helmet from '../../components/meta/Helmet';\nimport ReviewPolicyDialog from '../../components/promotion-site-reviews/ReviewPolicyDialog';\nimport MuiRouterLink from '../../components/mui-wrappers/MuiRouterLink';\nimport { parameterize } from '../../utils/casing';\nimport SinglePromotionSiteReview from '../../components/promotion-site-reviews/ShowReview';\n\nconst PromotionSites = function () {\n const dispatch = useAppDispatch();\n const [loading, setLoading] = React.useState(false);\n const [sortBy, setSortBy] = React.useState('weighted_rating:desc'); // 'rating' or 'reviews'\n const [filterFree, setFilterFree] = React.useState(true);\n const [filterDiscount, setFilterDiscount] = React.useState(true);\n const [sortedReviews, setSortedReviews] = React.useState<Record<number, PromotionSiteReview[]>>({}); // key is promotion site id\n\n const partnerLoggedIn = useAppSelector(isLoggedInPartner);\n const promotionSites = useAppSelector(selectAllPromotionSites);\n const promotionSiteReviews = useAppSelector(selectAllPromotionSiteReviews);\n\n const sortOpts = [\n { value: 'weighted_rating:desc', label: 'Special Blend: High to Low' },\n { value: 'weighted_rating:asc', label: 'Special Blend: Low to High' },\n { value: 'average_stars:desc', label: 'Rating: High to Low' },\n { value: 'average_stars:asc', label: 'Rating: Low to High' },\n { value: 'total_stars:desc', label: 'Total Reviews: High to Low' },\n { value: 'total_stars:asc', label: 'Total Reviews: Low to High' },\n { value: 'mailing_list_size:desc', label: 'List Size: High to Low' },\n { value: 'mailing_list_size:asc', label: 'List Size: Low to High' },\n { value: 'min_price_in_cents:desc', label: 'Minimum Cost: High to Low' },\n { value: 'min_price_in_cents:asc', label: 'Minimum Cost: Low to High' },\n ];\n\n React.useEffect(() => {\n const sorted: Record<number, PromotionSiteReview[]> = {};\n promotionSiteReviews.forEach((review) => {\n if (sorted[review.promotion_site_id]) {\n sorted[review.promotion_site_id].push(review);\n } else {\n sorted[review.promotion_site_id] = [review];\n }\n });\n setSortedReviews(sorted);\n }, [promotionSiteReviews]);\n\n const sortedSites = () => {\n const [sort, order] = sortBy.split(':');\n let newSites = [ ...promotionSites ];\n if (filterFree || filterDiscount) {\n newSites = newSites.filter((site) => (filterFree && site.accepts_free) || (filterDiscount && site.accepts_paid));\n }\n\n newSites.sort((a, b) => {\n let aSort = a[sort];\n let bSort = b[sort];\n if (sort === 'weighted_rating') {\n if (!a.total_stars || a.total_stars === 0) { aSort = 0; }\n if (!b.total_stars || b.total_stars === 0) { bSort = 0; }\n }\n\n if (order === 'desc') {\n return bSort - aSort;\n }\n return aSort - bSort;\n });\n \n return newSites;\n };\n\n const formatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD'\n });\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 (promotionSites.length === 0) {\n setLoading(true);\n dispatch(\n getAllPromotionSites({\n resourceType: 'partner',\n })\n )\n .unwrap()\n .finally(() => {\n setLoading(false);\n });\n }\n\n if (promotionSiteReviews.length === 0) {\n dispatch(getAllPromotionSiteReviews({}));\n }\n }, []);\n\n if (loading) { return <LoadingSpinner />; }\n\n const filters = () => (\n <Grid container spacing={2} sx={{ mb: 4 }} alignItems=\"center\">\n <Grid item xs={12} sm={6} lg={4}>\n <FormControl fullWidth>\n <InputLabel id=\"status-select-label\">Sort By</InputLabel>\n <Select\n labelId=\"status-select-label\"\n id=\"status-select\"\n value={sortBy}\n label=\"Sort By\"\n onChange={(e) => {\n setSortBy(e.target.value);\n }}\n >\n {sortOpts.map((opt) => (\n <MenuItem key={opt.value} value={opt.value}>\n {opt.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Grid>\n\n <Grid item xs={12} sm={6} lg={4}>\n <Box sx={{ display: 'flex', flexDirection: 'column' }}>\n <FormControlLabel\n control={\n <Checkbox\n checked={filterFree}\n onChange={(e) => setFilterFree(e.target.checked)}\n sx={{ p: '5px' }}\n />\n }\n label=\"Sites that accept free books\"\n />\n\n <FormControlLabel\n control={\n <Checkbox\n checked={filterDiscount}\n onChange={(e) => setFilterDiscount(e.target.checked)}\n sx={{ p: '5px' }}\n />\n }\n label=\"Sites that accept discounted books\"\n />\n </Box>\n </Grid>\n </Grid>\n )\n\n const promotionStats = (promotionSite: PromotionSite) => (\n <>\n <Typography sx={{ mt: 1 }} color=\"primary\"><b>List Size</b></Typography>\n <Typography variant=\"body1\">{promotionSite.mailing_list_size ? promotionSite.mailing_list_size.toLocaleString() : 'N/A'}</Typography>\n <Typography sx={{ mt: 1 }} color=\"primary\"><b>Accepted Book Prices</b></Typography>\n {[promotionSite.accepts_free && 'Free', promotionSite.accepts_paid && 'Discounted'].filter(Boolean).join(' and ')}\n {\n (promotionSite.min_price_in_cents || promotionSite.max_price_in_cents) && (\n <>\n <Typography sx={{ mt: 1 }} color=\"primary\"><b>Cost Range</b></Typography>\n <Typography variant=\"body1\">{[promotionSite.min_price_in_cents && formatter.format(promotionSite.min_price_in_cents / 100), promotionSite.max_price_in_cents && formatter.format(promotionSite.max_price_in_cents / 100)].filter(val => val).join(' - ')}</Typography>\n </>\n )\n }\n {promotionSite.promotable_websites.length > 0 && (\n <>\n <Typography sx={{ mt: 1 }} color=\"primary\"><b>Promotable Websites</b></Typography>\n <Typography variant=\"body1\">{promotionSite.promotable_websites.join(', ')}</Typography>\n </>\n )}\n </>\n )\n\n return (\n <Container component=\"main\" disableGutters maxWidth=\"lg\">\n <Helmet\n metaContent={{\n title: `Best Book Promotion Sites ${new Date().getFullYear()} - BookRaid`,\n url: 'https://bookraid.com/best-book-promotion-sites/',\n description: `Discover the best book promotion sites online in ${new Date().getFullYear()}! Sort and rank different options, read author reviews, see the most relevant stats, all in one place.`,\n }}\n />\n <Typography variant=\"h3\" component=\"h1\" sx={{ mb: 2 }}>Best Book Promotion Sites - {new Date().getFullYear()}</Typography>\n <Typography variant=\"h6\" sx={{ mb: 2 }}>Welcome to the most comprehensive list of the best book promotion sites on the internet! We've done the research so you don't have to, and we're confident that this is the most trustworthy and reliable resource available for authors looking to promote their books online.</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1, mr: 6 }}>Are we missing a website? <MuiRouterLink to=\"/contact\">Let us know</MuiRouterLink>.</Typography>\n <ReviewPolicyDialog />\n {filters()}\n {sortedSites().map((promotionSite) => (\n <Grid key={promotionSite.id} container spacing={2} sx={{ mb: 4 }}>\n <Grid item xs={12} sm={7} lg={8}>\n <Typography variant=\"h5\" component=\"h3\"><MuiRouterLink to={`/best-book-promotion-sites/${promotionSite.id}/${parameterize(promotionSite.title)}`}>{promotionSite.title}</MuiRouterLink></Typography>\n <MuiLink href={promotionSite.url} target=\"_blank\">{promotionSite.url.replace(/https?:\\/\\//, '').replace(/\\/$/, '')}</MuiLink>\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Tooltip title={`${Math.round(promotionSite.average_stars * 100) / 100} out of 5 stars`}>\n <Box component=\"span\" sx={{ display: 'flex', alignItems: 'center' }}><Rating value={promotionSite.average_stars} precision={0.5} readOnly emptyIcon={<Star style={{ opacity: 0.55 }} fontSize=\"inherit\" />} /></Box>\n </Tooltip>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ ml: 1 }}>({promotionSite.total_stars || 0} Author Reviews)</Typography>\n </Box>\n <Typography sx={{ mt: 1 }} variant=\"body1\">{promotionSite.description}</Typography>\n\n <Box sx={{ display: { xs: 'block', sm: 'none' } }}>\n {promotionStats(promotionSite)}\n </Box>\n\n <Box sx={{ mt: 1 }}>\n {partnerLoggedIn\n ? <NewReviewDialog id={promotionSite.id} siteName={promotionSite.title} />\n : <ReviewSignUp promotionSite={promotionSite} />\n }\n </Box>\n\n <Accordion sx={{ mt: 2, borderTopLeftRadius: 4, borderTopRightRadius: 4, '&:before': { backgroundColor: 'unset' } }}>\n <AccordionSummary\n expandIcon={<ExpandMore />}\n aria-controls=\"promo-site-review-content\"\n id=\"promo-site-review-header\"\n >\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Typography><b>Author Reviews ({promotionSite.total_stars || 0})</b></Typography>\n <Typography sx={{ ml: 1 }} variant=\"body2\" color=\"text.secondary\">Click to read reviews</Typography>\n </Box>\n </AccordionSummary>\n <AccordionDetails>\n {sortedReviews[promotionSite.id]?.map((review: PromotionSiteReview) => <SinglePromotionSiteReview key={review.id} review={review} />)}\n </AccordionDetails>\n </Accordion>\n </Grid>\n <Grid item sm={5} lg={4} sx={{ display: { xs: 'none', sm: 'block' } }}>\n <Box sx={{ borderLeft: '2px solid', borderColor: '#7fd7ff', pl: 2 }}>\n {promotionStats(promotionSite)}\n </Box>\n </Grid>\n </Grid>\n ))}\n </Container>\n );\n};\n\nexport default PromotionSites;\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');","import { generateUtilityClass, generateUtilityClasses } from '@mui/base';\nexport function getDialogActionsUtilityClass(slot) {\n return generateUtilityClass('MuiDialogActions', slot);\n}\nconst dialogActionsClasses = generateUtilityClasses('MuiDialogActions', ['root', 'spacing']);\nexport default dialogActionsClasses;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nconst _excluded = [\"className\", \"disableSpacing\"];\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { unstable_composeClasses as composeClasses } from '@mui/base';\nimport styled from '../styles/styled';\nimport useThemeProps from '../styles/useThemeProps';\nimport { getDialogActionsUtilityClass } from './dialogActionsClasses';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n disableSpacing\n } = ownerState;\n const slots = {\n root: ['root', !disableSpacing && 'spacing']\n };\n return composeClasses(slots, getDialogActionsUtilityClass, classes);\n};\n\nconst DialogActionsRoot = styled('div', {\n name: 'MuiDialogActions',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, !ownerState.disableSpacing && styles.spacing];\n }\n})(({\n ownerState\n}) => _extends({\n display: 'flex',\n alignItems: 'center',\n padding: 8,\n justifyContent: 'flex-end',\n flex: '0 0 auto'\n}, !ownerState.disableSpacing && {\n '& > :not(:first-of-type)': {\n marginLeft: 8\n }\n}));\nconst DialogActions = /*#__PURE__*/React.forwardRef(function DialogActions(inProps, ref) {\n const props = useThemeProps({\n props: inProps,\n name: 'MuiDialogActions'\n });\n\n const {\n className,\n disableSpacing = false\n } = props,\n other = _objectWithoutPropertiesLoose(props, _excluded);\n\n const ownerState = _extends({}, props, {\n disableSpacing\n });\n\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/_jsx(DialogActionsRoot, _extends({\n className: clsx(classes.root, className),\n ownerState: ownerState,\n ref: ref\n }, other));\n});\nprocess.env.NODE_ENV !== \"production\" ? DialogActions.propTypes\n/* remove-proptypes */\n= {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The content of the component.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * If `true`, the actions do not have additional margin.\n * @default false\n */\n disableSpacing: PropTypes.bool,\n\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])\n} : void 0;\nexport default DialogActions;"],"names":["React","open","setOpen","Link","underline","onClick","sx","display","color","Typography","variant","mb","cursor","Dialog","onClose","DialogTitle","DialogContent","DialogActions","Button","dispatch","useAppDispatch","loading","setLoading","sortBy","setSortBy","filterFree","setFilterFree","filterDiscount","setFilterDiscount","sortedReviews","setSortedReviews","partnerLoggedIn","useAppSelector","isLoggedInPartner","promotionSites","selectAllPromotionSites","promotionSiteReviews","selectAllPromotionSiteReviews","sortOpts","value","label","sorted","forEach","review","promotion_site_id","push","formatter","Intl","NumberFormat","style","currency","length","getAllPromotionSites","resourceType","unwrap","finally","getAllPromotionSiteReviews","LoadingSpinner","promotionStats","promotionSite","mt","mailing_list_size","toLocaleString","accepts_free","accepts_paid","filter","Boolean","join","min_price_in_cents","max_price_in_cents","format","val","promotable_websites","Container","component","disableGutters","maxWidth","Helmet","metaContent","title","Date","getFullYear","url","description","mr","MuiRouterLink","to","Grid","container","spacing","alignItems","item","xs","sm","lg","FormControl","fullWidth","InputLabel","id","Select","labelId","onChange","e","target","map","opt","MenuItem","Box","flexDirection","FormControlLabel","control","Checkbox","checked","p","split","sort","order","newSites","site","a","b","aSort","bSort","total_stars","sortedSites","parameterize","href","replace","Tooltip","Math","round","average_stars","Rating","precision","readOnly","emptyIcon","Star","opacity","fontSize","ml","NewReview","siteName","ReviewSignUp","Accordion","borderTopLeftRadius","borderTopRightRadius","backgroundColor","AccordionSummary","expandIcon","ExpandMore","AccordionDetails","borderLeft","borderColor","pl","createSvgIcon","_jsx","d","getDialogActionsUtilityClass","slot","generateUtilityClass","generateUtilityClasses","_excluded","DialogActionsRoot","styled","name","overridesResolver","props","styles","ownerState","root","disableSpacing","_extends","padding","justifyContent","flex","marginLeft","inProps","ref","useThemeProps","className","other","_objectWithoutPropertiesLoose","classes","slots","composeClasses","useUtilityClasses","clsx"],"sourceRoot":""}