{"version":3,"file":"static/js/4437.3a368a5a.chunk.js","mappings":"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","sources":["components/meta/Helmet.tsx","components/partner/SignUpForm.tsx","components/promotion-site-reviews/NewReview.tsx","components/promotion-site-reviews/ReviewForm.tsx","components/promotion-site-reviews/ReviewSignUp.tsx","components/promotion-site-reviews/EditReview.tsx","components/promotion-site-reviews/HelpfulButton.tsx","components/promotion-site-reviews/HelpfulSignUp.tsx","components/promotion-site-reviews/NotHelpfulButton.tsx","components/promotion-site-reviews/NotHelpfulSignUp.tsx","components/promotion-site-reviews/ShowReview.tsx","utils/casing.ts"],"sourcesContent":["import React from 'react';\nimport { Helmet as ReactHelmet } from 'react-helmet';\n\ninterface HelmetInput {\n title: string;\n url: string;\n description?: string;\n // Provide if there's a better image than the default\n ogImage?: string;\n}\n\nexport default function Helmet({ metaContent, schema }: { metaContent: HelmetInput, schema?: Array<Object> }) {\n const { title, url, description, ogImage } = metaContent;\n const defaultOgImage =\n 'https://website-assets-public.s3.us-west-2.amazonaws.com/opengraph/girl-in-hammock.jpg';\n const currentOgImage = ogImage || defaultOgImage;\n // Recent OG Images generated from Canva are 1200 x 600\n // So if one was set from Helmet, we use the smaller 600 size.\n // These will have to be redone and this discrepancy removed.\n const height = ogImage ? '600' : '630';\n return (\n <ReactHelmet>\n <title>{title}</title>\n <meta property=\"og:title\" content={title} />\n <link rel=\"canonical\" href={url} />\n <meta property=\"og:url\" content={url} />\n <meta property=\"og:description\" content={description} />\n <meta property=\"og:image\" content={currentOgImage} />\n <meta property=\"og:image:url\" content={currentOgImage} />\n <meta property=\"og:image:width\" content=\"1200\" />\n <meta property=\"og:image:height\" content={height} />\n\n <script type=\"application/ld+json\">\n {JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"Organization\",\n \"url\": \"https://bookraid.com\",\n \"logo\": \"https://bookraid.com/logo.png\",\n \"description\": \"BookRaid is a website and newsletter that lets you download free & bestselling discount eBooks for your Kindle, Nook, Kobo, or other eReader\"\n })}\n </script>\n {schema && (\n schema.map(sch => <script type=\"application/ld+json\">{JSON.stringify(sch)}</script>)\n )}\n </ReactHelmet>\n );\n}\n\nHelmet.defaultProps = {\n schema: [],\n};\n","/* eslint-disable react/require-default-props */\nimport React, { useState } from 'react';\nimport ReactGA from 'react-ga4';\nimport LoadingButton from '@mui/lab/LoadingButton';\nimport LoginIcon from '@mui/icons-material/Login';\nimport FacebookPixel from 'react-facebook-pixel';\nimport RedditPixel from 'react-reddit-pixel';\nimport Cookies from 'universal-cookie';\nimport { Box, Grid, TextField, Typography } from '@mui/material';\nimport { push } from 'connected-react-router';\nimport { useAppDispatch } from '../../app/hooks';\nimport { signUpPartner } from '../../store/current-partner/currentPartnerSlice';\nimport MuiRouterLink from '../mui-wrappers/MuiRouterLink';\nimport theme from '../../theme/theme';\nimport { addSnack } from '../../store/snacks/snacksSlice';\n\nconst Copyright = function () {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\" align=\"center\">\n {'Copyright © '}\n BookRaid {new Date().getFullYear()}\n </Typography>\n );\n};\n\nconst SignUpForm = function ({\n formExtrasData,\n handleSuccess,\n snackExtraData,\n extraSetFormErrors,\n extraBtnText,\n noFormElement, // <form> within a <form> is invalid HTML\n}: {\n formExtrasData?: any;\n handleSuccess?: () => void;\n snackExtraData?: any;\n extraSetFormErrors?: any;\n extraBtnText?: string;\n noFormElement?: boolean;\n}) {\n const dispatch = useAppDispatch();\n\n const [formErrors, setFormErrors] = useState({} as any);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [passwordConfirmation, setPasswordConfirmation] = useState('');\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (event: any) => {\n event.preventDefault();\n setSubmitting(true);\n const cookies = new Cookies();\n let signUpData = {\n email,\n password,\n password_confirmation: passwordConfirmation,\n referrer_id: cookies.get('referrer_id') || '',\n signup_source: cookies.get('utm_source') || '',\n };\n if (formExtrasData) {\n signUpData = { ...signUpData, ...formExtrasData };\n }\n dispatch(signUpPartner(signUpData))\n .unwrap()\n .then(() => {\n setSubmitting(false);\n // Partner completes registration\n FacebookPixel.track('CompleteRegistration');\n RedditPixel.track('Lead');\n // \"sign_up\" is somewhat a duplicate of the event below, but \"sign_up\" is a recommended event and probably has some implications for GA reporting\n ReactGA.event(\"sign_up\")\n ReactGA.event({\n category: 'Partners',\n action: 'PartnersSignUp',\n });\n ReactGA.gtag('event', 'conversion', {\n send_to: process.env.REACT_APP_GTAG_PARTNER_SIGNUP,\n });\n if (snackExtraData) {\n dispatch(addSnack(snackExtraData));\n }\n if (handleSuccess) {\n handleSuccess();\n } else {\n dispatch(push('/partners/books/new?acct=new'));\n }\n })\n .catch((error) => {\n setFormErrors({ ...formErrors, ...error.errors });\n if (extraSetFormErrors) {\n extraSetFormErrors({ ...formErrors, ...error.errors });\n }\n })\n .finally(() => {\n setSubmitting(false);\n });\n return () => setSubmitting(false);\n };\n\n return (\n <>\n <Box\n component={noFormElement ? 'div' : 'form'}\n noValidate\n onSubmit={handleSubmit}\n sx={{ width: '100%', marginTop: theme.spacing(1) }}\n >\n <TextField\n variant=\"outlined\"\n margin=\"normal\"\n required\n fullWidth\n label=\"Email Address\"\n name=\"email\"\n autoComplete=\"email\"\n error={formErrors?.email?.length > 0}\n helperText={formErrors?.email?.join(', ')}\n autoFocus\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n\n <TextField\n variant=\"outlined\"\n margin=\"normal\"\n required\n fullWidth\n name=\"password\"\n label=\"Password\"\n type=\"password\"\n autoComplete=\"current-password\"\n error={formErrors?.password?.length > 0}\n helperText={formErrors?.password?.join(', ')}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n\n <TextField\n variant=\"outlined\"\n margin=\"normal\"\n required\n fullWidth\n name=\"password-confirmation\"\n label=\"Password Confirmation\"\n type=\"password\"\n autoComplete=\"current-password\"\n value={passwordConfirmation}\n error={formErrors?.password_confirmation?.length > 0}\n helperText={formErrors?.password_confirmation?.join(', ')}\n onChange={(e) => setPasswordConfirmation(e.target.value)}\n />\n\n <LoadingButton\n type=\"submit\"\n onClick={handleSubmit}\n fullWidth\n loading={submitting}\n endIcon={<LoginIcon />}\n loadingPosition=\"end\"\n variant=\"contained\"\n color=\"secondary\"\n style={{ margin: '10px 0' }}\n >\n Sign Up{extraBtnText ? ` ${extraBtnText}` : ''}\n </LoadingButton>\n\n <Grid container>\n <Grid item xs>\n <MuiRouterLink to=\"/partners/password/forgot\" variant=\"body2\">\n Forgot password?\n </MuiRouterLink>\n </Grid>\n <Grid item>\n <MuiRouterLink to=\"/partners/sign-in\" variant=\"body2\">\n Already have an account? Sign In\n </MuiRouterLink>\n </Grid>\n </Grid>\n </Box>\n <Typography my={4} align=\"center\" color=\"text.secondary\">\n We will never spam you or share your email address, but occasionally\n email helpful promotion tips and sales. <br />\n Unsubscribe anytime.\n </Typography>\n <Box mt={4}>\n <Copyright />\n </Box>\n </>\n );\n};\n\nexport default SignUpForm;\n","import React from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n Button,\n Grid,\n Box,\n} from '@mui/material';\nimport { LoadingButton } from '@mui/lab';\nimport { Save } from '@mui/icons-material';\nimport { createPromotionSiteReview } from '../../store/promotion-site-reviews/promotionSiteReviewsSlice';\nimport ReviewForm from './ReviewForm';\nimport { useAppDispatch } from '../../app/hooks';\nimport { addSnack } from '../../store/snacks/snacksSlice';\n\nconst NewReviewDialog = function ({ id, siteName }: { id: number, siteName: string }) {\n const [open, setOpen] = React.useState(false);\n const [formErrors, setFormErrors] = React.useState({} as any);\n const [title, setTitle] = React.useState('');\n const [stars, setStars] = React.useState(0);\n const [name, setName] = React.useState('');\n const [promotionSiteId] = React.useState(id);\n const [reviewBody, setReviewBody] = React.useState('');\n const [submitting, setSubmitting] = React.useState(false);\n const dispatch = useAppDispatch();\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setSubmitting(true);\n\n dispatch(createPromotionSiteReview({\n resourceType: 'partner',\n title,\n stars,\n name,\n review_body: reviewBody,\n promotion_site_id: promotionSiteId,\n }))\n .unwrap()\n .then(() => {\n dispatch(addSnack({ message: \"Review successfully created\", variant: 'success' }));\n setOpen(false);\n })\n .catch((error) => {\n setFormErrors({ ...formErrors, ...error.errors });\n })\n .finally(() => {\n setSubmitting(false);\n });\n\n return () => setSubmitting(false);\n }\n\n return (\n <>\n <Button variant=\"contained\" color=\"secondary\" onClick={() => setOpen(true)}>Write a Review</Button>\n <Dialog onClose={() => setOpen(false)} open={open}>\n <DialogTitle>New Review of {siteName}</DialogTitle>\n <DialogContent>\n <form onSubmit={handleSubmit}>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <ReviewForm\n formErrors={formErrors}\n title={title}\n setTitle={setTitle}\n stars={stars}\n setStars={setStars}\n name={name}\n setName={setName}\n reviewBody={reviewBody}\n setReviewBody={setReviewBody}\n />\n </Grid>\n\n <Grid item xs={12}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>\n <LoadingButton\n type=\"submit\"\n loading={submitting}\n endIcon={<Save />}\n loadingPosition=\"end\"\n variant=\"contained\"\n color=\"secondary\"\n >\n SAVE REVIEW\n </LoadingButton>\n\n <Button onClick={() => setOpen(false)}>\n CLOSE\n </Button>\n </Box>\n </Grid>\n </Grid>\n </form>\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default NewReviewDialog;\n","import React from 'react';\nimport { FormHelperText, Rating, TextField, Typography } from '@mui/material';\nimport { Star } from '@mui/icons-material';\n\nconst ReviewForm = function ({\n formErrors,\n title,\n setTitle,\n stars,\n setStars,\n name,\n setName,\n reviewBody,\n setReviewBody,\n}: {\n formErrors: any;\n title: string;\n setTitle: React.Dispatch<React.SetStateAction<string>>;\n stars: number;\n setStars: React.Dispatch<React.SetStateAction<number>>;\n name: string;\n setName: React.Dispatch<React.SetStateAction<string>>;\n reviewBody: string;\n setReviewBody: React.Dispatch<React.SetStateAction<string>>;\n}) {\n const [localErrors, setLocalErrors] = React.useState({} as any);\n\n // when submitting nested attributes to rails, errors come back with the nested attributes prefix\n React.useEffect(() => {\n const newErrors = {} as any;\n Object.keys(formErrors).forEach((key) => {\n const newKey = key.replace('promotion_site_reviews.', '');\n newErrors[newKey] = formErrors[key];\n });\n\n setLocalErrors(newErrors);\n }, [formErrors]);\n\n return (\n <>\n <TextField\n error={localErrors.title && localErrors.title.length > 0}\n helperText={localErrors.title && localErrors.title.length > 0 && localErrors.title.join(', ')}\n variant=\"outlined\"\n margin=\"normal\"\n autoFocus\n required\n fullWidth\n name=\"title\"\n label=\"Review Title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n\n <TextField\n error={localErrors.name && localErrors.name.length > 0}\n helperText={localErrors.name && localErrors.name.length > 0 && localErrors.name.join(', ')}\n variant=\"outlined\"\n margin=\"normal\"\n required\n fullWidth\n name=\"name\"\n label=\"Your Name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n\n <Typography sx={{ mt: 1 }} component=\"legend\">Rating</Typography>\n <Rating\n name=\"stars\"\n value={stars}\n emptyIcon={<Star style={{ opacity: 0.55 }} fontSize=\"inherit\" />}\n onChange={(event, newValue) => {\n setStars(newValue!);\n }}\n />\n {localErrors.stars && localErrors.stars.length > 0 && (<FormHelperText error>{localErrors.stars.join(', ')}</FormHelperText>)}\n\n <TextField\n required\n error={localErrors.review_body && localErrors.review_body.length > 0}\n helperText={localErrors.review_body && localErrors.review_body.length > 0 && localErrors.review_body.join(', ')}\n variant=\"outlined\"\n margin=\"normal\"\n fullWidth\n multiline\n minRows={3}\n name=\"review_body\"\n label=\"Review Body\"\n value={reviewBody}\n onChange={(e) => setReviewBody(e.target.value)}\n />\n </>\n );\n};\n\nexport default ReviewForm;\n","import React from 'react';\nimport { Button, Dialog, DialogContent, DialogContentText, DialogTitle, IconButton } from '@mui/material';\nimport { useDispatch } from 'react-redux';\nimport { Close } from '@mui/icons-material';\nimport SignUpForm from '../partner/SignUpForm';\nimport { manualGetPromotionSiteReview } from '../../store/promotion-site-reviews/promotionSiteReviewsSlice';\nimport ReviewForm from './ReviewForm';\nimport { getPromotionSite, PromotionSite } from '../../store/promotion-sites/promotionSitesSlice';\n\nconst ReviewSignUp = function ({ promotionSite }: { promotionSite: PromotionSite }) {\n const [formErrors, setFormErrors] = React.useState({} as any);\n const [open, setOpen] = React.useState(false);\n const [title, setTitle] = React.useState('');\n const [stars, setStars] = React.useState(0);\n const [name, setName] = React.useState('');\n const [promotionSiteId] = React.useState(promotionSite.id);\n const [reviewBody, setReviewBody] = React.useState('');\n const dispatch = useDispatch();\n\n const handleSuccess = () => {\n dispatch(manualGetPromotionSiteReview({\n title,\n stars,\n name,\n review_body: reviewBody,\n promotion_site_id: promotionSiteId,\n id: 99999,\n created_at: new Date().toISOString(),\n created_at_time_ago: 'just now',\n helpful_count: 0,\n not_helpful_count: 0,\n resourceType: 'partner',\n current_partner_marked_helpful: false,\n current_partner_marked_not_helpful: false,\n owned_by_current_partner: true,\n }));\n dispatch(getPromotionSite({ id: promotionSite.id, resourceType: 'partner' }));\n setOpen(false);\n };\n\n const formExtrasData = {\n promotion_site_reviews_attributes: [{\n title,\n stars,\n name,\n review_body: reviewBody,\n promotion_site_id: promotionSiteId,\n }],\n }\n\n return (\n <>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => setOpen(true)}\n >\n WRITE A REVIEW\n </Button>\n <Dialog onClose={() => setOpen(false)} open={open}>\n <DialogTitle>\n New Review of {promotionSite.title}\n <IconButton\n aria-label=\"close\"\n onClick={() => setOpen(false)}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n color: 'secondary.main',\n }}\n >\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <ReviewForm\n formErrors={formErrors}\n title={title}\n setTitle={setTitle}\n stars={stars}\n setStars={setStars}\n name={name}\n setName={setName}\n reviewBody={reviewBody}\n setReviewBody={setReviewBody}\n />\n <DialogContentText sx={{ mt: 1 }}>\n <b>One last step:</b> before you can submit a review you need to create an account, so that we know you're not a robot :)\n </DialogContentText>\n <SignUpForm\n extraSetFormErrors={setFormErrors}\n handleSuccess={handleSuccess}\n formExtrasData={formExtrasData}\n snackExtraData={{ variant: 'success', message: 'Review successfully created' }}\n extraBtnText=\"and Submit Review\"\n />\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default ReviewSignUp;\n","import React from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n Button,\n Grid,\n Box,\n} from '@mui/material';\nimport { LoadingButton } from '@mui/lab';\nimport { Save } from '@mui/icons-material';\nimport { PromotionSiteReview, updatePromotionSiteReview } from '../../store/promotion-site-reviews/promotionSiteReviewsSlice';\nimport ReviewForm from './ReviewForm';\nimport { addSnack } from '../../store/snacks/snacksSlice';\nimport { useAppDispatch } from '../../app/hooks';\n\nconst EditReviewDialog = function ({\n review,\n}: {\n review: PromotionSiteReview;\n}) {\n const [open, setOpen] = React.useState(false);\n const [formErrors, setFormErrors] = React.useState({} as any);\n const [title, setTitle] = React.useState(review.title);\n const [stars, setStars] = React.useState(review.stars);\n const [name, setName] = React.useState(review.name);\n const [promotionSiteId] = React.useState(review.promotion_site_id);\n const [reviewBody, setReviewBody] = React.useState(review.review_body);\n const [submitting, setSubmitting] = React.useState(false);\n const dispatch = useAppDispatch();\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setSubmitting(true);\n\n dispatch(updatePromotionSiteReview({\n resourceType: 'partner',\n title,\n stars,\n name,\n review_body: reviewBody,\n promotion_site_id: promotionSiteId,\n id: review.id,\n }))\n .unwrap()\n .then(() => {\n dispatch(addSnack({ message: \"Review successfully updated\", variant: 'success' }));\n setOpen(false);\n })\n .catch((error: any) => {\n setFormErrors({ ...formErrors, ...error.errors });\n })\n .finally(() => {\n setSubmitting(false);\n });\n\n return () => setSubmitting(false);\n }\n\n return (\n <>\n <Button variant=\"contained\" color=\"secondary\" onClick={() => setOpen(true)}>EDIT REVIEW</Button>\n <Dialog onClose={() => setOpen(false)} open={open}>\n <DialogTitle>Edit Review</DialogTitle>\n <DialogContent>\n <form onSubmit={handleSubmit}>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <ReviewForm\n formErrors={formErrors}\n title={title}\n setTitle={setTitle}\n stars={stars}\n setStars={setStars}\n name={name}\n setName={setName}\n reviewBody={reviewBody}\n setReviewBody={setReviewBody}\n />\n </Grid>\n\n <Grid item xs={12}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>\n <LoadingButton\n type=\"submit\"\n loading={submitting}\n endIcon={<Save />}\n loadingPosition=\"end\"\n variant=\"contained\"\n color=\"secondary\"\n >\n SAVE REVIEW\n </LoadingButton>\n\n <Button onClick={() => setOpen(false)}>\n CLOSE\n </Button>\n </Box>\n </Grid>\n </Grid>\n </form>\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default EditReviewDialog;\n","import React from 'react';\nimport { LoadingButton } from '@mui/lab';\nimport { ThumbUp } from '@mui/icons-material';\nimport { useAppDispatch } from '../../app/hooks';\nimport { addSnack } from '../../store/snacks/snacksSlice';\nimport { createPartnerHelpful } from '../../store/partner-helpfuls/partnerHelpfulsSlice';\n\nconst HelpfulButton = function ({ id, existingHelpful }: { id: number, existingHelpful: boolean }) {\n const dispatch = useAppDispatch();\n const [submitting, setSubmitting] = React.useState(false);\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n setSubmitting(true);\n dispatch(createPartnerHelpful({ promotion_site_review_id: id, resourceType: 'partner' }))\n .unwrap()\n .then(() => {})\n .catch((error: any) => {\n error.data.full_messages.forEach((message: string) => {\n dispatch(addSnack({ message, variant: 'error' }))\n });\n })\n .finally(() => {\n setSubmitting(false);\n });\n return null;\n }\n\n return (\n <form onSubmit={handleSubmit}>\n <LoadingButton\n type=\"submit\"\n size=\"small\"\n fullWidth\n variant=\"contained\"\n color=\"secondary\"\n loading={submitting}\n disabled={existingHelpful}\n startIcon={<ThumbUp />}\n >\n Helpful\n </LoadingButton>\n </form>\n );\n};\n\nexport default HelpfulButton;\n","import React from 'react';\nimport { Button, Dialog, DialogContent, DialogContentText, DialogTitle, IconButton } from '@mui/material';\nimport { Close, ThumbUp } from '@mui/icons-material';\nimport { useDispatch } from 'react-redux';\nimport SignUpForm from '../partner/SignUpForm';\nimport { PromotionSiteReview, manualGetPromotionSiteReview } from '../../store/promotion-site-reviews/promotionSiteReviewsSlice';\n\nconst HelpfulSignUp = function ({ promotionSiteReview }: { promotionSiteReview: PromotionSiteReview }) {\n const [open, setOpen] = React.useState(false);\n const dispatch = useDispatch();\n\n const handleSuccess = () => {\n const newReview = { ...promotionSiteReview }\n newReview.current_partner_marked_helpful = true;\n newReview.helpful_count += 1;\n dispatch(manualGetPromotionSiteReview(newReview));\n setOpen(false);\n };\n\n return (\n <>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => setOpen(true)}\n startIcon={<ThumbUp />}\n >\n Helpful\n </Button>\n <Dialog onClose={() => setOpen(false)} open={open}>\n <DialogTitle>\n Create Account\n <IconButton\n aria-label=\"close\"\n onClick={() => setOpen(false)}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n color: 'secondary.main',\n }}\n >\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n Before we can mark this review as helpful you need to create an account, so that we know you're not a robot :)\n </DialogContentText>\n <SignUpForm\n handleSuccess={handleSuccess}\n formExtrasData={{ partner_helpfuls_attributes: [{ promotion_site_review_id: promotionSiteReview.id }] }}\n snackExtraData={{ variant: 'success', message: 'Review successfully marked as helpful' }}\n extraBtnText=\"and Mark as Helpful\"\n />\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default HelpfulSignUp;\n","import React from 'react';\nimport { LoadingButton } from '@mui/lab';\nimport { ThumbDown } from '@mui/icons-material';\nimport { useAppDispatch } from '../../app/hooks';\nimport { addSnack } from '../../store/snacks/snacksSlice';\nimport { createPartnerNotHelpful } from '../../store/partner-not-helpfuls/partnerNotHelpfulsSlice';\n\nconst NotHelpfulButton = function ({ id, existingNotHelpful }: { id: number, existingNotHelpful: boolean }) {\n const dispatch = useAppDispatch();\n const [submitting, setSubmitting] = React.useState(false);\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n setSubmitting(true);\n dispatch(createPartnerNotHelpful({ promotion_site_review_id: id, resourceType: 'partner' }))\n .unwrap()\n .then(() => {})\n .catch((error: any) => {\n error.data.full_messages.forEach((message: string) => {\n dispatch(addSnack({ message, variant: 'error' }))\n });\n })\n .finally(() => {\n setSubmitting(false);\n });\n return null;\n }\n\n return (\n <form onSubmit={handleSubmit}>\n <LoadingButton\n type=\"submit\"\n size=\"small\"\n fullWidth\n variant=\"contained\"\n color=\"secondary\"\n disabled={existingNotHelpful}\n loading={submitting}\n startIcon={<ThumbDown />}\n >\n Not Helpful\n </LoadingButton>\n </form>\n );\n};\n\nexport default NotHelpfulButton;\n","import React from 'react';\nimport { Button, Dialog, DialogContent, DialogContentText, DialogTitle, IconButton } from '@mui/material';\nimport { Close, ThumbDown } from '@mui/icons-material';\nimport { useDispatch } from 'react-redux';\nimport SignUpForm from '../partner/SignUpForm';\nimport { PromotionSiteReview, manualGetPromotionSiteReview } from '../../store/promotion-site-reviews/promotionSiteReviewsSlice';\n\nconst NotHelpfulSignUp = function ({ promotionSiteReview }: { promotionSiteReview: PromotionSiteReview }) {\n const [open, setOpen] = React.useState(false);\n const dispatch = useDispatch();\n\n const handleSuccess = () => {\n const newReview = { ...promotionSiteReview }\n newReview.current_partner_marked_not_helpful = true;\n newReview.not_helpful_count += 1;\n dispatch(manualGetPromotionSiteReview(newReview));\n setOpen(false);\n };\n\n return (\n <>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => setOpen(true)}\n startIcon={<ThumbDown />}\n >\n Not Helpful\n </Button>\n <Dialog onClose={() => setOpen(false)} open={open}>\n <DialogTitle>\n Create Account\n <IconButton\n aria-label=\"close\"\n onClick={() => setOpen(false)}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n color: 'secondary.main',\n }}\n >\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n Before we can mark this review as not helpful you need to create an account, so that we know you're not a robot :)\n </DialogContentText>\n <SignUpForm\n handleSuccess={handleSuccess}\n formExtrasData={{ partner_not_helpfuls_attributes: [{ promotion_site_review_id: promotionSiteReview.id }] }}\n snackExtraData={{ variant: 'success', message: 'Review successfully marked as not helpful' }}\n extraBtnText=\"and Mark as Not Helpful\"\n />\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default NotHelpfulSignUp;\n","import React from 'react';\nimport { Badge, Box, Rating, Typography } from '@mui/material';\nimport { AccessTime, Person, Star } from '@mui/icons-material';\nimport { PromotionSiteReview } from '../../store/promotion-site-reviews/promotionSiteReviewsSlice';\nimport { isLoggedInPartner } from '../../store/current-partner/currentPartnerSlice';\nimport { useAppSelector } from '../../app/hooks';\nimport EditReviewDialog from './EditReview';\nimport HelpfulButton from './HelpfulButton';\nimport HelpfulSignUp from './HelpfulSignUp';\nimport NotHelpfulButton from './NotHelpfulButton';\nimport NotHelpfulSignUp from './NotHelpfulSignUp';\n\nconst SinglePromotionSiteReview = function ({ review }: { review: PromotionSiteReview }) {\n const partnerLoggedIn = useAppSelector(isLoggedInPartner);\n\n return (\n <Box key={review.id} sx={{ width: '100%', mb: 5 }}>\n <Box sx={{ display: 'flex', alignItems: { xs: 'flex-start', sm: 'center' }, mb: 1, flexDirection: { xs: 'column', sm: 'row' } }}>\n <Rating value={review.stars} readOnly emptyIcon={<Star style={{ opacity: 0.55 }} fontSize=\"inherit\" />} />\n <Box sx={{ display: 'flex', mt: { xs: '0.25rem', sm: 0 }, ml: { xs: 0, sm: 2 } }}>\n <Person fontSize='small' color=\"primary\" sx={{ mr: '0.25rem' }} />\n <Typography variant=\"body2\" color=\"text.secondary\"><b>{review.name}</b></Typography>\n </Box>\n <Box sx={{ display: 'flex', mt: { xs: '0.25rem', sm: 0 }, ml: { xs: 0, sm: 2 } }}>\n <AccessTime fontSize='small' color=\"primary\" sx={{ mr: '0.25rem' }} />\n <Typography variant=\"body2\" color=\"text.secondary\">{review.created_at_time_ago}</Typography>\n </Box>\n </Box>\n <Typography variant=\"body1\"><b>{review.title}</b></Typography>\n <Typography variant=\"body2\">{review.review_body}</Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', mt: 2 }}>\n {partnerLoggedIn && review.owned_by_current_partner\n ? <EditReviewDialog review={review} />\n : (\n <>\n <Box sx={{ mr: 2 }} component=\"span\">\n <Badge badgeContent={review.helpful_count} color=\"info\">\n {partnerLoggedIn\n ? <HelpfulButton id={review.id} existingHelpful={review.current_partner_marked_helpful} />\n : <HelpfulSignUp promotionSiteReview={review} />\n }\n </Badge>\n </Box>\n <Badge badgeContent={review.not_helpful_count} color=\"info\">\n {partnerLoggedIn\n ? <NotHelpfulButton id={review.id} existingNotHelpful={review.current_partner_marked_not_helpful} />\n : <NotHelpfulSignUp promotionSiteReview={review} />\n }\n </Badge>\n </>\n )\n }\n </Box>\n </Box>\n )\n};\n\nexport default SinglePromotionSiteReview;\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":["Helmet","metaContent","schema","title","url","description","ogImage","currentOgImage","height","property","content","rel","href","type","JSON","stringify","map","sch","defaultProps","Copyright","variant","color","align","Date","getFullYear","formExtrasData","handleSuccess","snackExtraData","extraSetFormErrors","extraBtnText","noFormElement","dispatch","useAppDispatch","useState","formErrors","setFormErrors","email","setEmail","password","setPassword","passwordConfirmation","setPasswordConfirmation","submitting","setSubmitting","handleSubmit","event","preventDefault","cookies","Cookies","signUpData","password_confirmation","referrer_id","get","signup_source","signUpPartner","unwrap","then","FacebookPixel","RedditPixel","ReactGA","category","action","send_to","process","addSnack","push","catch","error","errors","finally","component","noValidate","onSubmit","sx","width","marginTop","theme","margin","required","fullWidth","label","name","autoComplete","length","helperText","join","autoFocus","value","onChange","e","target","onClick","loading","endIcon","loadingPosition","style","container","item","xs","to","my","mt","id","siteName","React","open","setOpen","setTitle","stars","setStars","setName","promotionSiteId","reviewBody","setReviewBody","createPromotionSiteReview","resourceType","review_body","promotion_site_id","message","onClose","spacing","display","justifyContent","localErrors","setLocalErrors","newErrors","Object","keys","forEach","key","newKey","replace","emptyIcon","opacity","fontSize","newValue","multiline","minRows","promotionSite","useDispatch","promotion_site_reviews_attributes","position","right","top","manualGetPromotionSiteReview","created_at","toISOString","created_at_time_ago","helpful_count","not_helpful_count","current_partner_marked_helpful","current_partner_marked_not_helpful","owned_by_current_partner","getPromotionSite","review","updatePromotionSiteReview","Button","Dialog","DialogTitle","DialogContent","Grid","ReviewForm","Box","LoadingButton","Save","existingHelpful","createPartnerHelpful","promotion_site_review_id","data","full_messages","size","disabled","startIcon","ThumbUp","promotionSiteReview","IconButton","Close","DialogContentText","SignUpForm","newReview","partner_helpfuls_attributes","existingNotHelpful","createPartnerNotHelpful","ThumbDown","partner_not_helpfuls_attributes","partnerLoggedIn","useAppSelector","isLoggedInPartner","mb","alignItems","sm","flexDirection","Rating","readOnly","Star","ml","Person","mr","Typography","AccessTime","EditReview","Badge","badgeContent","slugCase","token","trimNonWhitespaceCharacters","toLowerCase","camelize","str","word","index","toUpperCase","textToTrim","trim","parameterize","text"],"sourceRoot":""}