@anker-in/campaign-ui 0.5.0-beta.2 → 0.5.0-beta.20

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.
Files changed (137) hide show
  1. package/dist/cjs/components/credits/context/hooks/useCountries.js +1 -1
  2. package/dist/cjs/components/credits/context/hooks/useCountries.js.map +3 -3
  3. package/dist/cjs/components/memberPopup/MemberPopup.d.ts +1 -1
  4. package/dist/cjs/components/memberPopup/MemberPopup.js +1 -1
  5. package/dist/cjs/components/memberPopup/MemberPopup.js.map +3 -3
  6. package/dist/cjs/components/memberPopup/context/provider.d.ts +3 -3
  7. package/dist/cjs/components/memberPopup/context/provider.js +1 -1
  8. package/dist/cjs/components/memberPopup/context/provider.js.map +3 -3
  9. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +7 -0
  10. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js +2 -0
  11. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +7 -0
  12. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +9 -7
  13. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +1 -1
  14. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +3 -3
  15. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.d.ts +1 -2
  16. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js +1 -1
  17. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js.map +3 -3
  18. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +1 -2
  19. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js +1 -1
  20. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +3 -3
  21. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +1 -1
  22. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +2 -2
  23. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +1 -3
  24. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +1 -1
  25. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +3 -3
  26. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +1 -2
  27. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +1 -1
  28. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +3 -3
  29. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.d.ts +1 -8
  30. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js +1 -1
  31. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js.map +3 -3
  32. package/dist/cjs/components/memberPopup/panels/Referral/index.js +1 -1
  33. package/dist/cjs/components/memberPopup/panels/Referral/index.js.map +3 -3
  34. package/dist/cjs/components/memberPopup/type.d.ts +29 -3
  35. package/dist/cjs/components/memberPopup/type.js +1 -1
  36. package/dist/cjs/components/memberPopup/type.js.map +2 -2
  37. package/dist/esm/components/credits/context/hooks/useCountries.js +1 -1
  38. package/dist/esm/components/credits/context/hooks/useCountries.js.map +3 -3
  39. package/dist/esm/components/memberPopup/MemberPopup.d.ts +1 -1
  40. package/dist/esm/components/memberPopup/MemberPopup.js +1 -1
  41. package/dist/esm/components/memberPopup/MemberPopup.js.map +3 -3
  42. package/dist/esm/components/memberPopup/context/provider.d.ts +3 -3
  43. package/dist/esm/components/memberPopup/context/provider.js +1 -1
  44. package/dist/esm/components/memberPopup/context/provider.js.map +3 -3
  45. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +7 -0
  46. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js +2 -0
  47. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +7 -0
  48. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +9 -7
  49. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +1 -1
  50. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +3 -3
  51. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.d.ts +1 -2
  52. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js +1 -1
  53. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js.map +3 -3
  54. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +1 -2
  55. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js +1 -1
  56. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +3 -3
  57. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js +1 -1
  58. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfileModal.js.map +2 -2
  59. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +1 -3
  60. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +1 -1
  61. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +3 -3
  62. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +1 -2
  63. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +1 -1
  64. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +3 -3
  65. package/dist/esm/components/memberPopup/panels/EarnCredits/index.d.ts +1 -8
  66. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js +1 -1
  67. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js.map +3 -3
  68. package/dist/esm/components/memberPopup/panels/Referral/index.js +1 -1
  69. package/dist/esm/components/memberPopup/panels/Referral/index.js.map +3 -3
  70. package/dist/esm/components/memberPopup/type.d.ts +29 -3
  71. package/dist/esm/components/memberPopup/type.js +1 -1
  72. package/dist/esm/components/memberPopup/type.js.map +2 -2
  73. package/package.json +1 -1
  74. package/src/components/credits/context/hooks/useCountries.ts +4 -15
  75. package/src/components/memberPopup/MemberPopup.tsx +170 -177
  76. package/src/components/memberPopup/context/provider.tsx +24 -4
  77. package/src/components/memberPopup/panels/ActivitiesSubscribePanel.tsx +194 -0
  78. package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.tsx +93 -60
  79. package/src/components/memberPopup/panels/ConsumeCredits/index.tsx +199 -87
  80. package/src/components/memberPopup/panels/EarnCredits/ActivatePanel.tsx +30 -15
  81. package/src/components/memberPopup/panels/EarnCredits/CompleteProfileModal.tsx +6 -1
  82. package/src/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.tsx +65 -35
  83. package/src/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.tsx +15 -6
  84. package/src/components/memberPopup/panels/EarnCredits/index.tsx +131 -86
  85. package/src/components/memberPopup/panels/Referral/index.tsx +35 -16
  86. package/src/components/memberPopup/type.ts +26 -3
  87. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
  88. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
  89. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
  90. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
  91. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
  92. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
  93. package/dist/cjs/components/memberPopup/panels/Activity/index.d.ts +0 -7
  94. package/dist/cjs/components/memberPopup/panels/Activity/index.js +0 -2
  95. package/dist/cjs/components/memberPopup/panels/Activity/index.js.map +0 -7
  96. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
  97. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
  98. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
  99. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
  100. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
  101. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
  102. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
  103. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
  104. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
  105. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
  106. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
  107. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
  108. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
  109. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
  110. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
  111. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
  112. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
  113. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
  114. package/dist/esm/components/memberPopup/panels/Activity/index.d.ts +0 -7
  115. package/dist/esm/components/memberPopup/panels/Activity/index.js +0 -2
  116. package/dist/esm/components/memberPopup/panels/Activity/index.js.map +0 -7
  117. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
  118. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
  119. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
  120. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
  121. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
  122. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
  123. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
  124. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
  125. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
  126. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
  127. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
  128. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
  129. package/dist/index.d.mts +0 -1775
  130. package/dist/index.d.ts +0 -1775
  131. package/dist/index.js +0 -18542
  132. package/dist/index.js.map +0 -1
  133. package/dist/index.mjs +0 -18514
  134. package/dist/index.mjs.map +0 -1
  135. package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.tsx +0 -150
  136. package/src/components/memberPopup/panels/EarnCredits/SubscribeModal.tsx +0 -144
  137. package/src/components/memberPopup/panels/EarnCredits/SubscribePanel.tsx +0 -147
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/memberPopup/MemberPopup.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport { lazy, Suspense, useState, useCallback, useMemo } from 'react'\nimport { Picture } from '@anker-in/headless-ui'\nimport { type HeadlessConfig, useHeadlessContext, classNames as cn } from '@anker-in/lib'\nimport {\n MemberPopupActionType,\n MemberPopupPageScope,\n MemberPopupPanelType,\n type MemberPopupCopy,\n type MemberPopupContextValue,\n type MemberPopupItem,\n} from './type'\nimport { MemberPopupProvider } from './context/provider'\nimport { useMemberPopupContext } from './context/provider'\nimport { ViewStackContext, type ViewPayload } from './context/viewStack'\nimport { IconClose, IconArrow, IconCredit, IconBag, IconReferral, IconSwitch, IconSubscription } from './icons'\nimport { ROUNDED_BRANDS } from '../../constants'\n\nconst EarnCredits = lazy(() => import('./panels/EarnCredits'))\nconst ConsumeCredits = lazy(() => import('./panels/ConsumeCredits'))\nconst Referral = lazy(() => import('./panels/Referral'))\nconst CompleteProfile = lazy(() => import('./panels/EarnCredits/CompleteProfilePanel'))\nconst Subscribe = lazy(() => import('./panels/EarnCredits/SubscribePanel'))\nconst SubscribeEmail = lazy(() => import('./panels/EarnCredits/SubscribeEmailPanel'))\nconst Activate = lazy(() => import('./panels/EarnCredits/ActivatePanel'))\nconst RedeemCoupon = lazy(() => import('./panels/ConsumeCredits/RedeemCouponPanel'))\n\ntype MemberPopupProps = MemberPopupContextValue & {\n headlessConfig: HeadlessConfig\n copy: MemberPopupCopy\n bottomOffset?: string\n}\n\nexport function MemberPopup({ copy, bottomOffset = '24px', ...providerProps }: MemberPopupProps) {\n return (\n <MemberPopupProvider {...providerProps} earnCreditsCopy={copy.earnCredits}>\n <MemberPopupContent copy={copy} bottomOffset={bottomOffset} />\n </MemberPopupProvider>\n )\n}\n\ntype MemberPopupContentProps = {\n copy: MemberPopupCopy\n bottomOffset: string\n}\n\nfunction MemberPopupContent({ copy, bottomOffset }: MemberPopupContentProps) {\n const { profile, openSignInPopup, openSignUpPopup } = useMemberPopupContext()\n const { brand, storeDomain } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n const isLogin = !!profile\n const [isOpen, setIsOpen] = useState(false)\n const [viewStack, setViewStack] = useState<ViewPayload[]>([])\n const [isSubscribeSuccess, setIsSubscribeSuccess] = useState(false)\n const [isActivateSuccess, setIsActivateSuccess] = useState(false)\n const [isProfileCompleteSuccess, setIsProfileCompleteSuccess] = useState(false)\n\n const currentView = viewStack[viewStack.length - 1] ?? null\n\n const isVisible = useMemo(() => {\n const config = copy.pageConfig\n if (!config) return true\n const pathname = typeof window !== 'undefined' ? window.location.pathname : ''\n const matches = config.pages.some(page => pathname === page || pathname.startsWith(page + '/'))\n switch (config.scope) {\n case MemberPopupPageScope.Include:\n return matches\n case MemberPopupPageScope.Exclude:\n return !matches\n default:\n return true\n }\n }, [copy.pageConfig])\n\n if (!isVisible) return null\n\n const pushView = useCallback((view: ViewPayload) => {\n setViewStack(prev => [...prev, view])\n }, [])\n\n const popView = useCallback(() => {\n setViewStack(prev => prev.slice(0, -1))\n }, [])\n\n function handleAction(type: MemberPopupActionType, url?: string) {\n switch (type) {\n case MemberPopupActionType.ExternalLink:\n if (url) window.open(url, '_blank', 'noopener,noreferrer')\n break\n case MemberPopupActionType.OpenEarnCredits:\n pushView({ type: MemberPopupPanelType.EarnCredits })\n break\n case MemberPopupActionType.OpenConsumeCredits:\n pushView({ type: MemberPopupPanelType.ConsumeCredits })\n break\n case MemberPopupActionType.OpenReferral:\n pushView({ type: MemberPopupPanelType.Referral })\n break\n case MemberPopupActionType.OpenSubscribe:\n pushView({ type: MemberPopupPanelType.Subscribe })\n break\n }\n }\n\n function handleClose() {\n setIsOpen(false)\n setViewStack([])\n }\n\n return (\n <ViewStackContext.Provider value={{ pushView, popView }}>\n {isOpen && <div className=\"fixed inset-0 z-[998]\" onClick={handleClose} />}\n <div className=\"fixed right-0 z-[999] flex flex-col items-end pr-[16px]\" style={{ bottom: bottomOffset }}>\n {isOpen && (\n <div\n className={cn(\n 'relative mb-[8px] flex w-[420px] max-w-[calc(100vw-32px)] min-h-[600px] flex-col overflow-hidden bg-white shadow-[0_8px_32px_rgba(0,0,0,0.16)] cmp-md:w-[358px] cmp-sm:w-[258px]',\n rounded ? 'rounded-[12px]' : 'rounded-none'\n )}\n onClick={e => e.stopPropagation()}\n >\n <div className=\"absolute right-[-8px] top-[24px] size-0 border-y-8 border-l-8 border-y-transparent border-l-white\" />\n <div className=\"flex items-center justify-end pl-[10px] pr-[16px] pb-[8px] pt-[16px]\">\n {currentView !== null && (\n <button\n className=\"mr-auto flex size-[24px] cursor-pointer items-center justify-center\"\n onClick={popView}\n aria-label=\"Back\"\n >\n <IconSwitch />\n </button>\n )}\n <button\n className=\"flex size-[24px] cursor-pointer items-center justify-center\"\n onClick={handleClose}\n aria-label=\"Close\"\n >\n <IconClose />\n </button>\n </div>\n\n <div\n className=\"flex flex-1 flex-col gap-[12px] overflow-y-auto p-[16px]\"\n style={{ maxHeight: 'min(calc(80vh - 118px), 606px)' }}\n >\n {currentView === null && (\n <>\n {(copy.title || copy.subtitle) && (\n <div className=\"flex flex-col gap-[4px]\">\n {copy.title && (\n <h2 className=\"text-[24px] font-[700] leading-[1.2] text-[#080a0f]\">{copy.title}</h2>\n )}\n {copy.subtitle && (\n <p className=\"text-[16px] font-[700] leading-snug text-[#4a4c56]\">{copy.subtitle}</p>\n )}\n </div>\n )}\n {copy.list.map((item, i) => (\n <HomeCard key={i} item={item} onAction={handleAction} rounded={rounded} />\n ))}\n </>\n )}\n\n {currentView !== null && (\n <Suspense\n fallback={\n <div className=\"flex items-center justify-center py-[32px]\">\n <div className=\"size-[32px] animate-spin rounded-full border-[3px] border-[#080a0f] border-t-transparent\" />\n </div>\n }\n >\n {currentView.type === MemberPopupPanelType.EarnCredits && copy.earnCredits && (\n <EarnCredits\n copy={copy.earnCredits}\n onClose={popView}\n isSubscribeSuccess={isSubscribeSuccess}\n isActivateSuccess={isActivateSuccess}\n isProfileCompleteSuccess={isProfileCompleteSuccess}\n onSubscribeSuccess={() => setIsSubscribeSuccess(true)}\n onActivateSuccess={() => setIsActivateSuccess(true)}\n onProfileCompleteSuccess={() => setIsProfileCompleteSuccess(true)}\n />\n )}\n {currentView.type === MemberPopupPanelType.ConsumeCredits && copy.consumeCredits && (\n <ConsumeCredits copy={copy.consumeCredits} onClose={popView} />\n )}\n {currentView.type === MemberPopupPanelType.Referral && copy.referral && (\n <Referral copy={copy.referral} onClose={popView} />\n )}\n {currentView.type === MemberPopupPanelType.CompleteProfile && copy.earnCredits && (\n <CompleteProfile\n copy={copy.earnCredits.completeProfile}\n shopifyStoreDomain={storeDomain}\n onClose={popView}\n onSuccess={currentView.props?.onSuccess}\n />\n )}\n {currentView.type === MemberPopupPanelType.Subscribe && copy.subscribe && (\n <Subscribe\n copy={copy.subscribe}\n email={profile?.email}\n onClose={popView}\n onSuccess={currentView.props?.onSuccess}\n />\n )}\n {currentView.type === MemberPopupPanelType.SubscribeEmail && copy.earnCredits && (\n <SubscribeEmail\n copy={copy.earnCredits.subscribe}\n email={profile?.email}\n onClose={popView}\n onSuccess={currentView.props?.onSuccess}\n />\n )}\n {currentView.type === MemberPopupPanelType.Activate && copy.earnCredits && (\n <Activate\n copy={copy.earnCredits.authCodeActivate}\n onClose={popView}\n onSuccess={currentView.props?.onSuccess}\n />\n )}\n {currentView.type === MemberPopupPanelType.RedeemCoupon &&\n currentView.props &&\n copy.consumeCredits && (\n <RedeemCoupon\n itemTitle={currentView.props.itemTitle}\n itemCredits={currentView.props.itemCredits}\n itemImage={currentView.props.itemImage}\n itemValue={currentView.props.itemValue}\n itemOff={currentView.props.itemOff}\n redeemId={currentView.props.redeemId}\n userId={currentView.props.userId}\n alpcConfig={currentView.props.alpcConfig}\n copy={copy.consumeCredits.redeemModal}\n pointUnit={copy.consumeCredits.pointUnit}\n onClose={popView}\n />\n )}\n </Suspense>\n )}\n </div>\n\n {copy.footer && !isLogin && (\n <div className=\"border-t border-[#dadce0] p-[16px]\">\n <div className=\"flex items-center justify-between gap-[16px]\">\n <div className=\"flex items-center gap-[4px]\">\n <span className=\"text-[14px] font-[700] text-[#080a0f]\">{copy.footer.loginHint}</span>\n <button\n className=\"cursor-pointer text-[14px] font-[700] text-[#080a0f] underline\"\n onClick={openSignInPopup}\n >\n {copy.footer.loginLabel}\n </button>\n </div>\n <div className=\"flex shrink-0 items-center gap-[8px]\">\n <button\n className={cn(\n 'cursor-pointer border-[1.6px] border-[#080a0f] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-[#080a0f]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n onClick={openSignUpPopup}\n >\n {copy.footer.joinLabel}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n )}\n\n <button\n className=\"flex cursor-pointer items-center justify-center rounded-full bg-white shadow-lg\"\n onClick={() => setIsOpen(prev => !prev)}\n aria-label={copy.triggerImg.alt ?? 'Open member popup'}\n >\n <Picture source={copy.triggerImg.url} alt={copy.triggerImg.alt ?? ''} className=\"size-[58px]\" />\n </button>\n </div>\n </ViewStackContext.Provider>\n )\n}\n\ntype HomeCardProps = {\n item: MemberPopupItem\n onAction: (type: MemberPopupActionType, url?: string) => void\n rounded: boolean\n}\n\nfunction HomeCard({ item, onAction, rounded }: HomeCardProps) {\n const ACTION_ICON: Partial<Record<MemberPopupActionType, typeof IconCredit>> = {\n [MemberPopupActionType.OpenEarnCredits]: IconCredit,\n [MemberPopupActionType.OpenConsumeCredits]: IconBag,\n [MemberPopupActionType.OpenReferral]: IconReferral,\n [MemberPopupActionType.OpenSubscribe]: IconSubscription,\n }\n\n return (\n <div className={cn('flex flex-col gap-[16px] bg-[#f5f6f7] p-[16px]', rounded ? 'rounded-[8px]' : 'rounded-none')}>\n <div className=\"flex flex-col gap-[4px]\">\n <h3 className=\"text-[20px] font-[700] leading-[1.2] text-[#1e2024]\">{item.title}</h3>\n {item.description && <p className=\"text-[14px] font-[700] leading-[1.43] text-[#1e2024]\">{item.description}</p>}\n </div>\n\n <div className=\"flex flex-col gap-[16px]\">\n {item.links.map((link, i) => {\n const IconComponent = ACTION_ICON[link.type]\n return (\n <div key={i}>\n {i > 0 && <div className=\"mb-[16px] h-px bg-[#dadce0]\" />}\n <button\n className=\"flex w-full cursor-pointer items-center gap-[12px]\"\n onClick={() => onAction(link.type, link.url)}\n >\n {IconComponent && <IconComponent className=\"size-[24px] shrink-0\" />}\n <span className=\"flex-1 text-left text-[14px] font-[700] text-[#1e2024]\">{link.label}</span>\n <IconArrow className=\"size-[16px] shrink-0\" />\n </button>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n"],
5
- "mappings": "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",
6
- "names": ["Fragment", "jsx", "jsxs", "lazy", "Suspense", "useState", "useCallback", "useMemo", "Picture", "useHeadlessContext", "cn", "MemberPopupActionType", "MemberPopupPageScope", "MemberPopupPanelType", "MemberPopupProvider", "useMemberPopupContext", "ViewStackContext", "IconClose", "IconArrow", "IconCredit", "IconBag", "IconReferral", "IconSwitch", "IconSubscription", "ROUNDED_BRANDS", "EarnCredits", "ConsumeCredits", "Referral", "CompleteProfile", "Subscribe", "SubscribeEmail", "Activate", "RedeemCoupon", "MemberPopup", "copy", "bottomOffset", "providerProps", "MemberPopupContent", "profile", "openSignInPopup", "openSignUpPopup", "brand", "storeDomain", "rounded", "isLogin", "isOpen", "setIsOpen", "viewStack", "setViewStack", "isSubscribeSuccess", "setIsSubscribeSuccess", "isActivateSuccess", "setIsActivateSuccess", "isProfileCompleteSuccess", "setIsProfileCompleteSuccess", "currentView", "config", "pathname", "matches", "page", "pushView", "view", "prev", "popView", "handleAction", "type", "url", "handleClose", "e", "item", "i", "HomeCard", "onAction", "ACTION_ICON", "link", "IconComponent"]
4
+ "sourcesContent": ["'use client'\n\nimport { lazy, Suspense, useState, useCallback, useEffect } from 'react'\nimport { Picture } from '@anker-in/headless-ui'\nimport { gaTrack, type HeadlessConfig, useHeadlessContext, classNames as cn } from '@anker-in/lib'\nimport {\n MemberPopupActionType,\n MemberPopupPageScope,\n MemberPopupPanelType,\n type MemberPopupCopy,\n type MemberPopupContextValue,\n type MemberPopupItem,\n} from './type'\nimport { MemberPopupProvider } from './context/provider'\nimport { useMemberPopupContext } from './context/provider'\nimport { ViewStackContext, type ViewPayload } from './context/viewStack'\nimport { IconClose, IconArrow, IconCredit, IconBag, IconReferral, IconSwitch, IconSubscription } from './icons'\nimport { ROUNDED_BRANDS } from '../../constants'\n\nconst EarnCredits = lazy(() => import('./panels/EarnCredits'))\nconst ConsumeCredits = lazy(() => import('./panels/ConsumeCredits'))\nconst Referral = lazy(() => import('./panels/Referral'))\nconst CompleteProfilePanel = lazy(() => import('./panels/EarnCredits/CompleteProfilePanel'))\nconst ActivitiesSubscribePanel = lazy(() => import('./panels/ActivitiesSubscribePanel'))\nconst SubscribeEmailPanel = lazy(() => import('./panels/EarnCredits/SubscribeEmailPanel'))\nconst ActivatePanel = lazy(() => import('./panels/EarnCredits/ActivatePanel'))\nconst RedeemCouponPanel = lazy(() => import('./panels/ConsumeCredits/RedeemCouponPanel'))\n\ntype MemberPopupProps = MemberPopupContextValue & {\n headlessConfig: HeadlessConfig\n copy: MemberPopupCopy\n bottomOffset?: string\n}\n\nexport function MemberPopup({ copy, bottomOffset = '24px', ...providerProps }: MemberPopupProps) {\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const config = copy.pageConfig\n if (!config) {\n setIsVisible(true)\n return\n }\n const pathname = window.location.pathname\n const matches = config.pages.some(page => pathname === page || pathname.startsWith(page + '/'))\n switch (config.scope) {\n case MemberPopupPageScope.Include:\n setIsVisible(matches)\n break\n case MemberPopupPageScope.Exclude:\n setIsVisible(!matches)\n break\n default:\n setIsVisible(true)\n }\n }, [copy.pageConfig])\n\n return isVisible ? (\n <MemberPopupProvider {...providerProps} earnCreditsCopy={copy.earnCredits}>\n <MemberPopupContent copy={copy} bottomOffset={bottomOffset} />\n </MemberPopupProvider>\n ) : null\n}\n\ntype MemberPopupContentProps = {\n copy: MemberPopupCopy\n bottomOffset: string\n}\n\nfunction MemberPopupContent({ copy, bottomOffset }: MemberPopupContentProps) {\n const { profile, openSignInPopup, openSignUpPopup } = useMemberPopupContext()\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n const isLogin = !!profile\n const [isOpen, setIsOpen] = useState(false)\n const [viewStack, setViewStack] = useState<ViewPayload[]>([])\n\n const currentView = viewStack[viewStack.length - 1] ?? null\n\n const pushView = useCallback((view: ViewPayload) => {\n setViewStack(prev => [...prev, view])\n }, [])\n\n const popView = useCallback(() => {\n setViewStack(prev => prev.slice(0, -1))\n }, [])\n\n const MEMBER_POPUP_INFO = 'Member Floating Window'\n\n function trackLpButton(position: string, buttonName: string) {\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_button',\n event_parameters: {\n position,\n button_name: buttonName,\n info: MEMBER_POPUP_INFO,\n },\n })\n }\n\n function handleAction(type: MemberPopupActionType, url?: string) {\n switch (type) {\n case MemberPopupActionType.ExternalLink:\n if (url) window.open(url, '_blank', 'noopener,noreferrer')\n break\n case MemberPopupActionType.OpenEarnCredits:\n trackLpButton('home', 'earn_credits')\n pushView({ type: MemberPopupPanelType.EarnCredits })\n break\n case MemberPopupActionType.OpenConsumeCredits:\n trackLpButton('home', 'consume_credits')\n pushView({ type: MemberPopupPanelType.ConsumeCredits })\n break\n case MemberPopupActionType.OpenReferral:\n trackLpButton('home', 'referral')\n pushView({ type: MemberPopupPanelType.Referral })\n break\n case MemberPopupActionType.OpenSubscribe:\n trackLpButton('home', 'subscribe')\n pushView({ type: MemberPopupPanelType.Subscribe })\n break\n }\n }\n\n function handleClose() {\n setIsOpen(false)\n setViewStack([])\n }\n\n return (\n <ViewStackContext.Provider value={{ pushView, popView }}>\n {isOpen && <div className=\"fixed inset-0 z-[998]\" onClick={handleClose} />}\n <div\n className=\"fixed right-0 z-[999] flex flex-row items-end pr-[20px] md:flex-col md:items-end md:right-0 md:w-screen md:pr-0 md:pl-0\"\n style={{ bottom: bottomOffset }}\n >\n {isOpen && (\n <div className=\"relative mr-[12px] md:mr-[12px] md:mb-[12px]\" onClick={e => e.stopPropagation()}>\n <div className=\"absolute right-[-7px] bottom-[24px] size-0 border-y-8 border-l-8 border-r-0 border-y-transparent border-l-white md:bottom-[-8px] md:right-[25px] md:top-auto md:border-y-0 md:border-l-8 md:border-r-8 md:border-t-8 md:border-l-transparent md:border-r-transparent md:border-t-white\" />\n <div\n className={cn(\n 'flex w-[420px] max-w-[calc(100vw-32px)] min-h-[500px] flex-col overflow-hidden bg-white shadow-[0_8px_32px_rgba(0,0,0,0.16)] md:w-[calc(100vw-32px)] md:max-w-[400px]',\n rounded ? 'rounded-[12px]' : 'rounded-none'\n )}\n style={{ maxHeight: 'min(80vh, 606px)' }}\n >\n <div className=\"flex items-center justify-end pl-[10px] pr-[16px] pb-[8px] pt-[16px]\">\n {currentView !== null && (\n <button\n className=\"mr-auto flex size-[24px] cursor-pointer items-center justify-center\"\n onClick={popView}\n aria-label=\"Back\"\n >\n <IconSwitch />\n </button>\n )}\n <button\n className=\"flex size-[24px] cursor-pointer items-center justify-center\"\n onClick={() => {\n trackLpButton('floating_button', 'close')\n handleClose()\n }}\n aria-label=\"Close\"\n >\n <IconClose />\n </button>\n </div>\n\n <div className=\"flex flex-1 flex-col gap-[12px] overflow-y-auto p-[16px]\">\n {currentView === null && (\n <>\n {(copy.title || copy.subtitle) && (\n <div className=\"flex flex-col gap-[4px]\">\n {copy.title && (\n <h2 className=\"text-[24px] font-[700] leading-[1.2] text-[#080a0f]\">{copy.title}</h2>\n )}\n {copy.subtitle && (\n <p className=\"text-[16px] font-[700] leading-snug text-[#4a4c56]\">{copy.subtitle}</p>\n )}\n </div>\n )}\n {copy.list.map((item, i) => (\n <HomeCard key={i} item={item} onAction={handleAction} rounded={rounded} />\n ))}\n </>\n )}\n\n {currentView !== null && (\n <Suspense\n fallback={\n <div className=\"flex items-center justify-center py-[32px]\">\n <div className=\"size-[32px] animate-spin rounded-full border-[3px] border-[#080a0f] border-t-transparent\" />\n </div>\n }\n >\n {currentView.type === MemberPopupPanelType.EarnCredits && copy.earnCredits && (\n <EarnCredits copy={copy.earnCredits} />\n )}\n {currentView.type === MemberPopupPanelType.ConsumeCredits && copy.consumeCredits && (\n <ConsumeCredits copy={copy.consumeCredits} />\n )}\n {currentView.type === MemberPopupPanelType.Referral && copy.referral && (\n <Referral copy={copy.referral} onClose={popView} />\n )}\n {currentView.type === MemberPopupPanelType.CompleteProfile && copy.earnCredits && (\n <CompleteProfilePanel copy={copy.earnCredits.completeProfile} onClose={popView} />\n )}\n {currentView.type === MemberPopupPanelType.Subscribe && copy.activitiesSubscribe && (\n <ActivitiesSubscribePanel copy={copy.activitiesSubscribe} email={profile?.email} />\n )}\n {currentView.type === MemberPopupPanelType.SubscribeEmail && copy.earnCredits && (\n <SubscribeEmailPanel copy={copy.earnCredits.subscribe} email={profile?.email} onClose={popView} />\n )}\n {currentView.type === MemberPopupPanelType.Activate && copy.earnCredits && (\n <ActivatePanel copy={copy.earnCredits.authCodeActivate} onClose={popView} />\n )}\n {currentView.type === MemberPopupPanelType.RedeemCoupon &&\n currentView.props &&\n copy.consumeCredits && (\n <RedeemCouponPanel\n item={currentView.props as any}\n copy={copy.consumeCredits}\n onClose={popView}\n />\n )}\n </Suspense>\n )}\n </div>\n\n {copy.footer && !isLogin && (\n <div className=\"border-t border-[#dadce0] p-[16px]\">\n <div className=\"flex items-center justify-between gap-[16px]\">\n <div className=\"inline gap-[4px]\">\n <span className=\"text-[14px] font-[700] text-[#080a0f]\">{copy.footer.loginHint}</span>\n <button\n className=\"cursor-pointer ml-[4px] text-[14px] font-bold text-[#080a0f] underline\"\n onClick={openSignInPopup}\n >\n {copy.footer.loginLabel}\n </button>\n </div>\n <div className=\"flex shrink-0 items-center gap-[8px]\">\n <button\n className={cn(\n 'cursor-pointer border-[1.6px] border-[#080a0f] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-[#080a0f]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n onClick={openSignUpPopup}\n >\n {copy.footer.joinLabel}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n\n <button\n className=\"flex cursor-pointer items-center justify-center rounded-full bg-white shadow-lg md:ml-auto md:mr-[16px]\"\n onClick={() => {\n const next = !isOpen\n trackLpButton('floating_button', next ? 'open' : 'close')\n setIsOpen(next)\n }}\n aria-label={copy.triggerImg.alt ?? 'Open member popup'}\n >\n <Picture source={copy.triggerImg.url} alt={copy.triggerImg.alt ?? ''} className=\"size-[58px]\" />\n </button>\n </div>\n </ViewStackContext.Provider>\n )\n}\n\ntype HomeCardProps = {\n item: MemberPopupItem\n onAction: (type: MemberPopupActionType, url?: string) => void\n rounded: boolean\n}\n\nfunction HomeCard({ item, onAction, rounded }: HomeCardProps) {\n const ACTION_ICON: Partial<Record<MemberPopupActionType, typeof IconCredit>> = {\n [MemberPopupActionType.OpenEarnCredits]: IconCredit,\n [MemberPopupActionType.OpenConsumeCredits]: IconBag,\n [MemberPopupActionType.OpenReferral]: IconReferral,\n [MemberPopupActionType.OpenSubscribe]: IconSubscription,\n }\n\n return (\n <div className={cn('flex flex-col gap-[16px] bg-[#f5f6f7] p-[16px]', rounded ? 'rounded-[8px]' : 'rounded-none')}>\n <div className=\"flex flex-col gap-[4px]\">\n <h3 className=\"text-[20px] font-[700] leading-[1.2] text-[#1e2024]\">{item.title}</h3>\n {item.description && <p className=\"text-[14px] font-[700] leading-[1.43] text-[#1e2024]\">{item.description}</p>}\n </div>\n\n <div className=\"flex flex-col gap-[16px]\">\n {item.links.map((link, i) => {\n const IconComponent = ACTION_ICON[link.type]\n return (\n <div key={i}>\n {i > 0 && <div className=\"mb-[16px] h-px bg-[#dadce0]\" />}\n <button\n className=\"flex w-full cursor-pointer items-center gap-[12px]\"\n onClick={() => onAction(link.type, link.url)}\n >\n {IconComponent && <IconComponent className=\"size-[24px] shrink-0\" />}\n <span className=\"flex-1 text-left text-[14px] font-[700] text-[#1e2024]\">{link.label}</span>\n <IconArrow className=\"size-[16px] shrink-0\" />\n </button>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Fragment", "jsx", "jsxs", "lazy", "Suspense", "useState", "useCallback", "useEffect", "Picture", "gaTrack", "useHeadlessContext", "cn", "MemberPopupActionType", "MemberPopupPageScope", "MemberPopupPanelType", "MemberPopupProvider", "useMemberPopupContext", "ViewStackContext", "IconClose", "IconArrow", "IconCredit", "IconBag", "IconReferral", "IconSwitch", "IconSubscription", "ROUNDED_BRANDS", "EarnCredits", "ConsumeCredits", "Referral", "CompleteProfilePanel", "ActivitiesSubscribePanel", "SubscribeEmailPanel", "ActivatePanel", "RedeemCouponPanel", "MemberPopup", "copy", "bottomOffset", "providerProps", "isVisible", "setIsVisible", "config", "pathname", "matches", "page", "MemberPopupContent", "profile", "openSignInPopup", "openSignUpPopup", "brand", "rounded", "isLogin", "isOpen", "setIsOpen", "viewStack", "setViewStack", "currentView", "pushView", "view", "prev", "popView", "MEMBER_POPUP_INFO", "trackLpButton", "position", "buttonName", "handleAction", "type", "url", "handleClose", "e", "item", "i", "HomeCard", "next", "onAction", "ACTION_ICON", "link", "IconComponent"]
7
7
  }
@@ -1,11 +1,11 @@
1
1
  import { PropsWithChildren } from 'react';
2
2
  import { type HeadlessConfig } from '@anker-in/lib';
3
- import type { EarnCreditsCopy, MemberPopupContextValue } from '../type';
4
- export declare const MemberPopupContext: import("react").Context<MemberPopupContextValue>;
3
+ import type { EarnCreditsCopy, MemberPopupContextValue, MemberPopupInternalContextValue } from '../type';
4
+ export declare const MemberPopupContext: import("react").Context<MemberPopupInternalContextValue>;
5
5
  type MemberPopupProviderProps = MemberPopupContextValue & {
6
6
  headlessConfig: HeadlessConfig;
7
7
  earnCreditsCopy?: EarnCreditsCopy;
8
8
  };
9
9
  export declare function MemberPopupProvider({ children, headlessConfig, earnCreditsCopy, ...contextValue }: PropsWithChildren<MemberPopupProviderProps>): import("react/jsx-runtime").JSX.Element;
10
- export declare function useMemberPopupContext(): MemberPopupContextValue;
10
+ export declare function useMemberPopupContext(): MemberPopupInternalContextValue;
11
11
  export {};
@@ -1,2 +1,2 @@
1
- import{jsx as o}from"react/jsx-runtime";import{createContext as n,useContext as d}from"react";import{HeadlessProvider as a}from"@anker-in/lib";import{RegistrationProvider as s}from"../../registration";const p=n({profile:null,isLoadingProfile:!1,creditInfo:void 0,fetchCreditInfo:()=>{},openSignUpPopup:()=>{},openSignInPopup:()=>{},taskIdToTypeMapping:{},alpcConfig:{brand:"",locale:"",appName:""}});function m({children:e,headlessConfig:t,earnCreditsCopy:i,...r}){return o(a,{headlessConfig:t,children:o(s,{email:r.profile?.email,copy:{authCodeActivate:i?.authCodeActivate},children:o(p.Provider,{value:r,children:e})})})}function f(){const e=d(p);if(!e)throw new Error("useMemberPopupContext must be used within a MemberPopupProvider");return e}export{p as MemberPopupContext,m as MemberPopupProvider,f as useMemberPopupContext};
1
+ import{jsx as s}from"react/jsx-runtime";import{createContext as d,useContext as f,useState as o}from"react";import{HeadlessProvider as C}from"@anker-in/lib";import{RegistrationProvider as m}from"../../registration";const r=d({profile:null,isLoadingProfile:!1,creditInfo:void 0,fetchCreditInfo:()=>{},openSignUpPopup:()=>{},openSignInPopup:()=>{},taskIdToTypeMapping:{},alpcConfig:{brand:"",locale:"",appName:""},isSubscribeSuccess:!1,setIsSubscribeSuccess:()=>{},isActivateSuccess:!1,setIsActivateSuccess:()=>{},isProfileCompleteSuccess:!1,setIsProfileCompleteSuccess:()=>{}});function x({children:e,headlessConfig:i,earnCreditsCopy:p,...t}){const[n,u]=o(!1),[c,a]=o(!1),[l,P]=o(!1);return s(C,{headlessConfig:i,children:s(m,{email:t.profile?.email,copy:{authCodeActivate:p?.authCodeActivate},children:s(r.Provider,{value:{...t,isSubscribeSuccess:n,setIsSubscribeSuccess:u,isActivateSuccess:c,setIsActivateSuccess:a,isProfileCompleteSuccess:l,setIsProfileCompleteSuccess:P},children:e})})})}function I(){const e=f(r);if(!e)throw new Error("useMemberPopupContext must be used within a MemberPopupProvider");return e}export{r as MemberPopupContext,x as MemberPopupProvider,I as useMemberPopupContext};
2
2
  //# sourceMappingURL=provider.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/components/memberPopup/context/provider.tsx"],
4
- "sourcesContent": ["import { createContext, PropsWithChildren, useContext } from 'react'\nimport { HeadlessProvider, type HeadlessConfig } from '@anker-in/lib'\nimport { RegistrationProvider } from '../../registration'\nimport type { EarnCreditsCopy, MemberPopupContextValue } from '../type'\n\nexport const MemberPopupContext = createContext<MemberPopupContextValue>({\n profile: null,\n isLoadingProfile: false,\n creditInfo: undefined,\n fetchCreditInfo: () => {},\n openSignUpPopup: () => {},\n openSignInPopup: () => {},\n taskIdToTypeMapping: {},\n alpcConfig: {\n brand: '',\n locale: '',\n appName: '',\n },\n})\n\ntype MemberPopupProviderProps = MemberPopupContextValue & {\n headlessConfig: HeadlessConfig\n earnCreditsCopy?: EarnCreditsCopy\n}\n\nexport function MemberPopupProvider({\n children,\n headlessConfig,\n earnCreditsCopy,\n ...contextValue\n}: PropsWithChildren<MemberPopupProviderProps>) {\n return (\n <HeadlessProvider headlessConfig={headlessConfig}>\n <RegistrationProvider\n email={contextValue.profile?.email}\n copy={{ authCodeActivate: earnCreditsCopy?.authCodeActivate }}\n >\n <MemberPopupContext.Provider value={contextValue}>\n {children}\n </MemberPopupContext.Provider>\n </RegistrationProvider>\n </HeadlessProvider>\n )\n}\n\nexport function useMemberPopupContext() {\n const context = useContext(MemberPopupContext)\n if (!context) {\n throw new Error('useMemberPopupContext must be used within a MemberPopupProvider')\n }\n return context\n}\n"],
5
- "mappings": "AAqCQ,cAAAA,MAAA,oBArCR,OAAS,iBAAAC,EAAkC,cAAAC,MAAkB,QAC7D,OAAS,oBAAAC,MAA6C,gBACtD,OAAS,wBAAAC,MAA4B,qBAG9B,MAAMC,EAAqBJ,EAAuC,CACvE,QAAS,KACT,iBAAkB,GAClB,WAAY,OACZ,gBAAiB,IAAM,CAAC,EACxB,gBAAiB,IAAM,CAAC,EACxB,gBAAiB,IAAM,CAAC,EACxB,oBAAqB,CAAC,EACtB,WAAY,CACV,MAAO,GACP,OAAQ,GACR,QAAS,EACX,CACF,CAAC,EAOM,SAASK,EAAoB,CAClC,SAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,GAAGC,CACL,EAAgD,CAC9C,OACEV,EAACG,EAAA,CAAiB,eAAgBK,EAChC,SAAAR,EAACI,EAAA,CACC,MAAOM,EAAa,SAAS,MAC7B,KAAM,CAAE,iBAAkBD,GAAiB,gBAAiB,EAE5D,SAAAT,EAACK,EAAmB,SAAnB,CAA4B,MAAOK,EACjC,SAAAH,EACH,EACF,EACF,CAEJ,CAEO,SAASI,GAAwB,CACtC,MAAMC,EAAUV,EAAWG,CAAkB,EAC7C,GAAI,CAACO,EACH,MAAM,IAAI,MAAM,iEAAiE,EAEnF,OAAOA,CACT",
6
- "names": ["jsx", "createContext", "useContext", "HeadlessProvider", "RegistrationProvider", "MemberPopupContext", "MemberPopupProvider", "children", "headlessConfig", "earnCreditsCopy", "contextValue", "useMemberPopupContext", "context"]
4
+ "sourcesContent": ["import { createContext, PropsWithChildren, useContext, useState } from 'react'\nimport { HeadlessProvider, type HeadlessConfig } from '@anker-in/lib'\nimport { RegistrationProvider } from '../../registration'\nimport type { EarnCreditsCopy, MemberPopupContextValue, MemberPopupInternalContextValue } from '../type'\n\nexport const MemberPopupContext = createContext<MemberPopupInternalContextValue>({\n profile: null,\n isLoadingProfile: false,\n creditInfo: undefined,\n fetchCreditInfo: () => {},\n openSignUpPopup: () => {},\n openSignInPopup: () => {},\n taskIdToTypeMapping: {},\n alpcConfig: {\n brand: '',\n locale: '',\n appName: '',\n },\n isSubscribeSuccess: false,\n setIsSubscribeSuccess: () => {},\n isActivateSuccess: false,\n setIsActivateSuccess: () => {},\n isProfileCompleteSuccess: false,\n setIsProfileCompleteSuccess: () => {},\n})\n\ntype MemberPopupProviderProps = MemberPopupContextValue & {\n headlessConfig: HeadlessConfig\n earnCreditsCopy?: EarnCreditsCopy\n}\n\nexport function MemberPopupProvider({\n children,\n headlessConfig,\n earnCreditsCopy,\n ...contextValue\n}: PropsWithChildren<MemberPopupProviderProps>) {\n const [isSubscribeSuccess, setIsSubscribeSuccess] = useState(false)\n const [isActivateSuccess, setIsActivateSuccess] = useState(false)\n const [isProfileCompleteSuccess, setIsProfileCompleteSuccess] = useState(false)\n\n return (\n <HeadlessProvider headlessConfig={headlessConfig}>\n <RegistrationProvider\n email={contextValue.profile?.email}\n copy={{ authCodeActivate: earnCreditsCopy?.authCodeActivate }}\n >\n <MemberPopupContext.Provider\n value={{\n ...contextValue,\n isSubscribeSuccess,\n setIsSubscribeSuccess,\n isActivateSuccess,\n setIsActivateSuccess,\n isProfileCompleteSuccess,\n setIsProfileCompleteSuccess,\n }}\n >\n {children}\n </MemberPopupContext.Provider>\n </RegistrationProvider>\n </HeadlessProvider>\n )\n}\n\nexport function useMemberPopupContext() {\n const context = useContext(MemberPopupContext)\n if (!context) {\n throw new Error('useMemberPopupContext must be used within a MemberPopupProvider')\n }\n return context\n}\n"],
5
+ "mappings": "AA+CQ,cAAAA,MAAA,oBA/CR,OAAS,iBAAAC,EAAkC,cAAAC,EAAY,YAAAC,MAAgB,QACvE,OAAS,oBAAAC,MAA6C,gBACtD,OAAS,wBAAAC,MAA4B,qBAG9B,MAAMC,EAAqBL,EAA+C,CAC/E,QAAS,KACT,iBAAkB,GAClB,WAAY,OACZ,gBAAiB,IAAM,CAAC,EACxB,gBAAiB,IAAM,CAAC,EACxB,gBAAiB,IAAM,CAAC,EACxB,oBAAqB,CAAC,EACtB,WAAY,CACV,MAAO,GACP,OAAQ,GACR,QAAS,EACX,EACA,mBAAoB,GACpB,sBAAuB,IAAM,CAAC,EAC9B,kBAAmB,GACnB,qBAAsB,IAAM,CAAC,EAC7B,yBAA0B,GAC1B,4BAA6B,IAAM,CAAC,CACtC,CAAC,EAOM,SAASM,EAAoB,CAClC,SAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,GAAGC,CACL,EAAgD,CAC9C,KAAM,CAACC,EAAoBC,CAAqB,EAAIV,EAAS,EAAK,EAC5D,CAACW,EAAmBC,CAAoB,EAAIZ,EAAS,EAAK,EAC1D,CAACa,EAA0BC,CAA2B,EAAId,EAAS,EAAK,EAE9E,OACEH,EAACI,EAAA,CAAiB,eAAgBK,EAChC,SAAAT,EAACK,EAAA,CACC,MAAOM,EAAa,SAAS,MAC7B,KAAM,CAAE,iBAAkBD,GAAiB,gBAAiB,EAE5D,SAAAV,EAACM,EAAmB,SAAnB,CACC,MAAO,CACL,GAAGK,EACH,mBAAAC,EACA,sBAAAC,EACA,kBAAAC,EACA,qBAAAC,EACA,yBAAAC,EACA,4BAAAC,CACF,EAEC,SAAAT,EACH,EACF,EACF,CAEJ,CAEO,SAASU,GAAwB,CACtC,MAAMC,EAAUjB,EAAWI,CAAkB,EAC7C,GAAI,CAACa,EACH,MAAM,IAAI,MAAM,iEAAiE,EAEnF,OAAOA,CACT",
6
+ "names": ["jsx", "createContext", "useContext", "useState", "HeadlessProvider", "RegistrationProvider", "MemberPopupContext", "MemberPopupProvider", "children", "headlessConfig", "earnCreditsCopy", "contextValue", "isSubscribeSuccess", "setIsSubscribeSuccess", "isActivateSuccess", "setIsActivateSuccess", "isProfileCompleteSuccess", "setIsProfileCompleteSuccess", "useMemberPopupContext", "context"]
7
7
  }
@@ -0,0 +1,7 @@
1
+ import type { SubscribeModalCopy } from '../type';
2
+ type Props = {
3
+ copy: SubscribeModalCopy;
4
+ email?: string;
5
+ };
6
+ export default function ActivitiesSubscribeModal({ copy, email: initialEmail }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,2 @@
1
+ import{jsx as t,jsxs as c}from"react/jsx-runtime";import{useCallback as y,useEffect as A,useState as l}from"react";import{Checkbox as U,Picture as R,Text as a}from"@anker-in/headless-ui";import{gaTrack as B,classNames as p,useHeadlessContext as D}from"@anker-in/lib";import d from"js-cookie";import{parse as E}from"query-string";import{emailValidate as F}from"../../credits/context/utils";import{useMemberPopupContext as H}from"../context/provider";import{ROUNDED_BRANDS as I}from"../../../constants";function O(){if(typeof window>"u")return{register_source:""};const{search:e,href:s}=window.location,n=E(e);return{fbuy_ref_code:d.get("fbuy_ref_code"),ref:d.get("ref_ads"),inviter_code:n.ic??n.inviter_code??d.get("inviter_code"),register_source:n.redirect??d.get("reg_source")??s}}async function j(e){if(typeof window>"u"||!window?.grecaptcha?.execute||!e)return"";try{return await window.grecaptcha.execute(e,{action:"activity"})}catch{return""}}function q({copy:e,email:s}){const{alpcConfig:n,setIsSubscribeSuccess:x,pageHandle:b}=H(),{locale:g}=n,{brand:C,storeDomain:h,recaptchaSitekey:M}=D(),u=I.includes(C),[m,S]=l(!1),[i,_]=l(s??""),[v,o]=l(""),[k,w]=l(""),[L,N]=l(!1);A(()=>{s&&_(s)},[s]);const T=y(async()=>{if(o(""),!i)return o("Please fill in your email");if(!F(i))return o("Invalid email address");if(!m)return o("Please agree to the policy");N(!0);const{register_source:r}=O(),P=await j(M||"");try{const f=await(await fetch("/api/multipass/rainbowbridge/activities",{method:"POST",headers:{"Content-Type":"application/json","current-language":g,"X-Recaptcha-Token":P},body:JSON.stringify({email:i,register_source:r,shopify_domain:h,single_brand_subscribe:e.single_brand_subscribe??!0,genre:e.genre??e.dealsType??"",sub_brand_type:e.sub_brand_type??""})})).json();f?.data?.is_new_subscribe?f?.data?.errors?o(f?.data?.errors??"Error occurred"):(w(e.successTips??"Subscribed successfully!"),x(!0),B({event:"ga4Event",event_name:"subscribe",event_parameters:{page_group:e.dealsType??e.genre??"",position:"sticky",info:"Member Floating Window"}})):w(e.subscribedLabel??"You've already subscribed!")}catch{o("Network error")}finally{N(!1)}},[i,m,g,h,e,x]);return c("div",{className:"flex flex-col",children:[t(a,{className:"text-[22px] font-bold leading-[1.2]",html:e.title}),e.desc&&t(a,{className:"text-[16px] mt-[16px] font-bold text-[#1E2024]",html:e.desc}),t("input",{className:p("h-[46px] w-full border mt-[8px] px-[14px] text-[16px] outline-none placeholder:text-[#999]",u?"rounded-[4px]":"rounded-none"),placeholder:e.placeholder,value:i,onChange:r=>{o(""),_(r.target.value.trim())}}),c("div",{className:"flex w-full mt-[8px] items-start gap-[8px]",children:[t(U,{checked:m,onCheckedChange:()=>S(r=>!r),className:"border-[#1d1d1f] mt-[2px]"}),t("label",{className:"text-left text-[14px] font-bold text-[#4A4C56] [&_a]:underline",dangerouslySetInnerHTML:{__html:e.policy??""}})]}),t("button",{className:p("w-full cursor-pointer bg-[#080a0f] mt-[16px] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60",u?"rounded-[4px]":"rounded-none"),disabled:L,onClick:T,children:e.buttonLabel??"Subscribe"}),v&&t("div",{className:"text-left mt-[4px] text-[16px] font-semibold text-[#f84d4f]",children:t(a,{html:v})}),t("div",{className:"text-left mt-[4px] text-[16px] font-semibold text-[#52c41a]",children:t(a,{html:k})}),e.promo&&c("div",{className:"flex mt-[32px] flex-col text-left",children:[c("div",{className:"flex flex-col",children:[e.promo?.title&&t(a,{className:"text-[18px] font-bold leading-[1.2]",html:e.promo.title}),e.promo.description&&t(a,{className:"text-[14px] text-[#080A0F] mt-[8px] font-bold",html:e.promo.description}),e.promo.learnMoreLabel&&e.promo.learnMoreUrl&&c("a",{href:(()=>{try{if(!b)return e.promo.learnMoreUrl;const r=new URL(e.promo.learnMoreUrl,window.location.href);return r.searchParams.set("ref",`${b}_subscribe`),r.toString()}catch{return e.promo.learnMoreUrl}})(),target:"_blank",rel:"noopener noreferrer",className:"flex mt-[8px] items-center gap-[4px] text-[14px] font-bold",children:[e.promo.learnMoreLabel,t("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:t("path",{d:"M5.52827 3.52876C5.78862 3.26841 6.21063 3.26841 6.47098 3.52876L10.471 7.52876C10.7313 7.78911 10.7313 8.21112 10.471 8.47147L6.47098 12.4715C6.21063 12.7318 5.78862 12.7318 5.52827 12.4715C5.26792 12.2111 5.26792 11.7891 5.52827 11.5288L9.05692 8.00011L5.52827 4.47147C5.26792 4.21112 5.26792 3.78911 5.52827 3.52876Z",fill:"#080A0F"})})]})]}),e.promo.image?.url&&t(R,{source:e.promo.image.url,alt:e.promo.image.alt??"",className:p("h-[100px] mt-[8px] w-full object-cover",u?"rounded-[8px]":"rounded-none")})]})]})}export{q as default};
2
+ //# sourceMappingURL=ActivitiesSubscribePanel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/memberPopup/panels/ActivitiesSubscribePanel.tsx"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport { Button, Checkbox, Picture, Text } from '@anker-in/headless-ui'\nimport { gaTrack, classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport Cookies from 'js-cookie'\nimport { parse } from 'query-string'\nimport { emailValidate } from '../../credits/context/utils'\nimport { useMemberPopupContext } from '../context/provider'\nimport type { SubscribeModalCopy } from '../type'\nimport { ROUNDED_BRANDS } from '../../../constants'\n\ntype Props = {\n copy: SubscribeModalCopy\n email?: string\n}\n\nfunction getAdCookie() {\n if (typeof window === 'undefined') return { register_source: '' }\n const { search, href } = window.location\n const query = parse(search)\n return {\n fbuy_ref_code: Cookies.get('fbuy_ref_code'),\n ref: Cookies.get('ref_ads'),\n inviter_code: query.ic ?? query.inviter_code ?? Cookies.get('inviter_code'),\n register_source: query.redirect ?? Cookies.get('reg_source') ?? href,\n }\n}\n\nasync function getRecaptchaToken(sitekey: string): Promise<string> {\n if (typeof window === 'undefined' || !window?.grecaptcha?.execute) return ''\n if (!sitekey) return ''\n try {\n return await window.grecaptcha.execute(sitekey, { action: 'activity' })\n } catch {\n return ''\n }\n}\n\nexport default function ActivitiesSubscribeModal({ copy, email: initialEmail }: Props) {\n const { alpcConfig, setIsSubscribeSuccess, pageHandle } = useMemberPopupContext()\n const { locale } = alpcConfig\n const { brand: headlessBrand, storeDomain, recaptchaSitekey } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(headlessBrand)\n const [policy, setPolicy] = useState(false)\n const [email, setEmail] = useState(initialEmail ?? '')\n const [errorMessage, setErrorMessage] = useState('')\n const [successMessage, setSuccessMessage] = useState('')\n const [loading, setLoading] = useState(false)\n\n useEffect(() => {\n if (initialEmail) setEmail(initialEmail)\n }, [initialEmail])\n\n const handleSubmit = useCallback(async () => {\n setErrorMessage('')\n if (!email) return setErrorMessage('Please fill in your email')\n if (!emailValidate(email)) return setErrorMessage('Invalid email address')\n if (!policy) return setErrorMessage('Please agree to the policy')\n\n setLoading(true)\n const { register_source } = getAdCookie()\n const recaptchaToken = await getRecaptchaToken(recaptchaSitekey || '')\n try {\n const response = await fetch('/api/multipass/rainbowbridge/activities', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'current-language': locale,\n 'X-Recaptcha-Token': recaptchaToken,\n },\n body: JSON.stringify({\n email,\n register_source,\n shopify_domain: storeDomain,\n single_brand_subscribe: copy.single_brand_subscribe ?? true,\n genre: copy.genre ?? copy.dealsType ?? '',\n sub_brand_type: copy.sub_brand_type ?? '',\n }),\n })\n const result = await response.json()\n if (!result?.data?.is_new_subscribe) {\n setSuccessMessage(copy.subscribedLabel ?? \"You've already subscribed!\")\n } else if (!result?.data?.errors) {\n setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')\n setIsSubscribeSuccess(true)\n gaTrack({\n event: 'ga4Event',\n event_name: 'subscribe',\n event_parameters: {\n page_group: copy.dealsType ?? copy.genre ?? '',\n position: 'sticky',\n info: 'Member Floating Window',\n },\n })\n } else {\n setErrorMessage(result?.data?.errors ?? 'Error occurred')\n }\n } catch {\n setErrorMessage('Network error')\n } finally {\n setLoading(false)\n }\n }, [email, policy, locale, storeDomain, copy, setIsSubscribeSuccess])\n\n return (\n <div className=\"flex flex-col\">\n <Text className=\"text-[22px] font-bold leading-[1.2]\" html={copy.title} />\n {copy.desc && <Text className=\"text-[16px] mt-[16px] font-bold text-[#1E2024]\" html={copy.desc} />}\n\n <input\n className={cn(\n 'h-[46px] w-full border mt-[8px] px-[14px] text-[16px] outline-none placeholder:text-[#999]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n placeholder={copy.placeholder}\n value={email}\n onChange={e => {\n setErrorMessage('')\n setEmail(e.target.value.trim())\n }}\n />\n\n <div className=\"flex w-full mt-[8px] items-start gap-[8px]\">\n <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className=\"border-[#1d1d1f] mt-[2px]\" />\n <label\n className=\"text-left text-[14px] font-bold text-[#4A4C56] [&_a]:underline\"\n dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}\n />\n </div>\n\n <button\n className={cn(\n 'w-full cursor-pointer bg-[#080a0f] mt-[16px] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n disabled={loading}\n onClick={handleSubmit}\n >\n {copy.buttonLabel ?? 'Subscribe'}\n </button>\n\n {errorMessage && (\n <div className=\"text-left mt-[4px] text-[16px] font-semibold text-[#f84d4f]\">\n <Text html={errorMessage} />\n </div>\n )}\n <div className=\"text-left mt-[4px] text-[16px] font-semibold text-[#52c41a]\">\n <Text html={successMessage} />\n </div>\n\n {copy.promo && (\n <div className=\"flex mt-[32px] flex-col text-left\">\n <div className=\"flex flex-col\">\n {copy.promo?.title && <Text className=\"text-[18px] font-bold leading-[1.2]\" html={copy.promo.title} />}\n {copy.promo.description && (\n <Text className=\"text-[14px] text-[#080A0F] mt-[8px] font-bold\" html={copy.promo.description} />\n )}\n {copy.promo.learnMoreLabel && copy.promo.learnMoreUrl && (\n <a\n href={(() => {\n try {\n if (!pageHandle) return copy.promo!.learnMoreUrl!\n const url = new URL(copy.promo!.learnMoreUrl!, window.location.href)\n url.searchParams.set('ref', `${pageHandle}_subscribe`)\n return url.toString()\n } catch {\n return copy.promo!.learnMoreUrl!\n }\n })()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex mt-[8px] items-center gap-[4px] text-[14px] font-bold\"\n >\n {copy.promo.learnMoreLabel}\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M5.52827 3.52876C5.78862 3.26841 6.21063 3.26841 6.47098 3.52876L10.471 7.52876C10.7313 7.78911 10.7313 8.21112 10.471 8.47147L6.47098 12.4715C6.21063 12.7318 5.78862 12.7318 5.52827 12.4715C5.26792 12.2111 5.26792 11.7891 5.52827 11.5288L9.05692 8.00011L5.52827 4.47147C5.26792 4.21112 5.26792 3.78911 5.52827 3.52876Z\"\n fill=\"#080A0F\"\n />\n </svg>\n </a>\n )}\n </div>\n {copy.promo.image?.url && (\n <Picture\n source={copy.promo.image.url}\n alt={copy.promo.image.alt ?? ''}\n className={cn('h-[100px] mt-[8px] w-full object-cover', rounded ? 'rounded-[8px]' : 'rounded-none')}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Checkbox", "Picture", "Text", "gaTrack", "cn", "useHeadlessContext", "Cookies", "parse", "emailValidate", "useMemberPopupContext", "ROUNDED_BRANDS", "getAdCookie", "search", "href", "query", "getRecaptchaToken", "sitekey", "ActivitiesSubscribeModal", "copy", "initialEmail", "alpcConfig", "setIsSubscribeSuccess", "pageHandle", "locale", "headlessBrand", "storeDomain", "recaptchaSitekey", "rounded", "policy", "setPolicy", "email", "setEmail", "errorMessage", "setErrorMessage", "successMessage", "setSuccessMessage", "loading", "setLoading", "handleSubmit", "register_source", "recaptchaToken", "result", "e", "v", "url"]
7
+ }
@@ -1,6 +1,5 @@
1
- import type { RedeemCouponModalCopy, AlpcConfig } from '../../type';
2
- type Props = {
3
- onClose: () => void;
1
+ import type { ConsumeCreditsopy, AlpcConfig } from '../../type';
2
+ type RedeemCouponItem = {
4
3
  itemTitle: string;
5
4
  itemCredits: number;
6
5
  itemImage?: {
@@ -8,13 +7,16 @@ type Props = {
8
7
  alt?: string;
9
8
  };
10
9
  itemValue?: string;
11
- itemOff?: string;
10
+ itemRules?: string[];
12
11
  redeemId: number;
13
12
  userId?: string;
14
- copy: RedeemCouponModalCopy;
15
- pointUnit?: string;
16
13
  alpcConfig: AlpcConfig;
14
+ };
15
+ type Props = {
16
+ onClose: () => void;
17
+ item: RedeemCouponItem;
18
+ copy: ConsumeCreditsopy;
17
19
  onError?: (code: number) => void;
18
20
  };
19
- export default function RedeemCouponPanel({ onClose, itemTitle, itemCredits, itemImage, itemValue, itemOff, redeemId, userId, copy, pointUnit, alpcConfig, onError, }: Props): import("react/jsx-runtime").JSX.Element;
21
+ export default function RedeemCouponPanel({ onClose, item, copy, onError }: Props): import("react/jsx-runtime").JSX.Element;
20
22
  export {};
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as n}from"react/jsx-runtime";import{useCallback as U,useEffect as _,useState as f}from"react";import{Text as l,Button as w}from"@anker-in/headless-ui";import{useHeadlessContext as M,classNames as m}from"@anker-in/lib";import{AlpcErrorCode as d}from"../../../credits/context/const";import{useRedeemCoupon as P}from"./hooks/useRedeemCoupon";import j from"../../../credits/context/hooks/useCopy";import{ROUNDED_BRANDS as H}from"../../../../constants";function I({onClose:R,itemTitle:O,itemCredits:B,itemImage:a,itemValue:x,itemOff:C,redeemId:c,userId:g,copy:e,pointUnit:T="pts",alpcConfig:k,onError:N}){const[u,b]=f(),[v,i]=f(""),[y,s]=f(!1),{copy:D,copied:h}=j(),{brand:L}=M(),p=H.includes(L),{isMutating:S,trigger:E}=P(k),A=U(async()=>{i("");const{data:o}=await E({user_id:g,rule_id:c});if(!o){i(e.commonError);return}if(o.data?.success)b(o.data.coupon_code);else{let r=e.commonError;o.code===d.CodeLpcShopifyCouponRuleRedeemLimit?(r=e.redeemLimitError,s(!0)):o.code===d.CodeLpcRuleInventoryNotEnough?(r=e.inventoryNotEnough,s(!0)):o.code===d.CodeLpcNotEnoughCredits?(r=e.creditsNotEnough,s(!0)):o.code===d.CodeCrossSiteError&&(r=e.crossSiteError,s(!0)),i(r),N?.(o.code)}},[E,g,c,e,N]);return _(()=>{b(void 0),i(""),s(!1)},[c]),n("div",{className:"flex flex-col gap-[16px]",children:[a?.url&&n("div",{className:m("relative overflow-hidden w-fit mx-auto",p?"rounded-[8px]":"rounded-none"),children:[t("img",{src:a.url,alt:a.alt??"",className:"mx-auto h-[140px] object-contain"}),x&&n("div",{className:"absolute bottom-[20px] left-[20px] text-[32px] font-[800] leading-none text-white",children:[x,C?` ${C}`:""]})]}),n("p",{className:"text-center text-[24px] font-[700] text-[#1d1d1f]",children:[B," ",T]}),u?n("div",{className:"flex flex-col gap-[12px] text-center",children:[n("div",{className:"flex items-center justify-center gap-[10px]",children:[t("span",{className:"text-[24px] font-[700]",children:u}),t("button",{className:"cursor-pointer text-[14px] font-[700] underline disabled:pointer-events-none",disabled:h,onClick:()=>D(u),children:h?"Copied":"Copy"})]}),t(l,{className:"text-[20px] font-[700]",html:e.successTitle}),t(l,{className:"text-[14px] font-[700] text-[#6d6d6f]",html:e.successDesc}),t(w,{className:m("w-full py-[12px] text-[14px] font-[700] text-white bg-[#080a0f]",p?"rounded-[4px]":"rounded-none"),onClick:()=>{e.successButtonUrl&&(window.location.href=e.successButtonUrl),R()},children:e.successButton})]}):n("div",{className:"flex flex-col gap-[12px] text-center",children:[t(l,{className:"block text-[20px] font-[700]",html:e.confirmTitle}),t(w,{className:m("w-full py-[12px] text-[14px] font-[700] text-white disabled:opacity-60 bg-[#080a0f]",p?"rounded-[4px]":"rounded-none"),disabled:y,loading:S,onClick:A,children:e.confirmButton})]}),v&&t(l,{className:"text-center text-[14px] font-[700] text-[#ff0000]",html:v})]})}export{I as default};
1
+ import{jsx as t,jsxs as s}from"react/jsx-runtime";import{useCallback as P,useEffect as F,useState as f}from"react";import{Text as r,Button as w}from"@anker-in/headless-ui";import{gaTrack as V,useHeadlessContext as j,classNames as x}from"@anker-in/lib";import{AlpcErrorCode as a}from"../../../credits/context/const";import{useRedeemCoupon as H}from"./hooks/useRedeemCoupon";import O from"../../../credits/context/hooks/useCopy";import{ROUNDED_BRANDS as W}from"../../../../constants";function $({onClose:E,item:I,copy:R,onError:g}){const{itemTitle:q,itemCredits:_,itemImage:c,itemValue:C,itemRules:m,redeemId:p,userId:v,alpcConfig:k}=I,{redeemModal:e,creditUnit:B}=R,D=B??"pts",[i,N]=f(),[b,d]=f(""),[T,l]=f(!1),{copy:S,copied:y}=O(),{brand:L}=j(),u=W.includes(L),{isMutating:U,trigger:h}=H(k),A=P(async()=>{d("");const{data:o}=await h({user_id:v,rule_id:p});if(!o){d(e.commonError);return}if(o.data?.success)N(o.data.coupon_code),V({event:"ga4Event",event_name:"lp_button",event_parameters:{position:"consume_credits",button_name:"redeem_coupon_success",info:"Member Floating Window"}});else{let n=e.commonError;o.code===a.CodeLpcShopifyCouponRuleRedeemLimit?(n=e.redeemLimitError,l(!0)):o.code===a.CodeLpcRuleInventoryNotEnough?(n=e.inventoryNotEnough,l(!0)):o.code===a.CodeLpcNotEnoughCredits?(n=e.creditsNotEnough,l(!0)):o.code===a.CodeCrossSiteError&&(n=e.crossSiteError,l(!0)),d(n),g?.(o.code)}},[h,v,p,e,g]);F(()=>{N(void 0),d(""),l(!1)},[p]);const M=m&&m.length>0&&t("div",{className:"w-full text-[16px] font-bold leading-[1.4] text-[#6D6D6F] md:mt-[12px] md:text-[14px]",children:t("ul",{className:"ml-4 grid grid-flow-row gap-[4px]",children:m?.map((o,n)=>t("li",{className:"list-disc",children:t(r,{html:o,className:"font-bold"})},n))})});return s("div",{className:"flex flex-col",children:[c?.url&&t("div",{className:"relative w-full px-[24px]",children:s("div",{className:x("relative mx-auto overflow-hidden",u?"rounded-[8px]":"rounded-none"),children:[t("img",{src:c.url,alt:c.alt??"",className:"mx-auto h-[140px] w-full object-cover"}),C&&s("div",{className:"absolute bottom-[20px] left-[20px] text-[32px] font-[800] leading-none text-white",children:[C,e.off?` ${e.off}`:""]})]})}),!i&&s("div",{className:"flex flex-col gap-[16px] px-[24px] py-[20px]",children:[s("p",{className:"text-center text-[24px] font-[700] text-[#1d1d1f]",children:[_," ",D]}),M]}),i&&s("div",{className:"flex mt-[16px] flex-col gap-[8px] text-center",children:[s("div",{className:"flex items-center justify-center gap-[10px]",children:[t("span",{className:"text-[24px] font-[700]",children:i}),t("button",{className:"cursor-pointer text-[14px] font-[700] underline disabled:pointer-events-none",disabled:y,onClick:()=>S(i),children:y?"Copied":"Copy"})]}),t(r,{className:"text-[20px] font-[700]",html:e.successTitle}),t(r,{className:"text-[14px] font-[700] text-[#6d6d6f]",html:e.successDesc}),t(w,{className:x("w-full py-[12px] text-[14px] font-[700] text-white bg-[#080a0f]",u?"rounded-[4px]":"rounded-none"),onClick:()=>{e.successButtonUrl&&(window.location.href=e.successButtonUrl),E()},children:e.successButton})]}),!i&&s("div",{className:"sticky bottom-0 bg-white border-t border-[#e5e5e5] pt-[10px]",children:[s("div",{className:"flex flex-col gap-[8px] text-center",children:[t(r,{className:"block text-[16px] font-[700] leading-[1.3]",html:e.confirmTitle}),t(w,{className:x("w-full py-[12px] text-[14px] font-[700] text-white disabled:opacity-60 bg-[#080a0f]",u?"rounded-[4px]":"rounded-none"),disabled:T,loading:U,onClick:A,children:e.confirmButton})]}),b&&t(r,{className:"mt-[8px] text-center text-[14px] font-[700] text-[#ff0000]",html:b})]})]})}export{$ as default};
2
2
  //# sourceMappingURL=RedeemCouponPanel.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.tsx"],
4
- "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport { Text, Button } from '@anker-in/headless-ui'\nimport { useHeadlessContext, classNames as cn } from '@anker-in/lib'\nimport { AlpcErrorCode } from '../../../credits/context/const'\nimport { useRedeemCoupon } from './hooks/useRedeemCoupon'\nimport useCopy from '../../../credits/context/hooks/useCopy'\nimport type { RedeemCouponModalCopy, AlpcConfig } from '../../type'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\ntype Props = {\n onClose: () => void\n itemTitle: string\n itemCredits: number\n itemImage?: { url: string; alt?: string }\n itemValue?: string\n itemOff?: string\n redeemId: number\n userId?: string\n copy: RedeemCouponModalCopy\n pointUnit?: string\n alpcConfig: AlpcConfig\n onError?: (code: number) => void\n}\n\nexport default function RedeemCouponPanel({\n onClose,\n itemTitle,\n itemCredits,\n itemImage,\n itemValue,\n itemOff,\n redeemId,\n userId,\n copy,\n pointUnit = 'pts',\n alpcConfig,\n onError,\n}: Props) {\n const [couponCode, setCouponCode] = useState<string>()\n const [errorInfo, setErrorInfo] = useState('')\n const [disabled, setDisabled] = useState(false)\n const { copy: copyText, copied } = useCopy()\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const { isMutating: loading, trigger } = useRedeemCoupon(alpcConfig)\n\n const handleConfirm = useCallback(async () => {\n setErrorInfo('')\n const { data } = await trigger({ user_id: userId, rule_id: redeemId })\n if (!data) {\n setErrorInfo(copy.commonError)\n return\n }\n if (data.data?.success) {\n setCouponCode(data.data.coupon_code)\n } else {\n let msg = copy.commonError\n if (data.code === AlpcErrorCode.CodeLpcShopifyCouponRuleRedeemLimit) {\n msg = copy.redeemLimitError\n setDisabled(true)\n } else if (data.code === AlpcErrorCode.CodeLpcRuleInventoryNotEnough) {\n msg = copy.inventoryNotEnough\n setDisabled(true)\n } else if (data.code === AlpcErrorCode.CodeLpcNotEnoughCredits) {\n msg = copy.creditsNotEnough\n setDisabled(true)\n } else if (data.code === AlpcErrorCode.CodeCrossSiteError) {\n msg = copy.crossSiteError\n setDisabled(true)\n }\n setErrorInfo(msg)\n onError?.(data.code)\n }\n }, [trigger, userId, redeemId, copy, onError])\n\n useEffect(() => {\n setCouponCode(undefined)\n setErrorInfo('')\n setDisabled(false)\n }, [redeemId])\n\n return (\n <div className=\"flex flex-col gap-[16px]\">\n {itemImage?.url && (\n <div className={cn('relative overflow-hidden w-fit mx-auto', rounded ? 'rounded-[8px]' : 'rounded-none')}>\n <img src={itemImage.url} alt={itemImage.alt ?? ''} className=\"mx-auto h-[140px] object-contain\" />\n {itemValue && (\n <div className=\"absolute bottom-[20px] left-[20px] text-[32px] font-[800] leading-none text-white\">\n {itemValue}\n {itemOff ? ` ${itemOff}` : ''}\n </div>\n )}\n </div>\n )}\n\n <p className=\"text-center text-[24px] font-[700] text-[#1d1d1f]\">\n {itemCredits} {pointUnit}\n </p>\n\n {!couponCode ? (\n <div className=\"flex flex-col gap-[12px] text-center\">\n <Text className=\"block text-[20px] font-[700]\" html={copy.confirmTitle} />\n <Button\n className={cn('w-full py-[12px] text-[14px] font-[700] text-white disabled:opacity-60 bg-[#080a0f]', rounded ? 'rounded-[4px]' : 'rounded-none')}\n disabled={disabled}\n loading={loading}\n onClick={handleConfirm}\n >\n {copy.confirmButton}\n </Button>\n </div>\n ) : (\n <div className=\"flex flex-col gap-[12px] text-center\">\n <div className=\"flex items-center justify-center gap-[10px]\">\n <span className=\"text-[24px] font-[700]\">{couponCode}</span>\n <button\n className=\"cursor-pointer text-[14px] font-[700] underline disabled:pointer-events-none\"\n disabled={copied}\n onClick={() => copyText(couponCode)}\n >\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n <Text className=\"text-[20px] font-[700]\" html={copy.successTitle} />\n <Text className=\"text-[14px] font-[700] text-[#6d6d6f]\" html={copy.successDesc} />\n <Button\n className={cn('w-full py-[12px] text-[14px] font-[700] text-white bg-[#080a0f]', rounded ? 'rounded-[4px]' : 'rounded-none')}\n onClick={() => {\n if (copy.successButtonUrl) window.location.href = copy.successButtonUrl\n onClose()\n }}\n >\n {copy.successButton}\n </Button>\n </div>\n )}\n\n {errorInfo && <Text className=\"text-center text-[14px] font-[700] text-[#ff0000]\" html={errorInfo} />}\n </div>\n )\n}\n"],
5
- "mappings": "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",
6
- "names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Text", "Button", "useHeadlessContext", "cn", "AlpcErrorCode", "useRedeemCoupon", "useCopy", "ROUNDED_BRANDS", "RedeemCouponPanel", "onClose", "itemTitle", "itemCredits", "itemImage", "itemValue", "itemOff", "redeemId", "userId", "copy", "pointUnit", "alpcConfig", "onError", "couponCode", "setCouponCode", "errorInfo", "setErrorInfo", "disabled", "setDisabled", "copyText", "copied", "brand", "rounded", "loading", "trigger", "handleConfirm", "data", "msg"]
4
+ "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport { Text, Button } from '@anker-in/headless-ui'\nimport { gaTrack, useHeadlessContext, classNames as cn } from '@anker-in/lib'\nimport { AlpcErrorCode } from '../../../credits/context/const'\nimport { useRedeemCoupon } from './hooks/useRedeemCoupon'\nimport useCopy from '../../../credits/context/hooks/useCopy'\nimport type { ConsumeCreditsopy, AlpcConfig } from '../../type'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\ntype RedeemCouponItem = {\n itemTitle: string\n itemCredits: number\n itemImage?: { url: string; alt?: string }\n itemValue?: string\n itemRules?: string[]\n redeemId: number\n userId?: string\n alpcConfig: AlpcConfig\n}\n\ntype Props = {\n onClose: () => void\n item: RedeemCouponItem\n copy: ConsumeCreditsopy\n onError?: (code: number) => void\n}\n\nexport default function RedeemCouponPanel({ onClose, item, copy, onError }: Props) {\n const { itemTitle, itemCredits, itemImage, itemValue, itemRules, redeemId, userId, alpcConfig } = item\n const { redeemModal, creditUnit } = copy\n const pointUnit = creditUnit ?? 'pts'\n const [couponCode, setCouponCode] = useState<string>()\n const [errorInfo, setErrorInfo] = useState('')\n const [disabled, setDisabled] = useState(false)\n const { copy: copyText, copied } = useCopy()\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const { isMutating: loading, trigger } = useRedeemCoupon(alpcConfig)\n\n const handleConfirm = useCallback(async () => {\n setErrorInfo('')\n const { data } = await trigger({ user_id: userId, rule_id: redeemId })\n if (!data) {\n setErrorInfo(redeemModal.commonError)\n return\n }\n if (data.data?.success) {\n setCouponCode(data.data.coupon_code)\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_button',\n event_parameters: {\n position: 'consume_credits',\n button_name: 'redeem_coupon_success',\n info: 'Member Floating Window',\n },\n })\n } else {\n let msg = redeemModal.commonError\n if (data.code === AlpcErrorCode.CodeLpcShopifyCouponRuleRedeemLimit) {\n msg = redeemModal.redeemLimitError\n setDisabled(true)\n } else if (data.code === AlpcErrorCode.CodeLpcRuleInventoryNotEnough) {\n msg = redeemModal.inventoryNotEnough\n setDisabled(true)\n } else if (data.code === AlpcErrorCode.CodeLpcNotEnoughCredits) {\n msg = redeemModal.creditsNotEnough\n setDisabled(true)\n } else if (data.code === AlpcErrorCode.CodeCrossSiteError) {\n msg = redeemModal.crossSiteError\n setDisabled(true)\n }\n setErrorInfo(msg)\n onError?.(data.code)\n }\n }, [trigger, userId, redeemId, redeemModal, onError])\n\n useEffect(() => {\n setCouponCode(undefined)\n setErrorInfo('')\n setDisabled(false)\n }, [redeemId])\n\n const rulesSection = itemRules && itemRules.length > 0 && (\n <div className=\"w-full text-[16px] font-bold leading-[1.4] text-[#6D6D6F] md:mt-[12px] md:text-[14px]\">\n <ul className=\"ml-4 grid grid-flow-row gap-[4px]\">\n {itemRules?.map((text, index) => (\n <li className=\"list-disc\" key={index}>\n <Text html={text} className=\"font-bold\" />\n </li>\n ))}\n </ul>\n </div>\n )\n\n return (\n <div className=\"flex flex-col\">\n {itemImage?.url && (\n <div className=\"relative w-full px-[24px]\">\n <div className={cn('relative mx-auto overflow-hidden', rounded ? 'rounded-[8px]' : 'rounded-none')}>\n <img src={itemImage.url} alt={itemImage.alt ?? ''} className=\"mx-auto h-[140px] w-full object-cover\" />\n {itemValue && (\n <div className=\"absolute bottom-[20px] left-[20px] text-[32px] font-[800] leading-none text-white\">\n {itemValue}\n {redeemModal.off ? ` ${redeemModal.off}` : ''}\n </div>\n )}\n </div>\n </div>\n )}\n\n {!couponCode && (\n <div className=\"flex flex-col gap-[16px] px-[24px] py-[20px]\">\n <p className=\"text-center text-[24px] font-[700] text-[#1d1d1f]\">\n {itemCredits} {pointUnit}\n </p>\n {rulesSection}\n </div>\n )}\n\n {couponCode && (\n <div className=\"flex mt-[16px] flex-col gap-[8px] text-center\">\n <div className=\"flex items-center justify-center gap-[10px]\">\n <span className=\"text-[24px] font-[700]\">{couponCode}</span>\n <button\n className=\"cursor-pointer text-[14px] font-[700] underline disabled:pointer-events-none\"\n disabled={copied}\n onClick={() => copyText(couponCode)}\n >\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n <Text className=\"text-[20px] font-[700]\" html={redeemModal.successTitle} />\n <Text className=\"text-[14px] font-[700] text-[#6d6d6f]\" html={redeemModal.successDesc} />\n <Button\n className={cn(\n 'w-full py-[12px] text-[14px] font-[700] text-white bg-[#080a0f]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n onClick={() => {\n if (redeemModal.successButtonUrl) window.location.href = redeemModal.successButtonUrl\n onClose()\n }}\n >\n {redeemModal.successButton}\n </Button>\n </div>\n )}\n\n {!couponCode && (\n <div className=\"sticky bottom-0 bg-white border-t border-[#e5e5e5] pt-[10px]\">\n <div className=\"flex flex-col gap-[8px] text-center\">\n <Text className=\"block text-[16px] font-[700] leading-[1.3]\" html={redeemModal.confirmTitle} />\n <Button\n className={cn(\n 'w-full py-[12px] text-[14px] font-[700] text-white disabled:opacity-60 bg-[#080a0f]',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n disabled={disabled}\n loading={loading}\n onClick={handleConfirm}\n >\n {redeemModal.confirmButton}\n </Button>\n </div>\n\n {errorInfo && (\n <Text className=\"mt-[8px] text-center text-[14px] font-[700] text-[#ff0000]\" html={errorInfo} />\n )}\n </div>\n )}\n </div>\n )\n}\n"],
5
+ "mappings": "AAyFY,cAAAA,EAcE,QAAAC,MAdF,oBAzFZ,OAAS,eAAAC,EAAa,aAAAC,EAAW,YAAAC,MAAgB,QACjD,OAAS,QAAAC,EAAM,UAAAC,MAAc,wBAC7B,OAAS,WAAAC,EAAS,sBAAAC,EAAoB,cAAcC,MAAU,gBAC9D,OAAS,iBAAAC,MAAqB,iCAC9B,OAAS,mBAAAC,MAAuB,0BAChC,OAAOC,MAAa,yCAEpB,OAAS,kBAAAC,MAAsB,wBAoBhB,SAARC,EAAmC,CAAE,QAAAC,EAAS,KAAAC,EAAM,KAAAC,EAAM,QAAAC,CAAQ,EAAU,CACjF,KAAM,CAAE,UAAAC,EAAW,YAAAC,EAAa,UAAAC,EAAW,UAAAC,EAAW,UAAAC,EAAW,SAAAC,EAAU,OAAAC,EAAQ,WAAAC,CAAW,EAAIV,EAC5F,CAAE,YAAAW,EAAa,WAAAC,CAAW,EAAIX,EAC9BY,EAAYD,GAAc,MAC1B,CAACE,EAAYC,CAAa,EAAI3B,EAAiB,EAC/C,CAAC4B,EAAWC,CAAY,EAAI7B,EAAS,EAAE,EACvC,CAAC8B,EAAUC,CAAW,EAAI/B,EAAS,EAAK,EACxC,CAAE,KAAMgC,EAAU,OAAAC,CAAO,EAAIzB,EAAQ,EACrC,CAAE,MAAA0B,CAAM,EAAI9B,EAAmB,EAC/B+B,EAAU1B,EAAe,SAASyB,CAAK,EAEvC,CAAE,WAAYE,EAAS,QAAAC,CAAQ,EAAI9B,EAAgBe,CAAU,EAE7DgB,EAAgBxC,EAAY,SAAY,CAC5C+B,EAAa,EAAE,EACf,KAAM,CAAE,KAAAU,CAAK,EAAI,MAAMF,EAAQ,CAAE,QAAShB,EAAQ,QAASD,CAAS,CAAC,EACrE,GAAI,CAACmB,EAAM,CACTV,EAAaN,EAAY,WAAW,EACpC,MACF,CACA,GAAIgB,EAAK,MAAM,QACbZ,EAAcY,EAAK,KAAK,WAAW,EACnCpC,EAAQ,CACN,MAAO,WACP,WAAY,YACZ,iBAAkB,CAChB,SAAU,kBACV,YAAa,wBACb,KAAM,wBACR,CACF,CAAC,MACI,CACL,IAAIqC,EAAMjB,EAAY,YAClBgB,EAAK,OAASjC,EAAc,qCAC9BkC,EAAMjB,EAAY,iBAClBQ,EAAY,EAAI,GACPQ,EAAK,OAASjC,EAAc,+BACrCkC,EAAMjB,EAAY,mBAClBQ,EAAY,EAAI,GACPQ,EAAK,OAASjC,EAAc,yBACrCkC,EAAMjB,EAAY,iBAClBQ,EAAY,EAAI,GACPQ,EAAK,OAASjC,EAAc,qBACrCkC,EAAMjB,EAAY,eAClBQ,EAAY,EAAI,GAElBF,EAAaW,CAAG,EAChB1B,IAAUyB,EAAK,IAAI,CACrB,CACF,EAAG,CAACF,EAAShB,EAAQD,EAAUG,EAAaT,CAAO,CAAC,EAEpDf,EAAU,IAAM,CACd4B,EAAc,MAAS,EACvBE,EAAa,EAAE,EACfE,EAAY,EAAK,CACnB,EAAG,CAACX,CAAQ,CAAC,EAEb,MAAMqB,EAAetB,GAAaA,EAAU,OAAS,GACnDvB,EAAC,OAAI,UAAU,wFACb,SAAAA,EAAC,MAAG,UAAU,oCACX,SAAAuB,GAAW,IAAI,CAACuB,EAAMC,IACrB/C,EAAC,MAAG,UAAU,YACZ,SAAAA,EAACK,EAAA,CAAK,KAAMyC,EAAM,UAAU,YAAY,GADXC,CAE/B,CACD,EACH,EACF,EAGF,OACE9C,EAAC,OAAI,UAAU,gBACZ,UAAAoB,GAAW,KACVrB,EAAC,OAAI,UAAU,4BACb,SAAAC,EAAC,OAAI,UAAWQ,EAAG,mCAAoC8B,EAAU,gBAAkB,cAAc,EAC/F,UAAAvC,EAAC,OAAI,IAAKqB,EAAU,IAAK,IAAKA,EAAU,KAAO,GAAI,UAAU,wCAAwC,EACpGC,GACCrB,EAAC,OAAI,UAAU,oFACZ,UAAAqB,EACAK,EAAY,IAAM,IAAIA,EAAY,GAAG,GAAK,IAC7C,GAEJ,EACF,EAGD,CAACG,GACA7B,EAAC,OAAI,UAAU,+CACb,UAAAA,EAAC,KAAE,UAAU,oDACV,UAAAmB,EAAY,IAAES,GACjB,EACCgB,GACH,EAGDf,GACC7B,EAAC,OAAI,UAAU,gDACb,UAAAA,EAAC,OAAI,UAAU,8CACb,UAAAD,EAAC,QAAK,UAAU,yBAA0B,SAAA8B,EAAW,EACrD9B,EAAC,UACC,UAAU,+EACV,SAAUqC,EACV,QAAS,IAAMD,EAASN,CAAU,EAEjC,SAAAO,EAAS,SAAW,OACvB,GACF,EACArC,EAACK,EAAA,CAAK,UAAU,yBAAyB,KAAMsB,EAAY,aAAc,EACzE3B,EAACK,EAAA,CAAK,UAAU,wCAAwC,KAAMsB,EAAY,YAAa,EACvF3B,EAACM,EAAA,CACC,UAAWG,EACT,kEACA8B,EAAU,gBAAkB,cAC9B,EACA,QAAS,IAAM,CACTZ,EAAY,mBAAkB,OAAO,SAAS,KAAOA,EAAY,kBACrEZ,EAAQ,CACV,EAEC,SAAAY,EAAY,cACf,GACF,EAGD,CAACG,GACA7B,EAAC,OAAI,UAAU,+DACb,UAAAA,EAAC,OAAI,UAAU,sCACb,UAAAD,EAACK,EAAA,CAAK,UAAU,6CAA6C,KAAMsB,EAAY,aAAc,EAC7F3B,EAACM,EAAA,CACC,UAAWG,EACT,sFACA8B,EAAU,gBAAkB,cAC9B,EACA,SAAUL,EACV,QAASM,EACT,QAASE,EAER,SAAAf,EAAY,cACf,GACF,EAECK,GACChC,EAACK,EAAA,CAAK,UAAU,6DAA6D,KAAM2B,EAAW,GAElG,GAEJ,CAEJ",
6
+ "names": ["jsx", "jsxs", "useCallback", "useEffect", "useState", "Text", "Button", "gaTrack", "useHeadlessContext", "cn", "AlpcErrorCode", "useRedeemCoupon", "useCopy", "ROUNDED_BRANDS", "RedeemCouponPanel", "onClose", "item", "copy", "onError", "itemTitle", "itemCredits", "itemImage", "itemValue", "itemRules", "redeemId", "userId", "alpcConfig", "redeemModal", "creditUnit", "pointUnit", "couponCode", "setCouponCode", "errorInfo", "setErrorInfo", "disabled", "setDisabled", "copyText", "copied", "brand", "rounded", "loading", "trigger", "handleConfirm", "data", "msg", "rulesSection", "text", "index"]
7
7
  }
@@ -1,7 +1,6 @@
1
1
  import { type ConsumeCreditsopy } from '../../type';
2
2
  type Props = {
3
3
  copy: ConsumeCreditsopy;
4
- onClose: () => void;
5
4
  };
6
- declare function ConsumeCredits({ copy, onClose }: Props): import("react/jsx-runtime").JSX.Element;
5
+ declare function ConsumeCredits({ copy }: Props): import("react/jsx-runtime").JSX.Element;
7
6
  export default ConsumeCredits;
@@ -1,2 +1,2 @@
1
- import{Fragment as K,jsx as n,jsxs as r}from"react/jsx-runtime";import{useMemo as L,useState as I}from"react";import{Picture as S,Button as $}from"@anker-in/headless-ui";import{classNames as R,useProductsByHandles as z,useHeadlessContext as F}from"@anker-in/lib";import{useMemberPopupContext as T}from"../../context/provider";import{useViewStack as V}from"../../context/viewStack";import{useRedeemableList as j}from"./hooks/useRedeemableList";import{useRedeemAndBuy as H}from"./hooks/useRedeemAndBuy";import{ConsumeCreditsItemType as o,MemberPopupPanelType as G}from"../../type";import{numberFormat as v}from"../../../credits/context/utils";import{ROUNDED_BRANDS as q}from"../../../../constants";function J({copy:t,onClose:Q}){const{profile:d,creditInfo:u,openSignUpPopup:B,alpcConfig:c}=T(),{pushView:D}=V(),{brand:_}=F(),g=q.includes(_),[b,N]=I(""),[P,C]=I(null),p=!!d,{redeemableList:y,listLoading:w}=j(c),{trigger:A}=H(c),k=t.list.map(e=>e.product?.handle).filter(Boolean),{data:h}=z({handles:k}),M=L(()=>t.list.map(e=>{const a=y.find(l=>String(l.id)===String(e.redeemId));if(!a)return null;const i=Number(u?.available_credit??0),f=p&&!!d?.activated&&a.consume_credits>i,m=a.is_limited&&(!a.remaining_inventory||a.remaining_inventory<=0);let s,x;return e.type===o.RedeemAndBuy&&e.product&&(s=h?.find(l=>l.handle===e.product.handle),x=s?.variants?.find(l=>l.sku===e.product.sku)??s?.variants?.[0],!s||!x)?null:{...e,alpcData:a,insufficient:f,soldOut:m,product:s,variant:x}}).filter(Boolean),[t.list,y,u,d,p,h]);function O(e){return p?e.soldOut?t.soldOut:t.btnRedeem:t.unlockRewards}function U(e){return e.soldOut||e.insufficient}async function E(e){if(!p){B();return}if(e.type===o.Coupon)D({type:G.RedeemCoupon,props:{itemTitle:e.title,itemCredits:e.alpcData.consume_credits,itemImage:t.imageMapping?.[e.type]?{url:t.imageMapping[e.type].url,alt:e.image?.alt}:e.image,itemValue:e.value,itemOff:t.off,redeemId:Number(e.redeemId),userId:d?.user_id,alpcConfig:c}});else{N(""),C(e.redeemId);try{await A({productVariant:e.variant,redeemId:Number(e.redeemId),userId:d?.user_id})}catch(a){N(a?.message??t.redeemModal.commonError)}finally{C(null)}}}return n(K,{children:r("div",{className:"flex flex-1 flex-col gap-[12px]",children:[r("div",{className:"flex flex-col gap-[8px]",children:[t.title&&n("h2",{className:"text-[24px] font-[700] leading-[1.2] text-[#080a0f]",children:t.title}),t.subtitle&&n("p",{className:"text-[16px] font-[700] leading-snug text-[#4a4c56]",children:t.subtitle})]}),t.insufficientCredits&&u&&r("div",{className:"text-[14px] font-[700] text-[#1d1d1f]",children:[t.insufficientCredits,": ",v(u.available_credit)," ",t.pointUnit]}),b&&n("div",{className:"text-[14px] font-[700] text-[#f84d4f]",children:b}),w?n("div",{className:"flex flex-1 items-center justify-center py-[32px]",children:n("div",{className:"size-[32px] animate-spin rounded-full border-[3px] border-[#080a0f] border-t-transparent"})}):n("div",{className:"flex flex-col",children:M.map((e,a)=>r("div",{className:"relative py-[16px]",children:[a>0&&n("div",{className:"absolute inset-x-0 top-0 h-px bg-[#dadce0]"}),r("div",{className:"flex items-center gap-[12px]",children:[(()=>{const i=e.type===o.RedeemAndBuy,f=t.imageMapping?.[e.type]?.url,m=i?e.variant?.image?.url??e.product?.images?.[0]?.url??e.image?.url:f??e.image?.url,s=i?e.variant?.image?.altText??e.product?.images?.[0]?.alt??e.image?.alt??"":e.image?.alt??"";return m?r("div",{className:R("relative size-[64px] shrink-0 overflow-hidden",g?"rounded-[4px]":"rounded-none"),children:[n(S,{source:m,alt:s,className:"flex size-full items-center justify-center",imgClassName:i?"object-cover":"h-full w-auto object-contain"}),!i&&e.value&&r("div",{className:"absolute bottom-[20px] left-[4px] text-[14px] font-[800] leading-none text-white",children:[e.value," ",t.off]})]}):null})(),r("div",{className:"min-w-0 flex-1",children:[n("div",{className:"text-[16px] font-[700] text-[#1e2024] line-clamp-2",children:e.type===o.RedeemAndBuy&&e.product?.title?e.product.title:e.title}),n("div",{className:"mt-[4px] text-[14px] text-[#666]",children:e.type===o.RedeemAndBuy&&e.price!=null?`${v(e.alpcData.consume_credits)} ${t.pointUnit??""} + $${Number(e.price).toFixed(2)}`:`${v(e.alpcData.consume_credits)} ${t.pointUnit??""}`})]}),r("div",{className:"relative group",children:[n($,{className:R("bg-[#080a0f] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white",g?"rounded-[4px]":"rounded-none"),disabled:U(e),loading:P===e.redeemId,onClick:()=>E(e),children:O(e)}),e.insufficient&&n("div",{className:"pointer-events-none absolute left-[48px] top-full mt-[10px] hidden -translate-x-1/2 group-hover:block",children:r("div",{className:"relative bg-[#6D6D6F] p-[16px] text-[14px] font-[700] text-white shadow md:px-[10px] md:py-[8px]",children:[n("p",{className:"text-pretty tracking-[-0.02em] text-[14px]",children:t.insufficientCredits}),n("div",{className:"absolute -top-[8px] left-[48px] size-[16px] origin-top-left rotate-45 rounded-[2px] bg-[#6D6D6F]"})]})})]})]})]},a))}),t.creditsPage?.url&&n("a",{href:t.creditsPage.url,target:"_blank",rel:"noopener noreferrer",className:"mt-auto self-start text-[14px] font-[700] text-[#080a0f] underline",children:t.creditsPage.label??"Go to Credits Page"})]})})}var ie=J;export{ie as default};
1
+ import{Fragment as ne,jsx as n,jsxs as a}from"react/jsx-runtime";import{useEffect as H,useMemo as W,useState as S}from"react";import{Picture as G,Button as q}from"@anker-in/headless-ui";import{gaTrack as C,classNames as P,useProductsByHandles as J,useHeadlessContext as K}from"@anker-in/lib";import{useMemberPopupContext as Q}from"../../context/provider";import{useViewStack as X}from"../../context/viewStack";import{useRedeemableList as Y}from"./hooks/useRedeemableList";import{useRedeemAndBuy as Z}from"./hooks/useRedeemAndBuy";import{ConsumeCreditsItemType as o,MemberPopupPanelType as D}from"../../type";import{numberFormat as x}from"../../../credits/context/utils";import{ROUNDED_BRANDS as ee}from"../../../../constants";function te({copy:t}){const{profile:i,creditInfo:u,openSignUpPopup:L,alpcConfig:g,isActivateSuccess:A,fetchCreditInfo:U,pageHandle:c}=Q(),{pushView:w}=X(),{brand:E}=K(),v=ee.includes(E),[I,R]=S(""),[M,k]=S(null);H(()=>{i?.user_id&&U(i.user_id)},[]);const l=!!i,{redeemableList:y,listLoading:F}=Y(g),{trigger:$}=Z(g),T=t.list.map(e=>e.product?.handle).filter(Boolean),{data:B}=J({handles:T}),z=W(()=>t.list.map(e=>{const r=y.find(d=>String(d.id)===String(e.redeemId));if(!r)return null;const s=Number(u?.available_credit??0),N=r.consume_credits>s,m=r.is_limited&&(!r.remaining_inventory||r.remaining_inventory<=0),_=e.type===o.RedeemAndBuy||e.type===o.Product,f=B?.find(d=>d.handle===e.product?.handle),h=f?.variants?.find(d=>d.sku===e.product?.sku)??f?.variants?.[0];return _&&(!f||!h||!h?.availableForSale||m)?null:{...e,alpcData:r,insufficient:N,product:f,variant:h}}).filter(Boolean),[t.list,y,u,i,l,B]),p=i?.activated||A;function O(e){return!l||!p?t.unlockRewards:e.soldOut?t.soldOut:t.btnRedeem}function V(e){return!l||!p?!1:e.insufficient}function b(e){C({event:"ga4Event",event_name:"lp_button",event_parameters:{position:"consume_credits",button_name:"redeem",info:"Member Floating Window"}})}async function j(e){if(!l){L();return}if(!p){w({type:D.Activate});return}if(e.type===o.GiftCard||e.type===o.Product){if(t.creditsPage?.url){const r=t.creditsPage.redeemListSectionId??"creditsRedeemList",s=new URL(t.creditsPage.url,window.location.href);s.searchParams.set("section",r),c&&s.searchParams.set("ref",`${c}_consume_credits`),b(e.title),window.open(s.toString(),"_blank","noopener,noreferrer")}return}if(e.type===o.Coupon)b(e.title),w({type:D.RedeemCoupon,props:{itemTitle:e.title,itemCredits:e.alpcData.consume_credits,itemImage:t.imageMapping?.[e.type]?{url:t.imageMapping[e.type].url,alt:e.image?.alt}:e.image,itemValue:e.value,itemRules:e.rules,redeemId:Number(e.redeemId),userId:i?.user_id,alpcConfig:g}});else{R(""),k(e.redeemId),b(e.title);try{await $({productVariant:e.variant,redeemId:Number(e.redeemId),userId:i?.user_id}),C({event:"ga4Event",event_name:"lp_button",event_parameters:{position:"consume_credits",button_name:"redeem_success",info:"Member Floating Window"}})}catch(r){R(r?.message??t.redeemModal.commonError)}finally{k(null)}}}return n(ne,{children:a("div",{className:"flex flex-1 flex-col",children:[a("div",{className:"flex flex-col gap-[8px]",children:[t.title&&n("h2",{className:"text-[24px] font-[700] leading-[1.2] text-[#080a0f]",children:t.title}),t.subtitle&&n("p",{className:"text-[16px] mt-[8px] font-[700] leading-snug text-[#4a4c56]",children:t.subtitle})]}),l&&a("div",{className:P("flex items-center mt-[16px] gap-[12px] bg-[#f5f6f7] p-[16px]",v?"rounded-[8px]":"rounded-none"),children:[a("div",{className:"flex flex-1 flex-col gap-[4px]",children:[n("div",{className:"text-[14px] font-[700] text-[#1e2024]",children:t.balanceLabel??"AnkerCredits Balance"}),a("div",{className:"flex items-end gap-[4px]",children:[n("span",{className:"text-[24px] font-[700] leading-[1.2] text-[#1e2024]",children:x(u?.available_credit||0)}),n("span",{className:"text-[14px] font-[700] leading-[1.4] text-[#1e2024]",children:t.creditUnit??"ankercredits"})]})]}),n("div",{className:"h-full w-px bg-[#dadce0]"}),a("div",{className:"flex flex-1 flex-col gap-[4px]",children:[n("div",{className:"text-[14px] font-[700] text-[#1e2024]",children:t.comingSoonLabel??"Coming Soon"}),a("div",{className:"flex items-end gap-[4px]",children:[n("span",{className:"text-[24px] font-[700] leading-[1.2] text-[#1e2024]",children:x(u?.pending_credit||0)}),n("span",{className:"text-[14px] font-[700] leading-[1.4] text-[#1e2024]",children:t.creditUnit??"ankercredits"})]})]})]}),I&&n("div",{className:"text-[14px] mt-[8px] font-[700] text-[#f84d4f]",children:I}),F?n("div",{className:"flex flex-1 items-center justify-center py-[32px]",children:n("div",{className:"size-[32px] animate-spin rounded-full border-[3px] border-[#080a0f] border-t-transparent"})}):n("div",{className:"flex mt-[16px] flex-col",children:z.map((e,r)=>{const s=!!e.product;return a("div",{className:"relative py-[16px]",children:[r>0&&n("div",{className:"absolute inset-x-0 top-0 h-px bg-[#dadce0]"}),a("div",{className:"flex items-center gap-[12px]",children:[(()=>{const N=t.imageMapping?.[e.type]?.url,m=s?e.variant?.image?.url??e.product?.images?.[0]?.url??e.image?.url:N??e.image?.url,_=s?e.variant?.image?.altText??e.product?.images?.[0]?.alt??e.image?.alt??"":e.image?.alt??"";return m?a("div",{className:P("relative size-[64px] shrink-0 overflow-hidden",v?"rounded-[4px]":"rounded-none"),children:[n(G,{source:m,alt:_,className:"flex size-full items-center justify-center",imgClassName:s?"object-cover":"h-full w-auto object-contain"}),!s&&e.value&&a("div",{className:"absolute bottom-[16px] left-[4px] text-[12px] font-[800] leading-none text-white",children:[e.value," ",t.off]})]}):null})(),a("div",{className:"min-w-0 flex-1",children:[n("div",{className:"text-[16px] font-[700] text-[#1e2024] line-clamp-2",children:s&&e.product?.title?e.product.title:e.title}),n("div",{className:"mt-[4px] text-[14px] text-[#666]",children:s&&e.price!=null?`${x(e.alpcData.consume_credits)} ${t.creditUnit??""} + $${Number(e.price).toFixed(2)}`:`${x(e.alpcData.consume_credits)} ${t.creditUnit??""}`})]}),a("div",{className:"relative group",children:[n(q,{className:P("bg-[#080a0f] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white",v?"rounded-[4px]":"rounded-none"),disabled:V(e),loading:M===e.redeemId,onClick:()=>j(e),children:O(e)}),e.insufficient&&l&&p&&n("div",{className:"pointer-events-none absolute right-0 top-full z-[100] mt-[10px] hidden w-[200px] group-hover:block",children:a("div",{className:"relative bg-[#6D6D6F] p-[16px] text-[14px] font-[700] text-white shadow",children:[n("p",{className:"text-pretty tracking-[-0.02em] text-[14px]",children:t.insufficientCredits}),n("div",{className:"absolute -top-[8px] right-[20px] size-[16px] origin-top-left rotate-45 rounded-[2px] bg-[#6D6D6F]"})]})})]})]})]},r)})}),t.creditsPage?.url&&n("a",{href:(()=>{if(!c)return t.creditsPage.url;try{const e=new URL(t.creditsPage.url,window.location.href);return e.searchParams.set("ref",`${c}_consume_credits`),e.toString()}catch{return t.creditsPage.url}})(),target:"_blank",rel:"noopener noreferrer",className:"mt-auto self-start text-[14px] font-[700] text-[#080a0f] underline",onClick:()=>C({event:"ga4Event",event_name:"lp_button",event_parameters:{position:"consume_credits",button_name:"credits_page_link",info:"Member Floating Window"}}),children:t.creditsPage.label??"Go to Credits Page"})]})})}var me=te;export{me as default};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/components/memberPopup/panels/ConsumeCredits/index.tsx"],
4
- "sourcesContent": ["import { useMemo, useState } from 'react'\nimport { Picture, Button } from '@anker-in/headless-ui'\nimport { classNames as cn, useProductsByHandles, useHeadlessContext } from '@anker-in/lib'\nimport { useMemberPopupContext } from '../../context/provider'\nimport { useViewStack } from '../../context/viewStack'\nimport { useRedeemableList } from './hooks/useRedeemableList'\nimport { useRedeemAndBuy } from './hooks/useRedeemAndBuy'\nimport {\n ConsumeCreditsItemType,\n MemberPopupPanelType,\n type ConsumeCreditsopy,\n type ConsumeCreditsItem,\n} from '../../type'\nimport { numberFormat } from '../../../credits/context/utils'\nimport type { ConsumeCreditRuleResponse } from '../../../credits/context/response'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\ntype EnrichedItem = ConsumeCreditsItem & {\n alpcData: ConsumeCreditRuleResponse\n insufficient: boolean\n soldOut: boolean\n product?: any\n variant?: any\n}\n\ntype Props = {\n copy: ConsumeCreditsopy\n onClose: () => void\n}\n\nfunction ConsumeCredits({ copy, onClose }: Props) {\n const { profile, creditInfo, openSignUpPopup, alpcConfig } = useMemberPopupContext()\n const { pushView } = useViewStack()\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const [redeemAndBuyError, setRedeemAndBuyError] = useState('')\n const [loadingId, setLoadingId] = useState<string | number | null>(null)\n\n const isLogin = !!profile\n const { redeemableList, listLoading } = useRedeemableList(alpcConfig)\n const { trigger: redeemAndBuy } = useRedeemAndBuy(alpcConfig)\n\n const handles = copy.list.map(item => item.product?.handle).filter(Boolean) as string[]\n const { data: products } = useProductsByHandles({ handles })\n\n const list = useMemo(() => {\n return copy.list\n .map(item => {\n const alpcData = redeemableList.find(r => String(r.id) === String(item.redeemId))\n if (!alpcData) return null\n\n const availableCredit = Number(creditInfo?.available_credit ?? 0)\n const insufficient = isLogin && !!profile?.activated && alpcData.consume_credits > availableCredit\n const soldOut = alpcData.is_limited && (!alpcData.remaining_inventory || alpcData.remaining_inventory <= 0)\n\n let product\n let variant\n if (item.type === ConsumeCreditsItemType.RedeemAndBuy && item.product) {\n product = products?.find((p: any) => p.handle === item.product!.handle)\n variant = product?.variants?.find((v: any) => v.sku === item.product!.sku) ?? product?.variants?.[0]\n if (!product || !variant) return null\n }\n\n return { ...item, alpcData, insufficient, soldOut, product, variant }\n })\n .filter(Boolean) as EnrichedItem[]\n }, [copy.list, redeemableList, creditInfo, profile, isLogin, products])\n\n function getButtonLabel(item: (typeof list)[number]) {\n if (!isLogin) return copy.unlockRewards\n if (item.soldOut) return copy.soldOut\n return copy.btnRedeem\n }\n\n function isDisabled(item: (typeof list)[number]) {\n return item.soldOut || item.insufficient\n }\n\n async function handleRedeem(item: (typeof list)[number]) {\n if (!isLogin) {\n openSignUpPopup()\n return\n }\n if (item.type === ConsumeCreditsItemType.Coupon) {\n pushView({\n type: MemberPopupPanelType.RedeemCoupon,\n props: {\n itemTitle: item.title,\n itemCredits: item.alpcData.consume_credits,\n itemImage: copy.imageMapping?.[item.type]\n ? { url: copy.imageMapping[item.type]!.url, alt: item.image?.alt }\n : item.image,\n itemValue: item.value,\n itemOff: copy.off,\n redeemId: Number(item.redeemId),\n userId: profile?.user_id,\n alpcConfig,\n },\n })\n } else {\n setRedeemAndBuyError('')\n setLoadingId(item.redeemId)\n try {\n await redeemAndBuy({\n productVariant: item.variant,\n redeemId: Number(item.redeemId),\n userId: profile?.user_id,\n })\n } catch (e: any) {\n setRedeemAndBuyError(e?.message ?? copy.redeemModal.commonError)\n } finally {\n setLoadingId(null)\n }\n }\n }\n\n return (\n <>\n <div className=\"flex flex-1 flex-col gap-[12px]\">\n <div className=\"flex flex-col gap-[8px]\">\n {copy.title && <h2 className=\"text-[24px] font-[700] leading-[1.2] text-[#080a0f]\">{copy.title}</h2>}\n {copy.subtitle && <p className=\"text-[16px] font-[700] leading-snug text-[#4a4c56]\">{copy.subtitle}</p>}\n </div>\n\n {copy.insufficientCredits && creditInfo && (\n <div className=\"text-[14px] font-[700] text-[#1d1d1f]\">\n {copy.insufficientCredits}: {numberFormat(creditInfo.available_credit)} {copy.pointUnit}\n </div>\n )}\n {redeemAndBuyError && <div className=\"text-[14px] font-[700] text-[#f84d4f]\">{redeemAndBuyError}</div>}\n\n {listLoading ? (\n <div className=\"flex flex-1 items-center justify-center py-[32px]\">\n <div className=\"size-[32px] animate-spin rounded-full border-[3px] border-[#080a0f] border-t-transparent\" />\n </div>\n ) : (\n <div className=\"flex flex-col\">\n {list.map((item, idx) => (\n <div key={idx} className=\"relative py-[16px]\">\n {idx > 0 && <div className=\"absolute inset-x-0 top-0 h-px bg-[#dadce0]\" />}\n <div className=\"flex items-center gap-[12px]\">\n {(() => {\n const isRedeemAndBuy = item.type === ConsumeCreditsItemType.RedeemAndBuy\n const mappedImgUrl = copy.imageMapping?.[item.type]?.url\n const imgUrl = isRedeemAndBuy\n ? (item.variant?.image?.url ?? item.product?.images?.[0]?.url ?? item.image?.url)\n : (mappedImgUrl ?? item.image?.url)\n const imgAlt = isRedeemAndBuy\n ? (item.variant?.image?.altText ?? item.product?.images?.[0]?.alt ?? item.image?.alt ?? '')\n : (item.image?.alt ?? '')\n if (!imgUrl) return null\n return (\n <div className={cn('relative size-[64px] shrink-0 overflow-hidden', rounded ? 'rounded-[4px]' : 'rounded-none')}>\n <Picture\n source={imgUrl}\n alt={imgAlt}\n className=\"flex size-full items-center justify-center\"\n imgClassName={isRedeemAndBuy ? 'object-cover' : 'h-full w-auto object-contain'}\n />\n {!isRedeemAndBuy && item.value && (\n <div className=\"absolute bottom-[20px] left-[4px] text-[14px] font-[800] leading-none text-white\">\n {item.value} {copy.off}\n </div>\n )}\n </div>\n )\n })()}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[16px] font-[700] text-[#1e2024] line-clamp-2\">\n {item.type === ConsumeCreditsItemType.RedeemAndBuy && item.product?.title\n ? item.product.title\n : item.title}\n </div>\n <div className=\"mt-[4px] text-[14px] text-[#666]\">\n {item.type === ConsumeCreditsItemType.RedeemAndBuy && item.price != null\n ? `${numberFormat(item.alpcData.consume_credits)} ${copy.pointUnit ?? ''} + $${Number(item.price).toFixed(2)}`\n : `${numberFormat(item.alpcData.consume_credits)} ${copy.pointUnit ?? ''}`}\n </div>\n </div>\n <div className=\"relative group\">\n <Button\n className={cn('bg-[#080a0f] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white', rounded ? 'rounded-[4px]' : 'rounded-none')}\n disabled={isDisabled(item)}\n loading={loadingId === item.redeemId}\n onClick={() => handleRedeem(item)}\n >\n {getButtonLabel(item)}\n </Button>\n {item.insufficient && (\n <div className=\"pointer-events-none absolute left-[48px] top-full mt-[10px] hidden -translate-x-1/2 group-hover:block\">\n <div className=\"relative bg-[#6D6D6F] p-[16px] text-[14px] font-[700] text-white shadow md:px-[10px] md:py-[8px]\">\n <p className=\"text-pretty tracking-[-0.02em] text-[14px]\">{copy.insufficientCredits}</p>\n <div className=\"absolute -top-[8px] left-[48px] size-[16px] origin-top-left rotate-45 rounded-[2px] bg-[#6D6D6F]\" />\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {copy.creditsPage?.url && (\n <a\n href={copy.creditsPage.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto self-start text-[14px] font-[700] text-[#080a0f] underline\"\n >\n {copy.creditsPage.label ?? 'Go to Credits Page'}\n </a>\n )}\n </div>\n </>\n )\n}\n\nexport default ConsumeCredits\n"],
5
- "mappings": "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",
6
- "names": ["Fragment", "jsx", "jsxs", "useMemo", "useState", "Picture", "Button", "cn", "useProductsByHandles", "useHeadlessContext", "useMemberPopupContext", "useViewStack", "useRedeemableList", "useRedeemAndBuy", "ConsumeCreditsItemType", "MemberPopupPanelType", "numberFormat", "ROUNDED_BRANDS", "ConsumeCredits", "copy", "onClose", "profile", "creditInfo", "openSignUpPopup", "alpcConfig", "pushView", "brand", "rounded", "redeemAndBuyError", "setRedeemAndBuyError", "loadingId", "setLoadingId", "isLogin", "redeemableList", "listLoading", "redeemAndBuy", "handles", "item", "products", "list", "alpcData", "r", "availableCredit", "insufficient", "soldOut", "product", "variant", "p", "v", "getButtonLabel", "isDisabled", "handleRedeem", "e", "idx", "isRedeemAndBuy", "mappedImgUrl", "imgUrl", "imgAlt", "ConsumeCredits_default"]
4
+ "sourcesContent": ["import { useEffect, useMemo, useState } from 'react'\nimport { Picture, Button } from '@anker-in/headless-ui'\nimport { gaTrack, classNames as cn, useProductsByHandles, useHeadlessContext } from '@anker-in/lib'\nimport { useMemberPopupContext } from '../../context/provider'\nimport { useViewStack } from '../../context/viewStack'\nimport { useRedeemableList } from './hooks/useRedeemableList'\nimport { useRedeemAndBuy } from './hooks/useRedeemAndBuy'\nimport {\n ConsumeCreditsItemType,\n MemberPopupPanelType,\n type ConsumeCreditsopy,\n type ConsumeCreditsItem,\n} from '../../type'\nimport { numberFormat } from '../../../credits/context/utils'\nimport type { ConsumeCreditRuleResponse } from '../../../credits/context/response'\nimport { ROUNDED_BRANDS } from '../../../../constants'\n\ntype EnrichedItem = ConsumeCreditsItem & {\n alpcData: ConsumeCreditRuleResponse\n insufficient: boolean\n soldOut: boolean\n disabled: boolean\n product?: any\n variant?: any\n}\n\ntype Props = {\n copy: ConsumeCreditsopy\n}\n\nfunction ConsumeCredits({ copy }: Props) {\n const { profile, creditInfo, openSignUpPopup, alpcConfig, isActivateSuccess, fetchCreditInfo, pageHandle } =\n useMemberPopupContext()\n const { pushView } = useViewStack()\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const [redeemAndBuyError, setRedeemAndBuyError] = useState('')\n const [loadingId, setLoadingId] = useState<string | number | null>(null)\n\n useEffect(() => {\n if (profile?.user_id) fetchCreditInfo(profile.user_id)\n }, [])\n\n const isLogin = !!profile\n const { redeemableList, listLoading } = useRedeemableList(alpcConfig)\n const { trigger: redeemAndBuy } = useRedeemAndBuy(alpcConfig)\n\n const handles = copy.list.map(item => item.product?.handle).filter(Boolean) as string[]\n const { data: products } = useProductsByHandles({ handles })\n\n const list = useMemo(() => {\n return copy.list\n .map(item => {\n const alpcData = redeemableList.find(r => String(r.id) === String(item.redeemId))\n if (!alpcData) return null\n\n const availableCredit = Number(creditInfo?.available_credit ?? 0)\n const insufficient = alpcData.consume_credits > availableCredit\n const alpcSoldOut = alpcData.is_limited && (!alpcData.remaining_inventory || alpcData.remaining_inventory <= 0)\n\n const isPhysicalProduct =\n item.type === ConsumeCreditsItemType.RedeemAndBuy || item.type === ConsumeCreditsItemType.Product\n const product = products?.find((p: any) => p.handle === item.product?.handle)\n const variant = product?.variants?.find((v: any) => v.sku === item.product?.sku) ?? product?.variants?.[0]\n if (isPhysicalProduct && (!product || !variant || !variant?.availableForSale || alpcSoldOut)) {\n return null\n }\n return { ...item, alpcData, insufficient, product, variant }\n })\n .filter(Boolean) as EnrichedItem[]\n }, [copy.list, redeemableList, creditInfo, profile, isLogin, products])\n\n const isActivate = profile?.activated || isActivateSuccess\n\n function getButtonLabel(item: (typeof list)[number]) {\n if (!isLogin || !isActivate) {\n return copy.unlockRewards\n }\n if (item.soldOut) {\n return copy.soldOut\n }\n return copy.btnRedeem\n }\n\n function isDisabled(item: (typeof list)[number]) {\n if (!isLogin || !isActivate) {\n return false\n }\n return item.insufficient\n }\n\n function trackRedeemButton(itemTitle: string) {\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_button',\n event_parameters: {\n position: 'consume_credits',\n button_name: 'redeem',\n info: 'Member Floating Window',\n },\n })\n }\n\n async function handleRedeem(item: (typeof list)[number]) {\n if (!isLogin) {\n openSignUpPopup()\n return\n }\n if (!isActivate) {\n pushView({\n type: MemberPopupPanelType.Activate,\n })\n return\n }\n if (item.type === ConsumeCreditsItemType.GiftCard || item.type === ConsumeCreditsItemType.Product) {\n if (copy.creditsPage?.url) {\n const sectionId = copy.creditsPage.redeemListSectionId ?? 'creditsRedeemList'\n const targetUrl = new URL(copy.creditsPage.url, window.location.href)\n targetUrl.searchParams.set('section', sectionId)\n if (pageHandle) {\n targetUrl.searchParams.set('ref', `${pageHandle}_consume_credits`)\n }\n trackRedeemButton(item.title)\n window.open(targetUrl.toString(), '_blank', 'noopener,noreferrer')\n }\n return\n }\n if (item.type === ConsumeCreditsItemType.Coupon) {\n trackRedeemButton(item.title)\n pushView({\n type: MemberPopupPanelType.RedeemCoupon,\n props: {\n itemTitle: item.title,\n itemCredits: item.alpcData.consume_credits,\n itemImage: copy.imageMapping?.[item.type]\n ? { url: copy.imageMapping[item.type]!.url, alt: item.image?.alt }\n : item.image,\n itemValue: item.value,\n itemRules: item.rules,\n redeemId: Number(item.redeemId),\n userId: profile?.user_id,\n alpcConfig,\n },\n })\n } else {\n setRedeemAndBuyError('')\n setLoadingId(item.redeemId)\n trackRedeemButton(item.title)\n try {\n await redeemAndBuy({\n productVariant: item.variant,\n redeemId: Number(item.redeemId),\n userId: profile?.user_id,\n })\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_button',\n event_parameters: {\n position: 'consume_credits',\n button_name: 'redeem_success',\n info: 'Member Floating Window',\n },\n })\n } catch (e: any) {\n setRedeemAndBuyError(e?.message ?? copy.redeemModal.commonError)\n } finally {\n setLoadingId(null)\n }\n }\n }\n\n return (\n <>\n <div className=\"flex flex-1 flex-col\">\n <div className=\"flex flex-col gap-[8px]\">\n {copy.title && <h2 className=\"text-[24px] font-[700] leading-[1.2] text-[#080a0f]\">{copy.title}</h2>}\n {copy.subtitle && (\n <p className=\"text-[16px] mt-[8px] font-[700] leading-snug text-[#4a4c56]\">{copy.subtitle}</p>\n )}\n </div>\n\n {isLogin && (\n <div\n className={cn(\n 'flex items-center mt-[16px] gap-[12px] bg-[#f5f6f7] p-[16px]',\n rounded ? 'rounded-[8px]' : 'rounded-none'\n )}\n >\n <div className=\"flex flex-1 flex-col gap-[4px]\">\n <div className=\"text-[14px] font-[700] text-[#1e2024]\">{copy.balanceLabel ?? 'AnkerCredits Balance'}</div>\n <div className=\"flex items-end gap-[4px]\">\n <span className=\"text-[24px] font-[700] leading-[1.2] text-[#1e2024]\">\n {numberFormat(creditInfo?.available_credit || 0)}\n </span>\n <span className=\"text-[14px] font-[700] leading-[1.4] text-[#1e2024]\">\n {copy.creditUnit ?? 'ankercredits'}\n </span>\n </div>\n </div>\n <div className=\"h-full w-px bg-[#dadce0]\" />\n <div className=\"flex flex-1 flex-col gap-[4px]\">\n <div className=\"text-[14px] font-[700] text-[#1e2024]\">{copy.comingSoonLabel ?? 'Coming Soon'}</div>\n <div className=\"flex items-end gap-[4px]\">\n <span className=\"text-[24px] font-[700] leading-[1.2] text-[#1e2024]\">\n {numberFormat(creditInfo?.pending_credit || 0)}\n </span>\n <span className=\"text-[14px] font-[700] leading-[1.4] text-[#1e2024]\">\n {copy.creditUnit ?? 'ankercredits'}\n </span>\n </div>\n </div>\n </div>\n )}\n {redeemAndBuyError && <div className=\"text-[14px] mt-[8px] font-[700] text-[#f84d4f]\">{redeemAndBuyError}</div>}\n\n {listLoading ? (\n <div className=\"flex flex-1 items-center justify-center py-[32px]\">\n <div className=\"size-[32px] animate-spin rounded-full border-[3px] border-[#080a0f] border-t-transparent\" />\n </div>\n ) : (\n <div className=\"flex mt-[16px] flex-col\">\n {list.map((item, idx) => {\n const hasProduct = !!item.product\n return (\n <div key={idx} className=\"relative py-[16px]\">\n {idx > 0 && <div className=\"absolute inset-x-0 top-0 h-px bg-[#dadce0]\" />}\n <div className=\"flex items-center gap-[12px]\">\n {(() => {\n const mappedImgUrl = copy.imageMapping?.[item.type]?.url\n const imgUrl = hasProduct\n ? (item.variant?.image?.url ?? item.product?.images?.[0]?.url ?? item.image?.url)\n : (mappedImgUrl ?? item.image?.url)\n const imgAlt = hasProduct\n ? (item.variant?.image?.altText ?? item.product?.images?.[0]?.alt ?? item.image?.alt ?? '')\n : (item.image?.alt ?? '')\n if (!imgUrl) return null\n return (\n <div\n className={cn(\n 'relative size-[64px] shrink-0 overflow-hidden',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n >\n <Picture\n source={imgUrl}\n alt={imgAlt}\n className=\"flex size-full items-center justify-center\"\n imgClassName={hasProduct ? 'object-cover' : 'h-full w-auto object-contain'}\n />\n {!hasProduct && item.value && (\n <div className=\"absolute bottom-[16px] left-[4px] text-[12px] font-[800] leading-none text-white\">\n {item.value} {copy.off}\n </div>\n )}\n </div>\n )\n })()}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[16px] font-[700] text-[#1e2024] line-clamp-2\">\n {hasProduct && item.product?.title ? item.product.title : item.title}\n </div>\n <div className=\"mt-[4px] text-[14px] text-[#666]\">\n {hasProduct && item.price != null\n ? `${numberFormat(item.alpcData.consume_credits)} ${copy.creditUnit ?? ''} + $${Number(item.price).toFixed(2)}`\n : `${numberFormat(item.alpcData.consume_credits)} ${copy.creditUnit ?? ''}`}\n </div>\n </div>\n <div className=\"relative group\">\n <Button\n className={cn(\n 'bg-[#080a0f] px-[20px] pb-[10px] pt-[11px] text-[14px] font-[700] leading-[1.2] text-white',\n rounded ? 'rounded-[4px]' : 'rounded-none'\n )}\n disabled={isDisabled(item)}\n loading={loadingId === item.redeemId}\n onClick={() => handleRedeem(item)}\n >\n {getButtonLabel(item)}\n </Button>\n {item.insufficient && isLogin && isActivate && (\n <div className=\"pointer-events-none absolute right-0 top-full z-[100] mt-[10px] hidden w-[200px] group-hover:block\">\n <div className=\"relative bg-[#6D6D6F] p-[16px] text-[14px] font-[700] text-white shadow\">\n <p className=\"text-pretty tracking-[-0.02em] text-[14px]\">{copy.insufficientCredits}</p>\n <div className=\"absolute -top-[8px] right-[20px] size-[16px] origin-top-left rotate-45 rounded-[2px] bg-[#6D6D6F]\" />\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n )}\n\n {copy.creditsPage?.url && (\n <a\n href={(() => {\n if (!pageHandle) return copy.creditsPage!.url\n try {\n const url = new URL(copy.creditsPage!.url, window.location.href)\n url.searchParams.set('ref', `${pageHandle}_consume_credits`)\n return url.toString()\n } catch {\n return copy.creditsPage!.url\n }\n })()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto self-start text-[14px] font-[700] text-[#080a0f] underline\"\n onClick={() =>\n gaTrack({\n event: 'ga4Event',\n event_name: 'lp_button',\n event_parameters: {\n position: 'consume_credits',\n button_name: 'credits_page_link',\n info: 'Member Floating Window',\n },\n })\n }\n >\n {copy.creditsPage.label ?? 'Go to Credits Page'}\n </a>\n )}\n </div>\n </>\n )\n}\n\nexport default ConsumeCredits\n"],
5
+ "mappings": "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",
6
+ "names": ["Fragment", "jsx", "jsxs", "useEffect", "useMemo", "useState", "Picture", "Button", "gaTrack", "cn", "useProductsByHandles", "useHeadlessContext", "useMemberPopupContext", "useViewStack", "useRedeemableList", "useRedeemAndBuy", "ConsumeCreditsItemType", "MemberPopupPanelType", "numberFormat", "ROUNDED_BRANDS", "ConsumeCredits", "copy", "profile", "creditInfo", "openSignUpPopup", "alpcConfig", "isActivateSuccess", "fetchCreditInfo", "pageHandle", "pushView", "brand", "rounded", "redeemAndBuyError", "setRedeemAndBuyError", "loadingId", "setLoadingId", "isLogin", "redeemableList", "listLoading", "redeemAndBuy", "handles", "item", "products", "list", "alpcData", "r", "availableCredit", "insufficient", "alpcSoldOut", "isPhysicalProduct", "product", "p", "variant", "v", "isActivate", "getButtonLabel", "isDisabled", "trackRedeemButton", "itemTitle", "handleRedeem", "sectionId", "targetUrl", "e", "idx", "hasProduct", "mappedImgUrl", "imgUrl", "imgAlt", "url", "ConsumeCredits_default"]
7
7
  }
@@ -2,7 +2,6 @@ import type { AuthCodeActivateCopy } from '../../type';
2
2
  type Props = {
3
3
  copy: AuthCodeActivateCopy;
4
4
  onClose: () => void;
5
- onSuccess?: () => void;
6
5
  };
7
- export default function ActivatePanel({ copy, onClose, onSuccess }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export default function ActivatePanel({ copy, onClose }: Props): import("react/jsx-runtime").JSX.Element;
8
7
  export {};