@anker-in/campaign-ui 0.5.3 → 0.5.4-beta.2
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/components/credits/creditsFaq/index.js +1 -1
- package/dist/cjs/components/credits/creditsFaq/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
- package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +2 -2
- package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
- package/dist/cjs/components/credits/modal/ActivitiesModal.js +1 -1
- package/dist/cjs/components/credits/modal/ActivitiesModal.js.map +3 -3
- package/dist/cjs/components/credits/modal/RewardsModal.js +1 -1
- package/dist/cjs/components/credits/modal/RewardsModal.js.map +3 -3
- package/dist/esm/components/credits/creditsFaq/index.js +1 -1
- package/dist/esm/components/credits/creditsFaq/index.js.map +3 -3
- package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
- package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
- package/dist/esm/components/credits/modal/ActivitiesModal.js +1 -1
- package/dist/esm/components/credits/modal/ActivitiesModal.js.map +3 -3
- package/dist/esm/components/credits/modal/RewardsModal.js +1 -1
- package/dist/esm/components/credits/modal/RewardsModal.js.map +3 -3
- package/package.json +1 -1
- package/src/components/credits/creditsFaq/index.tsx +47 -42
- package/src/components/credits/creditsMemberPrice/CreditsMemberPrice.tsx +35 -42
- package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +75 -66
- package/src/components/credits/modal/ActivitiesModal.tsx +62 -56
- package/src/components/credits/modal/RewardsModal.tsx +43 -30
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/credits/modal/RewardsModal.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Tabs, TabsList, TabsTrigger, Picture } from '@anker-in/headless-ui'\nimport classNames from 'classnames'\nimport clipboard from 'copy-to-clipboard'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { ApprovalStatus, AlpcConsumeType, RewardType } from '../context/const'\nimport { CreditsModalContainer, type ModalContainerProps } from './ModalContainer'\nimport Tip from './Tip'\nimport LoadingDots from './LoadingDots'\nimport useMyRewards from '../context/hooks/useMyRewards'\nimport { useHeadlessContext } from '@anker-in/lib'\nimport { ROUNDED_BRANDS } from '../../../constants'\n\nexport interface RewardsCopy {\n title: string\n orderNumberLabel: string\n valueLabel: string\n receivedLabel: string\n failedLabel: string\n approveSuccessLabel: string\n couponTab: string\n productTab: string\n externalProductTab?: string\n pendingLabel: string\n unfulfilledLabel: string\n fulfilledLabel: string\n confirmedTip: string\n pendingTip: string\n processingTip: string\n ShippedTip: string\n emptyListLabel: string\n pointUnit: string\n code: string\n copied: string\n copy: string\n redeemLinkLabel?: string\n goGiftStatus?: {\n pending?: {\n label: string\n tip: string\n }\n approved?: {\n label: string\n tip: string\n }\n secondConfirm?: {\n label: string\n tip: string\n }\n rejected?: {\n label: string\n tip: string\n }\n callbackPending?: {\n label: string\n tip: string\n }\n callbackSuccess?: {\n label: string\n tip: string\n }\n callbackTimeout?: {\n label: string\n tip: string\n }\n }\n emptyListImage: {\n url: string\n alt?: string\n }\n}\ninterface RewardsModalProps extends ModalContainerProps {\n data: RewardsCopy\n}\n\nfunction RewardsModal({ data, ...props }: RewardsModalProps) {\n const [activeTab, setActiveTab] = useState(AlpcConsumeType.Coupon)\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const [page, setPage] = useState(1)\n const [copied, setCopied] = useState(-1)\n\n const tabs = useMemo(() => {\n return [\n { title: data.couponTab, type: AlpcConsumeType.Coupon },\n { title: data.productTab, type: AlpcConsumeType.Product },\n { title: data.externalProductTab, type: AlpcConsumeType.ExternalProduct },\n ].filter((tab): tab is { title: string; type: number } => !!tab.title)\n }, [data.couponTab, data.productTab, data.externalProductTab])\n\n // Reset page when switching tabs\n useEffect(() => {\n setPage(1)\n }, [activeTab])\n\n const { myRewards = [], canNext, isLoading } = useMyRewards({\n page,\n pageSize: 1000,\n consumeType: activeTab,\n })\n\n const getProductType = useCallback((item: any) => {\n if (item.fulfillment_status && item.fulfillment_status !== 'null') {\n return item.fulfillment_status === 'fulfilled' ? RewardType.Fulfilled : RewardType.Unfulfilled\n }\n\n if (item.approval_status === ApprovalStatus.Success || item.approval_status === ApprovalStatus.DoubleConfirm) {\n return RewardType.ApproveSuccess\n }\n\n if (item.approval_status === ApprovalStatus.Failed) {\n return RewardType.Failed\n }\n\n return RewardType.Pending\n }, [])\n\n const getGoGiftType = useCallback((status?: number) => {\n const statusMap: Record<number, RewardType> = {\n 0: RewardType.GogiftPending,\n 1: RewardType.GogiftApproved,\n 2: RewardType.GogiftSecondConfirm,\n 3: RewardType.GogiftRejected,\n 4: RewardType.GogiftCallbackPending,\n 5: RewardType.GogiftCallbackSuccess,\n 6: RewardType.GogiftCallbackTimeout,\n }\n return status !== undefined ? (statusMap[status] ?? RewardType.GogiftPending) : RewardType.GogiftPending\n }, [])\n\n const list = useMemo(() => {\n return myRewards.map(item => {\n const base = {\n title: item.goods_title,\n value: item.consume_credits,\n date: new Date(item.create_time * 1000),\n }\n\n if (activeTab === AlpcConsumeType.Coupon) {\n return {\n ...base,\n type: RewardType.Received,\n couponCode: item.coupon_code,\n orderNumber: '',\n link: '',\n }\n }\n\n if (activeTab === AlpcConsumeType.Product) {\n return {\n ...base,\n type: getProductType(item),\n orderNumber: item.order_number,\n couponCode: '',\n link: '',\n }\n }\n\n if (activeTab === AlpcConsumeType.ExternalProduct) {\n return {\n ...base,\n type: getGoGiftType(item.approval_status),\n orderNumber: '',\n couponCode: '',\n link: item.link || '',\n }\n }\n\n return { ...base, type: RewardType.Received, couponCode: '', orderNumber: '', link: '' }\n })\n }, [activeTab, myRewards, getProductType, getGoGiftType])\n\n\n const TypeMap = useMemo(() => {\n return {\n [RewardType.Received]: data.receivedLabel,\n [RewardType.Pending]: data.pendingLabel,\n [RewardType.ApproveFail]: data.failedLabel,\n [RewardType.ApproveSuccess]: data.approveSuccessLabel,\n [RewardType.Unfulfilled]: data.unfulfilledLabel,\n [RewardType.Fulfilled]: data.fulfilledLabel,\n [RewardType.Failed]: data.failedLabel,\n [RewardType.GogiftPending]: data.goGiftStatus?.pending?.label || data.pendingLabel,\n [RewardType.GogiftApproved]: data.goGiftStatus?.approved?.label || data.approveSuccessLabel,\n [RewardType.GogiftSecondConfirm]: data.goGiftStatus?.secondConfirm?.label || data.approveSuccessLabel,\n [RewardType.GogiftRejected]: data.goGiftStatus?.rejected?.label || data.failedLabel,\n [RewardType.GogiftCallbackPending]: data.goGiftStatus?.callbackPending?.label || data.pendingLabel,\n [RewardType.GogiftCallbackSuccess]: data.goGiftStatus?.callbackSuccess?.label || data.receivedLabel,\n [RewardType.GogiftCallbackTimeout]: data.goGiftStatus?.callbackTimeout?.label || data.failedLabel,\n }\n }, [data])\n\n const TipMap = useMemo(() => {\n return {\n [RewardType.Received]: '',\n [RewardType.Pending]: data.pendingTip,\n [RewardType.ApproveFail]: '',\n [RewardType.ApproveSuccess]: data.confirmedTip,\n [RewardType.Unfulfilled]: data.processingTip,\n [RewardType.Fulfilled]: data.ShippedTip,\n [RewardType.Failed]: '',\n [RewardType.GogiftPending]: data.goGiftStatus?.pending?.tip || '',\n [RewardType.GogiftApproved]: data.goGiftStatus?.approved?.tip || '',\n [RewardType.GogiftSecondConfirm]: data.goGiftStatus?.secondConfirm?.tip || '',\n [RewardType.GogiftRejected]: data.goGiftStatus?.rejected?.tip || '',\n [RewardType.GogiftCallbackPending]: data.goGiftStatus?.callbackPending?.tip || '',\n [RewardType.GogiftCallbackSuccess]: data.goGiftStatus?.callbackSuccess?.tip || '',\n [RewardType.GogiftCallbackTimeout]: data.goGiftStatus?.callbackTimeout?.tip || '',\n }\n }, [data])\n\n const ColorMap = useMemo(() => {\n return {\n [RewardType.Received]: '#52C41A',\n [RewardType.Pending]: '#999',\n [RewardType.ApproveFail]: '#F84D4F',\n [RewardType.ApproveSuccess]: '#999',\n [RewardType.Unfulfilled]: '#999',\n [RewardType.Fulfilled]: '#999',\n [RewardType.Failed]: '#F84D4F',\n [RewardType.GogiftPending]: '#999',\n [RewardType.GogiftApproved]: '#999',\n [RewardType.GogiftSecondConfirm]: '#999',\n [RewardType.GogiftRejected]: '#F84D4F',\n [RewardType.GogiftCallbackPending]: '#999',\n [RewardType.GogiftCallbackSuccess]: '#52C41A',\n [RewardType.GogiftCallbackTimeout]: '#F84D4F',\n }\n }, [])\n\n const handleScrollEnd = useCallback(() => {\n if (canNext) {\n setPage(prev => prev + 1)\n }\n }, [canNext])\n\n const handleCopy = useCallback((code: string, idx: number) => {\n setCopied(idx)\n clipboard(code)\n setTimeout(() => {\n setCopied(-1)\n }, 2000)\n }, [])\n\n\n return (\n <CreditsModalContainer\n title={data.title}\n className={classNames('h-[800px] w-[640px]')}\n useAnimation\n animationClassName=\"md:translate-y-[100vh]\"\n scrollClassName=\"md:mb-0 flex flex-col\"\n {...props}\n onScrollEnd={handleScrollEnd}\n >\n <div className=\"shrink-0\">\n <Tabs\n align=\"left\"\n shape={rounded ? 'rounded' : 'square'}\n value={activeTab.toString()}\n onValueChange={value => {\n setActiveTab(Number(value))\n }}\n >\n <TabsList>\n {tabs.map(tab => (\n <TabsTrigger key={tab.type} value={tab.type.toString()}>\n {tab.title}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n </div>\n\n {isLoading && (\n <div className=\"flex flex-1 flex-col items-center justify-center\">\n <LoadingDots />\n </div>\n )}\n\n {!isLoading && (\n <div className=\"mt-[24px] flex-1 overflow-auto overscroll-contain pb-[24px] md:pb-[48px]\">\n {list.length > 0 ? (\n <div className=\"grid gap-[18px] md:gap-[12px]\">\n {list.map((item, index) => (\n <div key={index} className=\"grid gap-[8px]\">\n {item?.orderNumber && (\n <div className=\"text-[15px] font-semibold leading-[1.4] text-[#777]\">\n {data.orderNumberLabel}: {item.orderNumber}\n </div>\n )}\n <div\n className={classNames(\n 'flex items-center justify-between rounded-[8px] bg-[#f7f8f9] px-[16px] py-[20px]',\n !rounded && 'rounded-none'\n )}\n >\n <div className=\"grid gap-[4px]\">\n <div className=\"text-[16px] font-bold leading-[1.4]\">{item.title}</div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {data.valueLabel}: {item.value} {data?.pointUnit}\n </div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {item?.couponCode ? `${data?.code || 'Code'}: ${item.couponCode} ` : ''}\n {item?.couponCode && (\n <span\n className=\"cursor-pointer text-[14px] font-semibold text-brand underline\"\n onClick={() => {\n handleCopy(item.couponCode, index)\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n }\n }}\n >\n {copied === index ? data?.copied || 'COPIED' : data?.copy || 'COPY'}\n </span>\n )}\n </div>\n {item?.link && (\n <div className=\"text-[14px] font-semibold text-[#999]\">\n <a\n href={item.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-brand underline\"\n >\n {data?.redeemLinkLabel || 'Redeem Link'}\n </a>\n </div>\n )}\n </div>\n <div className=\"grid gap-[4px] text-right\">\n <div\n className={classNames(\n 'flex items-center justify-end text-[16px] font-bold leading-[1.4]',\n `text-[${ColorMap[item.type]}]`\n )}\n >\n <span>{TypeMap[item.type]}</span>\n {TipMap[item.type] && <Tip info={TipMap[item.type]} index={index} />}\n </div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {dayjs(item.date).format('YYYY-MM-DD HH:mm').toString()}\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center\">\n <Picture\n className=\"mb-[12px] w-[160px]\"\n source={data?.emptyListImage?.url}\n alt={data?.emptyListImage?.alt || 'empty list image'}\n ></Picture>\n <div className=\"text-[16px] font-semibold leading-[1.4]\">{data?.emptyListLabel}</div>\n </div>\n )}\n </div>\n )}\n </CreditsModalContainer>\n )\n}\n\nexport default RewardsModal\n"],
|
|
5
|
-
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,
|
|
6
|
-
"names": ["RewardsModal_exports", "__export", "RewardsModal_default", "__toCommonJS", "import_jsx_runtime", "import_headless_ui", "import_classnames", "import_copy_to_clipboard", "import_dayjs", "import_react", "import_const", "import_ModalContainer", "import_Tip", "import_LoadingDots", "import_useMyRewards", "import_lib", "import_constants", "RewardsModal", "data", "props", "activeTab", "setActiveTab", "brand", "rounded", "page", "setPage", "copied", "setCopied", "tabs", "tab", "myRewards", "canNext", "isLoading", "useMyRewards", "getProductType", "item", "getGoGiftType", "status", "statusMap", "list", "base", "TypeMap", "TipMap", "ColorMap", "handleScrollEnd", "prev", "handleCopy", "code", "idx", "clipboard", "
|
|
4
|
+
"sourcesContent": ["import { Tabs, TabsContent, TabsList, TabsTrigger, Picture } from '@anker-in/headless-ui'\nimport classNames from 'classnames'\nimport clipboard from 'copy-to-clipboard'\nimport dayjs from 'dayjs'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { ApprovalStatus, AlpcConsumeType, RewardType } from '../context/const'\nimport { CreditsModalContainer, type ModalContainerProps } from './ModalContainer'\nimport Tip from './Tip'\nimport LoadingDots from './LoadingDots'\nimport useMyRewards from '../context/hooks/useMyRewards'\nimport { useHeadlessContext } from '@anker-in/lib'\nimport { ROUNDED_BRANDS } from '../../../constants'\n\nexport interface RewardsCopy {\n title: string\n orderNumberLabel: string\n valueLabel: string\n receivedLabel: string\n failedLabel: string\n approveSuccessLabel: string\n couponTab: string\n productTab: string\n externalProductTab?: string\n pendingLabel: string\n unfulfilledLabel: string\n fulfilledLabel: string\n confirmedTip: string\n pendingTip: string\n processingTip: string\n ShippedTip: string\n emptyListLabel: string\n pointUnit: string\n code: string\n copied: string\n copy: string\n redeemLinkLabel?: string\n goGiftStatus?: {\n pending?: {\n label: string\n tip: string\n }\n approved?: {\n label: string\n tip: string\n }\n secondConfirm?: {\n label: string\n tip: string\n }\n rejected?: {\n label: string\n tip: string\n }\n callbackPending?: {\n label: string\n tip: string\n }\n callbackSuccess?: {\n label: string\n tip: string\n }\n callbackTimeout?: {\n label: string\n tip: string\n }\n }\n emptyListImage: {\n url: string\n alt?: string\n }\n}\ninterface RewardsModalProps extends ModalContainerProps {\n data: RewardsCopy\n}\n\nfunction RewardsModal({ data, ...props }: RewardsModalProps) {\n const [activeTab, setActiveTab] = useState(AlpcConsumeType.Coupon)\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const [page, setPage] = useState(1)\n const [copied, setCopied] = useState(-1)\n\n const tabs = useMemo(() => {\n return [\n { title: data.couponTab, type: AlpcConsumeType.Coupon },\n { title: data.productTab, type: AlpcConsumeType.Product },\n { title: data.externalProductTab, type: AlpcConsumeType.ExternalProduct },\n ].filter((tab): tab is { title: string; type: number } => !!tab.title)\n }, [data.couponTab, data.productTab, data.externalProductTab])\n\n // Reset page when switching tabs\n useEffect(() => {\n setPage(1)\n }, [activeTab])\n\n const { myRewards = [], canNext, isLoading } = useMyRewards({\n page,\n pageSize: 1000,\n consumeType: activeTab,\n })\n\n const getProductType = useCallback((item: any) => {\n if (item.fulfillment_status && item.fulfillment_status !== 'null') {\n return item.fulfillment_status === 'fulfilled' ? RewardType.Fulfilled : RewardType.Unfulfilled\n }\n\n if (item.approval_status === ApprovalStatus.Success || item.approval_status === ApprovalStatus.DoubleConfirm) {\n return RewardType.ApproveSuccess\n }\n\n if (item.approval_status === ApprovalStatus.Failed) {\n return RewardType.Failed\n }\n\n return RewardType.Pending\n }, [])\n\n const getGoGiftType = useCallback((status?: number) => {\n const statusMap: Record<number, RewardType> = {\n 0: RewardType.GogiftPending,\n 1: RewardType.GogiftApproved,\n 2: RewardType.GogiftSecondConfirm,\n 3: RewardType.GogiftRejected,\n 4: RewardType.GogiftCallbackPending,\n 5: RewardType.GogiftCallbackSuccess,\n 6: RewardType.GogiftCallbackTimeout,\n }\n return status !== undefined ? (statusMap[status] ?? RewardType.GogiftPending) : RewardType.GogiftPending\n }, [])\n\n const list = useMemo(() => {\n return myRewards.map(item => {\n const base = {\n title: item.goods_title,\n value: item.consume_credits,\n date: new Date(item.create_time * 1000),\n }\n\n if (activeTab === AlpcConsumeType.Coupon) {\n return {\n ...base,\n type: RewardType.Received,\n couponCode: item.coupon_code,\n orderNumber: '',\n link: '',\n }\n }\n\n if (activeTab === AlpcConsumeType.Product) {\n return {\n ...base,\n type: getProductType(item),\n orderNumber: item.order_number,\n couponCode: '',\n link: '',\n }\n }\n\n if (activeTab === AlpcConsumeType.ExternalProduct) {\n return {\n ...base,\n type: getGoGiftType(item.approval_status),\n orderNumber: '',\n couponCode: '',\n link: item.link || '',\n }\n }\n\n return { ...base, type: RewardType.Received, couponCode: '', orderNumber: '', link: '' }\n })\n }, [activeTab, myRewards, getProductType, getGoGiftType])\n\n\n const TypeMap = useMemo(() => {\n return {\n [RewardType.Received]: data.receivedLabel,\n [RewardType.Pending]: data.pendingLabel,\n [RewardType.ApproveFail]: data.failedLabel,\n [RewardType.ApproveSuccess]: data.approveSuccessLabel,\n [RewardType.Unfulfilled]: data.unfulfilledLabel,\n [RewardType.Fulfilled]: data.fulfilledLabel,\n [RewardType.Failed]: data.failedLabel,\n [RewardType.GogiftPending]: data.goGiftStatus?.pending?.label || data.pendingLabel,\n [RewardType.GogiftApproved]: data.goGiftStatus?.approved?.label || data.approveSuccessLabel,\n [RewardType.GogiftSecondConfirm]: data.goGiftStatus?.secondConfirm?.label || data.approveSuccessLabel,\n [RewardType.GogiftRejected]: data.goGiftStatus?.rejected?.label || data.failedLabel,\n [RewardType.GogiftCallbackPending]: data.goGiftStatus?.callbackPending?.label || data.pendingLabel,\n [RewardType.GogiftCallbackSuccess]: data.goGiftStatus?.callbackSuccess?.label || data.receivedLabel,\n [RewardType.GogiftCallbackTimeout]: data.goGiftStatus?.callbackTimeout?.label || data.failedLabel,\n }\n }, [data])\n\n const TipMap = useMemo(() => {\n return {\n [RewardType.Received]: '',\n [RewardType.Pending]: data.pendingTip,\n [RewardType.ApproveFail]: '',\n [RewardType.ApproveSuccess]: data.confirmedTip,\n [RewardType.Unfulfilled]: data.processingTip,\n [RewardType.Fulfilled]: data.ShippedTip,\n [RewardType.Failed]: '',\n [RewardType.GogiftPending]: data.goGiftStatus?.pending?.tip || '',\n [RewardType.GogiftApproved]: data.goGiftStatus?.approved?.tip || '',\n [RewardType.GogiftSecondConfirm]: data.goGiftStatus?.secondConfirm?.tip || '',\n [RewardType.GogiftRejected]: data.goGiftStatus?.rejected?.tip || '',\n [RewardType.GogiftCallbackPending]: data.goGiftStatus?.callbackPending?.tip || '',\n [RewardType.GogiftCallbackSuccess]: data.goGiftStatus?.callbackSuccess?.tip || '',\n [RewardType.GogiftCallbackTimeout]: data.goGiftStatus?.callbackTimeout?.tip || '',\n }\n }, [data])\n\n const ColorMap = useMemo(() => {\n return {\n [RewardType.Received]: '#52C41A',\n [RewardType.Pending]: '#999',\n [RewardType.ApproveFail]: '#F84D4F',\n [RewardType.ApproveSuccess]: '#999',\n [RewardType.Unfulfilled]: '#999',\n [RewardType.Fulfilled]: '#999',\n [RewardType.Failed]: '#F84D4F',\n [RewardType.GogiftPending]: '#999',\n [RewardType.GogiftApproved]: '#999',\n [RewardType.GogiftSecondConfirm]: '#999',\n [RewardType.GogiftRejected]: '#F84D4F',\n [RewardType.GogiftCallbackPending]: '#999',\n [RewardType.GogiftCallbackSuccess]: '#52C41A',\n [RewardType.GogiftCallbackTimeout]: '#F84D4F',\n }\n }, [])\n\n const handleScrollEnd = useCallback(() => {\n if (canNext) {\n setPage(prev => prev + 1)\n }\n }, [canNext])\n\n const handleCopy = useCallback((code: string, idx: number) => {\n setCopied(idx)\n clipboard(code)\n setTimeout(() => {\n setCopied(-1)\n }, 2000)\n }, [])\n\n\n // \u6BCF\u4E2A tab \u5BF9\u5E94\u4E00\u6B21\u72EC\u7ACB\u7684\u63A5\u53E3\u8BF7\u6C42\uFF08consumeType \u4E0D\u540C\uFF09\uFF0C\u5F53\u524D\u53EA\u6709\u6FC0\u6D3B tab \u7684\u6570\u636E\u5B58\u5728\u4E8E\u5BA2\u6237\u7AEF\u3002\n // TabsContent \u53EA\u6302\u8F7D\u5F53\u524D\u6FC0\u6D3B\u7684\u4E00\u4E2A\uFF0C\u5404 tab \u590D\u7528\u540C\u4E00\u4EFD list/isLoading \u72B6\u6001\u662F\u5B89\u5168\u7684\u3002\n const renderContent = () => (\n <>\n {isLoading && (\n <div className=\"flex flex-1 flex-col items-center justify-center\">\n <LoadingDots />\n </div>\n )}\n\n {!isLoading && (\n <div className=\"mt-[24px] flex-1 overflow-auto overscroll-contain pb-[24px] md:pb-[48px]\">\n {list.length > 0 ? (\n <div className=\"grid gap-[18px] md:gap-[12px]\">\n {list.map((item, index) => (\n <div key={index} className=\"grid gap-[8px]\">\n {item?.orderNumber && (\n <div className=\"text-[15px] font-semibold leading-[1.4] text-[#777]\">\n {data.orderNumberLabel}: {item.orderNumber}\n </div>\n )}\n <div\n className={classNames(\n 'flex items-center justify-between rounded-[8px] bg-[#f7f8f9] px-[16px] py-[20px]',\n !rounded && 'rounded-none'\n )}\n >\n <div className=\"grid gap-[4px]\">\n <div className=\"text-[16px] font-bold leading-[1.4]\">{item.title}</div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {data.valueLabel}: {item.value} {data?.pointUnit}\n </div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {item?.couponCode ? `${data?.code || 'Code'}: ${item.couponCode} ` : ''}\n {item?.couponCode && (\n <span\n className=\"cursor-pointer text-[14px] font-semibold text-brand underline\"\n onClick={() => {\n handleCopy(item.couponCode, index)\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n }\n }}\n >\n {copied === index ? data?.copied || 'COPIED' : data?.copy || 'COPY'}\n </span>\n )}\n </div>\n {item?.link && (\n <div className=\"text-[14px] font-semibold text-[#999]\">\n <a\n href={item.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-brand underline\"\n >\n {data?.redeemLinkLabel || 'Redeem Link'}\n </a>\n </div>\n )}\n </div>\n <div className=\"grid gap-[4px] text-right\">\n <div\n className={classNames(\n 'flex items-center justify-end text-[16px] font-bold leading-[1.4]',\n `text-[${ColorMap[item.type]}]`\n )}\n >\n <span>{TypeMap[item.type]}</span>\n {TipMap[item.type] && <Tip info={TipMap[item.type]} index={index} />}\n </div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {dayjs(item.date).format('YYYY-MM-DD HH:mm').toString()}\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center\">\n <Picture\n className=\"mb-[12px] w-[160px]\"\n source={data?.emptyListImage?.url}\n alt={data?.emptyListImage?.alt || 'empty list image'}\n ></Picture>\n <div className=\"text-[16px] font-semibold leading-[1.4]\">{data?.emptyListLabel}</div>\n </div>\n )}\n </div>\n )}\n </>\n )\n\n return (\n <CreditsModalContainer\n title={data.title}\n className={classNames('h-[800px] w-[640px]')}\n useAnimation\n animationClassName=\"md:translate-y-[100vh]\"\n scrollClassName=\"md:mb-0 flex flex-col\"\n {...props}\n onScrollEnd={handleScrollEnd}\n >\n <Tabs\n align=\"left\"\n shape={rounded ? 'rounded' : 'square'}\n value={activeTab.toString()}\n onValueChange={value => {\n setActiveTab(Number(value))\n }}\n className=\"flex flex-1 flex-col\"\n >\n <div className=\"shrink-0\">\n <TabsList>\n {tabs.map(tab => (\n <TabsTrigger key={tab.type} value={tab.type.toString()}>\n {tab.title}\n </TabsTrigger>\n ))}\n </TabsList>\n </div>\n\n {tabs.map(tab => (\n <TabsContent key={tab.type} value={tab.type.toString()} className=\"flex flex-1 flex-col\">\n {renderContent()}\n </TabsContent>\n ))}\n </Tabs>\n </CreditsModalContainer>\n )\n}\n\nexport default RewardsModal\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["RewardsModal_exports", "__export", "RewardsModal_default", "__toCommonJS", "import_jsx_runtime", "import_headless_ui", "import_classnames", "import_copy_to_clipboard", "import_dayjs", "import_react", "import_const", "import_ModalContainer", "import_Tip", "import_LoadingDots", "import_useMyRewards", "import_lib", "import_constants", "RewardsModal", "data", "props", "activeTab", "setActiveTab", "brand", "rounded", "page", "setPage", "copied", "setCopied", "tabs", "tab", "myRewards", "canNext", "isLoading", "useMyRewards", "getProductType", "item", "getGoGiftType", "status", "statusMap", "list", "base", "TypeMap", "TipMap", "ColorMap", "handleScrollEnd", "prev", "handleCopy", "code", "idx", "clipboard", "renderContent", "LoadingDots", "index", "classNames", "e", "Tip", "dayjs", "value"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as s,jsxs as g}from"react/jsx-runtime";import{Container as x,Heading as C,Tabs as T,TabsContent as q,TabsList as h,TabsTrigger as y,Text as F}from"@anker-in/headless-ui";import{classNames as k,useHeadlessContext as N}from"@anker-in/lib";import{useMemo as d}from"react";import{FaqItem as v}from"./faqItem/FaqItem";import{ROUNDED_BRANDS as w}from"../../../constants";const I=({copy:r,id:p})=>{const{title:f,items:o,subTitle:i=""}=r||{},{brand:u}=N(),c=w.includes(u),l=d(()=>{const e=new Map;return o?.forEach(t=>{const a=t?.category_name;a&&(e.has(a)||e.set(a,[]),e.get(a).push(t))}),e},[o]),n=d(()=>Array.from(l.keys()),[l]),b=n[0]?.toString()||"",m=e=>s("div",{className:k("mt-[24px] flex flex-col overflow-auto pt-0"),children:e?.map((t,a)=>s(v,{index:a,defaultExpended:e.length===1,question:t.question,answer:t.answer,showDots:!1},a))});return g(x,{id:p,className:"bg-[#F5F5F7]",children:[f&&s(C,{as:"h2",size:"4",html:r?.title}),i&&s("div",{className:"mt-[8px] flex flex-row",children:s(F,{size:"4",as:"p",html:i,className:"flex-1"})}),n.length?g(T,{align:"left",shape:c?"rounded":"square",className:"mt-[24px]",defaultValue:b,children:[s(h,{children:n.map((e,t)=>s(y,{value:e,children:e},t))}),n.map((e,t)=>s(q,{value:e,children:m(l.get(e)||[])},t))]}):m(o||[]),r.learnMore?.link&&r.learnMore?.label&&s("a",{href:r.learnMore?.link,target:"_blank",className:"mt-[24px] block w-full text-center text-[18px] font-bold text-brand hover:underline l:text-[16px]",children:r.learnMore?.label})]})};export{I as CreditsFaq};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/credits/creditsFaq/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Container, Heading, Tabs, TabsList, TabsTrigger, Text } from '@anker-in/headless-ui'\nimport { classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport { useMemo
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["jsx", "jsxs", "Container", "Heading", "Tabs", "TabsList", "TabsTrigger", "Text", "cn", "useHeadlessContext", "useMemo", "
|
|
4
|
+
"sourcesContent": ["import { Container, Heading, Tabs, TabsContent, TabsList, TabsTrigger, Text } from '@anker-in/headless-ui'\nimport { classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport { useMemo } from 'react'\n\nimport { FaqItem } from './faqItem/FaqItem'\nimport { ROUNDED_BRANDS } from '../../../constants'\n\nexport type CreditsFaqCopy = {\n title: string\n subTitle: string\n learnMore: {\n link: string\n label: string\n }\n items: {\n category_name: string\n question: string\n answer: string\n }[]\n}\nexport const CreditsFaq = ({ copy, id }: { copy: CreditsFaqCopy; id?: string }) => {\n const { title, items: faqList, subTitle = '' } = copy || {}\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n // \u6309 category_name \u5206\u7EC4\uFF0C\u907F\u514D\u624B\u52A8 activeTab \u5B57\u7B26\u4E32\u6BD4\u8F83\uFF08\u9690\u85CF\u5B57\u7B26/\u7C7B\u578B\u4E0D\u4E00\u81F4\u4F1A\u5BFC\u81F4\u8FC7\u6EE4\u5931\u8D25\uFF09\n const groupedByCategory = useMemo(() => {\n const map = new Map<string, CreditsFaqCopy['items']>()\n faqList?.forEach(item => {\n const key = item?.category_name\n if (!key) return\n if (!map.has(key)) map.set(key, [])\n map.get(key)!.push(item)\n })\n return map\n }, [faqList])\n\n const categoryList = useMemo(() => Array.from(groupedByCategory.keys()), [groupedByCategory])\n const defaultTab = categoryList[0]?.toString() || ''\n\n const renderFaqItems = (list: CreditsFaqCopy['items']) => (\n <div className={cn('mt-[24px] flex flex-col overflow-auto pt-0')}>\n {list?.map((item, index) => (\n <FaqItem\n key={index}\n index={index}\n defaultExpended={list.length === 1}\n question={item.question}\n answer={item.answer}\n showDots={false}\n ></FaqItem>\n ))}\n </div>\n )\n\n return (\n <Container id={id} className=\"bg-[#F5F5F7]\">\n {title && <Heading as=\"h2\" size=\"4\" html={copy?.title} />}\n {subTitle && (\n <div className=\"mt-[8px] flex flex-row\">\n <Text size=\"4\" as=\"p\" html={subTitle} className=\"flex-1\" />\n </div>\n )}\n {categoryList.length ? (\n <Tabs align=\"left\" shape={rounded ? 'rounded' : 'square'} className=\"mt-[24px]\" defaultValue={defaultTab}>\n {/* faq-nav */}\n <TabsList>\n {categoryList.map((item, index) => (\n <TabsTrigger key={index} value={item}>\n {item}\n </TabsTrigger>\n ))}\n </TabsList>\n {categoryList.map((item, index) => (\n <TabsContent key={index} value={item}>\n {renderFaqItems(groupedByCategory.get(item) || [])}\n </TabsContent>\n ))}\n </Tabs>\n ) : (\n renderFaqItems(faqList || [])\n )}\n {copy.learnMore?.link && copy.learnMore?.label && (\n <a\n href={copy.learnMore?.link}\n target=\"_blank\"\n className=\"mt-[24px] block w-full text-center text-[18px] font-bold text-brand hover:underline l:text-[16px]\"\n >\n {copy.learnMore?.label}\n </a>\n )}\n </Container>\n )\n}\n"],
|
|
5
|
+
"mappings": "AA2CQ,cAAAA,EAqBA,QAAAC,MArBA,oBA3CR,OAAS,aAAAC,EAAW,WAAAC,EAAS,QAAAC,EAAM,eAAAC,EAAa,YAAAC,EAAU,eAAAC,EAAa,QAAAC,MAAY,wBACnF,OAAS,cAAcC,EAAI,sBAAAC,MAA0B,gBACrD,OAAS,WAAAC,MAAe,QAExB,OAAS,WAAAC,MAAe,oBACxB,OAAS,kBAAAC,MAAsB,qBAexB,MAAMC,EAAa,CAAC,CAAE,KAAAC,EAAM,GAAAC,CAAG,IAA6C,CACjF,KAAM,CAAE,MAAAC,EAAO,MAAOC,EAAS,SAAAC,EAAW,EAAG,EAAIJ,GAAQ,CAAC,EACpD,CAAE,MAAAK,CAAM,EAAIV,EAAmB,EAC/BW,EAAUR,EAAe,SAASO,CAAK,EAGvCE,EAAoBX,EAAQ,IAAM,CACtC,MAAMY,EAAM,IAAI,IAChB,OAAAL,GAAS,QAAQM,GAAQ,CACvB,MAAMC,EAAMD,GAAM,cACbC,IACAF,EAAI,IAAIE,CAAG,GAAGF,EAAI,IAAIE,EAAK,CAAC,CAAC,EAClCF,EAAI,IAAIE,CAAG,EAAG,KAAKD,CAAI,EACzB,CAAC,EACMD,CACT,EAAG,CAACL,CAAO,CAAC,EAENQ,EAAef,EAAQ,IAAM,MAAM,KAAKW,EAAkB,KAAK,CAAC,EAAG,CAACA,CAAiB,CAAC,EACtFK,EAAaD,EAAa,CAAC,GAAG,SAAS,GAAK,GAE5CE,EAAkBC,GACtB7B,EAAC,OAAI,UAAWS,EAAG,4CAA4C,EAC5D,SAAAoB,GAAM,IAAI,CAACL,EAAMM,IAChB9B,EAACY,EAAA,CAEC,MAAOkB,EACP,gBAAiBD,EAAK,SAAW,EACjC,SAAUL,EAAK,SACf,OAAQA,EAAK,OACb,SAAU,IALLM,CAMN,CACF,EACH,EAGF,OACE7B,EAACC,EAAA,CAAU,GAAIc,EAAI,UAAU,eAC1B,UAAAC,GAASjB,EAACG,EAAA,CAAQ,GAAG,KAAK,KAAK,IAAI,KAAMY,GAAM,MAAO,EACtDI,GACCnB,EAAC,OAAI,UAAU,yBACb,SAAAA,EAACQ,EAAA,CAAK,KAAK,IAAI,GAAG,IAAI,KAAMW,EAAU,UAAU,SAAS,EAC3D,EAEDO,EAAa,OACZzB,EAACG,EAAA,CAAK,MAAM,OAAO,MAAOiB,EAAU,UAAY,SAAU,UAAU,YAAY,aAAcM,EAE5F,UAAA3B,EAACM,EAAA,CACE,SAAAoB,EAAa,IAAI,CAACF,EAAMM,IACvB9B,EAACO,EAAA,CAAwB,MAAOiB,EAC7B,SAAAA,GADeM,CAElB,CACD,EACH,EACCJ,EAAa,IAAI,CAACF,EAAMM,IACvB9B,EAACK,EAAA,CAAwB,MAAOmB,EAC7B,SAAAI,EAAeN,EAAkB,IAAIE,CAAI,GAAK,CAAC,CAAC,GADjCM,CAElB,CACD,GACH,EAEAF,EAAeV,GAAW,CAAC,CAAC,EAE7BH,EAAK,WAAW,MAAQA,EAAK,WAAW,OACvCf,EAAC,KACC,KAAMe,EAAK,WAAW,KACtB,OAAO,SACP,UAAU,oGAET,SAAAA,EAAK,WAAW,MACnB,GAEJ,CAEJ",
|
|
6
|
+
"names": ["jsx", "jsxs", "Container", "Heading", "Tabs", "TabsContent", "TabsList", "TabsTrigger", "Text", "cn", "useHeadlessContext", "useMemo", "FaqItem", "ROUNDED_BRANDS", "CreditsFaq", "copy", "id", "title", "faqList", "subTitle", "brand", "rounded", "groupedByCategory", "map", "item", "key", "categoryList", "defaultTab", "renderFaqItems", "list", "index"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{jsx as o,jsxs as f}from"react/jsx-runtime";import{Container as Z,Heading as $,Tabs as j,TabsContent as B,TabsList as ee,TabsTrigger as te}from"@anker-in/headless-ui";import{useMemo as u,useState as g,useEffect as z,useCallback as p,useRef as ne}from"react";import I from"decimal.js";import re from"./MemberPriceItem";import ae from"../creditsCash/RedeemableItem";import se from"../context/hooks/useRedeemableList";import ie from"../modal/RulesModal";import{Pagination as G}from"./Pagination";import{useProductsByHandles as O,useHeadlessContext as oe,gaTrack as le}from"@anker-in/lib";import{classNames as U}from"@anker-in/lib";import{useCreditsContext as me}from"../context/provider";import{FunctionDiscountType as D}from"../context/memberPriceConst";import{ROUNDED_BRANDS as ce}from"../../../constants";const Re=({copy:s,id:W})=>{const[w,q]=g(s.tabs[0]?.type||"memberPrice"),[P,k]=g(),[m,v]=g(1),[l,b]=g(9),{redeemableList:N}=se(),{pageCommon:J,memberPriceDiscount:_,profile:R,gtm:M}=me(),{brand:K}=oe(),Q=ce.includes(K),h=ne(null),L=[{namespace:"global",key:"transparentImg"},{namespace:"__discountCodeApp",key:"data"}];z(()=>{const t=()=>{const n=window.innerWidth;n>=1440?b(12):n>=1024?b(9):n>=768?b(12):b(8)};return t(),window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[]),z(()=>{v(1)},[w,l]);const c=u(()=>!_||!s.memberPriceTab.memberPriceRuleId?null:_.find(t=>String(t.rule_id)===String(s.memberPriceTab.memberPriceRuleId)),[_,s.memberPriceTab.memberPriceRuleId]),X=u(()=>c?(c.result_detail?.member_discounts?.filter(e=>e.user_identity===1)||[]).flatMap(e=>e.main_products?.variants?.map(a=>a.handle)||[]):[],[c]),{data:C}=O({handles:X,metafieldIdentifiers:{variant:L}}),{data:T}=O({handles:s?.redeemTab?.list?.map(t=>t.products?.[0]?.handle)||[],metafieldIdentifiers:{variant:L}}),F=p(t=>{try{const n=t?.metafields?.__discountCodeApp?.data;if(!n)return 0;const e=n;if(!Array.isArray(e)||e.length===0)return 0;const a=new Date,r=e.find(i=>{const d=i.starts_at?new Date(i.starts_at):null,V=i.ends_at?new Date(i.ends_at):null;return!(d&&d>a||V&&V<a)});return r?.fixed_value?parseFloat(r.fixed_value):0}catch(n){return console.error("Failed to get coupon discount:",n),0}},[]),A=p((t,n,e)=>{const a=n?.discount_conf;if(!a)return null;let r=new I(t);switch(a.discount_type){case D.Percentage:r=r.mul(100-a.discount_value).div(100);break;case D.FixedAmount:r=r.sub(a.discount_value);break;case D.FixedPrice:r=new I(a.discount_value);break}if(e){const i=F(e);i>0&&(r=r.sub(i))}return r.lessThan(0)&&(r=new I(0)),{memberPrice:r.toNumber(),originalPrice:t}},[F]),x=u(()=>!c||!C?[]:(c.result_detail?.member_discounts?.filter(e=>e.user_identity===1)||[]).flatMap(e=>(e.main_products?.variants||[]).map(a=>({...a,discount:e}))).map(e=>{const a=C.find(d=>d.handle===e.handle);if(!a)return null;const r=a.variants?.find(d=>d.sku===e.sku)||a.variants?.[0];if(!r||!r.availableForSale)return null;const i=A(r.price.amount,e.discount,r);return i?{product:a,productVariant:r,memberPrice:i.memberPrice,originalPrice:i.originalPrice}:null})?.filter(Boolean)||[],[c,C,A]),y=u(()=>T?.map(t=>{const n=s.redeemTab.list.find(r=>r.products?.[0]?.handle===t.handle),e=N.find(r=>r.id?.toString()===n?.redeemId?.toString()),a=t.variants?.find(r=>r.sku===n?.products?.[0]?.sku)||t.variants?.[0];return!e||!a||!a.availableForSale||e.is_limited&&e.remaining_inventory<=0?null:{product:t,productVariant:a,alpcData:{id:e?.id,consumeCredits:e?.consume_credits,remainingInventory:e?.remaining_inventory,isLimited:e?.is_limited,consumeType:e?.consume_type,title:e?.name,desc:e?.note},config:n}}).filter(Boolean),[T,s.redeemTab.list,N]),S=u(()=>{const t=x?.length||0,n=Math.ceil(t/l),e=(m-1)*l,a=e+l,r=x?.slice(e,a)||[];return{totalPages:n,currentItems:r,showPagination:n>1}},[x,m,l]),E=u(()=>{const t=y?.length||0,n=Math.ceil(t/l),e=(m-1)*l,a=e+l,r=y?.slice(e,a)||[];return{totalPages:n,currentItems:r,showPagination:n>1}},[y,m,l]),H=p(t=>{if(v(t),h.current){const n=h.current.offsetTop;window.scrollTo({top:n-80,behavior:"smooth"})}},[v]),Y=p(t=>{const n=t;q(n);const a=s.tabs.find(r=>r.type===n)?.label||"";le({event:"ga4Event",event_name:"lp_button",member_active_status:R?.activated?"active":"not active",event_parameters:{page_group:M.pageGroup,position:s.title,button_name:a}})},[s.tabs,s.title,R?.activated,M.pageGroup]);return f(Z,{id:W,className:U("bg-[#F5F5F5]"),ref:h,children:[o($,{as:"h2",size:"4",html:s.title,className:"mx:px-[16px]"}),f(j,{align:"left",className:"mt-[24px]",value:w,onValueChange:Y,children:[o(ee,{children:s.tabs.map((t,n)=>o(te,{value:t.type,children:t.label},n))}),f(B,{value:"memberPrice",className:"relative mt-[24px]",children:[o("div",{className:"grid md:grid-cols-2 gap-[12px] grid-cols-4 md-xl:grid-cols-3 lg:gap-[16px]",children:S.currentItems?.map((t,n)=>o(re,{itemData:t,copy:s.memberPriceTab},n))}),o(G,{currentPage:m,totalPages:S.totalPages,onPageChange:H})]}),f(B,{value:"redeem",className:"relative mt-[24px]",children:[o("div",{className:"grid md:grid-cols-2 gap-[12px] grid-cols-4 md-xl:grid-cols-3 lg:gap-[16px]",children:E.currentItems?.map((t,n)=>o(ae,{copy:{title:s.title,...s.redeemTab},itemData:t,setRules:k,currencyCode:T?.[0]?.price.currencyCode||"USD"},n))}),o(G,{currentPage:m,totalPages:E.totalPages,onPageChange:H})]})]}),P&&o(ie,{overlayClassName:"md:px-[16px] md:items-center",className:U("md:h-fit md:rounded-b-[16px]",!Q&&"md:rounded-none"),isOpen:P.length>0,onClose:()=>k([]),titleClassName:"border-b-transparent h-[56px]",rules:P,scrollClassName:"md:mt-[8px] md:mb-[24px] md:pt-0",title:J?.ruleLabel,ruleClassName:"text-[#1d1d1f] font-bold"})]})};export{Re as CreditsMemberPrice};
|
|
2
2
|
//# sourceMappingURL=CreditsMemberPrice.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/credits/creditsMemberPrice/CreditsMemberPrice.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Container, Heading, Tabs, TabsList, TabsTrigger } from '@anker-in/headless-ui'\nimport { useMemo, useState, useEffect, useCallback, useRef } from 'react'\nimport Decimal from 'decimal.js'\n\nimport MemberPriceItem from './MemberPriceItem'\nimport RedeemableItem from '../creditsCash/RedeemableItem'\nimport useRedeemableList from '../context/hooks/useRedeemableList'\nimport RulesModal from '../modal/RulesModal'\nimport { Pagination } from './Pagination'\nimport { useProductsByHandles, useHeadlessContext, gaTrack } from '@anker-in/lib'\nimport { CreditsMemberPriceCopy, MemberPriceProduct } from './type'\nimport { Product, classNames as cn } from '@anker-in/lib'\nimport { useCreditsContext } from '../context/provider'\nimport { RedeemItem } from '../creditsCash/type'\nimport { FunctionDiscountType } from '../context/memberPriceConst'\nimport { ROUNDED_BRANDS } from '../../../constants'\n\nexport const CreditsMemberPrice = ({ copy, id }: { copy: CreditsMemberPriceCopy; id?: string }) => {\n const [activeTab, setActiveTab] = useState<'memberPrice' | 'redeem'>(copy.tabs[0]?.type || 'memberPrice')\n const [rules, setRules] = useState<string | string[]>()\n const [currentPage, setCurrentPage] = useState(1)\n const [itemsPerPage, setItemsPerPage] = useState(9) // \u9ED8\u8BA4 1024px \u4EE5\u4E0A\uFF1A3\u5217 \u00D7 3\u884C = 9\n const { redeemableList } = useRedeemableList()\n const { pageCommon, memberPriceDiscount, profile, gtm } = useCreditsContext()\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // \u5B9A\u4E49\u9700\u8981\u83B7\u53D6\u7684 metafield\uFF0C\u5305\u62EC\u900F\u660E\u56FE\u548C\u4F18\u60E0\u5238\u4FE1\u606F\n const variantMetafieldIdentifiers: any[] = [\n {\n namespace: 'global',\n key: 'transparentImg',\n },\n {\n namespace: '__discountCodeApp',\n key: 'data',\n },\n ]\n\n // \u6839\u636E\u5C4F\u5E55\u5C3A\u5BF8\u52A8\u6001\u8C03\u6574\u6BCF\u9875\u663E\u793A\u7684\u5546\u54C1\u6570\u91CF\n useEffect(() => {\n const updateItemsPerPage = () => {\n const width = window.innerWidth\n if (width >= 1440) {\n // 1920px \u4EE5\u4E0A\uFF1A4\u5217 \u00D7 3\u884C = 12\u4E2A\n setItemsPerPage(12)\n } else if (width >= 1024) {\n // 1024px - 1919px\uFF1A3\u5217 \u00D7 3\u884C = 9\u4E2A\n setItemsPerPage(9)\n } else if (width >= 768) {\n // 1024px \u4EE5\u4E0B\uFF1A3\u5217 \u00D7 4\u884C = 12\u4E2A\n setItemsPerPage(12)\n } else {\n // 768px \u4EE5\u4E0B\uFF1A2\u5217 \u00D7 4\u884C = 8\u4E2A\n setItemsPerPage(8)\n }\n }\n\n updateItemsPerPage()\n window.addEventListener('resize', updateItemsPerPage)\n return () => window.removeEventListener('resize', updateItemsPerPage)\n }, [])\n\n // \u5F53\u5207\u6362 tab \u6216\u6BCF\u9875\u6570\u91CF\u53D8\u5316\u65F6\u91CD\u7F6E\u9875\u7801\n useEffect(() => {\n setCurrentPage(1)\n }, [activeTab, itemsPerPage])\n\n // \u6839\u636E\u914D\u7F6E\u7684 ruleId \u67E5\u627E\u5BF9\u5E94\u7684\u4F1A\u5458\u4EF7\u89C4\u5219\n const targetRule = useMemo(() => {\n if (!memberPriceDiscount || !copy.memberPriceTab.memberPriceRuleId) return null\n return memberPriceDiscount.find(rule => String(rule.rule_id) === String(copy.memberPriceTab.memberPriceRuleId))\n }, [memberPriceDiscount, copy.memberPriceTab.memberPriceRuleId])\n\n const memberPriceHandles = useMemo(() => {\n if (!targetRule) return []\n\n // \u83B7\u53D6\u6240\u6709 user_identity === 1 \u7684 discounts\n const allDiscounts = targetRule.result_detail?.member_discounts?.filter(\n (discount: any) => discount.user_identity === 1\n ) || []\n\n // \u5408\u5E76\u6240\u6709 discounts \u7684 variants \u7684 handles\n const handles = allDiscounts.flatMap((discount: any) =>\n discount.main_products?.variants?.map((variant: any) => variant.handle) || []\n )\n\n return handles\n }, [targetRule])\n\n // \u83B7\u53D6\u4F1A\u5458\u4EF7\u4EA7\u54C1\u6570\u636E\uFF08\u901A\u8FC7\u4ECE memberPriceDiscount \u63D0\u53D6\u7684 handles \u83B7\u53D6\u4EA7\u54C1\uFF09\n const { data: memberPriceProducts } = useProductsByHandles({\n handles: memberPriceHandles,\n metafieldIdentifiers: {\n variant: variantMetafieldIdentifiers,\n },\n })\n\n // \u83B7\u53D6\u79EF\u5206\u5151\u6362\u4EA7\u54C1\u6570\u636E\n const { data: redeemProducts } = useProductsByHandles({\n handles: copy?.redeemTab?.list?.map(item => item.products?.[0]?.handle) || [],\n metafieldIdentifiers: {\n variant: variantMetafieldIdentifiers,\n },\n })\n\n // \u4ECE variant metafields \u4E2D\u83B7\u53D6\u6709\u6548\u7684 coupon \u6298\u6263\u91D1\u989D\n const getCouponDiscount = useCallback((variant: any) => {\n try {\n const discountData = variant?.metafields?.__discountCodeApp?.data\n if (!discountData) return 0\n\n // discountData \u5DF2\u7ECF\u662F\u5BF9\u8C61\uFF0C\u4E0D\u9700\u8981 JSON.parse\n const discounts = discountData\n if (!Array.isArray(discounts) || discounts.length === 0) return 0\n\n // \u83B7\u53D6\u7B2C\u4E00\u4E2A\u6709\u6548\u7684 coupon\uFF08\u68C0\u67E5\u65F6\u95F4\u8303\u56F4\uFF09\n const now = new Date()\n const validDiscount = discounts.find((discount: any) => {\n const startsAt = discount.starts_at ? new Date(discount.starts_at) : null\n const endsAt = discount.ends_at ? new Date(discount.ends_at) : null\n\n // \u68C0\u67E5 coupon \u662F\u5426\u5728\u6709\u6548\u671F\u5185\n if (startsAt && startsAt > now) return false\n if (endsAt && endsAt < now) return false\n\n return true\n })\n\n // \u8FD4\u56DE\u6298\u6263\u91D1\u989D\uFF08fixed_amount \u7C7B\u578B\uFF09\n if (validDiscount?.fixed_value) {\n return parseFloat(validDiscount.fixed_value)\n }\n\n return 0\n } catch (error) {\n console.error('Failed to get coupon discount:', error)\n return 0\n }\n }, [])\n\n // \u8BA1\u7B97\u4F1A\u5458\u4EF7\u7684\u8F85\u52A9\u51FD\u6570\uFF08\u4EC5\u4F7F\u7528\u666E\u901A\u4F1A\u5458 user_identity = 1 \u7684\u6298\u6263\uFF0C\u5E76\u53E0\u52A0 coupon \u6298\u6263\uFF09\n const calculateMemberPrice = useCallback(\n (price: number, discount: any, variant?: any) => {\n const discountConfig = discount?.discount_conf\n if (!discountConfig) return null\n\n // \u6839\u636E\u6298\u6263\u7C7B\u578B\u8BA1\u7B97\u4F1A\u5458\u4EF7\n let salePrice = new Decimal(price)\n switch (discountConfig.discount_type) {\n case FunctionDiscountType.Percentage:\n salePrice = salePrice.mul(100 - discountConfig.discount_value).div(100)\n break\n case FunctionDiscountType.FixedAmount:\n salePrice = salePrice.sub(discountConfig.discount_value)\n break\n case FunctionDiscountType.FixedPrice:\n salePrice = new Decimal(discountConfig.discount_value)\n break\n }\n\n // \u53E0\u52A0 coupon \u6298\u6263\n if (variant) {\n const couponDiscount = getCouponDiscount(variant)\n if (couponDiscount > 0) {\n salePrice = salePrice.sub(couponDiscount)\n }\n }\n\n // \u786E\u4FDD\u4EF7\u683C\u4E0D\u4E3A\u8D1F\u6570\n if (salePrice.lessThan(0)) {\n salePrice = new Decimal(0)\n }\n\n return {\n memberPrice: salePrice.toNumber(),\n originalPrice: price,\n }\n },\n [getCouponDiscount]\n )\n\n // \u5904\u7406\u4F1A\u5458\u4EF7\u4EA7\u54C1\u5217\u8868\uFF08\u4EC5\u666E\u901A\u4F1A\u5458 user_identity = 1 \u7684\u6298\u6263\uFF09\n const memberPriceList = useMemo(() => {\n if (!targetRule || !memberPriceProducts) return []\n\n // \u83B7\u53D6\u6240\u6709 user_identity === 1 \u7684 discounts\n const allDiscounts = targetRule.result_detail?.member_discounts?.filter(\n (discount: any) => discount.user_identity === 1\n ) || []\n\n // \u5408\u5E76\u6240\u6709 discounts \u7684 variants\uFF0C\u5E76\u4FDD\u5B58\u5BF9\u5E94\u7684 discount \u4FE1\u606F\n const allVariantsWithDiscount = allDiscounts.flatMap((discount: any) =>\n (discount.main_products?.variants || []).map((variant: any) => ({\n ...variant,\n discount, // \u5C06 discount \u4FE1\u606F\u4FDD\u5B58\u5230 variant \u4E2D\n }))\n )\n\n return (\n (allVariantsWithDiscount\n .map((variantWithDiscount: any) => {\n const product = memberPriceProducts.find(p => p.handle === variantWithDiscount.handle)\n if (!product) return null\n\n const productVariant = product.variants?.find(v => v.sku === variantWithDiscount.sku) || product.variants?.[0]\n if (!productVariant || !productVariant.availableForSale) return null\n\n const priceResult = calculateMemberPrice(\n productVariant.price.amount,\n variantWithDiscount.discount,\n productVariant\n )\n if (!priceResult) return null\n\n return {\n product,\n productVariant,\n memberPrice: priceResult.memberPrice,\n originalPrice: priceResult.originalPrice,\n }\n })\n ?.filter(Boolean) as unknown as MemberPriceProduct[]) || []\n )\n }, [targetRule, memberPriceProducts, calculateMemberPrice])\n\n // \u5904\u7406\u79EF\u5206\u5151\u6362\u4EA7\u54C1\u5217\u8868\uFF08\u590D\u7528 creditsCash \u7684\u903B\u8F91\uFF0C\u8FC7\u6EE4\u7F3A\u8D27\u5546\u54C1\uFF09\n const redeemList = useMemo(() => {\n return redeemProducts\n ?.map((product: Product) => {\n const config = copy.redeemTab.list.find(item => item.products?.[0]?.handle === product.handle)\n const alpcData = redeemableList.find(item => item.id?.toString() === config?.redeemId?.toString())\n const productVariant =\n product.variants?.find((variant: any) => variant.sku === config?.products?.[0]?.sku) || product.variants?.[0]\n\n // \u8FC7\u6EE4\u6761\u4EF6\uFF1A\n // 1. \u5FC5\u987B\u6709 alpcData \u548C productVariant\n // 2. \u5546\u54C1\u4E0D\u80FD\u7F3A\u8D27\n // 3. \u5982\u679C\u6709\u5E93\u5B58\u9650\u5236\uFF0C\u5219\u5E93\u5B58\u5FC5\u987B\u5927\u4E8E 0\n if (!alpcData || !productVariant) return null\n if (!productVariant.availableForSale) return null\n if (alpcData.is_limited && alpcData.remaining_inventory <= 0) return null\n\n return {\n product,\n productVariant,\n alpcData: {\n id: alpcData?.id,\n consumeCredits: alpcData?.consume_credits,\n remainingInventory: alpcData?.remaining_inventory,\n isLimited: alpcData?.is_limited,\n consumeType: alpcData?.consume_type,\n title: alpcData?.name,\n desc: alpcData?.note,\n },\n config,\n }\n })\n .filter(Boolean) as unknown as RedeemItem[]\n }, [redeemProducts, copy.redeemTab.list, redeemableList])\n\n // \u8BA1\u7B97\u4F1A\u5458\u4EF7\u5206\u9875\n const memberPricePagination = useMemo(() => {\n const totalItems = memberPriceList?.length || 0\n const totalPages = Math.ceil(totalItems / itemsPerPage)\n const startIndex = (currentPage - 1) * itemsPerPage\n const endIndex = startIndex + itemsPerPage\n const currentItems = memberPriceList?.slice(startIndex, endIndex) || []\n\n return {\n totalPages,\n currentItems,\n showPagination: totalPages > 1,\n }\n }, [memberPriceList, currentPage, itemsPerPage])\n\n // \u8BA1\u7B97\u79EF\u5206\u5151\u6362\u5206\u9875\n const redeemPagination = useMemo(() => {\n const totalItems = redeemList?.length || 0\n const totalPages = Math.ceil(totalItems / itemsPerPage)\n const startIndex = (currentPage - 1) * itemsPerPage\n const endIndex = startIndex + itemsPerPage\n const currentItems = redeemList?.slice(startIndex, endIndex) || []\n\n return {\n totalPages,\n currentItems,\n showPagination: totalPages > 1,\n }\n }, [redeemList, currentPage, itemsPerPage])\n\n // \u5904\u7406\u9875\u9762\u5207\u6362\uFF0C\u6EDA\u52A8\u5230\u6A21\u5757\u9876\u90E8\n const handlePageChange = useCallback(\n (page: number) => {\n setCurrentPage(page)\n // \u6EDA\u52A8\u5230\u6A21\u5757\u9876\u90E8\n if (containerRef.current) {\n const top = containerRef.current.offsetTop\n window.scrollTo({\n top: top - 80, // \u51CF\u53BB 80px \u7684\u504F\u79FB\u91CF\uFF0C\u907F\u514D\u88AB\u56FA\u5B9A\u5934\u90E8\u906E\u6321\n behavior: 'smooth',\n })\n }\n },\n [setCurrentPage]\n )\n\n // \u5904\u7406 tab \u5207\u6362\u5E76\u53D1\u9001\u57CB\u70B9\n const handleTabChange = useCallback(\n (value: string) => {\n const tabType = value as 'memberPrice' | 'redeem'\n setActiveTab(tabType)\n\n // \u67E5\u627E\u5F53\u524D tab \u7684 label\n const currentTab = copy.tabs.find(tab => tab.type === tabType)\n const tabLabel = currentTab?.label || ''\n\n // \u53D1\u9001 tab \u70B9\u51FB\u57CB\u70B9\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_button',\n member_active_status: profile?.activated ? 'active' : 'not active',\n event_parameters: {\n page_group: gtm.pageGroup,\n position: copy.title,\n button_name: tabLabel,\n },\n })\n },\n [copy.tabs, copy.title, profile?.activated, gtm.pageGroup]\n )\n\n return (\n <Container id={id} className={cn('bg-[#F5F5F5]')} ref={containerRef}>\n <Heading as=\"h2\" size=\"4\" html={copy.title} className=\"mx:px-[16px]\" />\n\n <Tabs\n align=\"left\"\n className=\"mt-[24px]\"\n value={activeTab}\n onValueChange={handleTabChange}\n >\n <TabsList>\n {copy.tabs.map((tab, index) => (\n <TabsTrigger key={index} value={tab.type}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n\n {/* Tab \u5185\u5BB9 */}\n <div className=\"relative mt-[24px]\">\n {/* \u4F1A\u5458\u4EF7 Tab */}\n {activeTab === 'memberPrice' && (\n <>\n <div className=\"grid md:grid-cols-2 gap-[12px] grid-cols-4 md-xl:grid-cols-3 lg:gap-[16px]\">\n {memberPricePagination.currentItems?.map((item, index: number) => (\n <MemberPriceItem key={index} itemData={item} copy={copy.memberPriceTab} />\n ))}\n </div>\n <Pagination\n currentPage={currentPage}\n totalPages={memberPricePagination.totalPages}\n onPageChange={handlePageChange}\n />\n </>\n )}\n\n {/* \u79EF\u5206\u5151\u6362 Tab */}\n {activeTab === 'redeem' && (\n <>\n <div className=\"grid md:grid-cols-2 gap-[12px] grid-cols-4 md-xl:grid-cols-3 lg:gap-[16px]\">\n {redeemPagination.currentItems?.map((item, index: number) => (\n <RedeemableItem\n key={index}\n copy={{\n title: copy.title,\n ...copy.redeemTab,\n }}\n itemData={item}\n setRules={setRules}\n currencyCode={redeemProducts?.[0]?.price.currencyCode || 'USD'}\n />\n ))}\n </div>\n <Pagination\n currentPage={currentPage}\n totalPages={redeemPagination.totalPages}\n onPageChange={handlePageChange}\n />\n </>\n )}\n </div>\n\n {/* Rules Modal */}\n {rules && (\n <RulesModal\n overlayClassName=\"md:px-[16px] md:items-center\"\n className={cn('md:h-fit md:rounded-b-[16px]', !rounded && 'md:rounded-none')}\n isOpen={rules.length > 0}\n onClose={() => setRules([])}\n titleClassName=\"border-b-transparent h-[56px]\"\n rules={rules}\n scrollClassName=\"md:mt-[8px] md:mb-[24px] md:pt-0\"\n title={pageCommon?.ruleLabel}\n ruleClassName=\"text-[#1d1d1f] font-bold\"\n />\n )}\n </Container>\n )\n}\n"],
|
|
5
|
-
"mappings": "AA+UM,
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import { Container, Heading, Tabs, TabsContent, TabsList, TabsTrigger } from '@anker-in/headless-ui'\nimport { useMemo, useState, useEffect, useCallback, useRef } from 'react'\nimport Decimal from 'decimal.js'\n\nimport MemberPriceItem from './MemberPriceItem'\nimport RedeemableItem from '../creditsCash/RedeemableItem'\nimport useRedeemableList from '../context/hooks/useRedeemableList'\nimport RulesModal from '../modal/RulesModal'\nimport { Pagination } from './Pagination'\nimport { useProductsByHandles, useHeadlessContext, gaTrack } from '@anker-in/lib'\nimport { CreditsMemberPriceCopy, MemberPriceProduct } from './type'\nimport { Product, classNames as cn } from '@anker-in/lib'\nimport { useCreditsContext } from '../context/provider'\nimport { RedeemItem } from '../creditsCash/type'\nimport { FunctionDiscountType } from '../context/memberPriceConst'\nimport { ROUNDED_BRANDS } from '../../../constants'\n\nexport const CreditsMemberPrice = ({ copy, id }: { copy: CreditsMemberPriceCopy; id?: string }) => {\n const [activeTab, setActiveTab] = useState<'memberPrice' | 'redeem'>(copy.tabs[0]?.type || 'memberPrice')\n const [rules, setRules] = useState<string | string[]>()\n const [currentPage, setCurrentPage] = useState(1)\n const [itemsPerPage, setItemsPerPage] = useState(9) // \u9ED8\u8BA4 1024px \u4EE5\u4E0A\uFF1A3\u5217 \u00D7 3\u884C = 9\n const { redeemableList } = useRedeemableList()\n const { pageCommon, memberPriceDiscount, profile, gtm } = useCreditsContext()\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // \u5B9A\u4E49\u9700\u8981\u83B7\u53D6\u7684 metafield\uFF0C\u5305\u62EC\u900F\u660E\u56FE\u548C\u4F18\u60E0\u5238\u4FE1\u606F\n const variantMetafieldIdentifiers: any[] = [\n {\n namespace: 'global',\n key: 'transparentImg',\n },\n {\n namespace: '__discountCodeApp',\n key: 'data',\n },\n ]\n\n // \u6839\u636E\u5C4F\u5E55\u5C3A\u5BF8\u52A8\u6001\u8C03\u6574\u6BCF\u9875\u663E\u793A\u7684\u5546\u54C1\u6570\u91CF\n useEffect(() => {\n const updateItemsPerPage = () => {\n const width = window.innerWidth\n if (width >= 1440) {\n // 1920px \u4EE5\u4E0A\uFF1A4\u5217 \u00D7 3\u884C = 12\u4E2A\n setItemsPerPage(12)\n } else if (width >= 1024) {\n // 1024px - 1919px\uFF1A3\u5217 \u00D7 3\u884C = 9\u4E2A\n setItemsPerPage(9)\n } else if (width >= 768) {\n // 1024px \u4EE5\u4E0B\uFF1A3\u5217 \u00D7 4\u884C = 12\u4E2A\n setItemsPerPage(12)\n } else {\n // 768px \u4EE5\u4E0B\uFF1A2\u5217 \u00D7 4\u884C = 8\u4E2A\n setItemsPerPage(8)\n }\n }\n\n updateItemsPerPage()\n window.addEventListener('resize', updateItemsPerPage)\n return () => window.removeEventListener('resize', updateItemsPerPage)\n }, [])\n\n // \u5F53\u5207\u6362 tab \u6216\u6BCF\u9875\u6570\u91CF\u53D8\u5316\u65F6\u91CD\u7F6E\u9875\u7801\n useEffect(() => {\n setCurrentPage(1)\n }, [activeTab, itemsPerPage])\n\n // \u6839\u636E\u914D\u7F6E\u7684 ruleId \u67E5\u627E\u5BF9\u5E94\u7684\u4F1A\u5458\u4EF7\u89C4\u5219\n const targetRule = useMemo(() => {\n if (!memberPriceDiscount || !copy.memberPriceTab.memberPriceRuleId) return null\n return memberPriceDiscount.find(rule => String(rule.rule_id) === String(copy.memberPriceTab.memberPriceRuleId))\n }, [memberPriceDiscount, copy.memberPriceTab.memberPriceRuleId])\n\n const memberPriceHandles = useMemo(() => {\n if (!targetRule) return []\n\n // \u83B7\u53D6\u6240\u6709 user_identity === 1 \u7684 discounts\n const allDiscounts = targetRule.result_detail?.member_discounts?.filter(\n (discount: any) => discount.user_identity === 1\n ) || []\n\n // \u5408\u5E76\u6240\u6709 discounts \u7684 variants \u7684 handles\n const handles = allDiscounts.flatMap((discount: any) =>\n discount.main_products?.variants?.map((variant: any) => variant.handle) || []\n )\n\n return handles\n }, [targetRule])\n\n // \u83B7\u53D6\u4F1A\u5458\u4EF7\u4EA7\u54C1\u6570\u636E\uFF08\u901A\u8FC7\u4ECE memberPriceDiscount \u63D0\u53D6\u7684 handles \u83B7\u53D6\u4EA7\u54C1\uFF09\n const { data: memberPriceProducts } = useProductsByHandles({\n handles: memberPriceHandles,\n metafieldIdentifiers: {\n variant: variantMetafieldIdentifiers,\n },\n })\n\n // \u83B7\u53D6\u79EF\u5206\u5151\u6362\u4EA7\u54C1\u6570\u636E\n const { data: redeemProducts } = useProductsByHandles({\n handles: copy?.redeemTab?.list?.map(item => item.products?.[0]?.handle) || [],\n metafieldIdentifiers: {\n variant: variantMetafieldIdentifiers,\n },\n })\n\n // \u4ECE variant metafields \u4E2D\u83B7\u53D6\u6709\u6548\u7684 coupon \u6298\u6263\u91D1\u989D\n const getCouponDiscount = useCallback((variant: any) => {\n try {\n const discountData = variant?.metafields?.__discountCodeApp?.data\n if (!discountData) return 0\n\n // discountData \u5DF2\u7ECF\u662F\u5BF9\u8C61\uFF0C\u4E0D\u9700\u8981 JSON.parse\n const discounts = discountData\n if (!Array.isArray(discounts) || discounts.length === 0) return 0\n\n // \u83B7\u53D6\u7B2C\u4E00\u4E2A\u6709\u6548\u7684 coupon\uFF08\u68C0\u67E5\u65F6\u95F4\u8303\u56F4\uFF09\n const now = new Date()\n const validDiscount = discounts.find((discount: any) => {\n const startsAt = discount.starts_at ? new Date(discount.starts_at) : null\n const endsAt = discount.ends_at ? new Date(discount.ends_at) : null\n\n // \u68C0\u67E5 coupon \u662F\u5426\u5728\u6709\u6548\u671F\u5185\n if (startsAt && startsAt > now) return false\n if (endsAt && endsAt < now) return false\n\n return true\n })\n\n // \u8FD4\u56DE\u6298\u6263\u91D1\u989D\uFF08fixed_amount \u7C7B\u578B\uFF09\n if (validDiscount?.fixed_value) {\n return parseFloat(validDiscount.fixed_value)\n }\n\n return 0\n } catch (error) {\n console.error('Failed to get coupon discount:', error)\n return 0\n }\n }, [])\n\n // \u8BA1\u7B97\u4F1A\u5458\u4EF7\u7684\u8F85\u52A9\u51FD\u6570\uFF08\u4EC5\u4F7F\u7528\u666E\u901A\u4F1A\u5458 user_identity = 1 \u7684\u6298\u6263\uFF0C\u5E76\u53E0\u52A0 coupon \u6298\u6263\uFF09\n const calculateMemberPrice = useCallback(\n (price: number, discount: any, variant?: any) => {\n const discountConfig = discount?.discount_conf\n if (!discountConfig) return null\n\n // \u6839\u636E\u6298\u6263\u7C7B\u578B\u8BA1\u7B97\u4F1A\u5458\u4EF7\n let salePrice = new Decimal(price)\n switch (discountConfig.discount_type) {\n case FunctionDiscountType.Percentage:\n salePrice = salePrice.mul(100 - discountConfig.discount_value).div(100)\n break\n case FunctionDiscountType.FixedAmount:\n salePrice = salePrice.sub(discountConfig.discount_value)\n break\n case FunctionDiscountType.FixedPrice:\n salePrice = new Decimal(discountConfig.discount_value)\n break\n }\n\n // \u53E0\u52A0 coupon \u6298\u6263\n if (variant) {\n const couponDiscount = getCouponDiscount(variant)\n if (couponDiscount > 0) {\n salePrice = salePrice.sub(couponDiscount)\n }\n }\n\n // \u786E\u4FDD\u4EF7\u683C\u4E0D\u4E3A\u8D1F\u6570\n if (salePrice.lessThan(0)) {\n salePrice = new Decimal(0)\n }\n\n return {\n memberPrice: salePrice.toNumber(),\n originalPrice: price,\n }\n },\n [getCouponDiscount]\n )\n\n // \u5904\u7406\u4F1A\u5458\u4EF7\u4EA7\u54C1\u5217\u8868\uFF08\u4EC5\u666E\u901A\u4F1A\u5458 user_identity = 1 \u7684\u6298\u6263\uFF09\n const memberPriceList = useMemo(() => {\n if (!targetRule || !memberPriceProducts) return []\n\n // \u83B7\u53D6\u6240\u6709 user_identity === 1 \u7684 discounts\n const allDiscounts = targetRule.result_detail?.member_discounts?.filter(\n (discount: any) => discount.user_identity === 1\n ) || []\n\n // \u5408\u5E76\u6240\u6709 discounts \u7684 variants\uFF0C\u5E76\u4FDD\u5B58\u5BF9\u5E94\u7684 discount \u4FE1\u606F\n const allVariantsWithDiscount = allDiscounts.flatMap((discount: any) =>\n (discount.main_products?.variants || []).map((variant: any) => ({\n ...variant,\n discount, // \u5C06 discount \u4FE1\u606F\u4FDD\u5B58\u5230 variant \u4E2D\n }))\n )\n\n return (\n (allVariantsWithDiscount\n .map((variantWithDiscount: any) => {\n const product = memberPriceProducts.find(p => p.handle === variantWithDiscount.handle)\n if (!product) return null\n\n const productVariant = product.variants?.find(v => v.sku === variantWithDiscount.sku) || product.variants?.[0]\n if (!productVariant || !productVariant.availableForSale) return null\n\n const priceResult = calculateMemberPrice(\n productVariant.price.amount,\n variantWithDiscount.discount,\n productVariant\n )\n if (!priceResult) return null\n\n return {\n product,\n productVariant,\n memberPrice: priceResult.memberPrice,\n originalPrice: priceResult.originalPrice,\n }\n })\n ?.filter(Boolean) as unknown as MemberPriceProduct[]) || []\n )\n }, [targetRule, memberPriceProducts, calculateMemberPrice])\n\n // \u5904\u7406\u79EF\u5206\u5151\u6362\u4EA7\u54C1\u5217\u8868\uFF08\u590D\u7528 creditsCash \u7684\u903B\u8F91\uFF0C\u8FC7\u6EE4\u7F3A\u8D27\u5546\u54C1\uFF09\n const redeemList = useMemo(() => {\n return redeemProducts\n ?.map((product: Product) => {\n const config = copy.redeemTab.list.find(item => item.products?.[0]?.handle === product.handle)\n const alpcData = redeemableList.find(item => item.id?.toString() === config?.redeemId?.toString())\n const productVariant =\n product.variants?.find((variant: any) => variant.sku === config?.products?.[0]?.sku) || product.variants?.[0]\n\n // \u8FC7\u6EE4\u6761\u4EF6\uFF1A\n // 1. \u5FC5\u987B\u6709 alpcData \u548C productVariant\n // 2. \u5546\u54C1\u4E0D\u80FD\u7F3A\u8D27\n // 3. \u5982\u679C\u6709\u5E93\u5B58\u9650\u5236\uFF0C\u5219\u5E93\u5B58\u5FC5\u987B\u5927\u4E8E 0\n if (!alpcData || !productVariant) return null\n if (!productVariant.availableForSale) return null\n if (alpcData.is_limited && alpcData.remaining_inventory <= 0) return null\n\n return {\n product,\n productVariant,\n alpcData: {\n id: alpcData?.id,\n consumeCredits: alpcData?.consume_credits,\n remainingInventory: alpcData?.remaining_inventory,\n isLimited: alpcData?.is_limited,\n consumeType: alpcData?.consume_type,\n title: alpcData?.name,\n desc: alpcData?.note,\n },\n config,\n }\n })\n .filter(Boolean) as unknown as RedeemItem[]\n }, [redeemProducts, copy.redeemTab.list, redeemableList])\n\n // \u8BA1\u7B97\u4F1A\u5458\u4EF7\u5206\u9875\n const memberPricePagination = useMemo(() => {\n const totalItems = memberPriceList?.length || 0\n const totalPages = Math.ceil(totalItems / itemsPerPage)\n const startIndex = (currentPage - 1) * itemsPerPage\n const endIndex = startIndex + itemsPerPage\n const currentItems = memberPriceList?.slice(startIndex, endIndex) || []\n\n return {\n totalPages,\n currentItems,\n showPagination: totalPages > 1,\n }\n }, [memberPriceList, currentPage, itemsPerPage])\n\n // \u8BA1\u7B97\u79EF\u5206\u5151\u6362\u5206\u9875\n const redeemPagination = useMemo(() => {\n const totalItems = redeemList?.length || 0\n const totalPages = Math.ceil(totalItems / itemsPerPage)\n const startIndex = (currentPage - 1) * itemsPerPage\n const endIndex = startIndex + itemsPerPage\n const currentItems = redeemList?.slice(startIndex, endIndex) || []\n\n return {\n totalPages,\n currentItems,\n showPagination: totalPages > 1,\n }\n }, [redeemList, currentPage, itemsPerPage])\n\n // \u5904\u7406\u9875\u9762\u5207\u6362\uFF0C\u6EDA\u52A8\u5230\u6A21\u5757\u9876\u90E8\n const handlePageChange = useCallback(\n (page: number) => {\n setCurrentPage(page)\n // \u6EDA\u52A8\u5230\u6A21\u5757\u9876\u90E8\n if (containerRef.current) {\n const top = containerRef.current.offsetTop\n window.scrollTo({\n top: top - 80, // \u51CF\u53BB 80px \u7684\u504F\u79FB\u91CF\uFF0C\u907F\u514D\u88AB\u56FA\u5B9A\u5934\u90E8\u906E\u6321\n behavior: 'smooth',\n })\n }\n },\n [setCurrentPage]\n )\n\n // \u5904\u7406 tab \u5207\u6362\u5E76\u53D1\u9001\u57CB\u70B9\n const handleTabChange = useCallback(\n (value: string) => {\n const tabType = value as 'memberPrice' | 'redeem'\n setActiveTab(tabType)\n\n // \u67E5\u627E\u5F53\u524D tab \u7684 label\n const currentTab = copy.tabs.find(tab => tab.type === tabType)\n const tabLabel = currentTab?.label || ''\n\n // \u53D1\u9001 tab \u70B9\u51FB\u57CB\u70B9\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_button',\n member_active_status: profile?.activated ? 'active' : 'not active',\n event_parameters: {\n page_group: gtm.pageGroup,\n position: copy.title,\n button_name: tabLabel,\n },\n })\n },\n [copy.tabs, copy.title, profile?.activated, gtm.pageGroup]\n )\n\n return (\n <Container id={id} className={cn('bg-[#F5F5F5]')} ref={containerRef}>\n <Heading as=\"h2\" size=\"4\" html={copy.title} className=\"mx:px-[16px]\" />\n\n <Tabs\n align=\"left\"\n className=\"mt-[24px]\"\n value={activeTab}\n onValueChange={handleTabChange}\n >\n <TabsList>\n {copy.tabs.map((tab, index) => (\n <TabsTrigger key={index} value={tab.type}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {/* \u4F1A\u5458\u4EF7 Tab */}\n <TabsContent value=\"memberPrice\" className=\"relative mt-[24px]\">\n <div className=\"grid md:grid-cols-2 gap-[12px] grid-cols-4 md-xl:grid-cols-3 lg:gap-[16px]\">\n {memberPricePagination.currentItems?.map((item, index: number) => (\n <MemberPriceItem key={index} itemData={item} copy={copy.memberPriceTab} />\n ))}\n </div>\n <Pagination\n currentPage={currentPage}\n totalPages={memberPricePagination.totalPages}\n onPageChange={handlePageChange}\n />\n </TabsContent>\n\n {/* \u79EF\u5206\u5151\u6362 Tab */}\n <TabsContent value=\"redeem\" className=\"relative mt-[24px]\">\n <div className=\"grid md:grid-cols-2 gap-[12px] grid-cols-4 md-xl:grid-cols-3 lg:gap-[16px]\">\n {redeemPagination.currentItems?.map((item, index: number) => (\n <RedeemableItem\n key={index}\n copy={{\n title: copy.title,\n ...copy.redeemTab,\n }}\n itemData={item}\n setRules={setRules}\n currencyCode={redeemProducts?.[0]?.price.currencyCode || 'USD'}\n />\n ))}\n </div>\n <Pagination\n currentPage={currentPage}\n totalPages={redeemPagination.totalPages}\n onPageChange={handlePageChange}\n />\n </TabsContent>\n </Tabs>\n\n {/* Rules Modal */}\n {rules && (\n <RulesModal\n overlayClassName=\"md:px-[16px] md:items-center\"\n className={cn('md:h-fit md:rounded-b-[16px]', !rounded && 'md:rounded-none')}\n isOpen={rules.length > 0}\n onClose={() => setRules([])}\n titleClassName=\"border-b-transparent h-[56px]\"\n rules={rules}\n scrollClassName=\"md:mt-[8px] md:mb-[24px] md:pt-0\"\n title={pageCommon?.ruleLabel}\n ruleClassName=\"text-[#1d1d1f] font-bold\"\n />\n )}\n </Container>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["jsx", "jsxs", "Container", "Heading", "Tabs", "TabsContent", "TabsList", "TabsTrigger", "useMemo", "useState", "useEffect", "useCallback", "useRef", "Decimal", "MemberPriceItem", "RedeemableItem", "useRedeemableList", "RulesModal", "Pagination", "useProductsByHandles", "useHeadlessContext", "gaTrack", "cn", "useCreditsContext", "FunctionDiscountType", "ROUNDED_BRANDS", "CreditsMemberPrice", "copy", "id", "activeTab", "setActiveTab", "rules", "setRules", "currentPage", "setCurrentPage", "itemsPerPage", "setItemsPerPage", "redeemableList", "pageCommon", "memberPriceDiscount", "profile", "gtm", "brand", "rounded", "containerRef", "variantMetafieldIdentifiers", "updateItemsPerPage", "width", "targetRule", "rule", "memberPriceHandles", "discount", "variant", "memberPriceProducts", "redeemProducts", "item", "getCouponDiscount", "discountData", "discounts", "now", "validDiscount", "startsAt", "endsAt", "error", "calculateMemberPrice", "price", "discountConfig", "salePrice", "couponDiscount", "memberPriceList", "variantWithDiscount", "product", "p", "productVariant", "v", "priceResult", "redeemList", "config", "alpcData", "memberPricePagination", "totalItems", "totalPages", "startIndex", "endIndex", "currentItems", "redeemPagination", "handlePageChange", "page", "top", "handleTabChange", "value", "tabType", "tabLabel", "tab", "index"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Fragment as
|
|
1
|
+
import{Fragment as pe,jsx as a,jsxs as y}from"react/jsx-runtime";import{Container as z,Heading as U,Tabs as j,TabsContent as q,TabsList as J,TabsTrigger as K}from"@anker-in/headless-ui";import R from"classnames";import{useCallback as Q,useMemo as x,useState as I}from"react";import W from"./RedeemCouponModal";import X from"./RedeemProductModal";import Y from"./RedeemVirtualProductModal";import{useCreditsContext as Z}from"../context/provider";import ee from"../context/hooks/useRedeemableList";import{AlpcConsumeType as P,AlpcErrorCode as te,ConsumeType as l}from"../context/const";import{useHeadlessContext as ae,useProductsByHandles as oe,gaTrack as ne,classNames as A}from"@anker-in/lib";import{RedeemableItem as re}from"./RedeemableItem";import{ROUNDED_BRANDS as se}from"../../../constants";import ie from"../modal/RulesModal";import{useRegistration as le}from"../../../components/registration";import{numberFormat as de}from"../context/utils";import me from"../context/hooks/useMyRewards";const Me=({copy:t,id:G})=>{const{profile:T,openSignUpPopup:D,gtm:{pageGroup:w},pageCommon:c,creditInfo:F}=Z(),{authCodeActivate:g}=le(),{brand:h,locale:O}=ae(),N=se.includes(h),p=Object.keys(T||{}).length>0,[o,u]=I(void 0),[f,L]=I(),{listLoading:B,redeemableList:_,getRedeemableList:k}=ee(),{myRewards:S}=me({page:1,pageSize:100,consumeType:P.ExternalProduct}),i=x(()=>({...c?.redeemModal||{},...t.redeemModal||{}}),[t.redeemModal,c?.redeemModal]),d=x(()=>_.map(e=>({id:e.id.toString(),title:e.name,consumeCredits:e.consume_credits,remainingInventory:e.remaining_inventory,isLimited:!!e.is_limited,consumeType:e.consume_type,handle:e.sku_handle,sku:e.goods_sku,image:e.goods_url})),[_]),H=d.map(e=>e.handle),{data:E}=oe({handles:H}),V=x(()=>{const e=new Map;return(t.list||[]).forEach(m=>{const C=(m.list||[]).filter(r=>d.some(n=>String(n.id)===String(r.id))).map(r=>{const n=d.find(s=>String(s.id)===String(r.id)),v=E?.find(s=>s.handle===n?.handle),M=v?.variants.find(s=>s.sku===n?.sku);if(n?.isLimited&&(!n?.remainingInventory||n.remainingInventory<=0)||n?.consumeType===P.Product&&(!v||!M))return null;const $=r.type===l.GoGift&&p&&S.some(s=>s.rule_id===Number(r.id));return{alpc:n,config:r,product:v,variant:M,hasRedeemed:$}}).filter(r=>r!==null);e.set(m.label,C)}),e},[t.list,d,E,p,S]),b=Q(e=>{e===te.CodeLpcRuleInventoryNotEnough&&k()},[k]);return y(z,{id:G,className:R("relative bg-[#F5F5F7]"),children:[a(U,{as:"h2",size:"4",html:t.title}),p&&t.availableCredits&&a("p",{className:"mt-[12px] text-[20px] l-xxl:text-[18px] l:text-[16px] font-bold text-[#4A4C56]",children:t.availableCredits.includes("$credits")?y(pe,{children:[t.availableCredits.split("$credits")[0],a("span",{className:A("text-brand-color-0",h==="ankersolix"&&"bg-gradient-to-r from-[#2c7ed0] via-[#00a9e1] via-[43%] to-[#00db84] bg-clip-text text-transparent"),children:de(F?.available_credit||0,O).toString()}),t.availableCredits.split("$credits")[1]||""]}):t.availableCredits}),y(j,{shape:N?"rounded":"square",align:"left",defaultValue:t.list?.[0]?.label||"",onValueChange:e=>{ne({event:"ga4Event",event_name:"lp_navigation",event_parameters:{navigation:e,page_group:w}})},children:[a("div",{className:R("py-[24px] md:justify-center"),children:a(J,{children:(t.list||[]).map(e=>a(K,{value:e.label,children:e.label},e.label))})}),(t.list||[]).map(e=>a(q,{value:e.label,children:!!d?.length&&!B&&a("div",{className:R("relative grid grid-cols-4 gap-[16px] md:grid-cols-2 md:gap-[12px] md-xl:grid-cols-3"),children:(V.get(e.label)||[])?.map(m=>a(re,{copy:t,item:m,onRedeem:C=>{p?!T?.activated&&!g.isActivateSuccess?(g.setAutoSendEmail(!0),g.open()):u(C):D()},onRulesOpen:L},m?.alpc?.id))})},e.label))]}),(o?.config?.type===l.Coupon||o?.config?.type===l.ShippingCoupon)&&i?.coupon&&o&&a(W,{item:o,copy:i,onError:b,onClose:()=>{u(void 0)}}),o?.config?.type===l.Product&&i?.product&&o&&a(X,{item:o,copy:i,onError:b,onClose:()=>{u(void 0)}}),(o?.config?.type===l.GiftCard||o?.config?.type===l.GoGift)&&i?.virtualProduct&&o&&a(Y,{item:o,copy:i,onError:b,onClose:()=>{u(void 0)}}),f&&a(ie,{overlayClassName:"md:px-[16px] md:items-center",className:A("md:h-fit md:rounded-b-[16px]",!N&&"md:rounded-none"),isOpen:f.length>0,onClose:()=>L([]),titleClassName:"border-b-transparent h-[56px]",rules:f,scrollClassName:"md:mt-[8px] md:mb-[24px] md:pt-0",title:c?.ruleLabel,ruleClassName:"text-[#1d1d1f] font-bold"})]})};export{Me as CreditsRedeemList};
|
|
2
2
|
//# sourceMappingURL=CreditsRedeemList.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/credits/creditsRedeemList/CreditsRedeemList.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Container, Heading, Tabs, TabsList, TabsTrigger } from '@anker-in/headless-ui'\nimport classNames from 'classnames'\nimport { useCallback, useMemo, useState } from 'react'\n\nimport RedeemCouponModal from './RedeemCouponModal'\nimport RedeemProductModal from './RedeemProductModal'\nimport RedeemVirtualProductModal from './RedeemVirtualProductModal'\nimport { useCreditsContext } from '../context/provider'\nimport useRedeemableList from '../context/hooks/useRedeemableList'\nimport { AlpcConsumeType, AlpcErrorCode, ConsumeType } from '../context/const'\nimport { useHeadlessContext, useProductsByHandles, gaTrack, classNames as cn } from '@anker-in/lib'\nimport type { RedeemableItem as RedeemableItemType } from '../type'\nimport { RedeemableItem } from './RedeemableItem'\nimport { ROUNDED_BRANDS } from '../../../constants'\nimport RulesModal from '../modal/RulesModal'\nimport { CreditsRedeemListCopy } from './type'\nimport { useRegistration } from '../../../components/registration'\nimport { numberFormat } from '../context/utils'\nimport useMyRewards from '../context/hooks/useMyRewards'\n\nexport const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; id?: string }) => {\n const {\n profile,\n openSignUpPopup,\n gtm: { pageGroup },\n pageCommon,\n creditInfo,\n } = useCreditsContext()\n const { authCodeActivate } = useRegistration()\n const { brand, locale } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const isLogin = Object.keys(profile || {}).length > 0\n\n const [
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["Fragment", "jsx", "jsxs", "Container", "Heading", "Tabs", "TabsList", "TabsTrigger", "classNames", "useCallback", "useMemo", "useState", "RedeemCouponModal", "RedeemProductModal", "RedeemVirtualProductModal", "useCreditsContext", "useRedeemableList", "AlpcConsumeType", "AlpcErrorCode", "ConsumeType", "useHeadlessContext", "useProductsByHandles", "gaTrack", "cn", "RedeemableItem", "ROUNDED_BRANDS", "RulesModal", "useRegistration", "numberFormat", "useMyRewards", "CreditsRedeemList", "copy", "id", "profile", "openSignUpPopup", "pageGroup", "pageCommon", "creditInfo", "authCodeActivate", "brand", "locale", "rounded", "isLogin", "
|
|
4
|
+
"sourcesContent": ["import { Container, Heading, Tabs, TabsContent, TabsList, TabsTrigger } from '@anker-in/headless-ui'\nimport classNames from 'classnames'\nimport { useCallback, useMemo, useState } from 'react'\n\nimport RedeemCouponModal from './RedeemCouponModal'\nimport RedeemProductModal from './RedeemProductModal'\nimport RedeemVirtualProductModal from './RedeemVirtualProductModal'\nimport { useCreditsContext } from '../context/provider'\nimport useRedeemableList from '../context/hooks/useRedeemableList'\nimport { AlpcConsumeType, AlpcErrorCode, ConsumeType } from '../context/const'\nimport { useHeadlessContext, useProductsByHandles, gaTrack, classNames as cn } from '@anker-in/lib'\nimport type { RedeemableItem as RedeemableItemType } from '../type'\nimport { RedeemableItem } from './RedeemableItem'\nimport { ROUNDED_BRANDS } from '../../../constants'\nimport RulesModal from '../modal/RulesModal'\nimport { CreditsRedeemListCopy } from './type'\nimport { useRegistration } from '../../../components/registration'\nimport { numberFormat } from '../context/utils'\nimport useMyRewards from '../context/hooks/useMyRewards'\n\nexport const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; id?: string }) => {\n const {\n profile,\n openSignUpPopup,\n gtm: { pageGroup },\n pageCommon,\n creditInfo,\n } = useCreditsContext()\n const { authCodeActivate } = useRegistration()\n const { brand, locale } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const isLogin = Object.keys(profile || {}).length > 0\n\n const [popRedeemData, setPopRedeemData] = useState<RedeemableItemType | undefined>(undefined)\n\n const [rules, setRules] = useState<string | string[]>()\n\n const { listLoading, redeemableList, getRedeemableList } = useRedeemableList()\n\n // \u83B7\u53D6\u7528\u6237\u7684 ExternalProduct \u5151\u6362\u8BB0\u5F55\n const { myRewards } = useMyRewards({\n page: 1,\n pageSize: 100,\n consumeType: AlpcConsumeType.ExternalProduct,\n })\n\n // \u5408\u5E76 redeemModal \u6587\u6848\uFF0C\u4F18\u5148\u4F7F\u7528 copy.redeemModal\uFF0Cfallback \u5230 pageCommon.redeemModal\n const redeemModalCopy = useMemo(() => {\n return {\n ...(pageCommon?.redeemModal || {}),\n ...(copy.redeemModal || {}),\n }\n }, [copy.redeemModal, pageCommon?.redeemModal])\n\n const alpcList = useMemo(() => {\n return redeemableList.map(item => {\n return {\n id: item.id.toString(),\n title: item.name,\n consumeCredits: item.consume_credits,\n remainingInventory: item.remaining_inventory,\n isLimited: !!item.is_limited,\n consumeType: item.consume_type,\n handle: item.sku_handle,\n sku: item.goods_sku,\n image: item.goods_url,\n }\n })\n }, [redeemableList])\n\n const handles = alpcList.map(item => item.handle)\n const { data: products } = useProductsByHandles({ handles })\n\n // \u6309 tab label \u5206\u7EC4\u9884\u8BA1\u7B97\u5217\u8868\uFF0C\u914D\u5408 TabsContent \u58F0\u660E\u5F0F\u6E32\u67D3\uFF0C\u907F\u514D\u624B\u52A8 activeTab \u5B57\u7B26\u4E32\u6BD4\u8F83\n const listByTab = useMemo(() => {\n const map = new Map<string, RedeemableItemType[]>()\n ;(copy.list || []).forEach(categoryItem => {\n const items = (categoryItem.list || [])\n .filter(item => alpcList.some(alpcItem => String(alpcItem.id) === String(item.id)))\n .map(item => {\n const alpcItem = alpcList.find(alpcItem => String(alpcItem.id) === String(item.id))\n const product = products?.find(product => product.handle === alpcItem?.handle)\n const variant = product?.variants.find(variant => variant.sku === alpcItem?.sku)\n // \u8FC7\u6EE4\u6389\u5E93\u5B58\u4E0D\u8DB3\u7684\u5546\u54C1\n if (alpcItem?.isLimited && (!alpcItem?.remainingInventory || alpcItem.remainingInventory <= 0)) return null\n if (alpcItem?.consumeType === AlpcConsumeType.Product && (!product || !variant)) return null\n\n // \u68C0\u67E5 GoGift \u662F\u5426\u5DF2\u7ECF\u5151\u6362\u8FC7\uFF08\u53EA\u6709 GoGift \u9650\u5236\u5151\u6362\u4E00\u6B21\uFF09\n const hasRedeemed = item.type === ConsumeType.GoGift &&\n isLogin &&\n myRewards.some(reward => reward.rule_id === Number(item.id))\n\n return {\n alpc: alpcItem,\n config: item,\n product,\n variant,\n hasRedeemed,\n }\n })\n .filter(item => item !== null) as unknown as RedeemableItemType[]\n map.set(categoryItem.label, items)\n })\n return map\n }, [copy.list, alpcList, products, isLogin, myRewards])\n\n const handleRedeemError = useCallback(\n (errorCode: AlpcErrorCode) => {\n if (errorCode === AlpcErrorCode.CodeLpcRuleInventoryNotEnough) {\n getRedeemableList()\n }\n },\n [getRedeemableList]\n )\n\n return (\n <Container id={id} className={classNames('relative bg-[#F5F5F7]')}>\n <Heading as=\"h2\" size=\"4\" html={copy.title} />\n\n {/* \u53EF\u7528\u79EF\u5206\u5C55\u793A */}\n {isLogin && copy.availableCredits && (\n <p className=\"mt-[12px] text-[20px] l-xxl:text-[18px] l:text-[16px] font-bold text-[#4A4C56]\">\n {copy.availableCredits.includes('$credits') ? (\n <>\n {copy.availableCredits.split('$credits')[0]}\n <span\n className={cn(\n 'text-brand-color-0',\n brand === 'ankersolix' &&\n 'bg-gradient-to-r from-[#2c7ed0] via-[#00a9e1] via-[43%] to-[#00db84] bg-clip-text text-transparent'\n )}\n >\n {numberFormat(creditInfo?.available_credit || 0, locale).toString()}\n </span>\n {copy.availableCredits.split('$credits')[1] || ''}\n </>\n ) : (\n copy.availableCredits\n )}\n </p>\n )}\n\n <Tabs\n shape={rounded ? 'rounded' : 'square'}\n align=\"left\"\n defaultValue={copy.list?.[0]?.label || ''}\n onValueChange={value => {\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_navigation',\n event_parameters: {\n navigation: value,\n page_group: pageGroup,\n },\n })\n }}\n >\n <div className={classNames('py-[24px] md:justify-center')}>\n <TabsList>\n {(copy.list || []).map(item => (\n <TabsTrigger key={item.label} value={item.label}>\n {item.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </div>\n {(copy.list || []).map(categoryItem => (\n <TabsContent key={categoryItem.label} value={categoryItem.label}>\n {/* PC\u7AEF */}\n {!!alpcList?.length && !listLoading && (\n <div\n className={classNames(\n 'relative grid grid-cols-4 gap-[16px] md:grid-cols-2 md:gap-[12px] md-xl:grid-cols-3'\n )}\n >\n {(listByTab.get(categoryItem.label) || [])?.map(item => (\n <RedeemableItem\n key={item?.alpc?.id}\n copy={copy}\n item={item}\n onRedeem={(item: RedeemableItemType) => {\n if (!isLogin) {\n openSignUpPopup()\n } else if (!profile?.activated && !authCodeActivate.isActivateSuccess) {\n authCodeActivate.setAutoSendEmail(true)\n authCodeActivate.open()\n } else {\n setPopRedeemData(item)\n }\n }}\n onRulesOpen={setRules}\n />\n ))}\n </div>\n )}\n </TabsContent>\n ))}\n </Tabs>\n\n {(popRedeemData?.config?.type === ConsumeType.Coupon ||\n popRedeemData?.config?.type === ConsumeType.ShippingCoupon) &&\n redeemModalCopy?.coupon &&\n popRedeemData && (\n <RedeemCouponModal\n item={popRedeemData}\n copy={redeemModalCopy}\n onError={handleRedeemError}\n onClose={() => {\n setPopRedeemData(undefined)\n }}\n />\n )}\n {popRedeemData?.config?.type === ConsumeType.Product && redeemModalCopy?.product && popRedeemData && (\n <RedeemProductModal\n item={popRedeemData}\n copy={redeemModalCopy}\n onError={handleRedeemError}\n onClose={() => {\n setPopRedeemData(undefined)\n }}\n />\n )}\n {(popRedeemData?.config?.type === ConsumeType.GiftCard || popRedeemData?.config?.type === ConsumeType.GoGift) &&\n redeemModalCopy?.virtualProduct &&\n popRedeemData && (\n <RedeemVirtualProductModal\n item={popRedeemData}\n copy={redeemModalCopy}\n onError={handleRedeemError}\n onClose={() => {\n setPopRedeemData(undefined)\n }}\n />\n )}\n {rules && (\n <RulesModal\n overlayClassName=\"md:px-[16px] md:items-center\"\n className={cn('md:h-fit md:rounded-b-[16px]', !rounded && 'md:rounded-none')}\n isOpen={rules.length > 0}\n onClose={() => setRules([])}\n titleClassName=\"border-b-transparent h-[56px]\"\n rules={rules}\n scrollClassName=\"md:mt-[8px] md:mb-[24px] md:pt-0\"\n title={pageCommon?.ruleLabel}\n ruleClassName=\"text-[#1d1d1f] font-bold\"\n />\n )}\n </Container>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Fragment", "jsx", "jsxs", "Container", "Heading", "Tabs", "TabsContent", "TabsList", "TabsTrigger", "classNames", "useCallback", "useMemo", "useState", "RedeemCouponModal", "RedeemProductModal", "RedeemVirtualProductModal", "useCreditsContext", "useRedeemableList", "AlpcConsumeType", "AlpcErrorCode", "ConsumeType", "useHeadlessContext", "useProductsByHandles", "gaTrack", "cn", "RedeemableItem", "ROUNDED_BRANDS", "RulesModal", "useRegistration", "numberFormat", "useMyRewards", "CreditsRedeemList", "copy", "id", "profile", "openSignUpPopup", "pageGroup", "pageCommon", "creditInfo", "authCodeActivate", "brand", "locale", "rounded", "isLogin", "popRedeemData", "setPopRedeemData", "rules", "setRules", "listLoading", "redeemableList", "getRedeemableList", "myRewards", "redeemModalCopy", "alpcList", "item", "handles", "products", "listByTab", "map", "categoryItem", "items", "alpcItem", "product", "variant", "hasRedeemed", "reward", "handleRedeemError", "errorCode", "value"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Fragment as
|
|
1
|
+
import{Fragment as _,jsx as i,jsxs as r}from"react/jsx-runtime";import{useCallback as N,useMemo as u,useState as U}from"react";import{useCreditsContext as R}from"../context/provider";import{CreditType as a,DTC_TASK_TYPE as g,TaskSubType as n,TaskType as w}from"../context/const";import E from"../context/hooks/useActivities";import{CreditsModalContainer as Y}from"./ModalContainer";import{classNames as x,useHeadlessContext as B}from"@anker-in/lib";import{Tabs as z,TabsContent as I,TabsList as O,TabsTrigger as V}from"@anker-in/headless-ui";import j from"./LoadingDots";import{Picture as F,Text as h}from"@anker-in/headless-ui";import{ROUNDED_BRANDS as H}from"../../../constants";import A from"dayjs";function q({data:e,...m}){const[c,M]=U(1),{taskIdToTypeMapping:T}=R(),{brand:C}=B(),y=H.includes(C),P=u(()=>({page:m.isOpen?c:0,pageSize:1e3}),[m.isOpen,c]),f=u(()=>{const t=[{title:e.allTab,type:a.All},{title:e.earnedTab,type:a.Earned},{title:e.deductedTab,type:a.Deducted}];return e.expiredTab&&t.push({title:e.expiredTab,type:a.Expired}),t},[e]),{activities:v=[],canNext:k,isLoading:b}=E(P),o=u(()=>{const t={[n.Activation]:e.activationTask,[n.UpdateName]:e.updateNameTask,[n.UpdatePhone]:e.updatePhoneTask,[n.UpdateBirthday]:e.updateBirthdayTask,[n.Subscription]:e.subscriptionTask,[n.UpadteAppName]:e.updateAppNameTask,[n.Refund]:e.refundTask,[n.ProductUnApproved]:e.productUnApprovedTask},s={[g.FirstPurchase]:e.firstPurchaseTask,[g.UploadReceipt]:e.uploadReceiptTask,[g.Shopping]:e.shoppingTask};function d(p){return p.task_type===w.Redeem&&p.task_sub_type===n.ProductUnApproved&&e.productUnApprovedTask?p.task_name.replace("Refund",e.productUnApprovedTask):T?.[String(p.task_rule_id)]?s[T?.[String(p.task_rule_id)]]||p.task_name:t[p.task_sub_type]||p.task_name}return v.map(p=>({title:d(p),date:new Date(p.create_time*1e3),value:p.credit,type:p.credit_type,pending_time:p.pending_time,credit_type:p.credit_type,status:p.status}))},[e.activationTask,e.updateNameTask,e.updatePhoneTask,e.updateBirthdayTask,e.subscriptionTask,e.updateAppNameTask,e.refundTask,e.productUnApprovedTask,e.firstPurchaseTask,e.uploadReceiptTask,e.shoppingTask,v,T]),l=N(t=>{let{value:s,...d}=t;return t.type===a.Deducted&&s>0&&(s=-s),{value:s,...d}},[]),S=u(()=>{const t=new Map;return t.set(a.All,o.map(l)),t.set(a.Earned,o.filter(s=>s.type===1).map(l)),t.set(a.Deducted,o.filter(s=>s.type===2&&s.status!==3).map(l)),t.set(a.Expired,o.filter(s=>s.type===2&&s.status===3).map(l)),t},[o,l]),D=N(()=>{k&&M(c+1)},[c,k]),L=t=>r(_,{children:[i("div",{className:"flex-1 overflow-auto overscroll-contain",children:r("div",{className:"grid gap-[18px] md:gap-[12px]",children:[b&&i("div",{className:"flex flex-1 flex-col items-center justify-center",children:i(j,{})}),!b&&i(_,{children:t.length>0?t.map((s,d)=>r("div",{className:x("flex h-fit items-center justify-between rounded-[8px] bg-[#f2f0f1] px-[16px] py-[20px] text-[16px]",!y&&"rounded-none"),children:[r("div",{className:"grid gap-[6px]",children:[i("div",{className:"font-bold",children:s.title}),i("div",{className:"text-[14px] font-semibold text-[#999]",children:A(s.date).format("YYYY-MM-DD HH:mm").toString()}),!e.pendingTips&&r("div",{className:`hidden text-[14px] font-semibold text-[#777] ${s.status===2&&s.credit_type===1?"!flex":""}`,children:[i(h,{html:e.pendingTips}),i("span",{children:A.unix(s.pending_time).add(1,"day").format("YYYY-MM-DD")}),e.pendingTips2&&i(h,{html:e.pendingTips2})]})]}),r("div",{className:x("font-bold",s.value>=0||s.credit_type===a.Expired?"text-[#52C41A]":"text-[#F84D4F]"),children:[s.value>=0&&"+",s.value]})]},d)):r("div",{className:"flex flex-col items-center justify-center py-[40px]",children:[i(F,{className:"mb-[16px] h-[120px] w-[160px]",source:e?.emptyListImage?.url,alt:e?.emptyListImage?.alt||"empty list image"}),i("div",{className:"leading-1.4 text-[16px] font-semibold",children:e?.emptyListLabel})]})})]})}),t.length>0&&i("div",{className:"mt-[12px] pb-[24px] text-[14px] font-semibold text-[#999]",children:e.tips})]});return i(Y,{title:e.title,className:x("h-[800px] w-[640px]"),useAnimation:!0,animationClassName:"md:translate-y-[100vh]",scrollClassName:"flex flex-col",...m,onScrollEnd:D,children:r(z,{align:"left",shape:y?"rounded":"square",defaultValue:f[0]?.type?.toString(),className:"flex-1 flex flex-col",children:[i("div",{className:"w-full sticky top-0 bg-white z-10 pb-[24px] overflow-x-auto",children:i(O,{children:f.map(t=>i(V,{value:t.type.toString(),children:t.title},t.type))})}),f.map(t=>i(I,{value:t.type.toString(),className:"flex-1 flex flex-col",children:L(S.get(t.type)||[])},t.type))]})})}var ie=q;export{ie as default};
|
|
2
2
|
//# sourceMappingURL=ActivitiesModal.js.map
|