{"version":3,"file":"static/chunks/187-6c6c924914e38d43.js","mappings":"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","sources":["webpack://_N_E/./src/clients/plume.ts","webpack://_N_E/./src/redux/typedUtils.ts","webpack://_N_E/./src/redux/features/user.ts","webpack://_N_E/./src/redux/hooks.ts","webpack://_N_E/../../packages/service-eligibility/src/insurance/index.ts","webpack://_N_E/../../packages/service-eligibility/src/insurance/purchases.ts","webpack://_N_E/../../packages/ui/src/Input/Input.tsx"],"sourcesContent":["import { STATES } from \"@repo/service-eligibility/insurance\";\nimport dobToAge from \"dob-to-age\";\n\nimport { ServiceType } from \"../../../../packages/service-eligibility/src/user\";\nimport {\n stringifyPronounSet,\n User,\n UserDeviceInfo,\n} from \"../redux/features/user\";\n\ninterface Contact {\n cdate: string;\n email: string;\n firstName: string;\n id: string;\n lastName: string;\n phone: string;\n udate: string;\n}\n\ninterface FieldValue {\n cdate: string;\n contact: string;\n field: string;\n id: string;\n udate: string;\n value: string;\n}\n\nexport interface UpsertContactResponse {\n contact: Contact;\n fieldValues: FieldValue[];\n}\n\nconst ActiveCampaignServiceType: Record = {\n estrogen: \"Estrogen+\",\n letter: \"Letter\",\n testosterone: \"Testosterone\",\n};\n\nexport const upsertContact = async (\n user: Partial,\n isUpdateExpected: boolean = false,\n): Promise => {\n const stateName = STATES.find(\n (state) => state.abbreviation === user.stateOfResidence,\n )?.name;\n\n const pronounsList = user.pronouns?.map(stringifyPronounSet) ?? [];\n if (user.additionalPronouns) pronounsList.push(user.additionalPronouns);\n const pronouns = pronounsList.join(\" \");\n\n const plan =\n user.selectedPurchaseOption?.purchaseOptionType === \"clinical\"\n ? user.selectedPurchaseOption?.clinicalType\n : user.selectedPurchaseOption?.purchaseOptionType;\n\n const requestBody = {\n age: user.dob ? dobToAge(user.dob) : undefined,\n dateOfBirth: user.dob,\n email: user.email,\n firstName: user.personalName,\n hasMedicaid: user.medicaid,\n howDidYouHearAboutUs: user.referralSource ?? \"\",\n id: user.activeCampaignId,\n lastName: user.surname,\n marketingOptIn: user.hasOptedIntoMarketing,\n planSelected: plan ? ActiveCampaignServiceType[plan] : \"None\",\n pronouns,\n stateOfResidence: stateName ?? \"\",\n };\n\n const baseUrl = process.env.NEXT_PUBLIC_PLUME_API;\n const searchParams = new URLSearchParams({\n isUpdateExpected: String(isUpdateExpected),\n });\n\n const body = JSON.stringify(requestBody);\n\n const response = await fetch(\n `${baseUrl}/contacts?${searchParams.toString()}`,\n {\n body,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n },\n );\n\n return (await response.json()) as UpsertContactResponse;\n};\n\n// User device endpoint, used to save device info for server-side package purchase event\nexport const upsertUserDevice = async (\n userDeviceInfo: UserDeviceInfo,\n): Promise => {\n const baseUrl = process.env.NEXT_PUBLIC_PLUME_API;\n\n await fetch(`${baseUrl}/data/user-device`, {\n body: JSON.stringify(userDeviceInfo),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n};\n","import {\n asyncThunkCreator,\n buildCreateSlice,\n createAsyncThunk,\n} from \"@reduxjs/toolkit\";\n\nimport { AppDispatch, RootState } from \"./store\";\n\n// `buildCreateSlice` allows us to create a slice with async thunks.\nexport const createAppSlice = buildCreateSlice({\n creators: { asyncThunk: asyncThunkCreator },\n});\n\nexport const createAppAsyncThunk = createAsyncThunk.withTypes<{\n dispatch: AppDispatch;\n extra: unknown;\n rejectValue: string;\n state: RootState;\n}>();\n","import { createAsyncThunk, PayloadAction } from \"@reduxjs/toolkit\";\nimport { getTodayForDateInput } from \"@repo/ui/Input\";\nimport dobToAge from \"dob-to-age\";\nimport { z, ZodIssueCode } from \"zod\";\n\nimport { PURCHASE_OPTION_TYPES } from \"../../../../../packages/service-eligibility/src/insurance/purchases\";\nimport { upsertContact, upsertUserDevice } from \"../../clients/plume\";\nimport { createAppAsyncThunk, createAppSlice } from \"../typedUtils\";\n\nconst refineDob = (value: string) => {\n const age = dobToAge(value);\n return age > 0 && age < 120;\n};\n\nconst refineZip = (value: string) => /^\\d{5}(?:[-\\s]\\d{4})?$/.test(value);\n\nexport const pronounSetSchema = z.object({\n id: z.number(),\n objective: z.string(),\n possessive: z.string(),\n subjective: z.string(),\n});\nexport type PronounSet = z.infer;\n\nexport const stringifyPronounSet = (pronounSet: PronounSet) =>\n `${pronounSet.subjective}/${pronounSet.objective}/${pronounSet.possessive}`;\n\nexport const CLINICAL_TYPES = [\"testosterone\", \"estrogen\"] as const;\nexport type ClinicalType = (typeof CLINICAL_TYPES)[number];\n\nexport const eligibilityDetailsSchema = z.object({\n dob: z.string().refine(refineDob, \"fields.dob.errorMessage\"),\n email: z.string().min(1, \"required\").email(\"fields.email.errorMessage\"),\n hasOptedIntoMarketing: z.boolean(),\n insuranceName: z.string().optional(),\n medicaid: z.boolean(),\n personalName: z.string().min(1, \"required\"),\n stateOfResidence: z.string().min(1, \"required\"), // this is state abbreviation, not full name\n surname: z.string().min(1, \"required\"),\n});\nexport type EligibilityDetails = z.infer;\n\nexport const selectedPurchaseOptionSchema = z.object({\n clinicalType: z.enum(CLINICAL_TYPES).nullish(),\n price: z.number().nullish(),\n priceId: z.string(),\n priceType: z.enum([\"one_time\", \"recurring\"]),\n purchaseOptionType: z.enum(PURCHASE_OPTION_TYPES),\n});\nexport type SelectedPurchaseOption = z.infer<\n typeof selectedPurchaseOptionSchema\n>;\n\nexport const contactDetailsSchema = z.object({\n activeCampaignId: z.string(),\n});\nexport type ContactDetails = z.infer;\n\nconst addressSchema = z.object({\n addressLine1: z.string().min(1, \"required\"),\n addressLine2: z.string().optional(),\n city: z.string().min(1, \"required\"),\n zip: z\n .string()\n .min(1, \"required\")\n .refine(refineZip, \"fields.zip.errorMessage\"),\n});\n\nexport const RelationshipsToHolder = [\n \"self\",\n \"partner\",\n \"child\",\n \"other\",\n] as const;\n\n// it'd be nice to define validations on this schema but Zod has trouble .merge()'ing\n// when the entire thing is marked .optional(), which would be needed to make these validations\n// conditional on another field (here, relationToPolicyholder)\nexport const insuranceDetailsPolicyholderSchema = z.object({\n policyholderAddressLine1: z.string(),\n policyholderAddressLine2: z.string().optional(),\n policyholderCity: z.string(),\n policyholderDob: z.string(),\n policyholderPersonalName: z.string(),\n policyholderState: z.string(),\n policyholderSurname: z.string(),\n policyholderZip: z.string(),\n});\n\nexport const insuranceDetailsSchema = z\n .object({\n groupId: z.string().min(1, \"required\"),\n isPolicyholderAddressSame: z.boolean(),\n memberId: z.string().min(1, \"required\"),\n relationToPolicyholder: z.enum(RelationshipsToHolder),\n })\n .merge(insuranceDetailsPolicyholderSchema)\n .superRefine((insuranceDetails, ctx) => {\n // if the policyholder fields are active, perform validations on them manually\n if (insuranceDetails.relationToPolicyholder !== \"self\") {\n const requiredIdentityFields = insuranceDetailsPolicyholderSchema.pick({\n policyholderDob: true,\n policyholderPersonalName: true,\n policyholderSurname: true,\n });\n requiredIdentityFields.keyof().options.forEach((policyholderField) => {\n const fieldValue = insuranceDetails[policyholderField];\n if (fieldValue.length === 0) {\n ctx.addIssue({\n code: ZodIssueCode.too_small,\n inclusive: true,\n message: \"required\",\n minimum: 1,\n path: [policyholderField],\n type: \"string\",\n });\n }\n });\n }\n if (!insuranceDetails.isPolicyholderAddressSame) {\n const requiredAddressFields = insuranceDetailsPolicyholderSchema.pick({\n policyholderAddressLine1: true,\n policyholderCity: true,\n policyholderState: true,\n policyholderZip: true,\n });\n requiredAddressFields.keyof().options.forEach((policyholderField) => {\n const fieldValue = insuranceDetails[policyholderField];\n if (policyholderField.includes(\"Zip\") && !refineZip(fieldValue)) {\n ctx.addIssue({\n code: ZodIssueCode.custom,\n message: \"fields.policyholderZip.errorMessage\",\n path: [policyholderField],\n });\n } else if (fieldValue.length === 0) {\n ctx.addIssue({\n code: ZodIssueCode.too_small,\n inclusive: true,\n message: \"required\",\n minimum: 1,\n path: [policyholderField],\n type: \"string\",\n });\n }\n });\n }\n });\n\nexport type InsuranceDetails = z.infer;\n\nexport const userDetailsSchema = z\n .object({\n additionalPronouns: z.string().optional(),\n hasAcceptedTerms: z\n .boolean()\n .refine((value) => !!value, { message: \"required\" }),\n legalPersonalName: z.string(),\n legalSurname: z.string(),\n pronouns: z.array(pronounSetSchema),\n referralSource: z.string().min(1, \"required\"),\n usePersonalNameForLegalName: z.boolean(),\n })\n .merge(addressSchema)\n .superRefine((userDetails, ctx) => {\n const nameFields: (keyof Pick<\n typeof userDetails,\n \"legalPersonalName\" | \"legalSurname\"\n >)[] = [\"legalPersonalName\", \"legalSurname\"];\n nameFields.forEach((nameField) => {\n if (\n !userDetails.usePersonalNameForLegalName &&\n userDetails[nameField].length === 0\n ) {\n ctx.addIssue({\n code: ZodIssueCode.too_small,\n inclusive: true,\n message: \"required\",\n minimum: 1,\n path: [nameField],\n type: \"string\",\n });\n }\n });\n });\n\nexport type UserDetails = z.infer;\n\nexport const userDeviceInfoSchema = z.object({\n deviceId: z.string(),\n fbclid: z.string().optional(),\n gclid: z.string().optional(),\n sessionId: z.string(),\n userId: z.string(),\n});\nexport type UserDeviceInfo = z.infer;\n\nexport const purchaseDetailsSchema = z.object({\n stripeCustomerId: z.string(),\n stripeSessionId: z.string(),\n});\n\nexport type PurchaseDetails = z.infer;\n\nexport type User = {\n selectedPurchaseOption: SelectedPurchaseOption;\n} & ({ insuranceDetails: InsuranceDetails } & ContactDetails &\n EligibilityDetails &\n PurchaseDetails &\n UserDetails);\n\nexport const NO_INSURANCE_SELECTED = \"none\";\n\nexport const initialState = {\n activeCampaignId: \"\",\n additionalPronouns: \"\",\n addressLine1: \"\",\n addressLine2: \"\",\n city: \"\",\n dob: getTodayForDateInput(),\n email: \"\",\n hasAcceptedTerms: false,\n hasOptedIntoMarketing: true,\n insuranceDetails: {\n groupId: \"\",\n isPolicyholderAddressSame: true,\n memberId: \"\",\n policyholderAddressLine1: \"\",\n policyholderAddressLine2: \"\",\n policyholderCity: \"\",\n policyholderDob: \"\",\n policyholderPersonalName: \"\",\n policyholderState: \"\",\n policyholderSurname: \"\",\n policyholderZip: \"\",\n relationToPolicyholder: \"self\",\n },\n insuranceName: NO_INSURANCE_SELECTED,\n legalPersonalName: \"\",\n legalSurname: \"\",\n medicaid: false,\n personalName: \"\",\n pronouns: [],\n referralSource: \"\",\n selectedPurchaseOption: {\n clinicalType: null,\n priceId: \"\",\n priceType: \"recurring\",\n purchaseOptionType: \"clinical\",\n },\n stateOfResidence: \"\",\n stripeCustomerId: \"\",\n stripeSessionId: \"\",\n surname: \"\",\n usePersonalNameForLegalName: false,\n zip: \"\",\n} satisfies Partial as Partial;\n\nexport const userSlice = createAppSlice({\n extraReducers: (builder) => {\n builder.addCase(upsertActiveCampaignContact.fulfilled, (state, action) => {\n state.activeCampaignId = action.payload.contact.id;\n });\n },\n initialState,\n name: \"user\",\n reducers: {\n updateContactDetails: (state, action: PayloadAction) => {\n return { ...state, ...action.payload };\n },\n updateEligibility: (state, action: PayloadAction) => {\n const userChangedState =\n state.stateOfResidence &&\n state.stateOfResidence !== action.payload.stateOfResidence;\n\n if (userChangedState) {\n return {\n ...state,\n insuranceDetails: initialState.insuranceDetails,\n insuranceName: NO_INSURANCE_SELECTED,\n selectedPurchaseOption: initialState.selectedPurchaseOption,\n ...action.payload,\n };\n }\n\n return { ...state, ...action.payload };\n },\n updateInsurance: (state, action: PayloadAction) => {\n state.insuranceDetails = action.payload;\n },\n updatePurchaseDetails: (\n state,\n action: PayloadAction>,\n ) => {\n return { ...state, ...action.payload };\n },\n updateSelectedPurchaseOption: (\n state,\n action: PayloadAction,\n ) => {\n state.selectedPurchaseOption = action.payload;\n\n // insurance isn't applicable for letter purchases so we clear it\n // we also clear clinical type (in case user switches from clinical to letter)\n if (action.payload.purchaseOptionType === \"letter\") {\n state.insuranceName = NO_INSURANCE_SELECTED;\n state.insuranceDetails = initialState.insuranceDetails;\n state.selectedPurchaseOption.clinicalType = null;\n }\n },\n updateUser: (state, action: PayloadAction) => {\n return { ...state, ...action.payload };\n },\n },\n});\n\n// isUpdateExpected is a temporary flag to help diagnose CP-1208\nexport const upsertActiveCampaignContact = createAppAsyncThunk(\n \"user/upsertActiveCampaignContact\",\n async (isUpdateExpected: boolean = false, { getState }) => {\n const { user } = getState();\n return upsertContact(user, isUpdateExpected);\n },\n);\n\nexport const upsertUserDeviceInfo = createAsyncThunk(\n \"user/upsertUserDevice\",\n async (deviceInfo: UserDeviceInfo): Promise => {\n await upsertUserDevice(deviceInfo);\n },\n);\n","import { useDispatch, useSelector, useStore } from \"react-redux\";\n\nimport type { AppDispatch, AppStore, RootState } from \"./store\";\n\n// These are typed versions of the expected redux hooks for our specific state interface\nexport const useAppDispatch = useDispatch.withTypes();\nexport const useAppSelector = useSelector.withTypes();\nexport const useAppStore = useStore.withTypes();\n","import states from \"states-us\";\n\nimport content from \"./insurance-rules.json\";\n\ntype Node = (typeof content.nodes)[number];\n\nexport const STATES = states.filter((state) => !state.territory);\n\nconst replaceQuotes = (str?: string) => {\n return str?.replaceAll('\"', \"\");\n};\n\nconst getInputIdByField = (node: Node, field: string) => {\n return node.content?.inputs?.find((input) => input.field === field)?.id;\n};\n\nconst getNodeByName = (nodes: Node[], name: string) => {\n return nodes.find((node) => node.name === name);\n};\n\nconst getInsuranceListByState = (\n rules: Record[],\n insuranceId: string,\n stateId: string,\n state: string,\n) => {\n const rule = rules.find((rule) => {\n return Object.values(rule).map(replaceQuotes).includes(state);\n });\n if (!rule) return;\n const insuranceListString = rule[insuranceId];\n\n if (!insuranceListString) return;\n\n return insuranceListString.split(\",\").map(replaceQuotes);\n};\n\nexport const getEligibleInsurancesForState = (state: null | string) => {\n const defaultList = [] as const;\n\n if (!state) return defaultList;\n\n const insuranceNode = getNodeByName(content.nodes, \"insurance eligibility\");\n if (!insuranceNode) return defaultList;\n\n const insuranceId = getInputIdByField(insuranceNode, \"insuranceName\");\n if (!insuranceId) return defaultList;\n const stateId = getInputIdByField(insuranceNode, \"stateOfResidence\");\n\n if (!stateId) return defaultList;\n if (!insuranceNode.content?.rules) return defaultList;\n if (!Array.isArray(insuranceNode.content.rules)) return defaultList;\n if (insuranceNode.content.rules.length === 0) return defaultList;\n\n const insuranceList = getInsuranceListByState(\n insuranceNode.content.rules,\n insuranceId,\n stateId,\n state,\n );\n\n if (!insuranceList) return defaultList;\n\n return insuranceList;\n};\n\nexport const getEligibleInsurancesByState = () => {\n return STATES.reduce((acc, state) => {\n const insurances = getEligibleInsurancesForState(state.abbreviation);\n return { ...acc, [state.abbreviation]: insurances };\n }, {}) as Record;\n};\n","import { z } from \"zod\";\n\nexport const EligiblePurchaseSchema = z.object({\n insuranceName: z.string().nullish(),\n stateOfResidence: z.string().nullish(),\n});\n\nexport type EligiblePurchasesInput = z.infer;\n// each purchase option has a corresponding lookup key, which maps to a stripe price\n// in stripe. This allows us to update to new prices dynamically in the stripe UI without\n// making code updates.\n// https://docs.stripe.com/products-prices/manage-prices#lookup-keys\nexport type PurchaseOption = {\n lookupKey: string;\n};\n\nexport const PURCHASE_OPTION_TYPES = [\"clinical\", \"letter\"] as const;\nexport type PurchaseOptionType = (typeof PURCHASE_OPTION_TYPES)[number];\n\nexport type EligiblePurchasesOutput = {\n purchaseOptions: Record;\n stateAcceptsInsurance: boolean;\n};\n","import {\n Input as HeadlessInput,\n type InputProps as HeadlessInputProps,\n} from \"@headlessui/react\";\nimport { clsx } from \"clsx\";\n\nconst dateTypes = [\"date\", \"datetime-local\", \"month\", \"time\", \"week\"] as const;\ntype DateType = (typeof dateTypes)[number];\n\nexport const getTodayForDateInput = () => new Date().toISOString().slice(0, 10);\n\ntype InputTypes =\n | \"email\"\n | \"number\"\n | \"password\"\n | \"search\"\n | \"tel\"\n | \"text\"\n | \"url\"\n | DateType;\n\nexport type InputProps = {\n innerRef?: React.Ref;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n type: InputTypes;\n value?: V;\n} & Omit;\n\nconst Input = function ({\n className,\n innerRef,\n leftIcon,\n rightIcon,\n value,\n ...props\n}: InputProps) {\n // Due to some weirdness with date inputs on safari, we have to manually set\n // the placeholder to today's date to get a consistent UX between safari\n // and other browsers.\n const valueIsPlaceholder = !value || value === getTodayForDateInput();\n return (\n \n \n \n );\n};\n\nexport default Input;\n"],"names":["ActiveCampaignServiceType","estrogen","letter","testosterone","upsertContact","user","STATES","isUpdateExpected","stateName","find","state","abbreviation","stateOfResidence","name","pronounsList","pronouns","map","stringifyPronounSet","additionalPronouns","push","join","plan","selectedPurchaseOption","purchaseOptionType","clinicalType","requestBody","age","dob","dobToAge","undefined","dateOfBirth","email","firstName","personalName","hasMedicaid","medicaid","howDidYouHearAboutUs","referralSource","id","activeCampaignId","lastName","surname","marketingOptIn","hasOptedIntoMarketing","planSelected","searchParams","URLSearchParams","String","body","JSON","stringify","response","fetch","process","concat","toString","headers","method","json","upsertUserDevice","userDeviceInfo","createAppSlice","buildCreateSlice","creators","asyncThunk","asyncThunkCreator","createAppAsyncThunk","createAsyncThunk","withTypes","refineZip","test","value","pronounSetSchema","z","object","number","objective","string","possessive","subjective","pronounSet","CLINICAL_TYPES","eligibilityDetailsSchema","refine","min","boolean","insuranceName","optional","selectedPurchaseOptionSchema","enum","nullish","price","priceId","priceType","PURCHASE_OPTION_TYPES","addressSchema","addressLine1","addressLine2","city","zip","RelationshipsToHolder","insuranceDetailsPolicyholderSchema","policyholderAddressLine1","policyholderAddressLine2","policyholderCity","policyholderDob","policyholderPersonalName","policyholderState","policyholderSurname","policyholderZip","insuranceDetailsSchema","groupId","isPolicyholderAddressSame","memberId","relationToPolicyholder","merge","superRefine","insuranceDetails","ctx","requiredIdentityFields","pick","keyof","options","forEach","fieldValue","policyholderField","length","addIssue","code","ZodIssueCode","too_small","inclusive","message","minimum","path","type","requiredAddressFields","includes","custom","userDetailsSchema","hasAcceptedTerms","legalPersonalName","legalSurname","array","usePersonalNameForLegalName","userDetails","nameFields","nameField","deviceId","fbclid","gclid","sessionId","userId","stripeCustomerId","stripeSessionId","NO_INSURANCE_SELECTED","initialState","getTodayForDateInput","userSlice","extraReducers","builder","addCase","upsertActiveCampaignContact","fulfilled","action","payload","contact","reducers","updateContactDetails","updateEligibility","updateInsurance","updatePurchaseDetails","updateSelectedPurchaseOption","updateUser","getState","arguments","upsertUserDeviceInfo","deviceInfo","useAppDispatch","useDispatch","useAppSelector","useSelector","useStore","states","filter","territory","dateTypes","Date","toISOString","slice","__webpack_exports__","Z","param","className","innerRef","leftIcon","rightIcon","props","valueIsPlaceholder","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__","jsx","span","clsx","data-slot","HeadlessInput","maxLength","ref"],"sourceRoot":""}