@anker-in/campaign-ui 0.5.4-beta.3 → 0.5.5-beta.1

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.
@@ -1,2 +1,2 @@
1
- "use strict";var se=Object.create;var y=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var le=(e,s)=>{for(var i in s)y(e,i,{get:s[i],enumerable:!0})},B=(e,s,i,v)=>{if(s&&typeof s=="object"||typeof s=="function")for(let u of oe(s))!ie.call(e,u)&&u!==i&&y(e,u,{get:()=>s[u],enumerable:!(v=ne(s,u))||v.enumerable});return e};var f=(e,s,i)=>(i=e!=null?se(re(e)):{},B(s||!e||!e.__esModule?y(i,"default",{value:e,enumerable:!0}):i,e)),de=e=>B(y({},"__esModule",{value:!0}),e);var pe={};le(pe,{CreditsRedeemList:()=>me});module.exports=de(pe);var a=require("react/jsx-runtime"),r=require("@anker-in/headless-ui"),T=f(require("classnames")),o=require("react"),H=f(require("./RedeemCouponModal")),$=f(require("./RedeemProductModal")),z=f(require("./RedeemVirtualProductModal")),U=require("../context/provider"),V=f(require("../context/hooks/useRedeemableList")),n=require("../context/const"),m=require("@anker-in/lib"),j=require("./RedeemableItem"),q=require("../../../constants"),J=f(require("../modal/RulesModal")),K=require("../../../components/registration"),Q=require("../context/utils"),W=f(require("../context/hooks/useMyRewards"));const me=({copy:e,id:s})=>{const{profile:i,openSignUpPopup:v,gtm:{pageGroup:u},pageCommon:h,creditInfo:X}=(0,U.useCreditsContext)(),{authCodeActivate:N}=(0,K.useRegistration)(),{brand:M,locale:Y}=(0,m.useHeadlessContext)(),I=q.ROUNDED_BRANDS.includes(M),R=Object.keys(i||{}).length>0,[L,A]=(0,o.useState)(e.list?.[0]?.label||"");(0,o.useEffect)(()=>{const t=(e.list||[]).map(c=>c.label);t.length&&!t.includes(L)&&A(t[0])},[e.list,L]);const[l,x]=(0,o.useState)(void 0),[_,P]=(0,o.useState)(),{listLoading:Z,redeemableList:G,getRedeemableList:D}=(0,V.default)(),{myRewards:w}=(0,W.default)({page:1,pageSize:100,consumeType:n.AlpcConsumeType.ExternalProduct}),b=(0,o.useMemo)(()=>({...h?.redeemModal||{},...e.redeemModal||{}}),[e.redeemModal,h?.redeemModal]),C=(0,o.useMemo)(()=>G.map(t=>({id:t.id.toString(),title:t.name,consumeCredits:t.consume_credits,remainingInventory:t.remaining_inventory,isLimited:!!t.is_limited,consumeType:t.consume_type,handle:t.sku_handle,sku:t.goods_sku,image:t.goods_url})),[G]),ee=C.map(t=>t.handle),{data:F}=(0,m.useProductsByHandles)({handles:ee}),te=(0,o.useMemo)(()=>{const t=new Map;return(e.list||[]).forEach(c=>{const E=(c.list||[]).filter(p=>C.some(d=>String(d.id)===String(p.id))).map(p=>{const d=C.find(g=>String(g.id)===String(p.id)),S=F?.find(g=>g.handle===d?.handle),O=S?.variants.find(g=>g.sku===d?.sku);if(d?.isLimited&&(!d?.remainingInventory||d.remainingInventory<=0)||d?.consumeType===n.AlpcConsumeType.Product&&(!S||!O))return null;const ae=p.type===n.ConsumeType.GoGift&&R&&w.some(g=>g.rule_id===Number(p.id));return{alpc:d,config:p,product:S,variant:O,hasRedeemed:ae}}).filter(p=>p!==null);t.set(c.label,E)}),t},[e.list,C,F,R,w]),k=(0,o.useCallback)(t=>{t===n.AlpcErrorCode.CodeLpcRuleInventoryNotEnough&&D()},[D]);return(0,a.jsxs)(r.Container,{id:s,className:(0,T.default)("relative bg-[#F5F5F7]"),children:[(0,a.jsx)(r.Heading,{as:"h2",size:"4",html:e.title}),R&&e.availableCredits&&(0,a.jsx)("p",{className:"mt-[12px] text-[20px] l-xxl:text-[18px] l:text-[16px] font-bold text-[#4A4C56]",children:e.availableCredits.includes("$credits")?(0,a.jsxs)(a.Fragment,{children:[e.availableCredits.split("$credits")[0],(0,a.jsx)("span",{className:(0,m.classNames)("text-brand-color-0",M==="ankersolix"&&"bg-gradient-to-r from-[#2c7ed0] via-[#00a9e1] via-[43%] to-[#00db84] bg-clip-text text-transparent"),children:(0,Q.numberFormat)(X?.available_credit||0,Y).toString()}),e.availableCredits.split("$credits")[1]||""]}):e.availableCredits}),(0,a.jsxs)(r.Tabs,{shape:I?"rounded":"square",align:"left",value:L,onValueChange:t=>{A(t),(0,m.gaTrack)({event:"ga4Event",event_name:"lp_navigation",event_parameters:{navigation:t,page_group:u}})},children:[(0,a.jsx)("div",{className:(0,T.default)("py-[24px] md:justify-center"),children:(0,a.jsx)(r.TabsList,{children:(e.list||[]).map(t=>(0,a.jsx)(r.TabsTrigger,{value:t.label,children:t.label},t.label))})}),(e.list||[]).map(t=>(0,a.jsx)(r.TabsContent,{value:t.label,children:!!C?.length&&!Z&&(0,a.jsx)("div",{className:(0,T.default)("relative grid grid-cols-4 gap-[16px] md:grid-cols-2 md:gap-[12px] md-xl:grid-cols-3"),children:(te.get(t.label)||[])?.map(c=>(0,a.jsx)(j.RedeemableItem,{copy:e,item:c,onRedeem:E=>{R?!i?.activated&&!N.isActivateSuccess?(N.setAutoSendEmail(!0),N.open()):x(E):v()},onRulesOpen:P},c?.alpc?.id))})},t.label))]}),(l?.config?.type===n.ConsumeType.Coupon||l?.config?.type===n.ConsumeType.ShippingCoupon)&&b?.coupon&&l&&(0,a.jsx)(H.default,{item:l,copy:b,onError:k,onClose:()=>{x(void 0)}}),l?.config?.type===n.ConsumeType.Product&&b?.product&&l&&(0,a.jsx)($.default,{item:l,copy:b,onError:k,onClose:()=>{x(void 0)}}),(l?.config?.type===n.ConsumeType.GiftCard||l?.config?.type===n.ConsumeType.GoGift)&&b?.virtualProduct&&l&&(0,a.jsx)(z.default,{item:l,copy:b,onError:k,onClose:()=>{x(void 0)}}),_&&(0,a.jsx)(J.default,{overlayClassName:"md:px-[16px] md:items-center",className:(0,m.classNames)("md:h-fit md:rounded-b-[16px]",!I&&"md:rounded-none"),isOpen:_.length>0,onClose:()=>P([]),titleClassName:"border-b-transparent h-[56px]",rules:_,scrollClassName:"md:mt-[8px] md:mb-[24px] md:pt-0",title:h?.ruleLabel,ruleClassName:"text-[#1d1d1f] font-bold"})]})};
1
+ "use strict";var te=Object.create;var y=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var ne=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var se=(e,o)=>{for(var s in o)y(e,s,{get:o[s],enumerable:!0})},F=(e,o,s,v)=>{if(o&&typeof o=="object"||typeof o=="function")for(let u of oe(o))!re.call(e,u)&&u!==s&&y(e,u,{get:()=>o[u],enumerable:!(v=ae(o,u))||v.enumerable});return e};var g=(e,o,s)=>(s=e!=null?te(ne(e)):{},F(o||!e||!e.__esModule?y(s,"default",{value:e,enumerable:!0}):s,e)),ie=e=>F(y({},"__esModule",{value:!0}),e);var de={};se(de,{CreditsRedeemList:()=>le});module.exports=ie(de);var a=require("react/jsx-runtime"),r=require("@anker-in/headless-ui"),T=g(require("classnames")),d=require("react"),O=g(require("./RedeemCouponModal")),B=g(require("./RedeemProductModal")),H=g(require("./RedeemVirtualProductModal")),V=require("../context/provider"),$=g(require("../context/hooks/useRedeemableList")),n=require("../context/const"),m=require("@anker-in/lib"),z=require("./RedeemableItem"),U=require("../../../constants"),j=g(require("../modal/RulesModal")),q=require("../../../components/registration"),J=require("../context/utils"),K=g(require("../context/hooks/useMyRewards"));const le=({copy:e,id:o})=>{const{profile:s,openSignUpPopup:v,gtm:{pageGroup:u},pageCommon:h,creditInfo:Q}=(0,V.useCreditsContext)(),{authCodeActivate:N}=(0,q.useRegistration)(),{brand:S,locale:W}=(0,m.useHeadlessContext)(),M=U.ROUNDED_BRANDS.includes(S),R=Object.keys(s||{}).length>0,[i,x]=(0,d.useState)(void 0),[L,I]=(0,d.useState)(),{listLoading:X,redeemableList:P,getRedeemableList:A}=(0,$.default)(),{myRewards:G}=(0,K.default)({page:1,pageSize:100,consumeType:n.AlpcConsumeType.ExternalProduct}),f=(0,d.useMemo)(()=>({...h?.redeemModal||{},...e.redeemModal||{}}),[e.redeemModal,h?.redeemModal]),b=(0,d.useMemo)(()=>P.map(t=>({id:t.id.toString(),title:t.name,consumeCredits:t.consume_credits,remainingInventory:t.remaining_inventory,isLimited:!!t.is_limited,consumeType:t.consume_type,handle:t.sku_handle,sku:t.goods_sku,image:t.goods_url})),[P]),Y=b.map(t=>t.handle),{data:D}=(0,m.useProductsByHandles)({handles:Y}),Z=(0,d.useMemo)(()=>{const t=new Map;return(e.list||[]).forEach(C=>{const k=(C.list||[]).filter(p=>b.some(l=>String(l.id)===String(p.id))).map(p=>{const l=b.find(c=>String(c.id)===String(p.id)),E=D?.find(c=>c.handle===l?.handle),w=E?.variants.find(c=>c.sku===l?.sku);if(l?.isLimited&&(!l?.remainingInventory||l.remainingInventory<=0)||l?.consumeType===n.AlpcConsumeType.Product&&(!E||!w))return null;const ee=p.type===n.ConsumeType.GoGift&&R&&G.some(c=>c.rule_id===Number(p.id));return{alpc:l,config:p,product:E,variant:w,hasRedeemed:ee}}).filter(p=>p!==null);t.set(C.label,k)}),t},[e.list,b,D,R,G]),_=(0,d.useCallback)(t=>{t===n.AlpcErrorCode.CodeLpcRuleInventoryNotEnough&&A()},[A]);return(0,a.jsxs)(r.Container,{id:o,className:(0,T.default)("relative bg-[#F5F5F7]"),children:[(0,a.jsx)(r.Heading,{as:"h2",size:"4",html:e.title}),R&&e.availableCredits&&(0,a.jsx)("p",{className:"mt-[12px] text-[20px] l-xxl:text-[18px] l:text-[16px] font-bold text-[#4A4C56]",children:e.availableCredits.includes("$credits")?(0,a.jsxs)(a.Fragment,{children:[e.availableCredits.split("$credits")[0],(0,a.jsx)("span",{className:(0,m.classNames)("text-brand-color-0",S==="ankersolix"&&"bg-gradient-to-r from-[#2c7ed0] via-[#00a9e1] via-[43%] to-[#00db84] bg-clip-text text-transparent"),children:(0,J.numberFormat)(Q?.available_credit||0,W).toString()}),e.availableCredits.split("$credits")[1]||""]}):e.availableCredits}),(0,a.jsxs)(r.Tabs,{shape:M?"rounded":"square",align:"left",defaultValue:e?.list?.[0]?.label,onValueChange:t=>{(0,m.gaTrack)({event:"ga4Event",event_name:"lp_navigation",event_parameters:{navigation:t,page_group:u}})},children:[(0,a.jsx)("div",{className:(0,T.default)("py-[24px] md:justify-center"),children:(0,a.jsx)(r.TabsList,{children:(e.list||[]).map(t=>(0,a.jsx)(r.TabsTrigger,{value:t.label,children:t.label},t.label))})}),(e.list||[]).map(t=>(0,a.jsx)(r.TabsContent,{value:t.label,children:!!b?.length&&!X&&(0,a.jsx)("div",{className:(0,T.default)("relative grid grid-cols-4 gap-[16px] md:grid-cols-2 md:gap-[12px] md-xl:grid-cols-3"),children:(Z.get(t.label)||[])?.map(C=>(0,a.jsx)(z.RedeemableItem,{copy:e,item:C,onRedeem:k=>{R?!s?.activated&&!N.isActivateSuccess?(N.setAutoSendEmail(!0),N.open()):x(k):v()},onRulesOpen:I},C?.alpc?.id))})},t.label))]}),(i?.config?.type===n.ConsumeType.Coupon||i?.config?.type===n.ConsumeType.ShippingCoupon)&&f?.coupon&&i&&(0,a.jsx)(O.default,{item:i,copy:f,onError:_,onClose:()=>{x(void 0)}}),i?.config?.type===n.ConsumeType.Product&&f?.product&&i&&(0,a.jsx)(B.default,{item:i,copy:f,onError:_,onClose:()=>{x(void 0)}}),(i?.config?.type===n.ConsumeType.GiftCard||i?.config?.type===n.ConsumeType.GoGift)&&f?.virtualProduct&&i&&(0,a.jsx)(H.default,{item:i,copy:f,onError:_,onClose:()=>{x(void 0)}}),L&&(0,a.jsx)(j.default,{overlayClassName:"md:px-[16px] md:items-center",className:(0,m.classNames)("md:h-fit md:rounded-b-[16px]",!M&&"md:rounded-none"),isOpen:L.length>0,onClose:()=>I([]),titleClassName:"border-b-transparent h-[56px]",rules:L,scrollClassName:"md:mt-[8px] md:mb-[24px] md:pt-0",title:h?.ruleLabel,ruleClassName:"text-[#1d1d1f] font-bold"})]})};
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, TabsContent, TabsList, TabsTrigger } from '@anker-in/headless-ui'\nimport classNames from 'classnames'\nimport { useCallback, useEffect, 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 // copy.list \u53EF\u80FD\u662F\u5F02\u6B65\u52A0\u8F7D\u7684\uFF0C\u9996\u6B21\u6E32\u67D3\u65F6\u53EF\u80FD\u4E3A\u7A7A\uFF0C\u9700\u8981\u5728\u6570\u636E\u5C31\u7EEA\u540E\u540C\u6B65 activeTab\uFF0C\n // \u5426\u5219 Radix Tabs \u975E\u53D7\u63A7\u6A21\u5F0F\u4E0B\u62FF\u5230\u7684 defaultValue \u4F1A\u4E00\u76F4\u662F\u521D\u59CB\u7684\u7A7A\u503C\uFF0C\u5BFC\u81F4\u521D\u59CB\u4E0D\u5C55\u793A\u4EFB\u4F55 TabsContent\u3002\n const [activeTab, setActiveTab] = useState<string>(copy.list?.[0]?.label || '')\n useEffect(() => {\n const labels = (copy.list || []).map(item => item.label)\n if (labels.length && !labels.includes(activeTab)) {\n setActiveTab(labels[0])\n }\n }, [copy.list, activeTab])\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 value={activeTab}\n onValueChange={value => {\n setActiveTab(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": ["CreditsRedeemList_exports", "__export", "CreditsRedeemList", "__toCommonJS", "import_jsx_runtime", "import_headless_ui", "import_classnames", "import_react", "import_RedeemCouponModal", "import_RedeemProductModal", "import_RedeemVirtualProductModal", "import_provider", "import_useRedeemableList", "import_const", "import_lib", "import_RedeemableItem", "import_constants", "import_RulesModal", "import_registration", "import_utils", "import_useMyRewards", "copy", "id", "profile", "openSignUpPopup", "pageGroup", "pageCommon", "creditInfo", "authCodeActivate", "brand", "locale", "rounded", "isLogin", "activeTab", "setActiveTab", "labels", "item", "popRedeemData", "setPopRedeemData", "rules", "setRules", "listLoading", "redeemableList", "getRedeemableList", "useRedeemableList", "myRewards", "useMyRewards", "redeemModalCopy", "alpcList", "handles", "products", "listByTab", "map", "categoryItem", "items", "alpcItem", "product", "variant", "hasRedeemed", "reward", "handleRedeemError", "errorCode", "classNames", "cn", "value", "RedeemCouponModal", "RedeemProductModal", "RedeemVirtualProductModal", "RulesModal"]
4
+ "sourcesContent": ["import { Container, Heading, Tabs, TabsContent, TabsList, TabsTrigger } from '@anker-in/headless-ui'\nimport classNames from 'classnames'\nimport { useCallback, useEffect, 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 =\n item.type === ConsumeType.GoGift && isLogin && 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": ["CreditsRedeemList_exports", "__export", "CreditsRedeemList", "__toCommonJS", "import_jsx_runtime", "import_headless_ui", "import_classnames", "import_react", "import_RedeemCouponModal", "import_RedeemProductModal", "import_RedeemVirtualProductModal", "import_provider", "import_useRedeemableList", "import_const", "import_lib", "import_RedeemableItem", "import_constants", "import_RulesModal", "import_registration", "import_utils", "import_useMyRewards", "copy", "id", "profile", "openSignUpPopup", "pageGroup", "pageCommon", "creditInfo", "authCodeActivate", "brand", "locale", "rounded", "isLogin", "popRedeemData", "setPopRedeemData", "rules", "setRules", "listLoading", "redeemableList", "getRedeemableList", "useRedeemableList", "myRewards", "useMyRewards", "redeemModalCopy", "alpcList", "item", "handles", "products", "listByTab", "map", "categoryItem", "items", "alpcItem", "product", "variant", "hasRedeemed", "reward", "handleRedeemError", "errorCode", "classNames", "cn", "value", "RedeemCouponModal", "RedeemProductModal", "RedeemVirtualProductModal", "RulesModal"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{Fragment as ge,jsx as a,jsxs as h}from"react/jsx-runtime";import{Container as j,Heading as q,Tabs as J,TabsContent as K,TabsList as Q,TabsTrigger as W}from"@anker-in/headless-ui";import x from"classnames";import{useCallback as X,useEffect as Y,useMemo as y,useState as T}from"react";import Z from"./RedeemCouponModal";import ee from"./RedeemProductModal";import te from"./RedeemVirtualProductModal";import{useCreditsContext as ae}from"../context/provider";import se from"../context/hooks/useRedeemableList";import{AlpcConsumeType as G,AlpcErrorCode as ne,ConsumeType as d}from"../context/const";import{useHeadlessContext as oe,useProductsByHandles as re,gaTrack as ie,classNames as D}from"@anker-in/lib";import{RedeemableItem as le}from"./RedeemableItem";import{ROUNDED_BRANDS as de}from"../../../constants";import me from"../modal/RulesModal";import{useRegistration as pe}from"../../../components/registration";import{numberFormat as ue}from"../context/utils";import ce from"../context/hooks/useMyRewards";const Pe=({copy:t,id:w})=>{const{profile:N,openSignUpPopup:F,gtm:{pageGroup:O},pageCommon:c,creditInfo:B}=ae(),{authCodeActivate:g}=pe(),{brand:L,locale:H}=oe(),_=de.includes(L),p=Object.keys(N||{}).length>0,[f,k]=T(t.list?.[0]?.label||"");Y(()=>{const e=(t.list||[]).map(r=>r.label);e.length&&!e.includes(f)&&k(e[0])},[t.list,f]);const[s,u]=T(void 0),[b,E]=T(),{listLoading:$,redeemableList:S,getRedeemableList:M}=se(),{myRewards:I}=ce({page:1,pageSize:100,consumeType:G.ExternalProduct}),l=y(()=>({...c?.redeemModal||{},...t.redeemModal||{}}),[t.redeemModal,c?.redeemModal]),m=y(()=>S.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})),[S]),z=m.map(e=>e.handle),{data:A}=re({handles:z}),U=y(()=>{const e=new Map;return(t.list||[]).forEach(r=>{const v=(r.list||[]).filter(o=>m.some(n=>String(n.id)===String(o.id))).map(o=>{const n=m.find(i=>String(i.id)===String(o.id)),R=A?.find(i=>i.handle===n?.handle),P=R?.variants.find(i=>i.sku===n?.sku);if(n?.isLimited&&(!n?.remainingInventory||n.remainingInventory<=0)||n?.consumeType===G.Product&&(!R||!P))return null;const V=o.type===d.GoGift&&p&&I.some(i=>i.rule_id===Number(o.id));return{alpc:n,config:o,product:R,variant:P,hasRedeemed:V}}).filter(o=>o!==null);e.set(r.label,v)}),e},[t.list,m,A,p,I]),C=X(e=>{e===ne.CodeLpcRuleInventoryNotEnough&&M()},[M]);return h(j,{id:w,className:x("relative bg-[#F5F5F7]"),children:[a(q,{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")?h(ge,{children:[t.availableCredits.split("$credits")[0],a("span",{className:D("text-brand-color-0",L==="ankersolix"&&"bg-gradient-to-r from-[#2c7ed0] via-[#00a9e1] via-[43%] to-[#00db84] bg-clip-text text-transparent"),children:ue(B?.available_credit||0,H).toString()}),t.availableCredits.split("$credits")[1]||""]}):t.availableCredits}),h(J,{shape:_?"rounded":"square",align:"left",value:f,onValueChange:e=>{k(e),ie({event:"ga4Event",event_name:"lp_navigation",event_parameters:{navigation:e,page_group:O}})},children:[a("div",{className:x("py-[24px] md:justify-center"),children:a(Q,{children:(t.list||[]).map(e=>a(W,{value:e.label,children:e.label},e.label))})}),(t.list||[]).map(e=>a(K,{value:e.label,children:!!m?.length&&!$&&a("div",{className:x("relative grid grid-cols-4 gap-[16px] md:grid-cols-2 md:gap-[12px] md-xl:grid-cols-3"),children:(U.get(e.label)||[])?.map(r=>a(le,{copy:t,item:r,onRedeem:v=>{p?!N?.activated&&!g.isActivateSuccess?(g.setAutoSendEmail(!0),g.open()):u(v):F()},onRulesOpen:E},r?.alpc?.id))})},e.label))]}),(s?.config?.type===d.Coupon||s?.config?.type===d.ShippingCoupon)&&l?.coupon&&s&&a(Z,{item:s,copy:l,onError:C,onClose:()=>{u(void 0)}}),s?.config?.type===d.Product&&l?.product&&s&&a(ee,{item:s,copy:l,onError:C,onClose:()=>{u(void 0)}}),(s?.config?.type===d.GiftCard||s?.config?.type===d.GoGift)&&l?.virtualProduct&&s&&a(te,{item:s,copy:l,onError:C,onClose:()=>{u(void 0)}}),b&&a(me,{overlayClassName:"md:px-[16px] md:items-center",className:D("md:h-fit md:rounded-b-[16px]",!_&&"md:rounded-none"),isOpen:b.length>0,onClose:()=>E([]),titleClassName:"border-b-transparent h-[56px]",rules:b,scrollClassName:"md:mt-[8px] md:mb-[24px] md:pt-0",title:c?.ruleLabel,ruleClassName:"text-[#1d1d1f] font-bold"})]})};export{Pe as CreditsRedeemList};
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 Ie=({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:E}=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:S}=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=S?.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&&E.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,S,p,E]),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{Ie 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, TabsContent, TabsList, TabsTrigger } from '@anker-in/headless-ui'\nimport classNames from 'classnames'\nimport { useCallback, useEffect, 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 // copy.list \u53EF\u80FD\u662F\u5F02\u6B65\u52A0\u8F7D\u7684\uFF0C\u9996\u6B21\u6E32\u67D3\u65F6\u53EF\u80FD\u4E3A\u7A7A\uFF0C\u9700\u8981\u5728\u6570\u636E\u5C31\u7EEA\u540E\u540C\u6B65 activeTab\uFF0C\n // \u5426\u5219 Radix Tabs \u975E\u53D7\u63A7\u6A21\u5F0F\u4E0B\u62FF\u5230\u7684 defaultValue \u4F1A\u4E00\u76F4\u662F\u521D\u59CB\u7684\u7A7A\u503C\uFF0C\u5BFC\u81F4\u521D\u59CB\u4E0D\u5C55\u793A\u4EFB\u4F55 TabsContent\u3002\n const [activeTab, setActiveTab] = useState<string>(copy.list?.[0]?.label || '')\n useEffect(() => {\n const labels = (copy.list || []).map(item => item.label)\n if (labels.length && !labels.includes(activeTab)) {\n setActiveTab(labels[0])\n }\n }, [copy.list, activeTab])\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 value={activeTab}\n onValueChange={value => {\n setActiveTab(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", "useEffect", "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", "activeTab", "setActiveTab", "labels", "item", "popRedeemData", "setPopRedeemData", "rules", "setRules", "listLoading", "redeemableList", "getRedeemableList", "myRewards", "redeemModalCopy", "alpcList", "handles", "products", "listByTab", "map", "categoryItem", "items", "alpcItem", "product", "variant", "hasRedeemed", "reward", "handleRedeemError", "errorCode", "value"]
4
+ "sourcesContent": ["import { Container, Heading, Tabs, TabsContent, TabsList, TabsTrigger } from '@anker-in/headless-ui'\nimport classNames from 'classnames'\nimport { useCallback, useEffect, 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 =\n item.type === ConsumeType.GoGift && isLogin && 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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anker-in/campaign-ui",
3
- "version": "0.5.4-beta.03",
3
+ "version": "0.5.5-beta.01",
4
4
  "description": "Campaign UI components and utilities for Anker projects",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -32,16 +32,6 @@ export const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; i
32
32
 
33
33
  const isLogin = Object.keys(profile || {}).length > 0
34
34
 
35
- // copy.list 可能是异步加载的,首次渲染时可能为空,需要在数据就绪后同步 activeTab,
36
- // 否则 Radix Tabs 非受控模式下拿到的 defaultValue 会一直是初始的空值,导致初始不展示任何 TabsContent。
37
- const [activeTab, setActiveTab] = useState<string>(copy.list?.[0]?.label || '')
38
- useEffect(() => {
39
- const labels = (copy.list || []).map(item => item.label)
40
- if (labels.length && !labels.includes(activeTab)) {
41
- setActiveTab(labels[0])
42
- }
43
- }, [copy.list, activeTab])
44
-
45
35
  const [popRedeemData, setPopRedeemData] = useState<RedeemableItemType | undefined>(undefined)
46
36
 
47
37
  const [rules, setRules] = useState<string | string[]>()
@@ -97,9 +87,8 @@ export const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; i
97
87
  if (alpcItem?.consumeType === AlpcConsumeType.Product && (!product || !variant)) return null
98
88
 
99
89
  // 检查 GoGift 是否已经兑换过(只有 GoGift 限制兑换一次)
100
- const hasRedeemed = item.type === ConsumeType.GoGift &&
101
- isLogin &&
102
- myRewards.some(reward => reward.rule_id === Number(item.id))
90
+ const hasRedeemed =
91
+ item.type === ConsumeType.GoGift && isLogin && myRewards.some(reward => reward.rule_id === Number(item.id))
103
92
 
104
93
  return {
105
94
  alpc: alpcItem,
@@ -138,7 +127,7 @@ export const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; i
138
127
  className={cn(
139
128
  'text-brand-color-0',
140
129
  brand === 'ankersolix' &&
141
- 'bg-gradient-to-r from-[#2c7ed0] via-[#00a9e1] via-[43%] to-[#00db84] bg-clip-text text-transparent'
130
+ 'bg-gradient-to-r from-[#2c7ed0] via-[#00a9e1] via-[43%] to-[#00db84] bg-clip-text text-transparent'
142
131
  )}
143
132
  >
144
133
  {numberFormat(creditInfo?.available_credit || 0, locale).toString()}
@@ -154,9 +143,8 @@ export const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; i
154
143
  <Tabs
155
144
  shape={rounded ? 'rounded' : 'square'}
156
145
  align="left"
157
- value={activeTab}
146
+ defaultValue={copy?.list?.[0]?.label}
158
147
  onValueChange={value => {
159
- setActiveTab(value)
160
148
  gaTrack({
161
149
  event: 'ga4Event',
162
150
  event_name: 'lp_navigation',