{"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&apos;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&apos;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&apos;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":""}