@anker-in/campaign-ui 0.2.1 → 0.2.2-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/credits/context/hooks/useActivities.js +1 -1
- package/dist/cjs/components/credits/context/hooks/useActivities.js.map +3 -3
- package/dist/cjs/components/credits/context/hooks/useAlpcFetch.js +1 -1
- package/dist/cjs/components/credits/context/hooks/useAlpcFetch.js.map +3 -3
- package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.d.ts +7 -0
- package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js +2 -0
- package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js.map +7 -0
- package/dist/cjs/components/credits/context/hooks/useMyRewards.js +1 -1
- package/dist/cjs/components/credits/context/hooks/useMyRewards.js.map +3 -3
- package/dist/cjs/components/credits/context/hooks/useRedeemCoupon.js +1 -1
- package/dist/cjs/components/credits/context/hooks/useRedeemCoupon.js.map +3 -3
- package/dist/cjs/components/credits/context/hooks/useRedeemProduct.js +1 -1
- package/dist/cjs/components/credits/context/hooks/useRedeemProduct.js.map +3 -3
- package/dist/cjs/components/credits/context/hooks/useRedeemableList.js +1 -1
- package/dist/cjs/components/credits/context/hooks/useRedeemableList.js.map +3 -3
- package/dist/cjs/components/credits/context/memberPriceConst.d.ts +10 -0
- package/dist/cjs/components/credits/context/memberPriceConst.js +2 -0
- package/dist/cjs/components/credits/context/memberPriceConst.js.map +7 -0
- package/dist/cjs/components/credits/context/memberPriceTypes.d.ts +46 -0
- package/dist/cjs/components/credits/context/memberPriceTypes.js +2 -0
- package/dist/cjs/components/credits/context/memberPriceTypes.js.map +7 -0
- package/dist/cjs/components/credits/context/provider.d.ts +4 -1
- package/dist/cjs/components/credits/context/provider.js +1 -1
- package/dist/cjs/components/credits/context/provider.js.map +3 -3
- package/dist/cjs/components/credits/context/utils/atobID.d.ts +1 -0
- package/dist/cjs/components/credits/context/utils/atobID.js +2 -0
- package/dist/cjs/components/credits/context/utils/atobID.js.map +7 -0
- package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.d.ts +5 -0
- package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.js +2 -0
- package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.js.map +7 -0
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.d.ts +8 -0
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js +2 -0
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js.map +7 -0
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +9 -0
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +2 -0
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +7 -0
- package/dist/cjs/components/credits/context/utils/variantGetCoupon.d.ts +6 -0
- package/dist/cjs/components/credits/context/utils/variantGetCoupon.js +2 -0
- package/dist/cjs/components/credits/context/utils/variantGetCoupon.js.map +7 -0
- package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.d.ts +4 -0
- package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +2 -0
- package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +7 -0
- package/dist/cjs/components/credits/creditsAnkersolixTask/index.d.ts +2 -0
- package/dist/cjs/components/credits/creditsAnkersolixTask/index.js +2 -0
- package/dist/cjs/components/credits/creditsAnkersolixTask/index.js.map +7 -0
- package/dist/cjs/components/credits/creditsAnkersolixTask/type.d.ts +1 -0
- package/dist/cjs/components/credits/creditsAnkersolixTask/type.js +2 -0
- package/dist/cjs/components/credits/creditsAnkersolixTask/type.js.map +7 -0
- package/dist/cjs/components/credits/creditsBanner/index.d.ts +2 -1
- package/dist/cjs/components/credits/creditsBanner/index.js +1 -1
- package/dist/cjs/components/credits/creditsBanner/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsBenefits/benefitItem.d.ts +4 -1
- package/dist/cjs/components/credits/creditsBenefits/benefitItem.js +2 -2
- package/dist/cjs/components/credits/creditsBenefits/benefitItem.js.map +4 -4
- package/dist/cjs/components/credits/creditsBenefits/iconInfo.js +1 -1
- package/dist/cjs/components/credits/creditsBenefits/iconInfo.js.map +2 -2
- package/dist/cjs/components/credits/creditsBenefits/index.d.ts +6 -2
- package/dist/cjs/components/credits/creditsBenefits/index.js +3 -3
- package/dist/cjs/components/credits/creditsBenefits/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsCash/CreditsCash.d.ts +2 -1
- package/dist/cjs/components/credits/creditsCash/CreditsCash.js +1 -1
- package/dist/cjs/components/credits/creditsCash/CreditsCash.js.map +3 -3
- package/dist/cjs/components/credits/creditsCash/RedeemableItem.js +1 -1
- package/dist/cjs/components/credits/creditsCash/RedeemableItem.js.map +2 -2
- package/dist/cjs/components/credits/creditsFaq/index.d.ts +2 -1
- package/dist/cjs/components/credits/creditsFaq/index.js +1 -1
- package/dist/cjs/components/credits/creditsFaq/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsInfoCard/index.d.ts +2 -1
- package/dist/cjs/components/credits/creditsInfoCard/index.js +1 -1
- package/dist/cjs/components/credits/creditsInfoCard/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.d.ts +5 -0
- package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js +2 -0
- package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +7 -0
- package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.d.ts +7 -0
- package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js +2 -0
- package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js.map +7 -0
- package/dist/cjs/components/credits/creditsMemberPrice/index.d.ts +2 -0
- package/dist/cjs/components/credits/creditsMemberPrice/index.js +2 -0
- package/dist/cjs/components/credits/creditsMemberPrice/index.js.map +7 -0
- package/dist/cjs/components/credits/creditsMemberPrice/type.d.ts +64 -0
- package/dist/cjs/components/credits/creditsMemberPrice/type.js +2 -0
- package/dist/cjs/components/credits/creditsMemberPrice/type.js.map +7 -0
- package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.d.ts +4 -0
- package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js +2 -0
- package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js.map +7 -0
- package/dist/cjs/components/credits/creditsNavigation/index.d.ts +2 -0
- package/dist/cjs/components/credits/creditsNavigation/index.js +2 -0
- package/dist/cjs/components/credits/creditsNavigation/index.js.map +7 -0
- package/dist/cjs/components/credits/creditsNavigation/type.d.ts +7 -0
- package/dist/cjs/components/credits/creditsNavigation/type.js +2 -0
- package/dist/cjs/components/credits/creditsNavigation/type.js.map +7 -0
- package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.d.ts +2 -1
- package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Error.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Error.js.map +2 -2
- package/dist/cjs/components/credits/creditsRedeemList/type.d.ts +1 -0
- package/dist/cjs/components/credits/creditsRedeemList/type.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/type.js.map +1 -1
- package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.d.ts +3 -1
- package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
- package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
- package/dist/cjs/templates/credits.d.ts +15 -1
- package/dist/cjs/templates/credits.js +2 -2
- package/dist/cjs/templates/credits.js.map +4 -4
- package/dist/cjs/templates/index.d.ts +1 -1
- package/dist/cjs/templates/index.js +1 -1
- package/dist/cjs/templates/index.js.map +1 -1
- package/dist/esm/components/credits/context/hooks/useActivities.js +1 -1
- package/dist/esm/components/credits/context/hooks/useActivities.js.map +3 -3
- package/dist/esm/components/credits/context/hooks/useAlpcFetch.js +1 -1
- package/dist/esm/components/credits/context/hooks/useAlpcFetch.js.map +3 -3
- package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.d.ts +7 -0
- package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js +2 -0
- package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js.map +7 -0
- package/dist/esm/components/credits/context/hooks/useMyRewards.js +1 -1
- package/dist/esm/components/credits/context/hooks/useMyRewards.js.map +3 -3
- package/dist/esm/components/credits/context/hooks/useRedeemCoupon.js +1 -1
- package/dist/esm/components/credits/context/hooks/useRedeemCoupon.js.map +3 -3
- package/dist/esm/components/credits/context/hooks/useRedeemProduct.js +1 -1
- package/dist/esm/components/credits/context/hooks/useRedeemProduct.js.map +3 -3
- package/dist/esm/components/credits/context/hooks/useRedeemableList.js +1 -1
- package/dist/esm/components/credits/context/hooks/useRedeemableList.js.map +3 -3
- package/dist/esm/components/credits/context/memberPriceConst.d.ts +10 -0
- package/dist/esm/components/credits/context/memberPriceConst.js +2 -0
- package/dist/esm/components/credits/context/memberPriceConst.js.map +7 -0
- package/dist/esm/components/credits/context/memberPriceTypes.d.ts +46 -0
- package/dist/esm/components/credits/context/memberPriceTypes.js +1 -0
- package/dist/esm/components/credits/context/memberPriceTypes.js.map +7 -0
- package/dist/esm/components/credits/context/provider.d.ts +4 -1
- package/dist/esm/components/credits/context/provider.js +1 -1
- package/dist/esm/components/credits/context/provider.js.map +3 -3
- package/dist/esm/components/credits/context/utils/atobID.d.ts +1 -0
- package/dist/esm/components/credits/context/utils/atobID.js +2 -0
- package/dist/esm/components/credits/context/utils/atobID.js.map +7 -0
- package/dist/esm/components/credits/context/utils/functionDiscountCalculate.d.ts +5 -0
- package/dist/esm/components/credits/context/utils/functionDiscountCalculate.js +2 -0
- package/dist/esm/components/credits/context/utils/functionDiscountCalculate.js.map +7 -0
- package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.d.ts +8 -0
- package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js +2 -0
- package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js.map +7 -0
- package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +9 -0
- package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +2 -0
- package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +7 -0
- package/dist/esm/components/credits/context/utils/variantGetCoupon.d.ts +6 -0
- package/dist/esm/components/credits/context/utils/variantGetCoupon.js +2 -0
- package/dist/esm/components/credits/context/utils/variantGetCoupon.js.map +7 -0
- package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.d.ts +4 -0
- package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +2 -0
- package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +7 -0
- package/dist/esm/components/credits/creditsAnkersolixTask/index.d.ts +2 -0
- package/dist/esm/components/credits/creditsAnkersolixTask/index.js +2 -0
- package/dist/esm/components/credits/creditsAnkersolixTask/index.js.map +7 -0
- package/dist/esm/components/credits/creditsAnkersolixTask/type.d.ts +1 -0
- package/dist/esm/components/credits/creditsAnkersolixTask/type.js +2 -0
- package/dist/esm/components/credits/creditsAnkersolixTask/type.js.map +7 -0
- package/dist/esm/components/credits/creditsBanner/index.d.ts +2 -1
- package/dist/esm/components/credits/creditsBanner/index.js +1 -1
- package/dist/esm/components/credits/creditsBanner/index.js.map +3 -3
- package/dist/esm/components/credits/creditsBenefits/benefitItem.d.ts +4 -1
- package/dist/esm/components/credits/creditsBenefits/benefitItem.js +2 -2
- package/dist/esm/components/credits/creditsBenefits/benefitItem.js.map +4 -4
- package/dist/esm/components/credits/creditsBenefits/iconInfo.js +1 -1
- package/dist/esm/components/credits/creditsBenefits/iconInfo.js.map +2 -2
- package/dist/esm/components/credits/creditsBenefits/index.d.ts +6 -2
- package/dist/esm/components/credits/creditsBenefits/index.js +3 -3
- package/dist/esm/components/credits/creditsBenefits/index.js.map +3 -3
- package/dist/esm/components/credits/creditsCash/CreditsCash.d.ts +2 -1
- package/dist/esm/components/credits/creditsCash/CreditsCash.js +1 -1
- package/dist/esm/components/credits/creditsCash/CreditsCash.js.map +3 -3
- package/dist/esm/components/credits/creditsCash/RedeemableItem.js +1 -1
- package/dist/esm/components/credits/creditsCash/RedeemableItem.js.map +2 -2
- package/dist/esm/components/credits/creditsFaq/index.d.ts +2 -1
- package/dist/esm/components/credits/creditsFaq/index.js +1 -1
- package/dist/esm/components/credits/creditsFaq/index.js.map +3 -3
- package/dist/esm/components/credits/creditsInfoCard/index.d.ts +2 -1
- package/dist/esm/components/credits/creditsInfoCard/index.js +1 -1
- package/dist/esm/components/credits/creditsInfoCard/index.js.map +3 -3
- package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.d.ts +5 -0
- package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js +2 -0
- package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +7 -0
- package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.d.ts +7 -0
- package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js +2 -0
- package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js.map +7 -0
- package/dist/esm/components/credits/creditsMemberPrice/index.d.ts +2 -0
- package/dist/esm/components/credits/creditsMemberPrice/index.js +2 -0
- package/dist/esm/components/credits/creditsMemberPrice/index.js.map +7 -0
- package/dist/esm/components/credits/creditsMemberPrice/type.d.ts +64 -0
- package/dist/esm/components/credits/creditsMemberPrice/type.js +1 -0
- package/dist/esm/components/credits/creditsMemberPrice/type.js.map +7 -0
- package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.d.ts +4 -0
- package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js +2 -0
- package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js.map +7 -0
- package/dist/esm/components/credits/creditsNavigation/index.d.ts +2 -0
- package/dist/esm/components/credits/creditsNavigation/index.js +2 -0
- package/dist/esm/components/credits/creditsNavigation/index.js.map +7 -0
- package/dist/esm/components/credits/creditsNavigation/type.d.ts +7 -0
- package/dist/esm/components/credits/creditsNavigation/type.js +1 -0
- package/dist/esm/components/credits/creditsNavigation/type.js.map +7 -0
- package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.d.ts +2 -1
- package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Error.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Error.js.map +2 -2
- package/dist/esm/components/credits/creditsRedeemList/type.d.ts +1 -0
- package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.d.ts +3 -1
- package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
- package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
- package/dist/esm/templates/credits.d.ts +15 -1
- package/dist/esm/templates/credits.js +2 -2
- package/dist/esm/templates/credits.js.map +4 -4
- package/dist/esm/templates/index.d.ts +1 -1
- package/dist/esm/templates/index.js +1 -1
- package/dist/esm/templates/index.js.map +1 -1
- package/dist/index.js +40660 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +40648 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +21 -20
- package/src/components/credits/context/hooks/useActivities.ts +3 -2
- package/src/components/credits/context/hooks/useAlpcFetch.ts +8 -4
- package/src/components/credits/context/hooks/useFunctionMemberPrice.ts +33 -0
- package/src/components/credits/context/hooks/useMyRewards.ts +3 -2
- package/src/components/credits/context/hooks/useRedeemCoupon.ts +4 -1
- package/src/components/credits/context/hooks/useRedeemProduct.ts +4 -1
- package/src/components/credits/context/hooks/useRedeemableList.ts +3 -3
- package/src/components/credits/context/memberPriceConst.ts +13 -0
- package/src/components/credits/context/memberPriceTypes.ts +54 -0
- package/src/components/credits/context/provider.tsx +9 -0
- package/src/components/credits/context/utils/atobID.ts +8 -0
- package/src/components/credits/context/utils/functionDiscountCalculate.ts +57 -0
- package/src/components/credits/context/utils/getFunctionMemberPrice.ts +135 -0
- package/src/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.ts +51 -0
- package/src/components/credits/context/utils/variantGetCoupon.ts +34 -0
- package/src/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.tsx +270 -0
- package/src/components/credits/creditsAnkersolixTask/index.ts +2 -0
- package/src/components/credits/creditsAnkersolixTask/type.ts +7 -0
- package/src/components/credits/creditsBanner/index.tsx +2 -2
- package/src/components/credits/creditsBenefits/{benefitItem.tsx → BenefitItem.tsx} +28 -9
- package/src/components/credits/creditsBenefits/index.tsx +12 -3
- package/src/components/credits/creditsCash/CreditsCash.tsx +5 -3
- package/src/components/credits/creditsCash/RedeemableItem.tsx +19 -15
- package/src/components/credits/creditsFaq/index.tsx +2 -2
- package/src/components/credits/creditsInfoCard/index.tsx +2 -2
- package/src/components/credits/creditsMemberPrice/CreditsMemberPrice.tsx +389 -0
- package/src/components/credits/creditsMemberPrice/MemberPriceItem.tsx +158 -0
- package/src/components/credits/creditsMemberPrice/index.ts +2 -0
- package/src/components/credits/creditsMemberPrice/type.ts +75 -0
- package/src/components/credits/creditsNavigation/CreditsNavigation.tsx +123 -0
- package/src/components/credits/creditsNavigation/index.ts +2 -0
- package/src/components/credits/creditsNavigation/type.ts +10 -0
- package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +17 -3
- package/src/components/credits/creditsRedeemList/RedeemProductModal/Error.tsx +1 -1
- package/src/components/credits/creditsRedeemList/type.ts +1 -0
- package/src/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.tsx +2 -2
- package/src/templates/{credits.tsx → Credits.tsx} +38 -7
- package/src/templates/index.ts +1 -1
- package/dist/cjs/components/credits/const.d.ts +0 -1
- package/dist/cjs/components/credits/const.js +0 -2
- package/dist/cjs/components/credits/const.js.map +0 -7
- package/dist/esm/components/credits/const.d.ts +0 -1
- package/dist/esm/components/credits/const.js +0 -2
- package/dist/esm/components/credits/const.js.map +0 -7
- /package/src/components/credits/creditsBenefits/{iconInfo.tsx → IconInfo.tsx} +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { useEffect, useState, useRef, useCallback } from 'react'
|
|
2
|
+
import { classNames as cn } from '@anker-in/lib'
|
|
3
|
+
import { Container } from '@anker-in/headless-ui'
|
|
4
|
+
import { CreditsNavigationCopy } from './type'
|
|
5
|
+
|
|
6
|
+
export const CreditsNavigation = ({ copy }: { copy: CreditsNavigationCopy }) => {
|
|
7
|
+
const [activeId, setActiveId] = useState<string>('')
|
|
8
|
+
const observerRef = useRef<IntersectionObserver | null>(null)
|
|
9
|
+
|
|
10
|
+
// 平滑滚动到目标模块
|
|
11
|
+
const scrollToSection = (targetId: string) => {
|
|
12
|
+
const element = document.getElementById(targetId)
|
|
13
|
+
if (element) {
|
|
14
|
+
const navHeight = 56 // 导航栏高度
|
|
15
|
+
const elementPosition = element.getBoundingClientRect().top + window.pageYOffset
|
|
16
|
+
const offsetPosition = elementPosition - navHeight
|
|
17
|
+
|
|
18
|
+
window.scrollTo({
|
|
19
|
+
top: offsetPosition,
|
|
20
|
+
behavior: 'smooth',
|
|
21
|
+
})
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 使用 Intersection Observer 监听模块可见性
|
|
26
|
+
const setupObserver = useCallback(() => {
|
|
27
|
+
// 清理之前的 observer
|
|
28
|
+
if (observerRef.current) {
|
|
29
|
+
observerRef.current.disconnect()
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 计算每个元素在视口中的可见面积
|
|
33
|
+
const visibilityMap = new Map<string, number>()
|
|
34
|
+
|
|
35
|
+
const observerCallback = (entries: IntersectionObserverEntry[]) => {
|
|
36
|
+
entries.forEach(entry => {
|
|
37
|
+
const id = entry.target.id
|
|
38
|
+
if (!id) return
|
|
39
|
+
|
|
40
|
+
// 计算可见面积
|
|
41
|
+
const visibleHeight = entry.intersectionRect.height
|
|
42
|
+
const visibleWidth = entry.intersectionRect.width
|
|
43
|
+
const visibleArea = visibleHeight * visibleWidth
|
|
44
|
+
|
|
45
|
+
visibilityMap.set(id, entry.isIntersecting ? visibleArea : 0)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
// 找出可见面积最大的元素
|
|
49
|
+
let maxArea = 0
|
|
50
|
+
let maxId = ''
|
|
51
|
+
|
|
52
|
+
visibilityMap.forEach((area, id) => {
|
|
53
|
+
if (area > maxArea) {
|
|
54
|
+
maxArea = area
|
|
55
|
+
maxId = id
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
if (maxId && maxId !== activeId) {
|
|
60
|
+
setActiveId(maxId)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 创建新的 observer
|
|
65
|
+
observerRef.current = new IntersectionObserver(observerCallback, {
|
|
66
|
+
threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1],
|
|
67
|
+
rootMargin: '-56px 0px 0px 0px', // 考虑导航栏高度
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// 观察所有目标元素
|
|
71
|
+
copy.items.forEach(item => {
|
|
72
|
+
const element = document.getElementById(item.targetId)
|
|
73
|
+
if (element && observerRef.current) {
|
|
74
|
+
observerRef.current.observe(element)
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
}, [copy.items, activeId])
|
|
78
|
+
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
setupObserver()
|
|
81
|
+
|
|
82
|
+
return () => {
|
|
83
|
+
if (observerRef.current) {
|
|
84
|
+
observerRef.current.disconnect()
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}, [setupObserver])
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<nav className={cn('sticky top-0 z-50 bg-white')}>
|
|
91
|
+
<Container asChild>
|
|
92
|
+
<div
|
|
93
|
+
className={cn(
|
|
94
|
+
'md:overflow-x-auto md:overflow-y-hidden md:-mx-[16px] md:px-[16px]',
|
|
95
|
+
'md:scrollbar-hide md:[&::-webkit-scrollbar]:hidden md:[-ms-overflow-style:none] md:[scrollbar-width:none]'
|
|
96
|
+
)}
|
|
97
|
+
>
|
|
98
|
+
<ul className={cn('flex items-end gap-[24px] pt-[16px] md:gap-[16px] md:pr-[16px]')}>
|
|
99
|
+
{copy.items.map((item, index) => {
|
|
100
|
+
const isActive = activeId === item.targetId
|
|
101
|
+
return (
|
|
102
|
+
<li key={index} className={cn('md:flex-shrink-0')}>
|
|
103
|
+
<button
|
|
104
|
+
onClick={() => scrollToSection(item.targetId)}
|
|
105
|
+
className={cn(
|
|
106
|
+
'pb-[16px] text-[14px] font-bold tracking-[-0.28px] leading-[1.4]',
|
|
107
|
+
'transition-all duration-200 relative border-b-4 whitespace-nowrap',
|
|
108
|
+
isActive
|
|
109
|
+
? 'text-[#080a0f] border-brand-1'
|
|
110
|
+
: 'text-[#4a4c56] hover:text-[#080a0f] border-transparent'
|
|
111
|
+
)}
|
|
112
|
+
>
|
|
113
|
+
{item.label}
|
|
114
|
+
</button>
|
|
115
|
+
</li>
|
|
116
|
+
)
|
|
117
|
+
})}
|
|
118
|
+
</ul>
|
|
119
|
+
</div>
|
|
120
|
+
</Container>
|
|
121
|
+
</nav>
|
|
122
|
+
)
|
|
123
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Container, Heading, Tabs, TabsList, TabsTrigger } from '@anker-in/headless-ui'
|
|
1
|
+
import { Container, Heading, Tabs, TabsList, TabsTrigger, Text } from '@anker-in/headless-ui'
|
|
2
2
|
import classNames from 'classnames'
|
|
3
3
|
import { useCallback, useMemo, useState } from 'react'
|
|
4
4
|
|
|
@@ -13,19 +13,22 @@ import { RedeemableItem } from './RedeemableItem'
|
|
|
13
13
|
import RulesModal from '../modal/rulesModal'
|
|
14
14
|
import { CreditsRedeemListCopy } from './type'
|
|
15
15
|
import { useRegistration } from '../../../components/registration'
|
|
16
|
+
import { numberFormat } from '../context/utils'
|
|
16
17
|
|
|
17
|
-
export const CreditsRedeemList = ({ copy }: { copy: CreditsRedeemListCopy }) => {
|
|
18
|
+
export const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; id?: string }) => {
|
|
18
19
|
const {
|
|
19
20
|
profile,
|
|
20
21
|
openSignUpPopup,
|
|
21
22
|
gtm: { pageGroup },
|
|
22
23
|
pageCommon,
|
|
24
|
+
creditInfo,
|
|
23
25
|
} = useCreditsContext()
|
|
24
26
|
const { authCodeActivate } = useRegistration()
|
|
25
27
|
const { brand } = useHeadlessContext()
|
|
26
28
|
const rounded = ROUNDED_BRANDS.includes(brand)
|
|
27
29
|
|
|
28
30
|
const isLogin = Object.keys(profile || {}).length > 0
|
|
31
|
+
const isActivated = profile?.activated
|
|
29
32
|
|
|
30
33
|
const [activeTab, setActiveTab] = useState<string>(copy.list[0].label)
|
|
31
34
|
|
|
@@ -62,6 +65,8 @@ export const CreditsRedeemList = ({ copy }: { copy: CreditsRedeemListCopy }) =>
|
|
|
62
65
|
const alpcItem = alpcList.find(alpcItem => alpcItem.id === item.id)
|
|
63
66
|
const product = products?.find(product => product.handle === alpcItem?.handle)
|
|
64
67
|
const variant = product?.variants.find(variant => variant.sku === alpcItem?.sku)
|
|
68
|
+
// 过滤掉库存不足的商品
|
|
69
|
+
if (alpcItem?.isLimited && (!alpcItem?.remainingInventory || alpcItem.remainingInventory <= 0)) return null
|
|
65
70
|
if (alpcItem?.consumeType === AlpcConsumeType.Product && (!product || !variant)) return null
|
|
66
71
|
return {
|
|
67
72
|
alpc: alpcList.find(alpcItem => alpcItem.id === item.id),
|
|
@@ -83,9 +88,18 @@ export const CreditsRedeemList = ({ copy }: { copy: CreditsRedeemListCopy }) =>
|
|
|
83
88
|
)
|
|
84
89
|
|
|
85
90
|
return (
|
|
86
|
-
<Container className={classNames('relative bg-[#F5F5F7]')}>
|
|
91
|
+
<Container id={id} className={classNames('relative bg-[#F5F5F7]')}>
|
|
87
92
|
<Heading as="h2" size="4" html={copy.title} />
|
|
88
93
|
|
|
94
|
+
{/* 可用积分展示 */}
|
|
95
|
+
{isLogin && isActivated && (
|
|
96
|
+
<Text
|
|
97
|
+
html={copy.availableCredits?.replace('$credits', numberFormat(creditInfo?.available_credit || 0).toString())}
|
|
98
|
+
className="mt-[12px] text-[20px] l-xxl:text-[18px] l:text-[16px] font-bold text-[#4A4C56]"
|
|
99
|
+
as="p"
|
|
100
|
+
/>
|
|
101
|
+
)}
|
|
102
|
+
|
|
89
103
|
<Tabs
|
|
90
104
|
shape={rounded ? 'rounded' : 'square'}
|
|
91
105
|
align="left"
|
|
@@ -6,7 +6,7 @@ type ErrorProps = {
|
|
|
6
6
|
|
|
7
7
|
export const Error = ({ errorInfo }: ErrorProps) => {
|
|
8
8
|
return (
|
|
9
|
-
<div className="mx-auto max-w-[404px] text-[16px] text-black/40">
|
|
9
|
+
<div className="mx-auto max-w-[404px] text-[16px] text-black/40 py-[56px]">
|
|
10
10
|
<Picture className="mx-auto mb-[12px] h-[140px] w-[220px]" source={errorInfo.imageUrl} />
|
|
11
11
|
<Text as="div" className="mt-[16px] text-center" html={errorInfo.message} />
|
|
12
12
|
</div>
|
|
@@ -11,7 +11,7 @@ import { useRegistration } from '../../registration'
|
|
|
11
11
|
import { CreditsUploadReceiptModal } from '../modal/creditsUploadReceiptModal'
|
|
12
12
|
import { CreditsSubscribeModal } from '../modal/subscribeModal'
|
|
13
13
|
|
|
14
|
-
export const CreditsWaysToGetCredits = ({ copy, classNames }: CreditsWaysToGetCreditsProps) => {
|
|
14
|
+
export const CreditsWaysToGetCredits = ({ copy, classNames, id }: CreditsWaysToGetCreditsProps & { id?: string }) => {
|
|
15
15
|
const [showMore, setShowMore] = useState(false)
|
|
16
16
|
const { profile } = useCreditsContext()
|
|
17
17
|
const { authCodeActivate } = useRegistration()
|
|
@@ -91,7 +91,7 @@ export const CreditsWaysToGetCredits = ({ copy, classNames }: CreditsWaysToGetCr
|
|
|
91
91
|
}, [actions, copy.list, isLogin])
|
|
92
92
|
|
|
93
93
|
return (
|
|
94
|
-
<Container id=
|
|
94
|
+
<Container id={id} className=" bg-[#F5F5F7] [&>div]:l:!px-0">
|
|
95
95
|
<div
|
|
96
96
|
className={cn(
|
|
97
97
|
'rounded-[16px] bg-[#1D1D1F] py-[64px] px-[140px] text-white md:px-[16px] l:rounded-none md-l:px-[32px] l-xl:px-[77px]',
|
|
@@ -4,23 +4,30 @@ import { RegistrationProvider } from '../components/registration/context/provide
|
|
|
4
4
|
import { DTC_TASK_TYPE } from '../components/credits/context/const'
|
|
5
5
|
import { CreditsProvider } from '../components/credits/context/provider'
|
|
6
6
|
import { CreditsPageCommon } from '../components/credits/type'
|
|
7
|
+
import { FunctionMemberPriceConfig } from '../components/credits/context/memberPriceTypes'
|
|
7
8
|
|
|
8
9
|
import { CreditsBanner, CreditsBannerCopy } from '../components/credits/creditsBanner'
|
|
9
10
|
import { CreditsInfoCard, CreditsInfoCardCopy } from '../components/credits/creditsInfoCard'
|
|
10
11
|
import { CreditsBenefits, CreditsBenefitsCopy } from '../components/credits/creditsBenefits'
|
|
11
12
|
import { CreditsWaysToGetCredits, CreditsWaysToGetCreditsCopy } from '../components/credits/creditsWaysToGetCredits'
|
|
13
|
+
import { CreditsAnkersolixTask, CreditsAnkersolixTaskCopy } from '../components/credits/creditsAnkersolixTask'
|
|
12
14
|
import { CreditsRedeemList, CreditsRedeemListCopy } from '../components/credits/creditsRedeemList'
|
|
13
15
|
import { CreditsCash, CreditsCashCopy } from '../components/credits/creditsCash'
|
|
16
|
+
import { CreditsMemberPrice, CreditsMemberPriceCopy } from '../components/credits/creditsMemberPrice'
|
|
14
17
|
import { CreditsFaq, CreditsFaqCopy } from '../components/credits/creditsFaq'
|
|
18
|
+
import { CreditsNavigation, CreditsNavigationCopy } from '../components/credits/creditsNavigation'
|
|
15
19
|
import { AuthCodeActivateCopy } from 'src/components/registration/authCodeActivate/type'
|
|
16
20
|
|
|
17
21
|
export enum ComponentKey {
|
|
22
|
+
Navigation = 'creditsNavigation',
|
|
18
23
|
Banner = 'creditsBanner',
|
|
19
24
|
InfoCard = 'creditsInfoCard',
|
|
20
25
|
Benefits = 'creditsBenefits',
|
|
21
26
|
WaysToGetCredits = 'creditsWaysToGetCredits',
|
|
27
|
+
AnkersolixTask = 'creditsAnkersolixTask',
|
|
22
28
|
RedeemList = 'creditsRedeemList',
|
|
23
29
|
SpendCreditsLikeCash = 'creditsCash',
|
|
30
|
+
MemberPrice = 'creditsMemberPrice',
|
|
24
31
|
Faqs = 'creditsFaq',
|
|
25
32
|
}
|
|
26
33
|
export type CreditsTemplateProps = {
|
|
@@ -30,17 +37,24 @@ export type CreditsTemplateProps = {
|
|
|
30
37
|
authCodeActivate: AuthCodeActivateCopy
|
|
31
38
|
}
|
|
32
39
|
taskIdToTypeMapping: Record<string, DTC_TASK_TYPE>
|
|
40
|
+
memberPriceDiscount?: FunctionMemberPriceConfig[]
|
|
41
|
+
}
|
|
42
|
+
creditsConfig?: {
|
|
43
|
+
alpcBrand?: string
|
|
33
44
|
}
|
|
34
45
|
pageConfig: {
|
|
35
46
|
order: ComponentKey[]
|
|
36
47
|
common: CreditsPageCommon
|
|
37
48
|
components: {
|
|
49
|
+
[ComponentKey.Navigation]?: CreditsNavigationCopy
|
|
38
50
|
[ComponentKey.Banner]?: CreditsBannerCopy
|
|
39
51
|
[ComponentKey.InfoCard]?: CreditsInfoCardCopy
|
|
40
52
|
[ComponentKey.Benefits]?: CreditsBenefitsCopy
|
|
41
53
|
[ComponentKey.WaysToGetCredits]?: CreditsWaysToGetCreditsCopy
|
|
54
|
+
[ComponentKey.AnkersolixTask]?: CreditsAnkersolixTaskCopy
|
|
42
55
|
[ComponentKey.RedeemList]?: CreditsRedeemListCopy
|
|
43
56
|
[ComponentKey.SpendCreditsLikeCash]?: CreditsCashCopy
|
|
57
|
+
[ComponentKey.MemberPrice]?: CreditsMemberPriceCopy
|
|
44
58
|
[ComponentKey.Faqs]?: CreditsFaqCopy
|
|
45
59
|
}
|
|
46
60
|
}
|
|
@@ -65,11 +79,14 @@ export type CreditsTemplateProps = {
|
|
|
65
79
|
export const CreditsTemplate = ({
|
|
66
80
|
headlessConfig,
|
|
67
81
|
siteConfig,
|
|
82
|
+
creditsConfig,
|
|
68
83
|
userContext,
|
|
69
84
|
pageConfig,
|
|
70
85
|
registrationContext,
|
|
71
86
|
gtm,
|
|
72
87
|
}: CreditsTemplateProps) => {
|
|
88
|
+
|
|
89
|
+
console.log('siteConfig', siteConfig)
|
|
73
90
|
return (
|
|
74
91
|
<HeadlessProvider headlessConfig={headlessConfig}>
|
|
75
92
|
<RegistrationProvider copy={siteConfig.registrationsSettings} email={userContext?.profile?.email}>
|
|
@@ -86,21 +103,30 @@ export const CreditsTemplate = ({
|
|
|
86
103
|
customerLoading={userContext?.customerLoading}
|
|
87
104
|
gtm={gtm}
|
|
88
105
|
pageCommon={pageConfig.common}
|
|
106
|
+
memberPriceDiscount={siteConfig.memberPriceDiscount}
|
|
107
|
+
alpcBrand={creditsConfig?.alpcBrand}
|
|
89
108
|
>
|
|
109
|
+
{/* 导航组件 - 固定位置,不参与 order 排序 */}
|
|
110
|
+
{pageConfig.components[ComponentKey.Navigation] && (
|
|
111
|
+
<CreditsNavigation copy={pageConfig.components[ComponentKey.Navigation]} />
|
|
112
|
+
)}
|
|
90
113
|
<div className={classNames('bg-[#f5f5f7] leading-[1.2]')}>
|
|
91
114
|
{pageConfig.order.map(key => {
|
|
115
|
+
// 跳过导航组件,因为它已经固定渲染在上方
|
|
116
|
+
if (key === ComponentKey.Navigation) return null
|
|
92
117
|
const componentCopy = pageConfig.components?.[key]
|
|
93
118
|
if (!componentCopy) return null
|
|
94
119
|
return (
|
|
95
120
|
<>
|
|
96
|
-
{key === ComponentKey.Banner && <CreditsBanner copy={componentCopy as CreditsBannerCopy} />}
|
|
121
|
+
{key === ComponentKey.Banner && <CreditsBanner copy={componentCopy as CreditsBannerCopy} id={key} />}
|
|
97
122
|
{key === ComponentKey.InfoCard && userContext?.profile && (
|
|
98
|
-
<CreditsInfoCard copy={componentCopy as CreditsInfoCardCopy} />
|
|
123
|
+
<CreditsInfoCard copy={componentCopy as CreditsInfoCardCopy} id={key} />
|
|
99
124
|
)}
|
|
100
|
-
{key === ComponentKey.Benefits && <CreditsBenefits copy={componentCopy as CreditsBenefitsCopy} />}
|
|
125
|
+
{key === ComponentKey.Benefits && <CreditsBenefits copy={componentCopy as CreditsBenefitsCopy} id={key} />}
|
|
101
126
|
{key === ComponentKey.WaysToGetCredits && (
|
|
102
127
|
<CreditsWaysToGetCredits
|
|
103
128
|
copy={componentCopy as CreditsWaysToGetCreditsCopy}
|
|
129
|
+
id={key}
|
|
104
130
|
classNames={
|
|
105
131
|
headlessConfig.brand === 'anker'
|
|
106
132
|
? {
|
|
@@ -115,11 +141,16 @@ export const CreditsTemplate = ({
|
|
|
115
141
|
}
|
|
116
142
|
/>
|
|
117
143
|
)}
|
|
118
|
-
{key === ComponentKey.
|
|
119
|
-
<
|
|
144
|
+
{key === ComponentKey.AnkersolixTask && (
|
|
145
|
+
<CreditsAnkersolixTask
|
|
146
|
+
copy={componentCopy as CreditsAnkersolixTaskCopy}
|
|
147
|
+
id={key}
|
|
148
|
+
/>
|
|
120
149
|
)}
|
|
121
|
-
{key === ComponentKey.
|
|
122
|
-
{key === ComponentKey.
|
|
150
|
+
{key === ComponentKey.RedeemList && <CreditsRedeemList copy={componentCopy as CreditsRedeemListCopy} id={key} />}
|
|
151
|
+
{key === ComponentKey.SpendCreditsLikeCash && <CreditsCash copy={componentCopy as CreditsCashCopy} id={key} />}
|
|
152
|
+
{key === ComponentKey.MemberPrice && <CreditsMemberPrice copy={componentCopy as CreditsMemberPriceCopy} id={key} />}
|
|
153
|
+
{key === ComponentKey.Faqs && <CreditsFaq copy={componentCopy as CreditsFaqCopy} id={key} />}
|
|
123
154
|
{key !== ComponentKey.Banner && (
|
|
124
155
|
<div className="laptop:h-16 desktop:h-[96px] lg-desktop:h-[128px] tablet:h-16 h-16" />
|
|
125
156
|
)}
|
package/src/templates/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './Credits'
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const roundedBrands: string[];
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var r=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var t=Object.prototype.hasOwnProperty;var a=(d,o)=>{for(var n in o)r(d,n,{get:o[n],enumerable:!0})},f=(d,o,n,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!t.call(d,e)&&e!==n&&r(d,e,{get:()=>o[e],enumerable:!(s=u(o,e))||s.enumerable});return d};var p=d=>f(r({},"__esModule",{value:!0}),d);var y={};a(y,{roundedBrands:()=>x});module.exports=p(y);const x=["eufy","soundcore"];
|
|
2
|
-
//# sourceMappingURL=const.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/components/credits/const.ts"],
|
|
4
|
-
"sourcesContent": ["export const roundedBrands = ['eufy', 'soundcore']\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAgB,CAAC,OAAQ,WAAW",
|
|
6
|
-
"names": ["const_exports", "__export", "roundedBrands", "__toCommonJS"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const roundedBrands: string[];
|
|
File without changes
|