@anker-in/campaign-ui 0.5.0-beta.9 → 0.5.0

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 (158) hide show
  1. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js +1 -1
  2. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +3 -3
  3. package/dist/cjs/components/credits/context/hooks/useShippingCountries.d.ts +8 -0
  4. package/dist/cjs/components/credits/context/hooks/useShippingCountries.js +2 -0
  5. package/dist/cjs/components/credits/context/hooks/useShippingCountries.js.map +7 -0
  6. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  7. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  8. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/index.js +1 -1
  9. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/index.js.map +3 -3
  10. package/dist/cjs/components/memberPopup/MemberPopup.d.ts +1 -1
  11. package/dist/cjs/components/memberPopup/MemberPopup.js +1 -1
  12. package/dist/cjs/components/memberPopup/MemberPopup.js.map +3 -3
  13. package/dist/cjs/components/memberPopup/context/provider.d.ts +3 -3
  14. package/dist/cjs/components/memberPopup/context/provider.js +1 -1
  15. package/dist/cjs/components/memberPopup/context/provider.js.map +3 -3
  16. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +1 -4
  17. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js +1 -1
  18. package/dist/cjs/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +3 -3
  19. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +8 -7
  20. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +1 -1
  21. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +3 -3
  22. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.d.ts +1 -2
  23. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js +1 -1
  24. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/index.js.map +3 -3
  25. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +1 -2
  26. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js +1 -1
  27. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +3 -3
  28. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +1 -3
  29. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +1 -1
  30. package/dist/cjs/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +3 -3
  31. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +1 -2
  32. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +1 -1
  33. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +3 -3
  34. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.d.ts +1 -8
  35. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js +1 -1
  36. package/dist/cjs/components/memberPopup/panels/EarnCredits/index.js.map +3 -3
  37. package/dist/cjs/components/memberPopup/panels/Referral/index.js +1 -1
  38. package/dist/cjs/components/memberPopup/panels/Referral/index.js.map +3 -3
  39. package/dist/cjs/components/memberPopup/type.d.ts +19 -2
  40. package/dist/cjs/components/memberPopup/type.js +1 -1
  41. package/dist/cjs/components/memberPopup/type.js.map +1 -1
  42. package/dist/cjs/templates/Credits.js +1 -1
  43. package/dist/cjs/templates/Credits.js.map +3 -3
  44. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js +1 -1
  45. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +3 -3
  46. package/dist/esm/components/credits/context/hooks/useShippingCountries.d.ts +8 -0
  47. package/dist/esm/components/credits/context/hooks/useShippingCountries.js +2 -0
  48. package/dist/esm/components/credits/context/hooks/useShippingCountries.js.map +7 -0
  49. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  50. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  51. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/index.js +1 -1
  52. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/index.js.map +3 -3
  53. package/dist/esm/components/memberPopup/MemberPopup.d.ts +1 -1
  54. package/dist/esm/components/memberPopup/MemberPopup.js +1 -1
  55. package/dist/esm/components/memberPopup/MemberPopup.js.map +3 -3
  56. package/dist/esm/components/memberPopup/context/provider.d.ts +3 -3
  57. package/dist/esm/components/memberPopup/context/provider.js +1 -1
  58. package/dist/esm/components/memberPopup/context/provider.js.map +3 -3
  59. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.d.ts +1 -4
  60. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js +1 -1
  61. package/dist/esm/components/memberPopup/panels/ActivitiesSubscribePanel.js.map +3 -3
  62. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.d.ts +8 -7
  63. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js +1 -1
  64. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.js.map +3 -3
  65. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.d.ts +1 -2
  66. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js +1 -1
  67. package/dist/esm/components/memberPopup/panels/ConsumeCredits/index.js.map +3 -3
  68. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.d.ts +1 -2
  69. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js +1 -1
  70. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivatePanel.js.map +3 -3
  71. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.d.ts +1 -3
  72. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js +1 -1
  73. package/dist/esm/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.js.map +3 -3
  74. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.d.ts +1 -2
  75. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js +1 -1
  76. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.js.map +3 -3
  77. package/dist/esm/components/memberPopup/panels/EarnCredits/index.d.ts +1 -8
  78. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js +1 -1
  79. package/dist/esm/components/memberPopup/panels/EarnCredits/index.js.map +3 -3
  80. package/dist/esm/components/memberPopup/panels/Referral/index.js +1 -1
  81. package/dist/esm/components/memberPopup/panels/Referral/index.js.map +3 -3
  82. package/dist/esm/components/memberPopup/type.d.ts +19 -2
  83. package/dist/esm/components/memberPopup/type.js +1 -1
  84. package/dist/esm/components/memberPopup/type.js.map +1 -1
  85. package/dist/esm/templates/Credits.js +1 -1
  86. package/dist/esm/templates/Credits.js.map +3 -3
  87. package/package.json +2 -1
  88. package/src/components/LiveChatWidget/components/MessageContent/TextBlock.tsx +7 -5
  89. package/src/components/credits/context/hooks/useShippingCountries.ts +60 -0
  90. package/src/components/credits/creditsRedeemList/RedeemProductModal/Address.tsx +2 -2
  91. package/src/components/credits/creditsRedeemList/RedeemProductModal/index.tsx +2 -2
  92. package/src/components/memberPopup/MemberPopup.tsx +166 -178
  93. package/src/components/memberPopup/context/provider.tsx +24 -4
  94. package/src/components/memberPopup/panels/ActivitiesSubscribePanel.tsx +66 -73
  95. package/src/components/memberPopup/panels/ConsumeCredits/RedeemCouponPanel.tsx +38 -55
  96. package/src/components/memberPopup/panels/ConsumeCredits/index.tsx +207 -106
  97. package/src/components/memberPopup/panels/EarnCredits/ActivatePanel.tsx +32 -16
  98. package/src/components/memberPopup/panels/EarnCredits/CompleteProfilePanel.tsx +60 -35
  99. package/src/components/memberPopup/panels/EarnCredits/SubscribeEmailPanel.tsx +32 -22
  100. package/src/components/memberPopup/panels/EarnCredits/index.tsx +55 -48
  101. package/src/components/memberPopup/panels/Referral/index.tsx +40 -22
  102. package/src/components/memberPopup/type.ts +20 -3
  103. package/src/templates/Credits.tsx +25 -0
  104. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
  105. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
  106. package/dist/cjs/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
  107. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
  108. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
  109. package/dist/cjs/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
  110. package/dist/cjs/components/memberPopup/panels/Activity/index.d.ts +0 -7
  111. package/dist/cjs/components/memberPopup/panels/Activity/index.js +0 -2
  112. package/dist/cjs/components/memberPopup/panels/Activity/index.js.map +0 -7
  113. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
  114. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
  115. package/dist/cjs/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
  116. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.d.ts +0 -11
  117. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js +0 -2
  118. package/dist/cjs/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js.map +0 -7
  119. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
  120. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
  121. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
  122. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
  123. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
  124. package/dist/cjs/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
  125. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
  126. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
  127. package/dist/cjs/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
  128. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.d.ts +0 -10
  129. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js +0 -2
  130. package/dist/esm/components/memberPopup/panels/Activity/SubscribeModal.js.map +0 -7
  131. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.d.ts +0 -7
  132. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js +0 -2
  133. package/dist/esm/components/memberPopup/panels/Activity/hooks/useActivitySubscribe.js.map +0 -7
  134. package/dist/esm/components/memberPopup/panels/Activity/index.d.ts +0 -7
  135. package/dist/esm/components/memberPopup/panels/Activity/index.js +0 -2
  136. package/dist/esm/components/memberPopup/panels/Activity/index.js.map +0 -7
  137. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.d.ts +0 -19
  138. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js +0 -2
  139. package/dist/esm/components/memberPopup/panels/ConsumeCredits/RedeemCouponModal.js.map +0 -7
  140. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.d.ts +0 -11
  141. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js +0 -2
  142. package/dist/esm/components/memberPopup/panels/EarnCredits/ActivitiesSubscribePanel.js.map +0 -7
  143. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.d.ts +0 -10
  144. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js +0 -2
  145. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribeModal.js.map +0 -7
  146. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.d.ts +0 -9
  147. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js +0 -2
  148. package/dist/esm/components/memberPopup/panels/EarnCredits/SubscribePanel.js.map +0 -7
  149. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.d.ts +0 -13
  150. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js +0 -2
  151. package/dist/esm/components/memberPopup/panels/Referral/hooks/useReferralDashboard.js.map +0 -7
  152. package/dist/index.d.mts +0 -1775
  153. package/dist/index.d.ts +0 -1775
  154. package/dist/index.js +0 -18542
  155. package/dist/index.js.map +0 -1
  156. package/dist/index.mjs +0 -18514
  157. package/dist/index.mjs.map +0 -1
  158. package/src/components/memberPopup/panels/EarnCredits/CompleteProfileModal.tsx +0 -191
@@ -1,6 +1,6 @@
1
1
  import { useCallback, useEffect, useState } from 'react'
2
2
  import { Button, Checkbox, Picture, Text } from '@anker-in/headless-ui'
3
- import { classNames as cn, useHeadlessContext } from '@anker-in/lib'
3
+ import { gaTrack, classNames as cn, useHeadlessContext } from '@anker-in/lib'
4
4
  import Cookies from 'js-cookie'
5
5
  import { parse } from 'query-string'
6
6
  import { emailValidate } from '../../credits/context/utils'
@@ -9,11 +9,8 @@ import type { SubscribeModalCopy } from '../type'
9
9
  import { ROUNDED_BRANDS } from '../../../constants'
10
10
 
11
11
  type Props = {
12
- onSuccess?: () => void
13
12
  copy: SubscribeModalCopy
14
13
  email?: string
15
- hideForm: boolean
16
- onHideForm: () => void
17
14
  }
18
15
 
19
16
  function getAdCookie() {
@@ -38,18 +35,12 @@ async function getRecaptchaToken(sitekey: string): Promise<string> {
38
35
  }
39
36
  }
40
37
 
41
- export default function ActivitiesSubscribeModal({
42
- onSuccess,
43
- copy,
44
- email: initialEmail,
45
- hideForm,
46
- onHideForm,
47
- }: Props) {
48
- const { alpcConfig } = useMemberPopupContext()
38
+ export default function ActivitiesSubscribeModal({ copy, email: initialEmail }: Props) {
39
+ const { alpcConfig, setIsSubscribeSuccess, pageHandle } = useMemberPopupContext()
49
40
  const { locale } = alpcConfig
50
41
  const { brand: headlessBrand, storeDomain, recaptchaSitekey } = useHeadlessContext()
51
42
  const rounded = ROUNDED_BRANDS.includes(headlessBrand)
52
- const [policy, setPolicy] = useState(false)
43
+ const [policy, setPolicy] = useState(copy.policyDefaultChecked ?? false)
53
44
  const [email, setEmail] = useState(initialEmail ?? '')
54
45
  const [errorMessage, setErrorMessage] = useState('')
55
46
  const [successMessage, setSuccessMessage] = useState('')
@@ -86,89 +77,91 @@ export default function ActivitiesSubscribeModal({
86
77
  }),
87
78
  })
88
79
  const result = await response.json()
89
- if (!result.errors) {
80
+ if (!result?.data?.is_new_subscribe) {
81
+ setSuccessMessage(copy.subscribedLabel ?? "You've already subscribed!")
82
+ } else if (!result?.data?.errors) {
90
83
  setSuccessMessage(copy.successTips ?? 'Subscribed successfully!')
91
- onSuccess?.()
92
- setTimeout(() => {
93
- onHideForm()
94
- setSuccessMessage('')
95
- }, 3000)
84
+ setIsSubscribeSuccess(true)
85
+ gaTrack({
86
+ event: 'ga4Event',
87
+ event_name: 'subscribe',
88
+ event_parameters: {
89
+ page_group: copy.dealsType ?? copy.genre ?? '',
90
+ position: 'sticky',
91
+ info: 'Member Floating Window',
92
+ },
93
+ })
96
94
  } else {
97
- setErrorMessage(result.errors ?? 'Error occurred')
95
+ setErrorMessage(result?.data?.errors ?? 'Error occurred')
98
96
  }
99
97
  } catch {
100
98
  setErrorMessage('Network error')
101
99
  } finally {
102
100
  setLoading(false)
103
101
  }
104
- }, [email, policy, locale, storeDomain, copy, onSuccess, onHideForm])
102
+ }, [email, policy, locale, storeDomain, copy, setIsSubscribeSuccess])
105
103
 
106
104
  return (
107
- <div className="flex flex-col gap-[16px] text-center">
108
- {!hideForm && (
109
- <>
110
- <Text className="text-[22px] font-bold" html={copy.title} />
111
- {copy.desc && <Text className="text-left text-[16px] font-semibold text-[#1f2021]" html={copy.desc} />}
105
+ <div className="flex flex-col">
106
+ <Text className="text-[22px] font-bold leading-[1.2]" html={copy.title} />
107
+ {copy.desc && <Text className="text-[16px] mt-[16px] font-bold text-[#1E2024]" html={copy.desc} />}
112
108
 
113
- <input
114
- className={cn(
115
- 'h-[46px] w-full border px-[14px] text-[16px] outline-none placeholder:text-[#999]',
116
- errorMessage ? 'border-[#f84d4f]' : 'border-[#d8d8d8]',
117
- rounded ? 'rounded-[4px]' : 'rounded-none'
118
- )}
119
- placeholder={copy.placeholder}
120
- value={email}
121
- onChange={e => {
122
- setErrorMessage('')
123
- setEmail(e.target.value.trim())
124
- }}
125
- />
109
+ <input
110
+ className={cn(
111
+ 'h-[46px] w-full border mt-[8px] px-[14px] text-[16px] outline-none placeholder:text-[#999]',
112
+ rounded ? 'rounded-[4px]' : 'rounded-none'
113
+ )}
114
+ placeholder={copy.placeholder}
115
+ value={email}
116
+ onChange={e => {
117
+ setErrorMessage('')
118
+ setEmail(e.target.value.trim())
119
+ }}
120
+ />
126
121
 
127
- <div className="flex w-full items-start gap-[8px]">
128
- <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className="border-[#1d1d1f]" />
129
- <label
130
- className="text-left text-[14px] font-semibold text-[#777] [&_a]:underline"
131
- dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}
132
- />
133
- </div>
122
+ <div className="flex w-full mt-[8px] items-start gap-[8px]">
123
+ <Checkbox checked={policy} onCheckedChange={() => setPolicy(v => !v)} className="border-[#1d1d1f] mt-[2px]" />
124
+ <label
125
+ className="text-left text-[14px] font-bold text-[#4A4C56] [&_a]:underline"
126
+ dangerouslySetInnerHTML={{ __html: copy.policy ?? '' }}
127
+ />
128
+ </div>
134
129
 
135
- <button
136
- className={cn(
137
- 'w-full cursor-pointer bg-[#080a0f] py-[14px] text-[14px] font-[700] text-white disabled:opacity-60',
138
- rounded ? 'rounded-[4px]' : 'rounded-none'
139
- )}
140
- disabled={loading}
141
- onClick={handleSubmit}
142
- >
143
- {copy.buttonLabel ?? 'Subscribe'}
144
- </button>
130
+ <Button className="w-full mt-[16px]" size="base" loading={loading} onClick={handleSubmit}>
131
+ {copy.buttonLabel ?? 'Subscribe'}
132
+ </Button>
145
133
 
146
- {errorMessage && (
147
- <div className="text-left text-[16px] font-semibold text-[#f84d4f]">
148
- <Text html={errorMessage} />
149
- </div>
150
- )}
151
- <div className="text-left text-[16px] font-semibold text-[#52c41a]">
152
- <Text html={successMessage} />
153
- </div>
154
- </>
134
+ {errorMessage && (
135
+ <div className="text-left mt-[4px] text-[16px] font-semibold text-[#f84d4f]">
136
+ <Text html={errorMessage} />
137
+ </div>
155
138
  )}
139
+ <div className="text-left mt-[4px] text-[16px] font-semibold text-[#52c41a]">
140
+ <Text html={successMessage} />
141
+ </div>
156
142
 
157
143
  {copy.promo && (
158
- <div className="flex flex-col text-left">
159
- <div className="flex flex-col gap-[8px]">
160
- {copy.promo?.title && (
161
- <h3 className="text-[20px] font-[700] leading-[1.2] text-[#080a0f]">{copy.promo?.title}</h3>
162
- )}
144
+ <div className="flex mt-[32px] flex-col text-left">
145
+ <div className="flex flex-col">
146
+ {copy.promo?.title && <Text className="text-[18px] font-bold leading-[1.2]" html={copy.promo.title} />}
163
147
  {copy.promo.description && (
164
- <p className="text-[14px] leading-[1.5] text-[#1e2024]">{copy.promo.description}</p>
148
+ <Text className="text-[14px] text-[#080A0F] mt-[8px] font-bold" html={copy.promo.description} />
165
149
  )}
166
150
  {copy.promo.learnMoreLabel && copy.promo.learnMoreUrl && (
167
151
  <a
168
- href={copy.promo.learnMoreUrl}
152
+ href={(() => {
153
+ try {
154
+ if (!pageHandle) return copy.promo!.learnMoreUrl!
155
+ const url = new URL(copy.promo!.learnMoreUrl!, window.location.href)
156
+ url.searchParams.set('ref', `${pageHandle}_subscribe`)
157
+ return url.toString()
158
+ } catch {
159
+ return copy.promo!.learnMoreUrl!
160
+ }
161
+ })()}
169
162
  target="_blank"
170
163
  rel="noopener noreferrer"
171
- className="flex items-center gap-[4px] text-[14px] font-[700] text-[#080a0f] underline"
164
+ className="flex mt-[8px] items-center gap-[4px] text-[14px] font-bold"
172
165
  >
173
166
  {copy.promo.learnMoreLabel}
174
167
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
@@ -1,43 +1,34 @@
1
1
  import { useCallback, useEffect, useState } from 'react'
2
2
  import { Text, Button } from '@anker-in/headless-ui'
3
- import { useHeadlessContext, classNames as cn } from '@anker-in/lib'
3
+ import { gaTrack, useHeadlessContext, classNames as cn } from '@anker-in/lib'
4
4
  import { AlpcErrorCode } from '../../../credits/context/const'
5
5
  import { useRedeemCoupon } from './hooks/useRedeemCoupon'
6
6
  import useCopy from '../../../credits/context/hooks/useCopy'
7
- import type { RedeemCouponModalCopy, AlpcConfig } from '../../type'
7
+ import type { ConsumeCreditsopy, AlpcConfig } from '../../type'
8
8
  import { ROUNDED_BRANDS } from '../../../../constants'
9
9
 
10
- type Props = {
11
- onClose: () => void
10
+ type RedeemCouponItem = {
12
11
  itemTitle: string
13
12
  itemCredits: number
14
13
  itemImage?: { url: string; alt?: string }
15
14
  itemValue?: string
16
- itemOff?: string
17
15
  itemRules?: string[]
18
16
  redeemId: number
19
17
  userId?: string
20
- copy: RedeemCouponModalCopy
21
- pointUnit?: string
22
18
  alpcConfig: AlpcConfig
19
+ }
20
+
21
+ type Props = {
22
+ onClose: () => void
23
+ item: RedeemCouponItem
24
+ copy: ConsumeCreditsopy
23
25
  onError?: (code: number) => void
24
26
  }
25
27
 
26
- export default function RedeemCouponPanel({
27
- onClose,
28
- itemTitle,
29
- itemCredits,
30
- itemImage,
31
- itemValue,
32
- itemOff,
33
- itemRules,
34
- redeemId,
35
- userId,
36
- copy,
37
- pointUnit = 'pts',
38
- alpcConfig,
39
- onError,
40
- }: Props) {
28
+ export default function RedeemCouponPanel({ onClose, item, copy, onError }: Props) {
29
+ const { itemTitle, itemCredits, itemImage, itemValue, itemRules, redeemId, userId, alpcConfig } = item
30
+ const { redeemModal, creditUnit } = copy
31
+ const pointUnit = creditUnit ?? 'pts'
41
32
  const [couponCode, setCouponCode] = useState<string>()
42
33
  const [errorInfo, setErrorInfo] = useState('')
43
34
  const [disabled, setDisabled] = useState(false)
@@ -51,30 +42,39 @@ export default function RedeemCouponPanel({
51
42
  setErrorInfo('')
52
43
  const { data } = await trigger({ user_id: userId, rule_id: redeemId })
53
44
  if (!data) {
54
- setErrorInfo(copy.commonError)
45
+ setErrorInfo(redeemModal.commonError)
55
46
  return
56
47
  }
57
48
  if (data.data?.success) {
58
49
  setCouponCode(data.data.coupon_code)
50
+ gaTrack({
51
+ event: 'ga4Event',
52
+ event_name: 'lp_button',
53
+ event_parameters: {
54
+ position: 'consume_credits',
55
+ button_name: 'redeem_coupon_success',
56
+ info: 'Member Floating Window',
57
+ },
58
+ })
59
59
  } else {
60
- let msg = copy.commonError
60
+ let msg = redeemModal.commonError
61
61
  if (data.code === AlpcErrorCode.CodeLpcShopifyCouponRuleRedeemLimit) {
62
- msg = copy.redeemLimitError
62
+ msg = redeemModal.redeemLimitError
63
63
  setDisabled(true)
64
64
  } else if (data.code === AlpcErrorCode.CodeLpcRuleInventoryNotEnough) {
65
- msg = copy.inventoryNotEnough
65
+ msg = redeemModal.inventoryNotEnough
66
66
  setDisabled(true)
67
67
  } else if (data.code === AlpcErrorCode.CodeLpcNotEnoughCredits) {
68
- msg = copy.creditsNotEnough
68
+ msg = redeemModal.creditsNotEnough
69
69
  setDisabled(true)
70
70
  } else if (data.code === AlpcErrorCode.CodeCrossSiteError) {
71
- msg = copy.crossSiteError
71
+ msg = redeemModal.crossSiteError
72
72
  setDisabled(true)
73
73
  }
74
74
  setErrorInfo(msg)
75
75
  onError?.(data.code)
76
76
  }
77
- }, [trigger, userId, redeemId, copy, onError])
77
+ }, [trigger, userId, redeemId, redeemModal, onError])
78
78
 
79
79
  useEffect(() => {
80
80
  setCouponCode(undefined)
@@ -103,7 +103,7 @@ export default function RedeemCouponPanel({
103
103
  {itemValue && (
104
104
  <div className="absolute bottom-[20px] left-[20px] text-[32px] font-[800] leading-none text-white">
105
105
  {itemValue}
106
- {itemOff ? ` ${itemOff}` : ''}
106
+ {redeemModal.off ? ` ${redeemModal.off}` : ''}
107
107
  </div>
108
108
  )}
109
109
  </div>
@@ -128,22 +128,13 @@ export default function RedeemCouponPanel({
128
128
  disabled={copied}
129
129
  onClick={() => copyText(couponCode)}
130
130
  >
131
- {copied ? 'Copied' : 'Copy'}
131
+ {copied ? (redeemModal.copiedLabel ?? 'Copied') : (redeemModal.copyLabel ?? 'Copy')}
132
132
  </button>
133
133
  </div>
134
- <Text className="text-[20px] font-[700]" html={copy.successTitle} />
135
- <Text className="text-[14px] font-[700] text-[#6d6d6f]" html={copy.successDesc} />
136
- <Button
137
- className={cn(
138
- 'w-full py-[12px] text-[14px] font-[700] text-white bg-[#080a0f]',
139
- rounded ? 'rounded-[4px]' : 'rounded-none'
140
- )}
141
- onClick={() => {
142
- if (copy.successButtonUrl) window.location.href = copy.successButtonUrl
143
- onClose()
144
- }}
145
- >
146
- {copy.successButton}
134
+ <Text className="text-[20px] font-[700]" html={redeemModal.successTitle} />
135
+ <Text className="text-[14px] font-[700] text-[#6d6d6f]" html={redeemModal.successDesc} />
136
+ <Button as="a" href={redeemModal.successButtonUrl} className="w-full">
137
+ {redeemModal.successButton}
147
138
  </Button>
148
139
  </div>
149
140
  )}
@@ -151,17 +142,9 @@ export default function RedeemCouponPanel({
151
142
  {!couponCode && (
152
143
  <div className="sticky bottom-0 bg-white border-t border-[#e5e5e5] pt-[10px]">
153
144
  <div className="flex flex-col gap-[8px] text-center">
154
- <Text className="block text-[16px] font-[700] leading-[1.3]" html={copy.confirmTitle} />
155
- <Button
156
- className={cn(
157
- 'w-full py-[12px] text-[14px] font-[700] text-white disabled:opacity-60 bg-[#080a0f]',
158
- rounded ? 'rounded-[4px]' : 'rounded-none'
159
- )}
160
- disabled={disabled}
161
- loading={loading}
162
- onClick={handleConfirm}
163
- >
164
- {copy.confirmButton}
145
+ <Text className="block text-[16px] font-[700] leading-[1.3]" html={redeemModal.confirmTitle} />
146
+ <Button className="w-full" disabled={disabled} loading={loading} onClick={handleConfirm}>
147
+ {redeemModal.confirmButton}
165
148
  </Button>
166
149
  </div>
167
150