{"version":3,"file":"index.7986f282.js","sources":["../../src/types.ts","../../src/store.ts","../../src/components/lockup.tsx","../../src/components/primary-button.tsx","../../src/api/index.ts","../../src/hooks/index.ts","../../src/components/confirmation-formik.tsx","../../src/components/confirmation-step.tsx","../../src/components/phone-number-input.tsx","../../src/shared.ts","../../src/components/terms-of-service.tsx","../../src/components/user-info-formik.tsx","../../src/components/user-info-formik-with-email.tsx","../../src/components/initial-step.tsx","../../src/components/success-step.tsx","../../src/App.tsx","../../src/lib/index.ts","../../src/lib/constants.ts","../../src/components/app-container.tsx","../../src/main.tsx"],"sourcesContent":["export interface ConfirmationFormValues {\n code: string;\n phone_number: string;\n}\n\nexport interface UserInfoFormikValues {\n email?: string;\n tosConsent: boolean;\n phone?: string;\n}\n\nexport interface VerifyPhoneAttributes extends UserInfoFormikValues {\n domain: string;\n user_id: string;\n optin_method: string;\n phone_number: string;\n}\n\nexport interface CreateUserAttributes extends ConfirmationFormValues {\n user_id: string;\n optin_method: string;\n domain: string;\n phone_number: string;\n}\n\nexport enum WorkflowStep {\n Initial,\n Confirm,\n Success,\n}\n\nexport type DisplayType = \"modal\" | \"page\";\n","import create from \"zustand\";\nimport { WorkflowStep } from \"./types\";\n\ntype OptInState = {\n step: WorkflowStep;\n setStep: (newStep: WorkflowStep) => void;\n submissionError?: string;\n confirmationError?: string;\n phoneNumber?: string;\n setPhoneNumber: (phoneNumber: string) => void;\n setSubmissionError: (error: string) => void;\n setConfirmationError: (error: string) => void;\n container: {\n width: number;\n };\n setContainer: (width: number) => void;\n};\n\nexport const useOptInStore = create((set) => ({\n step: WorkflowStep.Initial,\n confirmationError: undefined,\n submissionError: undefined,\n phoneNumber: undefined,\n setStep: (step) => set(() => ({ step })),\n setConfirmationError: (error) => set(() => ({ confirmationError: error })),\n setSubmissionError: (error) => set(() => ({ submissionError: error })),\n container: {\n width: 0,\n },\n setContainer: (width) => set(() => ({ container: { width } })),\n setPhoneNumber: (phoneNumber) => set(() => ({ phoneNumber })),\n}));\n","import React from \"react\";\n\nfunction Logo() {\n return (\n \n Powered by Repeat\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport function Lockup() {\n return (\n
\n
\n \n \n \n
\n
\n );\n}\n","import React from \"react\";\nimport cc from \"classcat\";\n\ninterface PrimaryButtonProps extends React.ComponentProps<\"button\"> {\n children: React.ReactNode;\n className?: string;\n loading?: boolean;\n disabled?: boolean;\n}\n\nexport function PrimaryButton(props: PrimaryButtonProps) {\n const { children, disabled, loading, className, ...rest } = props;\n\n const buttonClass = cc([\n \"border-radius-primary inline-flex items-center px-4 py-2 border border-transparent body !font-medium rounded-md shadow-sm cta-text bg-primary focus-primary focus-primary-border\",\n {\n \"opacity-50\": disabled || loading,\n \"cursor-not-allowed\": disabled,\n \"cursor-wait\": loading,\n },\n className,\n ]);\n\n return (\n \n );\n}\n","import { VerifyPhoneAttributes, CreateUserAttributes } from \"../types\";\nimport wretch, { WretcherError } from \"wretch\";\n\nconst API_BASE_URL =\n (import.meta.env.VITE_API_BASE_URL as string) || \"http://localhost:3000\";\nconst apiClient = wretch(API_BASE_URL).errorType(\"json\");\n\nexport function sendVerifyCode(values: VerifyPhoneAttributes) {\n return apiClient\n .url(`/api/public/users.sendVerifyCode`)\n .post(values)\n .json()\n .catch((err: WretcherError) => {\n throw new Error(err?.json?.error?.detail || \"Phone number rejected.\");\n });\n}\n\nexport function createUserFromCheckout(values: CreateUserAttributes) {\n return apiClient\n .url(`/api/public/users.createFromCheckout`)\n .post(values)\n .json();\n}\n","import { useMutation, UseMutationOptions } from \"react-query\";\n\nimport { sendVerifyCode, createUserFromCheckout } from \"../api\";\nimport { useOptInStore } from \"../store\";\nimport { WretcherResponse, WretcherError } from \"wretch\";\n\nexport const BREAKPOINT = 480;\n\nexport function useSubmitUserInfo(\n options: UseMutationOptions\n) {\n // @ts-ignore\n return useMutation(sendVerifyCode, options);\n}\n\nexport function useConfirmCode(options: UseMutationOptions) {\n // @ts-ignore\n return useMutation(createUserFromCheckout, options);\n}\n\nexport function useContainerSize() {\n const width = useOptInStore((state) => state.container.width);\n return width < BREAKPOINT ? \"mobile\" : \"desktop\";\n}\n","import React from \"react\";\nimport { ErrorMessage, Field, Form, Formik, FormikHelpers } from \"formik\";\nimport { object, string } from \"yup\";\nimport cc from \"classcat\";\n\nimport { ConfirmationFormValues } from \"../types\";\nimport { PrimaryButton } from \"./primary-button\";\nimport { useContainerSize } from \"../hooks\";\nimport { useOptInStore } from \"../store\";\n\ninterface ConfirmationFormikProps {\n error?: string;\n onSubmit: (\n values: ConfirmationFormValues,\n formikHelpers: FormikHelpers\n ) => Promise;\n}\n\nconst initialValues: ConfirmationFormValues = {\n code: \"\",\n phone_number: \"\",\n};\n\nconst confirmationSchema = object().shape({\n code: string()\n .required(\"Please enter a valid 6-digit verification code\")\n .length(6, \"Verification code must be 6 digits.\"),\n});\n\nexport function ConfirmationFormik(props: ConfirmationFormikProps) {\n const size = useContainerSize();\n const phoneNumber = useOptInStore((state) => state.phoneNumber) || \"\";\n const onSubmit = (\n values: ConfirmationFormValues,\n helpers: FormikHelpers\n ) => props.onSubmit({ ...values, phone_number: phoneNumber }, helpers);\n\n return (\n \n {({ isSubmitting }) => (\n
\n
\n \n
\n
\n \n \n
\n \n
\n \n {isSubmitting ? \"Confirming...\" : \"Confirm\"}\n \n
\n \n
\n )}\n \n );\n}\n","import React from \"react\";\nimport { useOptInStore } from \"../store\";\nimport { ConfirmationFormValues } from \"../types\";\nimport { ConfirmationFormik } from \"./confirmation-formik\";\n\ninterface ConfirmationStepProps {\n onSubmit: (values: ConfirmationFormValues) => Promise;\n}\n\nexport function ConfirmationStep(props: ConfirmationStepProps) {\n const error = useOptInStore((state) => state.confirmationError);\n const phoneNumber = useOptInStore((state) => state.phoneNumber);\n const formattedPhoneNumber = phoneNumber?.replace(\n /(\\d)(\\d{3})(\\d{3})(\\d{4})/,\n \"+$1 ($2) $3-$4\"\n );\n\n return (\n
\n
\n

Almost Done!

\n

\n A 6-digit verification code was sent to {formattedPhoneNumber}. Please\n enter it below to confirm sign up.\n

\n
\n
\n \n
\n
\n );\n}\n","import React from \"react\";\nimport { useField, Field } from \"formik\";\nimport InputMask from \"react-input-mask\";\n\ninterface PhoneNumberInputProps {\n name: string;\n}\n\nconst rawMask = `+1 (___) ___-____`;\n\nexport function PhoneNumberInput(props: PhoneNumberInputProps) {\n const [field, , helpers] = useField(props.name);\n\n return (\n ) => {\n const rawValue = e.target.value;\n if (!rawValue || (rawValue === rawMask && !field.value)) {\n helpers.setValue(\"\");\n return;\n }\n\n const justTheDigits = rawValue.match(/\\d+/g)?.map(String).join(\"\");\n helpers.setValue(justTheDigits);\n }}\n className=\"border-radius-primary w-full h-full border-[#C9CCCF] focus-primary focus-primary-border placeholder-subdued text-body\"\n name={props.name}\n />\n );\n}\n","import { string, boolean } from \"yup\";\n// @ts-ignore\nimport phone from \"phone\";\n\nexport const emailValidationAtom = {\n email: string().email().required(\"Please enter a valid email address.\"),\n};\n\nexport const baseUserInfoValidationSchema = {\n tosConsent: boolean().oneOf(\n [true],\n \"Please check box above to accept Terms of Service and Privacy Policy.\"\n ),\n phone: string()\n .required(\"Please enter a phone number\")\n .test(\n \"is-valid-phone\",\n \"Please enter a valid phone number in the field above.\",\n function (value) {\n const validated = phone(value);\n return validated && validated.length > 0;\n }\n ),\n};\n","import Markdown from \"markdown-to-jsx\";\nimport React from \"react\";\nimport { UserInfoFormikValues } from \"../types\";\n\ninterface TermsOfServiceProps {\n name: string;\n privacyUrl: string;\n tosUrl: string;\n termsOfService: string;\n}\n\nconst MarkdownAnchor: React.FC = (props) => {\n return ;\n};\n\nexport function TermsOfService(props: TermsOfServiceProps) {\n if (props.termsOfService !== \"\") {\n return (\n \n {props.termsOfService}\n \n );\n }\n\n return (\n \n I agree to receive automated text messages at the phone number provided.\n For more information, see {props.name}'s{\" \"}\n \n Terms of Service\n {\" \"}\n and{\" \"}\n \n Privacy Policy\n \n .\n \n );\n}\n","import React from \"react\";\n\nimport { Formik, Form, Field, ErrorMessage } from \"formik\";\nimport { object } from \"yup\";\nimport cc from \"classcat\";\n\nimport { PrimaryButton } from \"./primary-button\";\nimport { PhoneNumberInput } from \"./phone-number-input\";\n\nimport { UserInfoFormikValues } from \"../types\";\nimport { useContainerSize } from \"../hooks\";\nimport { baseUserInfoValidationSchema } from \"../shared\";\nimport { useOptInStore } from \"../store\";\nimport { TermsOfService } from \"./terms-of-service\";\n\nconst validationSchema = object().shape({ ...baseUserInfoValidationSchema });\n\ninterface UserInfoFormikProps {\n onSubmit: (values: UserInfoFormikValues) => Promise;\n name: string;\n privacyUrl: string;\n tosUrl: string;\n phone: string;\n termsOfService: string;\n}\n\nexport function UserInfoFormik(props: UserInfoFormikProps) {\n const size = useContainerSize();\n const confirmationError = useOptInStore((state) => state.confirmationError);\n const setPhoneNumber = useOptInStore((state) => state.setPhoneNumber);\n const onSubmit = async (opts: UserInfoFormikValues) => {\n setPhoneNumber(opts.phone || \"\");\n await props.onSubmit(opts);\n };\n\n return (\n \n {({ isSubmitting }) => (\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n
\n
\n \n
\n
\n \n
\n \n
\n \n
\n
\n
\n \n {isSubmitting ? \"Submitting...\" : \"Next Step\"}\n \n
\n
\n \n
\n {confirmationError && (\n

{confirmationError}

\n )}\n \n
\n )}\n \n );\n}\n","import React from \"react\";\nimport { Formik, Form, Field, ErrorMessage } from \"formik\";\nimport { object } from \"yup\";\n\nimport { UserInfoFormikValues } from \"../types\";\nimport { PrimaryButton } from \"./primary-button\";\nimport { PhoneNumberInput } from \"./phone-number-input\";\n\nimport { baseUserInfoValidationSchema, emailValidationAtom } from \"../shared\";\n\nconst validationSchema = object().shape({\n ...baseUserInfoValidationSchema,\n ...emailValidationAtom,\n});\n\ninterface UserInfoFormikProps {\n onSubmit: (values: UserInfoFormikValues) => Promise;\n name: string;\n privacyUrl: string;\n phone?: string;\n tosUrl: string;\n}\n\nexport function UserInfoFormikWithEmail(props: UserInfoFormikProps) {\n const phoneNumberInitialValues: UserInfoFormikValues = {\n email: \"\",\n tosConsent: false,\n phone: props.phone,\n };\n\n let possessiveName = props.name\n ? props.name.endsWith(\"s\")\n ? `${props.name}'`\n : `${props.name}'s`\n : \"the\";\n\n return (\n \n {({ isSubmitting }) => (\n
\n
\n
\n
\n \n
\n \n \n
\n
\n
\n \n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n \n I agree to receive automated text messages at the\n phone number provided. For more information, see{\" \"}\n {possessiveName}{\" \"}\n \n Terms of Service\n {\" \"}\n and{\" \"}\n \n Privacy Policy\n \n .\n \n \n
\n
\n \n
\n
\n
\n
\n \n {isSubmitting ? \"Submitting...\" : \"Next Step\"}\n \n
\n
\n
\n )}\n \n );\n}\n","import React from \"react\";\nimport { useOptInStore } from \"../store\";\nimport { DisplayType, UserInfoFormikValues } from \"../types\";\nimport { UserInfoFormik } from \"./user-info-formik\";\nimport { UserInfoFormikWithEmail } from \"./user-info-formik-with-email\";\n\ninterface InitialStepProps {\n name: string;\n privacyUrl: string;\n tosUrl: string;\n phone: string;\n discountText: string;\n showDiscountText: boolean;\n title: string;\n body: string;\n termsOfService: string;\n display: DisplayType;\n onSubmit: (values: UserInfoFormikValues) => Promise;\n}\n\nexport function InitialStep(props: InitialStepProps) {\n const submissionError = useOptInStore((state) => state.submissionError);\n return (\n
\n
\n

{props.title}

\n

{props.body}

\n
\n {submissionError && (\n

{submissionError}

\n )}\n {props.showDiscountText && (\n
\n
\n

{props.discountText}

\n
\n
\n )}\n
\n {props.display === \"page\" && (\n \n )}\n {props.display === \"modal\" && (\n \n )}\n
\n
\n );\n}\n","import React, { useEffect } from \"react\";\nimport { PrimaryButton } from \"./primary-button\";\n\nexport function SuccessStep() {\n function transmitFinished() {\n window.parent.postMessage(\n {\n event: \"workflowComplete\",\n },\n \"*\"\n );\n }\n\n const handleClose = () => {\n transmitFinished();\n };\n\n return (\n
\n
\n

Success!

\n

\n We'll be in touch when it's time to reorder.\n

\n Close\n
\n
\n );\n}\n","import React from \"react\";\nimport queryString from \"query-string\";\nimport cc from \"classcat\";\n\nimport { Lockup } from \"./components/lockup\";\nimport { ConfirmationStep } from \"./components/confirmation-step\";\nimport { InitialStep } from \"./components/initial-step\";\nimport { SuccessStep } from \"./components/success-step\";\nimport { useConfirmCode, useContainerSize, useSubmitUserInfo } from \"./hooks\";\nimport { useOptInStore } from \"./store\";\nimport {\n ConfirmationFormValues,\n DisplayType,\n UserInfoFormikValues,\n WorkflowStep,\n} from \"./types\";\nimport { hexToRgb } from \"./lib\";\nimport { DEFAULT_BODY, DEFAULT_TITLE } from \"./lib/constants\";\n\nfunction App() {\n const size = useContainerSize();\n\n const parsed = queryString.parse(location.search);\n const { display = \"modal\" as DisplayType } = parsed;\n const domain = parsed.domain as string;\n const name = parsed.name as string;\n const tos_url = parsed.tos_url as string;\n const policy_url = parsed.policy_url as string;\n const user_id = parsed.user_id as string;\n const phone = String(parsed.phone);\n const optin_method = String(display);\n const primary_button_text_color = String(\n parsed.primary_button_text_color || \"#ffffff\"\n );\n const colorRgb = hexToRgb(String(parsed.color));\n const color = colorRgb ? `${colorRgb.r}, ${colorRgb.g}, ${colorRgb.b}` : null;\n const font_family = String(parsed.font_family || \"\");\n const font_weight = String(parsed.font_weight || \"\");\n const font_css_url = String(parsed.font_css_url || \"\");\n const font_style = String(parsed.font_style || \"\");\n const button_preference = parsed.button_preference || \"rounded\";\n const show_discount_text = parsed.show_discount_text === \"true\";\n const discount_text = String(parsed.discount_text);\n const body = String(parsed.body || DEFAULT_BODY);\n const title = String(parsed.title || DEFAULT_TITLE);\n const terms_of_service = String(parsed.terms_of_service || \"\");\n const show_repeat_logo = parsed.show_repeat_logo === \"true\";\n\n color && document.documentElement.style.setProperty(\"--brand-color\", color);\n\n document.documentElement.style.setProperty(\n \"--brand-cta-text\",\n primary_button_text_color\n );\n\n font_family !== \"\" &&\n document.documentElement.style.setProperty(\n `--brand-font-family`,\n `\"${font_family}\"`\n );\n\n font_weight !== \"\" &&\n document.documentElement.style.setProperty(\n `--brand-font-weight`,\n `${font_weight}`\n );\n\n font_style !== \"\" &&\n document.documentElement.style.setProperty(\n `--brand-font-style`,\n `${font_style}`\n );\n\n const borderRadius = button_preference === \"rounded\" ? \"0.25rem\" : \"0px\";\n const borderRadiusSmall =\n button_preference === \"rounded\" ? \"0.125rem\" : \"0px\";\n\n document.documentElement.style.setProperty(\n `--brand-border-style`,\n `${borderRadius}`\n );\n\n document.documentElement.style.setProperty(\n `--brand-border-style-sm`,\n `${borderRadiusSmall}`\n );\n\n const stylesheetLink = document.querySelector(`link[href=\"${font_css_url}\"]`);\n\n if (!stylesheetLink && font_css_url !== \"\") {\n const newLink = document.createElement(\"link\");\n newLink.href = font_css_url;\n newLink.rel = \"stylesheet\";\n document.head.appendChild(newLink);\n }\n\n const { step, setStep, setSubmissionError, setConfirmationError } =\n useOptInStore();\n\n const { mutateAsync } = useSubmitUserInfo({\n onSuccess: () => {\n setStep(WorkflowStep.Confirm);\n },\n onError: (e) => {\n let message = (e as Error).message;\n setSubmissionError(message);\n },\n });\n\n const { mutateAsync: confirmMutateAsync } = useConfirmCode({\n onMutate: () => {\n // Clear the existing confirmation error, helpful for consecutive submits.\n setConfirmationError(\"\");\n },\n onSuccess: () => {\n setStep(WorkflowStep.Success);\n },\n onError: () => {\n setConfirmationError(\n \"The verification code you've entered is incorrect.\"\n );\n },\n });\n\n const handleSubmitUserInfo = async (values: UserInfoFormikValues) => {\n await mutateAsync({\n ...values,\n phone_number: values.phone || \"\",\n domain,\n user_id,\n optin_method,\n });\n };\n\n const handleConfirmation = async (values: ConfirmationFormValues) => {\n await confirmMutateAsync({\n ...values,\n user_id,\n optin_method,\n domain,\n });\n };\n\n const containerClass = cc([\n {\n \"wrap-modal\": display === \"modal\",\n \"wrap-page\": display === \"page\",\n },\n ]);\n\n const responsiveClass = cc([\n { \"is-desktop\": size === \"desktop\", \"is-mobile\": size === \"mobile\" },\n ]);\n\n return (\n
\n
\n {step === WorkflowStep.Initial && (\n \n )}\n {step === WorkflowStep.Confirm && (\n \n )}\n {step === WorkflowStep.Success && }\n
\n {show_repeat_logo && }\n
\n );\n}\n\nexport default App;\n","export function hexToRgb(hex: string) {\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n}\n","export const DEFAULT_TITLE = \"Never run out of the products you love\";\nexport const DEFAULT_BODY = `Make things easy with personalized replenishment reminders and\n seamless reordering. We’ll follow up via text - you tell us if you’re\n ready for more (or not).`;\n","import React, { useEffect, useRef } from \"react\";\nimport useMeasure from \"react-use-measure\";\nimport queryString from \"query-string\";\n\nimport { useOptInStore } from \"../store\";\nimport App from \"../App\";\n\nexport function AppContainer() {\n const parsed = queryString.parse(location.search);\n const { display } = parsed;\n\n function ModalWrap() {\n const [ref, { height, width }] = useMeasure();\n const widthRef = useRef(width);\n const [layoutLoaded, setLayoutLoaded] = React.useState(false);\n const setContainer = useOptInStore((state) => state.setContainer);\n\n useEffect(() => {\n if (width > 0) {\n setContainer(width);\n widthRef.current = width;\n }\n\n window.parent.postMessage(\n {\n event: \"modalSizeChange\",\n width,\n height,\n },\n \"*\"\n );\n }, [width, height]);\n\n useEffect(() => {\n if (!layoutLoaded) {\n if (width && widthRef.current && width === widthRef.current) {\n setLayoutLoaded(true);\n }\n }\n }, [layoutLoaded, setLayoutLoaded, width, widthRef]);\n\n return
{layoutLoaded && }
;\n }\n\n if (display === \"page\") {\n return ;\n } else {\n return ;\n }\n}\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { QueryClient, QueryClientProvider } from \"react-query\";\n\nimport \"./index.css\";\n\nimport { AppContainer } from \"./components/app-container\";\n\nconst queryClient = new QueryClient();\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n"],"names":["WorkflowStep","WorkflowStep2","useOptInStore","create","set","step","Initial","confirmationError","submissionError","phoneNumber","setStep","setConfirmationError","error","setSubmissionError","container","width","setContainer","setPhoneNumber","className","role","viewBox","version","d","fill","id","height","href","target","Logo","props","_a","children","disabled","loading","rest","buttonClass","cc","__spreadProps","apiClient","wretch","errorType","values","url","post","json","catch","err","Error","detail","state","initialValues","code","phone_number","confirmationSchema","object","shape","string","required","length","size","useContainerSize","Formik","initialErrors","onSubmit","helpers","validateOnChange","validateOnBlur","validationSchema","enableReinitialize","isSubmitting","Form","htmlFor","Field","placeholder","name","maxLength","type","ErrorMessage","component","PrimaryButton","formattedPhoneNumber","replace","ConfirmationFormik","field","useField","InputMask","mask","value","onChange","e","rawValue","setValue","justTheDigits","match","map","String","join","emailValidationAtom","email","baseUserInfoValidationSchema","tosConsent","boolean","oneOf","phone","test","validated","MarkdownAnchor","__spreadValues","termsOfService","Markdown","options","overrides","a","tosUrl","privacyUrl","async","opts","TermsOfService","PhoneNumberInput","phoneNumberInitialValues","possessiveName","endsWith","title","body","showDiscountText","discountText","display","UserInfoFormikWithEmail","UserInfoFormik","onClick","parent","postMessage","event","parsed","queryString","parse","location","search","domain","tos_url","policy_url","user_id","phone2","optin_method","primary_button_text_color","colorRgb","hex","color","result","exec","r","parseInt","g","b","font_family","font_weight","font_css_url","font_style","button_preference","show_discount_text","discount_text","terms_of_service","show_repeat_logo","document","documentElement","style","setProperty","borderRadius","borderRadiusSmall","querySelector","newLink","createElement","rel","head","appendChild","mutateAsync","useMutation","sendVerifyCode","onSuccess","Confirm","onError","message","confirmMutateAsync","createUserFromCheckout","useConfirmCode","onMutate","Success","containerClass","responsiveClass","InitialStep","ConfirmationStep","SuccessStep","Lockup","ref","useMeasure","widthRef","useRef","layoutLoaded","setLayoutLoaded","React","useState","current","App","ModalWrap","queryClient","QueryClient","ReactDOM","render","StrictMode","QueryClientProvider","client","AppContainer","getElementById"],"mappings":"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"}