@anker-in/headless-ui 1.3.41-alpha.1784792113239 → 1.3.41-alpha.1784792494281
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/biz-components/NotifyMeDialog/NotifyMeDialog.js +1 -1
- package/dist/cjs/biz-components/NotifyMeDialog/NotifyMeDialog.js.map +3 -3
- package/dist/esm/biz-components/NotifyMeDialog/NotifyMeDialog.js +1 -1
- package/dist/esm/biz-components/NotifyMeDialog/NotifyMeDialog.js.map +3 -3
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";"use client";var
|
|
1
|
+
"use strict";"use client";var re=Object.create;var T=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ne=Object.getPrototypeOf,se=Object.prototype.hasOwnProperty;var me=(r,l)=>{for(var u in l)T(r,u,{get:l[u],enumerable:!0})},$=(r,l,u,m)=>{if(l&&typeof l=="object"||typeof l=="function")for(let o of ie(l))!se.call(r,o)&&o!==u&&T(r,o,{get:()=>l[o],enumerable:!(m=le(l,o))||m.enumerable});return r};var ce=(r,l,u)=>(u=r!=null?re(ne(r)):{},$(l||!r||!r.__esModule?T(u,"default",{value:r,enumerable:!0}):u,r)),pe=r=>$(T({},"__esModule",{value:!0}),r);var ge={};me(ge,{default:()=>fe});module.exports=pe(ge);var e=require("react/jsx-runtime"),s=require("react"),t=require("../../components/index.js"),d=require("../../helpers/index.js"),de=ce(require("react")),G=require("../../hooks/useExposure.js"),q=require("../AiuiProvider/index.js"),w=require("../../shared/track.js");const v="copy",k="NotifyMeDialog",ue=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,j=({open:r,onOpenChange:l,copy:u,classNames:m,checkboxes:o=[],subscriptionMeta:C,onSubmit:S})=>{const{title:_,subTitle:b,emailLabel:A="Email address",emailPlaceholder:F="your@email.com",submitBtnText:N="Notify Me",errorEmpty:W,errorInvalidEmail:X,errorCheckboxRequired:J,errorSubmit:M="Something went wrong. Please try again.",errorSubmitDetail:K,successTitle:Q,successDesc:H,successBtnText:B}=u,L=de.useRef(null),{trackingData:z}=(0,q.useAiuiContext)();(0,G.useExposure)(L,{componentType:v,componentName:k,componentTitle:_,componentDescription:b});const[h,I]=(0,s.useState)(""),[D,P]=(0,s.useState)(()=>o.map(()=>!1)),[f,x]=(0,s.useState)("idle"),[U,E]=(0,s.useState)(()=>o.map(()=>!1)),[n,g]=(0,s.useState)("idle"),[R,y]=(0,s.useState)(null),V=R?K?.find(a=>a.code===R)?.message??M:M,Y=n!=="loading"&&n!=="success",Z=(0,s.useCallback)(a=>{const c=o[a];c&&(0,w.gaTrack)({event:"ga4Event",event_name:"component_click",event_parameters:{page_group:z.pageGroup||"Home Page",component_type:v,component_name:k,button_name:c.label,component_title:_,component_description:b||""}}),P(p=>{const i=[...p];return i[a]=!i[a],i}),E(p=>{const i=[...p];return i[a]=!1,i}),f!=="idle"&&x("idle"),n==="error-submit"&&(g("idle"),y(null))},[f,n]),O=(0,s.useCallback)(a=>{I(a.target.value),f!=="idle"&&x("idle"),E(c=>c.some(Boolean)?c.map(()=>!1):c),n==="error-submit"&&(g("idle"),y(null))},[f,n]),ee=(0,s.useCallback)(async()=>{(0,w.gaTrack)({event:"ga4Event",event_name:"component_click",event_parameters:{page_group:z.pageGroup||"Home Page",component_type:v,component_name:k,button_name:N,component_title:_,component_description:b||""}});let a=!1;h.trim()?ue.test(h.trim())?x("idle"):(x("error-format"),a=!0):(x("error-empty"),a=!0);const c=o.map((p,i)=>p.label&&p.required&&!D[i]?(a=!0,!0):!1);if(E(c),!a){g("loading");try{const p=o.map((i,oe)=>i.checkbox_id!==void 0?{checkbox_id:i.checkbox_id,checked:D[oe]}:null).filter(i=>i!==null);await S({email:h.trim(),checkedItems:p,meta:C}),g("success")}catch(p){const i=p&&typeof p=="object"&&"code"in p?String(p.code):null;y(i),g("error-submit")}}},[h,o,D,C,S]);(0,s.useEffect)(()=>{if(n!=="error-submit")return;const a=setTimeout(()=>{g("idle"),y(null)},3e3);return()=>clearTimeout(a)},[n]);const te=(0,s.useCallback)(a=>{a||(I(""),P(o.map(()=>!1)),x("idle"),E(o.map(()=>!1)),g("idle"),y(null)),l(a)},[o,l]),ae=o.some(a=>a.label);return(0,e.jsx)(t.Dialog,{open:r,onOpenChange:te,children:(0,e.jsxs)(t.DialogContent,{ref:L,"aria-describedby":"notify-me-content",className:(0,d.cn)("laptop:max-w-[480px] laptop:[&_.dialog-close-icon]:size-6 laptop:gap-8 rounded-box laptop:p-8 max-h-[90vh] w-[calc(100%-32px)] gap-6 overflow-y-auto bg-white p-6 [&_.dialog-close-icon]:size-5",m?.root),children:[n!=="success"&&(0,e.jsxs)(t.DialogHeader,{className:(0,d.cn)(m?.header),children:[(0,e.jsx)(t.DialogTitle,{children:(0,e.jsx)(t.Heading,{as:"h2",size:2,className:(0,d.cn)("text-info-primary text-center font-bold",m?.title),children:_})}),b&&(0,e.jsx)(t.DialogDescription,{asChild:!0,children:(0,e.jsx)(t.Text,{as:"p",className:(0,d.cn)("text-info-primary laptop:text-base mt-1 text-center text-sm",m?.subTitle),children:b})})]}),n==="success"?(0,e.jsxs)("div",{className:(0,d.cn)("flex flex-col items-center text-center",m?.successText),children:[(0,e.jsx)("div",{className:"flex size-20 items-center justify-center",children:(0,e.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"80",height:"80",viewBox:"0 0 80 80",fill:"none",children:[(0,e.jsx)("circle",{cx:"40",cy:"40",r:"35",fill:"#30D158"}),(0,e.jsx)("path",{d:"M23.3333 38.3333L36.6666 50L56.6666 30",stroke:"white",strokeWidth:"6.66667",strokeLinecap:"round",strokeLinejoin:"round"})]})}),(0,e.jsxs)("div",{className:"mt-4",children:[(0,e.jsx)(t.Heading,{as:"h3",size:2,className:"text-info-primary font-bold",children:Q}),H&&(0,e.jsx)(t.Text,{as:"p",className:"text-info-primary laptop:text-base mt-1 text-sm",children:H})]}),B&&(0,e.jsx)(t.Button,{variant:"primary",size:"lg",onClick:()=>l(!1),className:"laptop:mt-8 mt-6 w-full",children:B})]}):(0,e.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,e.jsxs)("div",{className:m?.emailInput,children:[(0,e.jsx)(t.Text,{as:"label",htmlFor:"notify-me-email",className:"text-info-primary laptop:text-base mb-2 block text-sm",children:A}),(0,e.jsx)(t.Input,{id:"notify-me-email",type:"email",placeholder:F,value:h,onChange:O,disabled:n==="loading",className:(0,d.cn)("placeholder:text-info-tertiary text-info-primary laptop:h-[54px] laptop:text-base laptop:p-4 border-lines-1 h-[44px] w-full bg-white p-3 text-sm font-bold placeholder:font-bold focus-visible:!outline-none",f!=="idle"&&"border-error-0")}),f==="error-empty"&&(0,e.jsx)(t.Text,{as:"p",className:"text-error-0 laptop:text-base mt-2 text-sm",children:W}),f==="error-format"&&(0,e.jsx)(t.Text,{as:"p",className:"text-error-0 laptop:text-base mt-2 text-sm",children:X})]}),ae&&(0,e.jsx)("div",{className:(0,d.cn)("laptop:gap-4 flex flex-col gap-2",m?.checkboxes),children:o.map((a,c)=>a.label?(0,e.jsxs)("div",{children:[(0,e.jsxs)("label",{className:(0,d.cn)("text-info-tertiary flex cursor-pointer items-start gap-2",m?.checkboxItem),children:[(0,e.jsx)(t.Checkbox,{checked:D[c],onCheckedChange:()=>Z(c),"data-headless-type-name":`${v}#${k}`,"data-headless-title-desc-button":`''#''#${a.label}`,"data-headless-nav-position":"''#1",disabled:n==="loading",className:"border-info-secondary data-[state=checked]:bg-info-secondary mt-0.5 shrink-0"}),(0,e.jsx)(t.Text,{as:"span",className:"text-info-tertiary laptop:text-base [&_a]:text-brand-0 text-sm leading-snug [&_a]:underline",html:a.label})]}),U[c]&&(0,e.jsx)(t.Text,{as:"p",className:"text-error-0 laptop:text-base mt-2 text-sm",children:J})]},c):null)}),(0,e.jsx)(t.Button,{variant:"primary",size:"lg",loading:n==="loading",disabled:!Y,onClick:ee,className:(0,d.cn)("w-full",m?.submitBtn),"data-headless-type-name":`${v}#${k}`,"data-headless-title-desc-button":`''#''#${N}`,"data-headless-nav-position":"''#1",children:N}),n==="error-submit"&&(0,e.jsx)(t.Text,{as:"p",className:(0,d.cn)("text-error-0 laptop:text-base text-sm",m?.errorText),children:V})]})]})})};j.displayName="NotifyMeDialog";var fe=j;
|
|
2
2
|
//# sourceMappingURL=NotifyMeDialog.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/biz-components/NotifyMeDialog/NotifyMeDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n Button,\n Text,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n Input,\n Checkbox,\n Heading,\n} from '../../components/index.js'\nimport { cn } from '../../helpers/index.js'\nimport type { NotifyMeDialogProps } from './types.js'\nimport * as React from 'react'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\nimport { gaTrack } from '../../shared/track.js'\n\nconst componentType = 'copy'\nconst componentName = 'NotifyMeDialog'\n\ntype EmailState = 'idle' | 'error-empty' | 'error-format'\ntype SubmitState = 'idle' | 'loading' | 'success' | 'error-submit'\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nconst NotifyMeDialog = ({\n open,\n onOpenChange,\n copy,\n classNames,\n checkboxes = [],\n subscriptionMeta,\n onSubmit,\n}: NotifyMeDialogProps) => {\n const {\n title,\n subTitle,\n emailLabel = 'Email address',\n emailPlaceholder = 'your@email.com',\n submitBtnText = 'Notify Me',\n errorEmpty,\n errorInvalidEmail,\n errorCheckboxRequired,\n errorSubmit = 'Something went wrong. Please try again.',\n errorSubmitDetail,\n successTitle,\n successDesc,\n successBtnText,\n } = copy\n\n const notifyMeDialogRef = React.useRef<HTMLDivElement>(null)\n const { trackingData } = useAiuiContext()\n useExposure(notifyMeDialogRef, {\n componentType,\n componentName,\n componentTitle: title,\n componentDescription: subTitle,\n })\n\n const [email, setEmail] = useState('')\n const [checkedStates, setCheckedStates] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [emailState, setEmailState] = useState<EmailState>('idle')\n const [checkboxErrors, setCheckboxErrors] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [submitState, setSubmitState] = useState<SubmitState>('idle')\n const [errorCode, setErrorCode] = useState<string | null>(null)\n\n // \u6839\u636E\u9519\u8BEF\u7801\u5339\u914D\u5BF9\u5E94\u6587\u6848\uFF0C\u672A\u5339\u914D\u5230\u5219\u56DE\u9000\u5230 errorSubmit\n const resolvedErrorMessage = errorCode\n ? (errorSubmitDetail?.find(d => d.code === errorCode)?.message ?? errorSubmit)\n : errorSubmit\n\n // \u662F\u5426\u53EF\u4EE5\u70B9\u51FB\u63D0\u4EA4\uFF08loading/success \u65F6\u7981\u7528\uFF09\n const canSubmit = submitState !== 'loading' && submitState !== 'success'\n\n // checkbox \u72B6\u6001\u53D8\u5316\n const updateCheckedState = useCallback(\n (index: number) => {\n setCheckedStates(prev => {\n const next = [...prev]\n next[index] = !next[index]\n return next\n })\n // \u6E05\u9664\u5F53\u524D checkbox \u7684\u9519\u8BEF\u72B6\u6001\n setCheckboxErrors(prev => {\n const next = [...prev]\n next[index] = false\n return next\n })\n // \u6E05\u9664\u90AE\u7BB1\u9519\u8BEF\u548C\u63D0\u4EA4\u9519\u8BEF\n if (emailState !== 'idle') setEmailState('idle')\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n // \u90AE\u7BB1\u8F93\u5165\u53D8\u5316\n const handleEmailChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value)\n if (emailState !== 'idle') setEmailState('idle')\n setCheckboxErrors(prev => (prev.some(Boolean) ? prev.map(() => false) : prev))\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n /**\n * \u5BA2\u6237\u7AEF onSubmit \u8C03\u7528\u793A\u4F8B\n *\n * \u63A5\u53E3\u5931\u8D25\u65F6\u9700 throw { code } \u4EE5\u4FBF\u7EC4\u4EF6\u6309 errorSubmitDetail \u5339\u914D\u5BF9\u5E94\u63D0\u793A\u6587\u6848\uFF0C\n * code \u4E3A number \u7C7B\u578B\u65F6\u7EC4\u4EF6\u4F1A\u81EA\u52A8\u8F6C\u4E3A string \u8FDB\u884C\u5339\u914D\u3002\n *\n * @example\n * const handleNotifyMeSubmit = useCallback(\n * async (params) => {\n * const { email, checkedItems, meta } = params\n * const res = await fetch('/api/multipass/shopifyservices/product_arrival_notices', {\n * method: 'POST',\n * headers: {\n * 'Content-Type': 'application/json',\n * 'current-language': locale,\n * },\n * body: JSON.stringify({\n * email,\n * locale,\n * sku: variant.sku,\n * shop: shop.primaryDomain?.host,\n * }),\n * })\n * if (res.ok) {\n * if (checkedItems?.some?.((item) => item.checked && item.checkbox_id === 'subscribe')) {\n * subscribe({ email, dealsType: 'outStockNotify_subscribe_emails' })\n * }\n * } else {\n * throw { code: res.status }\n * }\n * },\n * [locale, variant.sku, shop.primaryDomain?.host, subscribe],\n * )\n */\n // \u70B9\u51FB\u63D0\u4EA4\n const handleSubmit = useCallback(async () => {\n // \u70B9\u51FB\u63D0\u4EA4\u57CB\u70B9\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingData.pageGroup || 'Home Page',\n component_type: componentType,\n component_name: componentName,\n button_name: submitBtnText,\n component_title: title,\n component_description: subTitle || '',\n },\n })\n\n let hasError = false\n\n // \u6821\u9A8C\u90AE\u7BB1\u975E\u7A7A\n if (!email.trim()) {\n setEmailState('error-empty')\n hasError = true\n } else if (!EMAIL_REGEX.test(email.trim())) {\n setEmailState('error-format')\n hasError = true\n } else {\n setEmailState('idle')\n }\n\n // \u6821\u9A8C required checkbox\n const newCheckboxErrors = checkboxes.map((cb, i) => {\n if (cb.label && cb.required && !checkedStates[i]) {\n hasError = true\n return true\n }\n return false\n })\n setCheckboxErrors(newCheckboxErrors)\n\n if (hasError) return\n\n setSubmitState('loading')\n try {\n const checkedItems = checkboxes\n .map((cb, i) =>\n cb.checkbox_id !== undefined ? { checkbox_id: cb.checkbox_id!, checked: checkedStates[i] } : null\n )\n .filter((item): item is { checkbox_id: string; checked: boolean } => item !== null)\n await onSubmit({ email: email.trim(), checkedItems, meta: subscriptionMeta })\n setSubmitState('success')\n } catch (err: unknown) {\n const code =\n err && typeof err === 'object' && 'code' in err ? String((err as Record<string, unknown>).code) : null\n setErrorCode(code)\n setSubmitState('error-submit')\n }\n }, [email, checkboxes, checkedStates, subscriptionMeta, onSubmit])\n\n // error-submit 3s \u540E\u81EA\u52A8\u6D88\u5931\n useEffect(() => {\n if (submitState !== 'error-submit') return\n const timer = setTimeout(() => {\n setSubmitState('idle')\n setErrorCode(null)\n }, 3000)\n return () => clearTimeout(timer)\n }, [submitState])\n\n // \u5173\u95ED\u5F39\u7A97\u65F6\u91CD\u7F6E\n const handleOpenChange = useCallback(\n (isOpen: boolean) => {\n if (!isOpen) {\n setEmail('')\n setCheckedStates(checkboxes.map(() => false))\n setEmailState('idle')\n setCheckboxErrors(checkboxes.map(() => false))\n setSubmitState('idle')\n setErrorCode(null)\n }\n onOpenChange(isOpen)\n },\n [checkboxes, onOpenChange]\n )\n\n const hasCheckboxes = checkboxes.some(cb => cb.label)\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n ref={notifyMeDialogRef}\n aria-describedby=\"notify-me-content\"\n className={cn(\n 'laptop:max-w-[480px] laptop:[&_.dialog-close-icon]:size-6 laptop:gap-8 rounded-box laptop:p-8 max-h-[90vh] w-[calc(100%-32px)] gap-6 overflow-y-auto bg-white p-6 [&_.dialog-close-icon]:size-5',\n classNames?.root\n )}\n >\n {submitState !== 'success' && (\n <DialogHeader className={cn(classNames?.header)}>\n <DialogTitle>\n <Heading as=\"h2\" size={2} className={cn('text-info-primary text-center font-bold', classNames?.title)}>\n {title}\n </Heading>\n </DialogTitle>\n {subTitle && (\n <DialogDescription asChild>\n <Text\n as=\"p\"\n className={cn('text-info-primary laptop:text-base mt-1 text-center text-sm', classNames?.subTitle)}\n >\n {subTitle}\n </Text>\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n\n {submitState === 'success' ? (\n <div className={cn('flex flex-col items-center text-center', classNames?.successText)}>\n {/* \u6210\u529F\u56FE\u6807 */}\n <div className=\"flex size-20 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\">\n <circle cx=\"40\" cy=\"40\" r=\"35\" fill=\"#30D158\" />\n <path\n d=\"M23.3333 38.3333L36.6666 50L56.6666 30\"\n stroke=\"white\"\n strokeWidth=\"6.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n <div className=\"mt-4\">\n {/* \u6807\u9898 */}\n <Heading as=\"h3\" size={2} className=\"text-info-primary font-bold\">\n {successTitle}\n </Heading>\n {/* \u526F\u6587\u6848 */}\n {successDesc && (\n <Text as=\"p\" className=\"text-info-primary laptop:text-base mt-1 text-sm\">\n {successDesc}\n </Text>\n )}\n </div>\n {/* \u786E\u8BA4\u6309\u94AE */}\n {successBtnText && (\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={() => onOpenChange(false)}\n className=\"laptop:mt-8 mt-6 w-full\"\n >\n {successBtnText}\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {/* \u90AE\u7BB1\u8F93\u5165\u6846 */}\n <div className={classNames?.emailInput}>\n <Text\n as=\"label\"\n htmlFor=\"notify-me-email\"\n className=\"text-info-primary laptop:text-base mb-2 block text-sm\"\n >\n {emailLabel}\n </Text>\n <Input\n id=\"notify-me-email\"\n type=\"email\"\n placeholder={emailPlaceholder}\n value={email}\n onChange={handleEmailChange}\n disabled={submitState === 'loading'}\n className={cn(\n 'placeholder:text-info-tertiary text-info-primary laptop:h-[54px] laptop:text-base laptop:p-4 border-lines-1 h-[44px] w-full bg-white p-3 text-sm font-bold placeholder:font-bold focus-visible:!outline-none',\n emailState !== 'idle' && 'border-error-0'\n )}\n />\n {emailState === 'error-empty' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorEmpty}\n </Text>\n )}\n {emailState === 'error-format' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorInvalidEmail}\n </Text>\n )}\n </div>\n\n {/* Checkboxes \u5217\u8868 */}\n {hasCheckboxes && (\n <div className={cn('laptop:gap-4 flex flex-col gap-2', classNames?.checkboxes)}>\n {checkboxes.map((cb, i) => {\n if (!cb.label) return null\n return (\n <div key={i}>\n <label\n className={cn(\n 'text-info-tertiary flex cursor-pointer items-start gap-2',\n classNames?.checkboxItem\n )}\n >\n <Checkbox\n checked={checkedStates[i]}\n onCheckedChange={() => updateCheckedState(i)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${cb.label}`}\n data-headless-nav-position={`''#1`}\n disabled={submitState === 'loading'}\n className=\"border-info-secondary data-[state=checked]:bg-info-secondary mt-0.5 shrink-0\"\n />\n <Text\n as=\"span\"\n className=\"text-info-tertiary laptop:text-base [&_a]:text-brand-0 text-sm leading-snug [&_a]:underline\"\n html={cb.label}\n />\n </label>\n {checkboxErrors[i] && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorCheckboxRequired}\n </Text>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n {/* \u63D0\u4EA4\u6309\u94AE */}\n <Button\n variant=\"primary\"\n size=\"lg\"\n loading={submitState === 'loading'}\n disabled={!canSubmit}\n onClick={handleSubmit}\n className={cn('w-full', classNames?.submitBtn)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${submitBtnText}`}\n data-headless-nav-position={`''#1`}\n >\n {submitBtnText}\n </Button>\n\n {/* \u63D0\u4EA4\u9519\u8BEF\uFF08\u5F39\u7A97\u6700\u5E95\u90E8\uFF09 */}\n {submitState === 'error-submit' && (\n <Text as=\"p\" className={cn('text-error-0 laptop:text-base text-sm', classNames?.errorText)}>\n {resolvedErrorMessage}\n </Text>\n )}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nNotifyMeDialog.displayName = 'NotifyMeDialog'\n\nexport default NotifyMeDialog\nexport type { NotifyMeDialogProps }\n"],
|
|
5
|
-
"mappings": "olBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KAAA,eAAAC,GAAAH,
|
|
6
|
-
"names": ["NotifyMeDialog_exports", "__export", "NotifyMeDialog_default", "__toCommonJS", "import_jsx_runtime", "import_react", "import_components", "import_helpers", "React", "import_useExposure", "import_AiuiProvider", "import_track", "componentType", "componentName", "EMAIL_REGEX", "NotifyMeDialog", "open", "onOpenChange", "copy", "classNames", "checkboxes", "subscriptionMeta", "onSubmit", "title", "subTitle", "emailLabel", "emailPlaceholder", "submitBtnText", "errorEmpty", "errorInvalidEmail", "errorCheckboxRequired", "errorSubmit", "errorSubmitDetail", "successTitle", "successDesc", "successBtnText", "notifyMeDialogRef", "trackingData", "email", "setEmail", "checkedStates", "setCheckedStates", "emailState", "setEmailState", "checkboxErrors", "setCheckboxErrors", "submitState", "setSubmitState", "errorCode", "setErrorCode", "resolvedErrorMessage", "d", "canSubmit", "updateCheckedState", "index", "prev", "next", "handleEmailChange", "e", "handleSubmit", "hasError", "newCheckboxErrors", "
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n Button,\n Text,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n Input,\n Checkbox,\n Heading,\n} from '../../components/index.js'\nimport { cn } from '../../helpers/index.js'\nimport type { NotifyMeDialogProps } from './types.js'\nimport * as React from 'react'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\nimport { gaTrack } from '../../shared/track.js'\n\nconst componentType = 'copy'\nconst componentName = 'NotifyMeDialog'\n\ntype EmailState = 'idle' | 'error-empty' | 'error-format'\ntype SubmitState = 'idle' | 'loading' | 'success' | 'error-submit'\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nconst NotifyMeDialog = ({\n open,\n onOpenChange,\n copy,\n classNames,\n checkboxes = [],\n subscriptionMeta,\n onSubmit,\n}: NotifyMeDialogProps) => {\n const {\n title,\n subTitle,\n emailLabel = 'Email address',\n emailPlaceholder = 'your@email.com',\n submitBtnText = 'Notify Me',\n errorEmpty,\n errorInvalidEmail,\n errorCheckboxRequired,\n errorSubmit = 'Something went wrong. Please try again.',\n errorSubmitDetail,\n successTitle,\n successDesc,\n successBtnText,\n } = copy\n\n const notifyMeDialogRef = React.useRef<HTMLDivElement>(null)\n const { trackingData } = useAiuiContext()\n useExposure(notifyMeDialogRef, {\n componentType,\n componentName,\n componentTitle: title,\n componentDescription: subTitle,\n })\n\n const [email, setEmail] = useState('')\n const [checkedStates, setCheckedStates] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [emailState, setEmailState] = useState<EmailState>('idle')\n const [checkboxErrors, setCheckboxErrors] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [submitState, setSubmitState] = useState<SubmitState>('idle')\n const [errorCode, setErrorCode] = useState<string | null>(null)\n\n // \u6839\u636E\u9519\u8BEF\u7801\u5339\u914D\u5BF9\u5E94\u6587\u6848\uFF0C\u672A\u5339\u914D\u5230\u5219\u56DE\u9000\u5230 errorSubmit\n const resolvedErrorMessage = errorCode\n ? (errorSubmitDetail?.find(d => d.code === errorCode)?.message ?? errorSubmit)\n : errorSubmit\n\n // \u662F\u5426\u53EF\u4EE5\u70B9\u51FB\u63D0\u4EA4\uFF08loading/success \u65F6\u7981\u7528\uFF09\n const canSubmit = submitState !== 'loading' && submitState !== 'success'\n\n // checkbox \u72B6\u6001\u53D8\u5316\n const updateCheckedState = useCallback(\n (index: number) => {\n // checkbox \u70B9\u51FB\u57CB\u70B9\n const cb = checkboxes[index]\n if (cb) {\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingData.pageGroup || 'Home Page',\n component_type: componentType,\n component_name: componentName,\n button_name: cb.label,\n component_title: title,\n component_description: subTitle || '',\n },\n })\n }\n\n setCheckedStates(prev => {\n const next = [...prev]\n next[index] = !next[index]\n return next\n })\n // \u6E05\u9664\u5F53\u524D checkbox \u7684\u9519\u8BEF\u72B6\u6001\n setCheckboxErrors(prev => {\n const next = [...prev]\n next[index] = false\n return next\n })\n // \u6E05\u9664\u90AE\u7BB1\u9519\u8BEF\u548C\u63D0\u4EA4\u9519\u8BEF\n if (emailState !== 'idle') setEmailState('idle')\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n // \u90AE\u7BB1\u8F93\u5165\u53D8\u5316\n const handleEmailChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value)\n if (emailState !== 'idle') setEmailState('idle')\n setCheckboxErrors(prev => (prev.some(Boolean) ? prev.map(() => false) : prev))\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n /**\n * \u5BA2\u6237\u7AEF onSubmit \u8C03\u7528\u793A\u4F8B\n *\n * \u63A5\u53E3\u5931\u8D25\u65F6\u9700 throw { code } \u4EE5\u4FBF\u7EC4\u4EF6\u6309 errorSubmitDetail \u5339\u914D\u5BF9\u5E94\u63D0\u793A\u6587\u6848\uFF0C\n * code \u4E3A number \u7C7B\u578B\u65F6\u7EC4\u4EF6\u4F1A\u81EA\u52A8\u8F6C\u4E3A string \u8FDB\u884C\u5339\u914D\u3002\n *\n * @example\n * const handleNotifyMeSubmit = useCallback(\n * async (params) => {\n * const { email, checkedItems, meta } = params\n * const res = await fetch('/api/multipass/shopifyservices/product_arrival_notices', {\n * method: 'POST',\n * headers: {\n * 'Content-Type': 'application/json',\n * 'current-language': locale,\n * },\n * body: JSON.stringify({\n * email,\n * locale,\n * sku: variant.sku,\n * shop: shop.primaryDomain?.host,\n * }),\n * })\n * if (res.ok) {\n * if (checkedItems?.some?.((item) => item.checked && item.checkbox_id === 'subscribe')) {\n * subscribe({ email, dealsType: 'outStockNotify_subscribe_emails' })\n * }\n * } else {\n * throw { code: res.status }\n * }\n * },\n * [locale, variant.sku, shop.primaryDomain?.host, subscribe],\n * )\n */\n // \u70B9\u51FB\u63D0\u4EA4\n const handleSubmit = useCallback(async () => {\n // \u70B9\u51FB\u63D0\u4EA4\u57CB\u70B9\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingData.pageGroup || 'Home Page',\n component_type: componentType,\n component_name: componentName,\n button_name: submitBtnText,\n component_title: title,\n component_description: subTitle || '',\n },\n })\n\n let hasError = false\n\n // \u6821\u9A8C\u90AE\u7BB1\u975E\u7A7A\n if (!email.trim()) {\n setEmailState('error-empty')\n hasError = true\n } else if (!EMAIL_REGEX.test(email.trim())) {\n setEmailState('error-format')\n hasError = true\n } else {\n setEmailState('idle')\n }\n\n // \u6821\u9A8C required checkbox\n const newCheckboxErrors = checkboxes.map((cb, i) => {\n if (cb.label && cb.required && !checkedStates[i]) {\n hasError = true\n return true\n }\n return false\n })\n setCheckboxErrors(newCheckboxErrors)\n\n if (hasError) return\n\n setSubmitState('loading')\n try {\n const checkedItems = checkboxes\n .map((cb, i) =>\n cb.checkbox_id !== undefined ? { checkbox_id: cb.checkbox_id!, checked: checkedStates[i] } : null\n )\n .filter((item): item is { checkbox_id: string; checked: boolean } => item !== null)\n await onSubmit({ email: email.trim(), checkedItems, meta: subscriptionMeta })\n setSubmitState('success')\n } catch (err: unknown) {\n const code =\n err && typeof err === 'object' && 'code' in err ? String((err as Record<string, unknown>).code) : null\n setErrorCode(code)\n setSubmitState('error-submit')\n }\n }, [email, checkboxes, checkedStates, subscriptionMeta, onSubmit])\n\n // error-submit 3s \u540E\u81EA\u52A8\u6D88\u5931\n useEffect(() => {\n if (submitState !== 'error-submit') return\n const timer = setTimeout(() => {\n setSubmitState('idle')\n setErrorCode(null)\n }, 3000)\n return () => clearTimeout(timer)\n }, [submitState])\n\n // \u5173\u95ED\u5F39\u7A97\u65F6\u91CD\u7F6E\n const handleOpenChange = useCallback(\n (isOpen: boolean) => {\n if (!isOpen) {\n setEmail('')\n setCheckedStates(checkboxes.map(() => false))\n setEmailState('idle')\n setCheckboxErrors(checkboxes.map(() => false))\n setSubmitState('idle')\n setErrorCode(null)\n }\n onOpenChange(isOpen)\n },\n [checkboxes, onOpenChange]\n )\n\n const hasCheckboxes = checkboxes.some(cb => cb.label)\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n ref={notifyMeDialogRef}\n aria-describedby=\"notify-me-content\"\n className={cn(\n 'laptop:max-w-[480px] laptop:[&_.dialog-close-icon]:size-6 laptop:gap-8 rounded-box laptop:p-8 max-h-[90vh] w-[calc(100%-32px)] gap-6 overflow-y-auto bg-white p-6 [&_.dialog-close-icon]:size-5',\n classNames?.root\n )}\n >\n {submitState !== 'success' && (\n <DialogHeader className={cn(classNames?.header)}>\n <DialogTitle>\n <Heading as=\"h2\" size={2} className={cn('text-info-primary text-center font-bold', classNames?.title)}>\n {title}\n </Heading>\n </DialogTitle>\n {subTitle && (\n <DialogDescription asChild>\n <Text\n as=\"p\"\n className={cn('text-info-primary laptop:text-base mt-1 text-center text-sm', classNames?.subTitle)}\n >\n {subTitle}\n </Text>\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n\n {submitState === 'success' ? (\n <div className={cn('flex flex-col items-center text-center', classNames?.successText)}>\n {/* \u6210\u529F\u56FE\u6807 */}\n <div className=\"flex size-20 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\">\n <circle cx=\"40\" cy=\"40\" r=\"35\" fill=\"#30D158\" />\n <path\n d=\"M23.3333 38.3333L36.6666 50L56.6666 30\"\n stroke=\"white\"\n strokeWidth=\"6.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n <div className=\"mt-4\">\n {/* \u6807\u9898 */}\n <Heading as=\"h3\" size={2} className=\"text-info-primary font-bold\">\n {successTitle}\n </Heading>\n {/* \u526F\u6587\u6848 */}\n {successDesc && (\n <Text as=\"p\" className=\"text-info-primary laptop:text-base mt-1 text-sm\">\n {successDesc}\n </Text>\n )}\n </div>\n {/* \u786E\u8BA4\u6309\u94AE */}\n {successBtnText && (\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={() => onOpenChange(false)}\n className=\"laptop:mt-8 mt-6 w-full\"\n >\n {successBtnText}\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {/* \u90AE\u7BB1\u8F93\u5165\u6846 */}\n <div className={classNames?.emailInput}>\n <Text\n as=\"label\"\n htmlFor=\"notify-me-email\"\n className=\"text-info-primary laptop:text-base mb-2 block text-sm\"\n >\n {emailLabel}\n </Text>\n <Input\n id=\"notify-me-email\"\n type=\"email\"\n placeholder={emailPlaceholder}\n value={email}\n onChange={handleEmailChange}\n disabled={submitState === 'loading'}\n className={cn(\n 'placeholder:text-info-tertiary text-info-primary laptop:h-[54px] laptop:text-base laptop:p-4 border-lines-1 h-[44px] w-full bg-white p-3 text-sm font-bold placeholder:font-bold focus-visible:!outline-none',\n emailState !== 'idle' && 'border-error-0'\n )}\n />\n {emailState === 'error-empty' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorEmpty}\n </Text>\n )}\n {emailState === 'error-format' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorInvalidEmail}\n </Text>\n )}\n </div>\n\n {/* Checkboxes \u5217\u8868 */}\n {hasCheckboxes && (\n <div className={cn('laptop:gap-4 flex flex-col gap-2', classNames?.checkboxes)}>\n {checkboxes.map((cb, i) => {\n if (!cb.label) return null\n return (\n <div key={i}>\n <label\n className={cn(\n 'text-info-tertiary flex cursor-pointer items-start gap-2',\n classNames?.checkboxItem\n )}\n >\n <Checkbox\n checked={checkedStates[i]}\n onCheckedChange={() => updateCheckedState(i)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${cb.label}`}\n data-headless-nav-position={`''#1`}\n disabled={submitState === 'loading'}\n className=\"border-info-secondary data-[state=checked]:bg-info-secondary mt-0.5 shrink-0\"\n />\n <Text\n as=\"span\"\n className=\"text-info-tertiary laptop:text-base [&_a]:text-brand-0 text-sm leading-snug [&_a]:underline\"\n html={cb.label}\n />\n </label>\n {checkboxErrors[i] && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorCheckboxRequired}\n </Text>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n {/* \u63D0\u4EA4\u6309\u94AE */}\n <Button\n variant=\"primary\"\n size=\"lg\"\n loading={submitState === 'loading'}\n disabled={!canSubmit}\n onClick={handleSubmit}\n className={cn('w-full', classNames?.submitBtn)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${submitBtnText}`}\n data-headless-nav-position={`''#1`}\n >\n {submitBtnText}\n </Button>\n\n {/* \u63D0\u4EA4\u9519\u8BEF\uFF08\u5F39\u7A97\u6700\u5E95\u90E8\uFF09 */}\n {submitState === 'error-submit' && (\n <Text as=\"p\" className={cn('text-error-0 laptop:text-base text-sm', classNames?.errorText)}>\n {resolvedErrorMessage}\n </Text>\n )}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nNotifyMeDialog.displayName = 'NotifyMeDialog'\n\nexport default NotifyMeDialog\nexport type { NotifyMeDialogProps }\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["NotifyMeDialog_exports", "__export", "NotifyMeDialog_default", "__toCommonJS", "import_jsx_runtime", "import_react", "import_components", "import_helpers", "React", "import_useExposure", "import_AiuiProvider", "import_track", "componentType", "componentName", "EMAIL_REGEX", "NotifyMeDialog", "open", "onOpenChange", "copy", "classNames", "checkboxes", "subscriptionMeta", "onSubmit", "title", "subTitle", "emailLabel", "emailPlaceholder", "submitBtnText", "errorEmpty", "errorInvalidEmail", "errorCheckboxRequired", "errorSubmit", "errorSubmitDetail", "successTitle", "successDesc", "successBtnText", "notifyMeDialogRef", "trackingData", "email", "setEmail", "checkedStates", "setCheckedStates", "emailState", "setEmailState", "checkboxErrors", "setCheckboxErrors", "submitState", "setSubmitState", "errorCode", "setErrorCode", "resolvedErrorMessage", "d", "canSubmit", "updateCheckedState", "index", "cb", "prev", "next", "handleEmailChange", "e", "handleSubmit", "hasError", "newCheckboxErrors", "checkedItems", "i", "item", "err", "code", "timer", "handleOpenChange", "isOpen", "hasCheckboxes"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{jsx as t,jsxs as
|
|
1
|
+
"use client";import{jsx as t,jsxs as m}from"react/jsx-runtime";import{useCallback as D,useEffect as re,useState as f}from"react";import{Button as P,Text as c,Dialog as le,DialogContent as ie,DialogHeader as ne,DialogTitle as se,DialogDescription as me,Input as ce,Checkbox as pe,Heading as R}from"../../components/index.js";import{cn as s}from"../../helpers/index.js";import*as de from"react";import{useExposure as ue}from"../../hooks/useExposure.js";import{useAiuiContext as fe}from"../AiuiProvider/index.js";import{gaTrack as $}from"../../shared/track.js";const h="copy",y="NotifyMeDialog",ge=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,j=({open:G,onOpenChange:E,copy:q,classNames:n,checkboxes:i=[],subscriptionMeta:N,onSubmit:w})=>{const{title:v,subTitle:g,emailLabel:A="Email address",emailPlaceholder:F="your@email.com",submitBtnText:T="Notify Me",errorEmpty:W,errorInvalidEmail:X,errorCheckboxRequired:J,errorSubmit:C="Something went wrong. Please try again.",errorSubmitDetail:K,successTitle:Q,successDesc:S,successBtnText:M}=q,H=de.useRef(null),{trackingData:B}=fe();ue(H,{componentType:h,componentName:y,componentTitle:v,componentDescription:g});const[x,L]=f(""),[k,z]=f(()=>i.map(()=>!1)),[p,u]=f("idle"),[U,_]=f(()=>i.map(()=>!1)),[o,d]=f("idle"),[I,b]=f(null),V=I?K?.find(e=>e.code===I)?.message??C:C,Y=o!=="loading"&&o!=="success",Z=D(e=>{const r=i[e];r&&$({event:"ga4Event",event_name:"component_click",event_parameters:{page_group:B.pageGroup||"Home Page",component_type:h,component_name:y,button_name:r.label,component_title:v,component_description:g||""}}),z(l=>{const a=[...l];return a[e]=!a[e],a}),_(l=>{const a=[...l];return a[e]=!1,a}),p!=="idle"&&u("idle"),o==="error-submit"&&(d("idle"),b(null))},[p,o]),O=D(e=>{L(e.target.value),p!=="idle"&&u("idle"),_(r=>r.some(Boolean)?r.map(()=>!1):r),o==="error-submit"&&(d("idle"),b(null))},[p,o]),ee=D(async()=>{$({event:"ga4Event",event_name:"component_click",event_parameters:{page_group:B.pageGroup||"Home Page",component_type:h,component_name:y,button_name:T,component_title:v,component_description:g||""}});let e=!1;x.trim()?ge.test(x.trim())?u("idle"):(u("error-format"),e=!0):(u("error-empty"),e=!0);const r=i.map((l,a)=>l.label&&l.required&&!k[a]?(e=!0,!0):!1);if(_(r),!e){d("loading");try{const l=i.map((a,oe)=>a.checkbox_id!==void 0?{checkbox_id:a.checkbox_id,checked:k[oe]}:null).filter(a=>a!==null);await w({email:x.trim(),checkedItems:l,meta:N}),d("success")}catch(l){const a=l&&typeof l=="object"&&"code"in l?String(l.code):null;b(a),d("error-submit")}}},[x,i,k,N,w]);re(()=>{if(o!=="error-submit")return;const e=setTimeout(()=>{d("idle"),b(null)},3e3);return()=>clearTimeout(e)},[o]);const te=D(e=>{e||(L(""),z(i.map(()=>!1)),u("idle"),_(i.map(()=>!1)),d("idle"),b(null)),E(e)},[i,E]),ae=i.some(e=>e.label);return t(le,{open:G,onOpenChange:te,children:m(ie,{ref:H,"aria-describedby":"notify-me-content",className:s("laptop:max-w-[480px] laptop:[&_.dialog-close-icon]:size-6 laptop:gap-8 rounded-box laptop:p-8 max-h-[90vh] w-[calc(100%-32px)] gap-6 overflow-y-auto bg-white p-6 [&_.dialog-close-icon]:size-5",n?.root),children:[o!=="success"&&m(ne,{className:s(n?.header),children:[t(se,{children:t(R,{as:"h2",size:2,className:s("text-info-primary text-center font-bold",n?.title),children:v})}),g&&t(me,{asChild:!0,children:t(c,{as:"p",className:s("text-info-primary laptop:text-base mt-1 text-center text-sm",n?.subTitle),children:g})})]}),o==="success"?m("div",{className:s("flex flex-col items-center text-center",n?.successText),children:[t("div",{className:"flex size-20 items-center justify-center",children:m("svg",{xmlns:"http://www.w3.org/2000/svg",width:"80",height:"80",viewBox:"0 0 80 80",fill:"none",children:[t("circle",{cx:"40",cy:"40",r:"35",fill:"#30D158"}),t("path",{d:"M23.3333 38.3333L36.6666 50L56.6666 30",stroke:"white",strokeWidth:"6.66667",strokeLinecap:"round",strokeLinejoin:"round"})]})}),m("div",{className:"mt-4",children:[t(R,{as:"h3",size:2,className:"text-info-primary font-bold",children:Q}),S&&t(c,{as:"p",className:"text-info-primary laptop:text-base mt-1 text-sm",children:S})]}),M&&t(P,{variant:"primary",size:"lg",onClick:()=>E(!1),className:"laptop:mt-8 mt-6 w-full",children:M})]}):m("div",{className:"flex flex-col gap-4",children:[m("div",{className:n?.emailInput,children:[t(c,{as:"label",htmlFor:"notify-me-email",className:"text-info-primary laptop:text-base mb-2 block text-sm",children:A}),t(ce,{id:"notify-me-email",type:"email",placeholder:F,value:x,onChange:O,disabled:o==="loading",className:s("placeholder:text-info-tertiary text-info-primary laptop:h-[54px] laptop:text-base laptop:p-4 border-lines-1 h-[44px] w-full bg-white p-3 text-sm font-bold placeholder:font-bold focus-visible:!outline-none",p!=="idle"&&"border-error-0")}),p==="error-empty"&&t(c,{as:"p",className:"text-error-0 laptop:text-base mt-2 text-sm",children:W}),p==="error-format"&&t(c,{as:"p",className:"text-error-0 laptop:text-base mt-2 text-sm",children:X})]}),ae&&t("div",{className:s("laptop:gap-4 flex flex-col gap-2",n?.checkboxes),children:i.map((e,r)=>e.label?m("div",{children:[m("label",{className:s("text-info-tertiary flex cursor-pointer items-start gap-2",n?.checkboxItem),children:[t(pe,{checked:k[r],onCheckedChange:()=>Z(r),"data-headless-type-name":`${h}#${y}`,"data-headless-title-desc-button":`''#''#${e.label}`,"data-headless-nav-position":"''#1",disabled:o==="loading",className:"border-info-secondary data-[state=checked]:bg-info-secondary mt-0.5 shrink-0"}),t(c,{as:"span",className:"text-info-tertiary laptop:text-base [&_a]:text-brand-0 text-sm leading-snug [&_a]:underline",html:e.label})]}),U[r]&&t(c,{as:"p",className:"text-error-0 laptop:text-base mt-2 text-sm",children:J})]},r):null)}),t(P,{variant:"primary",size:"lg",loading:o==="loading",disabled:!Y,onClick:ee,className:s("w-full",n?.submitBtn),"data-headless-type-name":`${h}#${y}`,"data-headless-title-desc-button":`''#''#${T}`,"data-headless-nav-position":"''#1",children:T}),o==="error-submit"&&t(c,{as:"p",className:s("text-error-0 laptop:text-base text-sm",n?.errorText),children:V})]})]})})};j.displayName="NotifyMeDialog";var _e=j;export{_e as default};
|
|
2
2
|
//# sourceMappingURL=NotifyMeDialog.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/biz-components/NotifyMeDialog/NotifyMeDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n Button,\n Text,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n Input,\n Checkbox,\n Heading,\n} from '../../components/index.js'\nimport { cn } from '../../helpers/index.js'\nimport type { NotifyMeDialogProps } from './types.js'\nimport * as React from 'react'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\nimport { gaTrack } from '../../shared/track.js'\n\nconst componentType = 'copy'\nconst componentName = 'NotifyMeDialog'\n\ntype EmailState = 'idle' | 'error-empty' | 'error-format'\ntype SubmitState = 'idle' | 'loading' | 'success' | 'error-submit'\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nconst NotifyMeDialog = ({\n open,\n onOpenChange,\n copy,\n classNames,\n checkboxes = [],\n subscriptionMeta,\n onSubmit,\n}: NotifyMeDialogProps) => {\n const {\n title,\n subTitle,\n emailLabel = 'Email address',\n emailPlaceholder = 'your@email.com',\n submitBtnText = 'Notify Me',\n errorEmpty,\n errorInvalidEmail,\n errorCheckboxRequired,\n errorSubmit = 'Something went wrong. Please try again.',\n errorSubmitDetail,\n successTitle,\n successDesc,\n successBtnText,\n } = copy\n\n const notifyMeDialogRef = React.useRef<HTMLDivElement>(null)\n const { trackingData } = useAiuiContext()\n useExposure(notifyMeDialogRef, {\n componentType,\n componentName,\n componentTitle: title,\n componentDescription: subTitle,\n })\n\n const [email, setEmail] = useState('')\n const [checkedStates, setCheckedStates] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [emailState, setEmailState] = useState<EmailState>('idle')\n const [checkboxErrors, setCheckboxErrors] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [submitState, setSubmitState] = useState<SubmitState>('idle')\n const [errorCode, setErrorCode] = useState<string | null>(null)\n\n // \u6839\u636E\u9519\u8BEF\u7801\u5339\u914D\u5BF9\u5E94\u6587\u6848\uFF0C\u672A\u5339\u914D\u5230\u5219\u56DE\u9000\u5230 errorSubmit\n const resolvedErrorMessage = errorCode\n ? (errorSubmitDetail?.find(d => d.code === errorCode)?.message ?? errorSubmit)\n : errorSubmit\n\n // \u662F\u5426\u53EF\u4EE5\u70B9\u51FB\u63D0\u4EA4\uFF08loading/success \u65F6\u7981\u7528\uFF09\n const canSubmit = submitState !== 'loading' && submitState !== 'success'\n\n // checkbox \u72B6\u6001\u53D8\u5316\n const updateCheckedState = useCallback(\n (index: number) => {\n setCheckedStates(prev => {\n const next = [...prev]\n next[index] = !next[index]\n return next\n })\n // \u6E05\u9664\u5F53\u524D checkbox \u7684\u9519\u8BEF\u72B6\u6001\n setCheckboxErrors(prev => {\n const next = [...prev]\n next[index] = false\n return next\n })\n // \u6E05\u9664\u90AE\u7BB1\u9519\u8BEF\u548C\u63D0\u4EA4\u9519\u8BEF\n if (emailState !== 'idle') setEmailState('idle')\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n // \u90AE\u7BB1\u8F93\u5165\u53D8\u5316\n const handleEmailChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value)\n if (emailState !== 'idle') setEmailState('idle')\n setCheckboxErrors(prev => (prev.some(Boolean) ? prev.map(() => false) : prev))\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n /**\n * \u5BA2\u6237\u7AEF onSubmit \u8C03\u7528\u793A\u4F8B\n *\n * \u63A5\u53E3\u5931\u8D25\u65F6\u9700 throw { code } \u4EE5\u4FBF\u7EC4\u4EF6\u6309 errorSubmitDetail \u5339\u914D\u5BF9\u5E94\u63D0\u793A\u6587\u6848\uFF0C\n * code \u4E3A number \u7C7B\u578B\u65F6\u7EC4\u4EF6\u4F1A\u81EA\u52A8\u8F6C\u4E3A string \u8FDB\u884C\u5339\u914D\u3002\n *\n * @example\n * const handleNotifyMeSubmit = useCallback(\n * async (params) => {\n * const { email, checkedItems, meta } = params\n * const res = await fetch('/api/multipass/shopifyservices/product_arrival_notices', {\n * method: 'POST',\n * headers: {\n * 'Content-Type': 'application/json',\n * 'current-language': locale,\n * },\n * body: JSON.stringify({\n * email,\n * locale,\n * sku: variant.sku,\n * shop: shop.primaryDomain?.host,\n * }),\n * })\n * if (res.ok) {\n * if (checkedItems?.some?.((item) => item.checked && item.checkbox_id === 'subscribe')) {\n * subscribe({ email, dealsType: 'outStockNotify_subscribe_emails' })\n * }\n * } else {\n * throw { code: res.status }\n * }\n * },\n * [locale, variant.sku, shop.primaryDomain?.host, subscribe],\n * )\n */\n // \u70B9\u51FB\u63D0\u4EA4\n const handleSubmit = useCallback(async () => {\n // \u70B9\u51FB\u63D0\u4EA4\u57CB\u70B9\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingData.pageGroup || 'Home Page',\n component_type: componentType,\n component_name: componentName,\n button_name: submitBtnText,\n component_title: title,\n component_description: subTitle || '',\n },\n })\n\n let hasError = false\n\n // \u6821\u9A8C\u90AE\u7BB1\u975E\u7A7A\n if (!email.trim()) {\n setEmailState('error-empty')\n hasError = true\n } else if (!EMAIL_REGEX.test(email.trim())) {\n setEmailState('error-format')\n hasError = true\n } else {\n setEmailState('idle')\n }\n\n // \u6821\u9A8C required checkbox\n const newCheckboxErrors = checkboxes.map((cb, i) => {\n if (cb.label && cb.required && !checkedStates[i]) {\n hasError = true\n return true\n }\n return false\n })\n setCheckboxErrors(newCheckboxErrors)\n\n if (hasError) return\n\n setSubmitState('loading')\n try {\n const checkedItems = checkboxes\n .map((cb, i) =>\n cb.checkbox_id !== undefined ? { checkbox_id: cb.checkbox_id!, checked: checkedStates[i] } : null\n )\n .filter((item): item is { checkbox_id: string; checked: boolean } => item !== null)\n await onSubmit({ email: email.trim(), checkedItems, meta: subscriptionMeta })\n setSubmitState('success')\n } catch (err: unknown) {\n const code =\n err && typeof err === 'object' && 'code' in err ? String((err as Record<string, unknown>).code) : null\n setErrorCode(code)\n setSubmitState('error-submit')\n }\n }, [email, checkboxes, checkedStates, subscriptionMeta, onSubmit])\n\n // error-submit 3s \u540E\u81EA\u52A8\u6D88\u5931\n useEffect(() => {\n if (submitState !== 'error-submit') return\n const timer = setTimeout(() => {\n setSubmitState('idle')\n setErrorCode(null)\n }, 3000)\n return () => clearTimeout(timer)\n }, [submitState])\n\n // \u5173\u95ED\u5F39\u7A97\u65F6\u91CD\u7F6E\n const handleOpenChange = useCallback(\n (isOpen: boolean) => {\n if (!isOpen) {\n setEmail('')\n setCheckedStates(checkboxes.map(() => false))\n setEmailState('idle')\n setCheckboxErrors(checkboxes.map(() => false))\n setSubmitState('idle')\n setErrorCode(null)\n }\n onOpenChange(isOpen)\n },\n [checkboxes, onOpenChange]\n )\n\n const hasCheckboxes = checkboxes.some(cb => cb.label)\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n ref={notifyMeDialogRef}\n aria-describedby=\"notify-me-content\"\n className={cn(\n 'laptop:max-w-[480px] laptop:[&_.dialog-close-icon]:size-6 laptop:gap-8 rounded-box laptop:p-8 max-h-[90vh] w-[calc(100%-32px)] gap-6 overflow-y-auto bg-white p-6 [&_.dialog-close-icon]:size-5',\n classNames?.root\n )}\n >\n {submitState !== 'success' && (\n <DialogHeader className={cn(classNames?.header)}>\n <DialogTitle>\n <Heading as=\"h2\" size={2} className={cn('text-info-primary text-center font-bold', classNames?.title)}>\n {title}\n </Heading>\n </DialogTitle>\n {subTitle && (\n <DialogDescription asChild>\n <Text\n as=\"p\"\n className={cn('text-info-primary laptop:text-base mt-1 text-center text-sm', classNames?.subTitle)}\n >\n {subTitle}\n </Text>\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n\n {submitState === 'success' ? (\n <div className={cn('flex flex-col items-center text-center', classNames?.successText)}>\n {/* \u6210\u529F\u56FE\u6807 */}\n <div className=\"flex size-20 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\">\n <circle cx=\"40\" cy=\"40\" r=\"35\" fill=\"#30D158\" />\n <path\n d=\"M23.3333 38.3333L36.6666 50L56.6666 30\"\n stroke=\"white\"\n strokeWidth=\"6.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n <div className=\"mt-4\">\n {/* \u6807\u9898 */}\n <Heading as=\"h3\" size={2} className=\"text-info-primary font-bold\">\n {successTitle}\n </Heading>\n {/* \u526F\u6587\u6848 */}\n {successDesc && (\n <Text as=\"p\" className=\"text-info-primary laptop:text-base mt-1 text-sm\">\n {successDesc}\n </Text>\n )}\n </div>\n {/* \u786E\u8BA4\u6309\u94AE */}\n {successBtnText && (\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={() => onOpenChange(false)}\n className=\"laptop:mt-8 mt-6 w-full\"\n >\n {successBtnText}\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {/* \u90AE\u7BB1\u8F93\u5165\u6846 */}\n <div className={classNames?.emailInput}>\n <Text\n as=\"label\"\n htmlFor=\"notify-me-email\"\n className=\"text-info-primary laptop:text-base mb-2 block text-sm\"\n >\n {emailLabel}\n </Text>\n <Input\n id=\"notify-me-email\"\n type=\"email\"\n placeholder={emailPlaceholder}\n value={email}\n onChange={handleEmailChange}\n disabled={submitState === 'loading'}\n className={cn(\n 'placeholder:text-info-tertiary text-info-primary laptop:h-[54px] laptop:text-base laptop:p-4 border-lines-1 h-[44px] w-full bg-white p-3 text-sm font-bold placeholder:font-bold focus-visible:!outline-none',\n emailState !== 'idle' && 'border-error-0'\n )}\n />\n {emailState === 'error-empty' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorEmpty}\n </Text>\n )}\n {emailState === 'error-format' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorInvalidEmail}\n </Text>\n )}\n </div>\n\n {/* Checkboxes \u5217\u8868 */}\n {hasCheckboxes && (\n <div className={cn('laptop:gap-4 flex flex-col gap-2', classNames?.checkboxes)}>\n {checkboxes.map((cb, i) => {\n if (!cb.label) return null\n return (\n <div key={i}>\n <label\n className={cn(\n 'text-info-tertiary flex cursor-pointer items-start gap-2',\n classNames?.checkboxItem\n )}\n >\n <Checkbox\n checked={checkedStates[i]}\n onCheckedChange={() => updateCheckedState(i)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${cb.label}`}\n data-headless-nav-position={`''#1`}\n disabled={submitState === 'loading'}\n className=\"border-info-secondary data-[state=checked]:bg-info-secondary mt-0.5 shrink-0\"\n />\n <Text\n as=\"span\"\n className=\"text-info-tertiary laptop:text-base [&_a]:text-brand-0 text-sm leading-snug [&_a]:underline\"\n html={cb.label}\n />\n </label>\n {checkboxErrors[i] && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorCheckboxRequired}\n </Text>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n {/* \u63D0\u4EA4\u6309\u94AE */}\n <Button\n variant=\"primary\"\n size=\"lg\"\n loading={submitState === 'loading'}\n disabled={!canSubmit}\n onClick={handleSubmit}\n className={cn('w-full', classNames?.submitBtn)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${submitBtnText}`}\n data-headless-nav-position={`''#1`}\n >\n {submitBtnText}\n </Button>\n\n {/* \u63D0\u4EA4\u9519\u8BEF\uFF08\u5F39\u7A97\u6700\u5E95\u90E8\uFF09 */}\n {submitState === 'error-submit' && (\n <Text as=\"p\" className={cn('text-error-0 laptop:text-base text-sm', classNames?.errorText)}>\n {resolvedErrorMessage}\n </Text>\n )}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nNotifyMeDialog.displayName = 'NotifyMeDialog'\n\nexport default NotifyMeDialog\nexport type { NotifyMeDialogProps }\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Button", "Text", "Dialog", "DialogContent", "DialogHeader", "DialogTitle", "DialogDescription", "Input", "Checkbox", "Heading", "cn", "React", "useExposure", "useAiuiContext", "gaTrack", "componentType", "componentName", "EMAIL_REGEX", "NotifyMeDialog", "open", "onOpenChange", "copy", "classNames", "checkboxes", "subscriptionMeta", "onSubmit", "title", "subTitle", "emailLabel", "emailPlaceholder", "submitBtnText", "errorEmpty", "errorInvalidEmail", "errorCheckboxRequired", "errorSubmit", "errorSubmitDetail", "successTitle", "successDesc", "successBtnText", "notifyMeDialogRef", "trackingData", "email", "setEmail", "checkedStates", "setCheckedStates", "emailState", "setEmailState", "checkboxErrors", "setCheckboxErrors", "submitState", "setSubmitState", "errorCode", "setErrorCode", "resolvedErrorMessage", "d", "canSubmit", "updateCheckedState", "index", "prev", "next", "handleEmailChange", "handleSubmit", "hasError", "newCheckboxErrors", "
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n Button,\n Text,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n Input,\n Checkbox,\n Heading,\n} from '../../components/index.js'\nimport { cn } from '../../helpers/index.js'\nimport type { NotifyMeDialogProps } from './types.js'\nimport * as React from 'react'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\nimport { gaTrack } from '../../shared/track.js'\n\nconst componentType = 'copy'\nconst componentName = 'NotifyMeDialog'\n\ntype EmailState = 'idle' | 'error-empty' | 'error-format'\ntype SubmitState = 'idle' | 'loading' | 'success' | 'error-submit'\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nconst NotifyMeDialog = ({\n open,\n onOpenChange,\n copy,\n classNames,\n checkboxes = [],\n subscriptionMeta,\n onSubmit,\n}: NotifyMeDialogProps) => {\n const {\n title,\n subTitle,\n emailLabel = 'Email address',\n emailPlaceholder = 'your@email.com',\n submitBtnText = 'Notify Me',\n errorEmpty,\n errorInvalidEmail,\n errorCheckboxRequired,\n errorSubmit = 'Something went wrong. Please try again.',\n errorSubmitDetail,\n successTitle,\n successDesc,\n successBtnText,\n } = copy\n\n const notifyMeDialogRef = React.useRef<HTMLDivElement>(null)\n const { trackingData } = useAiuiContext()\n useExposure(notifyMeDialogRef, {\n componentType,\n componentName,\n componentTitle: title,\n componentDescription: subTitle,\n })\n\n const [email, setEmail] = useState('')\n const [checkedStates, setCheckedStates] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [emailState, setEmailState] = useState<EmailState>('idle')\n const [checkboxErrors, setCheckboxErrors] = useState<boolean[]>(() => checkboxes.map(() => false))\n const [submitState, setSubmitState] = useState<SubmitState>('idle')\n const [errorCode, setErrorCode] = useState<string | null>(null)\n\n // \u6839\u636E\u9519\u8BEF\u7801\u5339\u914D\u5BF9\u5E94\u6587\u6848\uFF0C\u672A\u5339\u914D\u5230\u5219\u56DE\u9000\u5230 errorSubmit\n const resolvedErrorMessage = errorCode\n ? (errorSubmitDetail?.find(d => d.code === errorCode)?.message ?? errorSubmit)\n : errorSubmit\n\n // \u662F\u5426\u53EF\u4EE5\u70B9\u51FB\u63D0\u4EA4\uFF08loading/success \u65F6\u7981\u7528\uFF09\n const canSubmit = submitState !== 'loading' && submitState !== 'success'\n\n // checkbox \u72B6\u6001\u53D8\u5316\n const updateCheckedState = useCallback(\n (index: number) => {\n // checkbox \u70B9\u51FB\u57CB\u70B9\n const cb = checkboxes[index]\n if (cb) {\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingData.pageGroup || 'Home Page',\n component_type: componentType,\n component_name: componentName,\n button_name: cb.label,\n component_title: title,\n component_description: subTitle || '',\n },\n })\n }\n\n setCheckedStates(prev => {\n const next = [...prev]\n next[index] = !next[index]\n return next\n })\n // \u6E05\u9664\u5F53\u524D checkbox \u7684\u9519\u8BEF\u72B6\u6001\n setCheckboxErrors(prev => {\n const next = [...prev]\n next[index] = false\n return next\n })\n // \u6E05\u9664\u90AE\u7BB1\u9519\u8BEF\u548C\u63D0\u4EA4\u9519\u8BEF\n if (emailState !== 'idle') setEmailState('idle')\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n // \u90AE\u7BB1\u8F93\u5165\u53D8\u5316\n const handleEmailChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value)\n if (emailState !== 'idle') setEmailState('idle')\n setCheckboxErrors(prev => (prev.some(Boolean) ? prev.map(() => false) : prev))\n if (submitState === 'error-submit') {\n setSubmitState('idle')\n setErrorCode(null)\n }\n },\n [emailState, submitState]\n )\n\n /**\n * \u5BA2\u6237\u7AEF onSubmit \u8C03\u7528\u793A\u4F8B\n *\n * \u63A5\u53E3\u5931\u8D25\u65F6\u9700 throw { code } \u4EE5\u4FBF\u7EC4\u4EF6\u6309 errorSubmitDetail \u5339\u914D\u5BF9\u5E94\u63D0\u793A\u6587\u6848\uFF0C\n * code \u4E3A number \u7C7B\u578B\u65F6\u7EC4\u4EF6\u4F1A\u81EA\u52A8\u8F6C\u4E3A string \u8FDB\u884C\u5339\u914D\u3002\n *\n * @example\n * const handleNotifyMeSubmit = useCallback(\n * async (params) => {\n * const { email, checkedItems, meta } = params\n * const res = await fetch('/api/multipass/shopifyservices/product_arrival_notices', {\n * method: 'POST',\n * headers: {\n * 'Content-Type': 'application/json',\n * 'current-language': locale,\n * },\n * body: JSON.stringify({\n * email,\n * locale,\n * sku: variant.sku,\n * shop: shop.primaryDomain?.host,\n * }),\n * })\n * if (res.ok) {\n * if (checkedItems?.some?.((item) => item.checked && item.checkbox_id === 'subscribe')) {\n * subscribe({ email, dealsType: 'outStockNotify_subscribe_emails' })\n * }\n * } else {\n * throw { code: res.status }\n * }\n * },\n * [locale, variant.sku, shop.primaryDomain?.host, subscribe],\n * )\n */\n // \u70B9\u51FB\u63D0\u4EA4\n const handleSubmit = useCallback(async () => {\n // \u70B9\u51FB\u63D0\u4EA4\u57CB\u70B9\n gaTrack({\n event: 'ga4Event',\n event_name: 'component_click',\n event_parameters: {\n page_group: trackingData.pageGroup || 'Home Page',\n component_type: componentType,\n component_name: componentName,\n button_name: submitBtnText,\n component_title: title,\n component_description: subTitle || '',\n },\n })\n\n let hasError = false\n\n // \u6821\u9A8C\u90AE\u7BB1\u975E\u7A7A\n if (!email.trim()) {\n setEmailState('error-empty')\n hasError = true\n } else if (!EMAIL_REGEX.test(email.trim())) {\n setEmailState('error-format')\n hasError = true\n } else {\n setEmailState('idle')\n }\n\n // \u6821\u9A8C required checkbox\n const newCheckboxErrors = checkboxes.map((cb, i) => {\n if (cb.label && cb.required && !checkedStates[i]) {\n hasError = true\n return true\n }\n return false\n })\n setCheckboxErrors(newCheckboxErrors)\n\n if (hasError) return\n\n setSubmitState('loading')\n try {\n const checkedItems = checkboxes\n .map((cb, i) =>\n cb.checkbox_id !== undefined ? { checkbox_id: cb.checkbox_id!, checked: checkedStates[i] } : null\n )\n .filter((item): item is { checkbox_id: string; checked: boolean } => item !== null)\n await onSubmit({ email: email.trim(), checkedItems, meta: subscriptionMeta })\n setSubmitState('success')\n } catch (err: unknown) {\n const code =\n err && typeof err === 'object' && 'code' in err ? String((err as Record<string, unknown>).code) : null\n setErrorCode(code)\n setSubmitState('error-submit')\n }\n }, [email, checkboxes, checkedStates, subscriptionMeta, onSubmit])\n\n // error-submit 3s \u540E\u81EA\u52A8\u6D88\u5931\n useEffect(() => {\n if (submitState !== 'error-submit') return\n const timer = setTimeout(() => {\n setSubmitState('idle')\n setErrorCode(null)\n }, 3000)\n return () => clearTimeout(timer)\n }, [submitState])\n\n // \u5173\u95ED\u5F39\u7A97\u65F6\u91CD\u7F6E\n const handleOpenChange = useCallback(\n (isOpen: boolean) => {\n if (!isOpen) {\n setEmail('')\n setCheckedStates(checkboxes.map(() => false))\n setEmailState('idle')\n setCheckboxErrors(checkboxes.map(() => false))\n setSubmitState('idle')\n setErrorCode(null)\n }\n onOpenChange(isOpen)\n },\n [checkboxes, onOpenChange]\n )\n\n const hasCheckboxes = checkboxes.some(cb => cb.label)\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n ref={notifyMeDialogRef}\n aria-describedby=\"notify-me-content\"\n className={cn(\n 'laptop:max-w-[480px] laptop:[&_.dialog-close-icon]:size-6 laptop:gap-8 rounded-box laptop:p-8 max-h-[90vh] w-[calc(100%-32px)] gap-6 overflow-y-auto bg-white p-6 [&_.dialog-close-icon]:size-5',\n classNames?.root\n )}\n >\n {submitState !== 'success' && (\n <DialogHeader className={cn(classNames?.header)}>\n <DialogTitle>\n <Heading as=\"h2\" size={2} className={cn('text-info-primary text-center font-bold', classNames?.title)}>\n {title}\n </Heading>\n </DialogTitle>\n {subTitle && (\n <DialogDescription asChild>\n <Text\n as=\"p\"\n className={cn('text-info-primary laptop:text-base mt-1 text-center text-sm', classNames?.subTitle)}\n >\n {subTitle}\n </Text>\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n\n {submitState === 'success' ? (\n <div className={cn('flex flex-col items-center text-center', classNames?.successText)}>\n {/* \u6210\u529F\u56FE\u6807 */}\n <div className=\"flex size-20 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\">\n <circle cx=\"40\" cy=\"40\" r=\"35\" fill=\"#30D158\" />\n <path\n d=\"M23.3333 38.3333L36.6666 50L56.6666 30\"\n stroke=\"white\"\n strokeWidth=\"6.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n <div className=\"mt-4\">\n {/* \u6807\u9898 */}\n <Heading as=\"h3\" size={2} className=\"text-info-primary font-bold\">\n {successTitle}\n </Heading>\n {/* \u526F\u6587\u6848 */}\n {successDesc && (\n <Text as=\"p\" className=\"text-info-primary laptop:text-base mt-1 text-sm\">\n {successDesc}\n </Text>\n )}\n </div>\n {/* \u786E\u8BA4\u6309\u94AE */}\n {successBtnText && (\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={() => onOpenChange(false)}\n className=\"laptop:mt-8 mt-6 w-full\"\n >\n {successBtnText}\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {/* \u90AE\u7BB1\u8F93\u5165\u6846 */}\n <div className={classNames?.emailInput}>\n <Text\n as=\"label\"\n htmlFor=\"notify-me-email\"\n className=\"text-info-primary laptop:text-base mb-2 block text-sm\"\n >\n {emailLabel}\n </Text>\n <Input\n id=\"notify-me-email\"\n type=\"email\"\n placeholder={emailPlaceholder}\n value={email}\n onChange={handleEmailChange}\n disabled={submitState === 'loading'}\n className={cn(\n 'placeholder:text-info-tertiary text-info-primary laptop:h-[54px] laptop:text-base laptop:p-4 border-lines-1 h-[44px] w-full bg-white p-3 text-sm font-bold placeholder:font-bold focus-visible:!outline-none',\n emailState !== 'idle' && 'border-error-0'\n )}\n />\n {emailState === 'error-empty' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorEmpty}\n </Text>\n )}\n {emailState === 'error-format' && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorInvalidEmail}\n </Text>\n )}\n </div>\n\n {/* Checkboxes \u5217\u8868 */}\n {hasCheckboxes && (\n <div className={cn('laptop:gap-4 flex flex-col gap-2', classNames?.checkboxes)}>\n {checkboxes.map((cb, i) => {\n if (!cb.label) return null\n return (\n <div key={i}>\n <label\n className={cn(\n 'text-info-tertiary flex cursor-pointer items-start gap-2',\n classNames?.checkboxItem\n )}\n >\n <Checkbox\n checked={checkedStates[i]}\n onCheckedChange={() => updateCheckedState(i)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${cb.label}`}\n data-headless-nav-position={`''#1`}\n disabled={submitState === 'loading'}\n className=\"border-info-secondary data-[state=checked]:bg-info-secondary mt-0.5 shrink-0\"\n />\n <Text\n as=\"span\"\n className=\"text-info-tertiary laptop:text-base [&_a]:text-brand-0 text-sm leading-snug [&_a]:underline\"\n html={cb.label}\n />\n </label>\n {checkboxErrors[i] && (\n <Text as=\"p\" className=\"text-error-0 laptop:text-base mt-2 text-sm\">\n {errorCheckboxRequired}\n </Text>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n {/* \u63D0\u4EA4\u6309\u94AE */}\n <Button\n variant=\"primary\"\n size=\"lg\"\n loading={submitState === 'loading'}\n disabled={!canSubmit}\n onClick={handleSubmit}\n className={cn('w-full', classNames?.submitBtn)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`''#''#${submitBtnText}`}\n data-headless-nav-position={`''#1`}\n >\n {submitBtnText}\n </Button>\n\n {/* \u63D0\u4EA4\u9519\u8BEF\uFF08\u5F39\u7A97\u6700\u5E95\u90E8\uFF09 */}\n {submitState === 'error-submit' && (\n <Text as=\"p\" className={cn('text-error-0 laptop:text-base text-sm', classNames?.errorText)}>\n {resolvedErrorMessage}\n </Text>\n )}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nNotifyMeDialog.displayName = 'NotifyMeDialog'\n\nexport default NotifyMeDialog\nexport type { NotifyMeDialogProps }\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Button", "Text", "Dialog", "DialogContent", "DialogHeader", "DialogTitle", "DialogDescription", "Input", "Checkbox", "Heading", "cn", "React", "useExposure", "useAiuiContext", "gaTrack", "componentType", "componentName", "EMAIL_REGEX", "NotifyMeDialog", "open", "onOpenChange", "copy", "classNames", "checkboxes", "subscriptionMeta", "onSubmit", "title", "subTitle", "emailLabel", "emailPlaceholder", "submitBtnText", "errorEmpty", "errorInvalidEmail", "errorCheckboxRequired", "errorSubmit", "errorSubmitDetail", "successTitle", "successDesc", "successBtnText", "notifyMeDialogRef", "trackingData", "email", "setEmail", "checkedStates", "setCheckedStates", "emailState", "setEmailState", "checkboxErrors", "setCheckboxErrors", "submitState", "setSubmitState", "errorCode", "setErrorCode", "resolvedErrorMessage", "d", "canSubmit", "updateCheckedState", "index", "cb", "prev", "next", "handleEmailChange", "handleSubmit", "hasError", "newCheckboxErrors", "i", "checkedItems", "item", "err", "code", "timer", "handleOpenChange", "isOpen", "hasCheckboxes", "NotifyMeDialog_default"]
|
|
7
7
|
}
|