@shopbb/helium 0.5.4 → 0.5.5
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/components/AddressList.d.ts.map +1 -1
- package/dist/components/AddressList.js +6 -1
- package/dist/components/AddressList.js.map +1 -1
- package/dist/components/AddressPicker.d.ts.map +1 -1
- package/dist/components/AddressPicker.js +5 -0
- package/dist/components/AddressPicker.js.map +1 -1
- package/dist/components/DiscountComponents.d.ts.map +1 -1
- package/dist/components/DiscountComponents.js +10 -0
- package/dist/components/DiscountComponents.js.map +1 -1
- package/dist/components/DiscountSelector.d.ts.map +1 -1
- package/dist/components/DiscountSelector.js +8 -1
- package/dist/components/DiscountSelector.js.map +1 -1
- package/dist/components/hooks/useMounted.d.ts +2 -0
- package/dist/components/hooks/useMounted.d.ts.map +1 -0
- package/dist/components/hooks/useMounted.js +34 -0
- package/dist/components/hooks/useMounted.js.map +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/AddressList.tsx +5 -0
- package/src/components/AddressPicker.tsx +5 -0
- package/src/components/DiscountComponents.tsx +11 -0
- package/src/components/DiscountSelector.tsx +8 -0
- package/src/components/hooks/useMounted.ts +34 -0
- package/src/components/index.ts +3 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddressList.d.ts","sourceRoot":"","sources":["../../src/components/AddressList.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"AddressList.d.ts","sourceRoot":"","sources":["../../src/components/AddressList.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrE,MAAM,WAAW,gBAAgB;IAC/B,aAAa;IACb,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY;IACZ,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,KAAK,KAAK,CAAC,SAAS,CAAC;IACpF,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CAiDlD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* <AddressList>
|
|
4
4
|
*
|
|
@@ -13,9 +13,14 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
13
13
|
*/
|
|
14
14
|
import * as React from 'react';
|
|
15
15
|
import { useAddressBook } from './AddressBookProvider';
|
|
16
|
+
import { useMounted } from './hooks/useMounted';
|
|
16
17
|
export function AddressList(props) {
|
|
17
18
|
const { onEdit, onAdd, emptyText = '还没有保存的地址', renderItem, className, loadingFallback = null, } = props;
|
|
19
|
+
const mounted = useMounted();
|
|
18
20
|
const { addresses, status, setDefault, deleteAddress } = useAddressBook();
|
|
21
|
+
if (!mounted) {
|
|
22
|
+
return _jsx("div", { "data-address-list": true, "data-ssr-placeholder": true, className: className });
|
|
23
|
+
}
|
|
19
24
|
if (status === 'loading' || status === 'unauthenticated') {
|
|
20
25
|
return _jsx(_Fragment, { children: loadingFallback });
|
|
21
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddressList.js","sourceRoot":"","sources":["../../src/components/AddressList.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"AddressList.js","sourceRoot":"","sources":["../../src/components/AddressList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddressPicker.d.ts","sourceRoot":"","sources":["../../src/components/AddressPicker.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"AddressPicker.d.ts","sourceRoot":"","sources":["../../src/components/AddressPicker.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrE,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACvE,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,oBAAoB;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sCAAsC;IACtC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,wCAAwC;IACxC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAkHtD"}
|
|
@@ -21,9 +21,11 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
21
21
|
*/
|
|
22
22
|
import * as React from 'react';
|
|
23
23
|
import { useAddressBook } from './AddressBookProvider';
|
|
24
|
+
import { useMounted } from './hooks/useMounted';
|
|
24
25
|
import { AddressForm } from './AddressForm';
|
|
25
26
|
export function AddressPicker(props) {
|
|
26
27
|
const { value, onChange, onSelect, allowNewAddress = true, onUseNewAddress, emptyFallback, className, } = props;
|
|
28
|
+
const mounted = useMounted();
|
|
27
29
|
const { addresses, defaultAddress, status } = useAddressBook();
|
|
28
30
|
// 非受控 fallback
|
|
29
31
|
const [internalId, setInternalId] = React.useState(null);
|
|
@@ -44,6 +46,9 @@ export function AddressPicker(props) {
|
|
|
44
46
|
setSelectedId(addresses[0].id, addresses[0]);
|
|
45
47
|
}
|
|
46
48
|
}, [defaultAddress, addresses, selectedId, setSelectedId]);
|
|
49
|
+
if (!mounted) {
|
|
50
|
+
return _jsx("div", { "data-address-picker": true, "data-ssr-placeholder": true, className: className });
|
|
51
|
+
}
|
|
47
52
|
if (status === 'loading') {
|
|
48
53
|
return _jsx("div", { "data-address-picker": true, "data-loading": true, children: "\u52A0\u8F7D\u5730\u5740\u4E2D\u2026" });
|
|
49
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddressPicker.js","sourceRoot":"","sources":["../../src/components/AddressPicker.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AddressPicker.js","sourceRoot":"","sources":["../../src/components/AddressPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscountComponents.d.ts","sourceRoot":"","sources":["../../src/components/DiscountComponents.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAqC,KAAK,QAAQ,EAAsB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"DiscountComponents.d.ts","sourceRoot":"","sources":["../../src/components/DiscountComponents.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAqC,KAAK,QAAQ,EAAsB,MAAM,oBAAoB,CAAC;AAS1G,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,2CAqBlE;AAMD,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,KAAK,CAAC,SAAS,CAAC;CACtD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,kDA0BtE;AAgCD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,2CA2DlE;AAMD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;CACnD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,kDA8CxD"}
|
|
@@ -17,6 +17,7 @@ import * as React from 'react';
|
|
|
17
17
|
import { useDiscounts, useProductDiscounts } from './DiscountProvider';
|
|
18
18
|
import { useAnalytics } from './AnalyticsProvider';
|
|
19
19
|
import { Money } from './Money';
|
|
20
|
+
import { useMounted } from './hooks/useMounted';
|
|
20
21
|
export function AppliedDiscountList(props) {
|
|
21
22
|
const { className, emptyText = null } = props;
|
|
22
23
|
const { cartAllocations } = useDiscounts();
|
|
@@ -26,10 +27,15 @@ export function AppliedDiscountList(props) {
|
|
|
26
27
|
}
|
|
27
28
|
export function ClaimableDiscountList(props) {
|
|
28
29
|
const { scope = 'store', productHandle, first = 10, className, emptyText = null, renderItem } = props;
|
|
30
|
+
const mounted = useMounted();
|
|
29
31
|
const { publicDiscounts, publicDiscountsStatus } = useDiscounts();
|
|
30
32
|
const { discounts: productDiscs, loading: productLoading } = useProductDiscounts(scope === 'product' ? productHandle : null);
|
|
31
33
|
const list = scope === 'product' ? productDiscs : publicDiscounts;
|
|
32
34
|
const loading = scope === 'product' ? productLoading : publicDiscountsStatus === 'loading';
|
|
35
|
+
// SSR 安全:首次渲染返回固定占位(空容器),避免和 client 拉到数据后的渲染 mismatch
|
|
36
|
+
if (!mounted) {
|
|
37
|
+
return _jsx("div", { "data-claimable-discount-list": true, "data-scope": scope, "data-ssr-placeholder": true, className: className });
|
|
38
|
+
}
|
|
33
39
|
if (loading)
|
|
34
40
|
return null;
|
|
35
41
|
if (list.length === 0)
|
|
@@ -89,7 +95,11 @@ export function DiscountClaimButton(props) {
|
|
|
89
95
|
}
|
|
90
96
|
export function MyDiscountList(props) {
|
|
91
97
|
const { className, emptyText = '还没有优惠券', filter = 'available' } = props;
|
|
98
|
+
const mounted = useMounted();
|
|
92
99
|
const { myDiscounts, myDiscountsStatus } = useDiscounts();
|
|
100
|
+
if (!mounted) {
|
|
101
|
+
return _jsx("div", { "data-my-discount-list": true, "data-ssr-placeholder": true, className: className });
|
|
102
|
+
}
|
|
93
103
|
if (myDiscountsStatus === 'loading')
|
|
94
104
|
return null;
|
|
95
105
|
if (myDiscountsStatus === 'unauthenticated')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscountComponents.js","sourceRoot":"","sources":["../../src/components/DiscountComponents.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAqC,MAAM,oBAAoB,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"DiscountComponents.js","sourceRoot":"","sources":["../../src/components/DiscountComponents.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscountSelector.d.ts","sourceRoot":"","sources":["../../src/components/DiscountSelector.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DiscountSelector.d.ts","sourceRoot":"","sources":["../../src/components/DiscountSelector.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,uBAAuB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1C,YAAY;IACZ,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;CAC5J;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAuG5D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* <DiscountSelector>
|
|
4
4
|
*
|
|
@@ -20,12 +20,19 @@ import * as React from 'react';
|
|
|
20
20
|
import { useDiscounts } from './DiscountProvider';
|
|
21
21
|
import { useAnalytics } from './AnalyticsProvider';
|
|
22
22
|
import { Money } from './Money';
|
|
23
|
+
import { useMounted } from './hooks/useMounted';
|
|
23
24
|
export function DiscountSelector(props) {
|
|
24
25
|
const { className, unauthenticatedFallback, renderApplied } = props;
|
|
26
|
+
const mounted = useMounted();
|
|
25
27
|
const { myDiscounts, myDiscountsStatus, cartAllocations, appliedClaim, selectCartDiscount, } = useDiscounts();
|
|
26
28
|
const analytics = useAnalytics();
|
|
27
29
|
const [open, setOpen] = React.useState(false);
|
|
28
30
|
const [pending, setPending] = React.useState(false);
|
|
31
|
+
// SSR + client 首次 render:返回固定占位,保证 hydration 不 mismatch。
|
|
32
|
+
// mounted 后才进入真正的渲染分支。
|
|
33
|
+
if (!mounted) {
|
|
34
|
+
return _jsx("div", { "data-discount-selector": true, "data-ssr-placeholder": true, className: className });
|
|
35
|
+
}
|
|
29
36
|
// 服务端已经决定了 cart 上是哪张券
|
|
30
37
|
const appliedAlloc = cartAllocations[0];
|
|
31
38
|
const appliedClaimId = appliedClaim?.claimId ?? null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscountSelector.js","sourceRoot":"","sources":["../../src/components/DiscountSelector.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"DiscountSelector.js","sourceRoot":"","sources":["../../src/components/DiscountSelector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMounted.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useMounted.ts"],"names":[],"mappings":"AA2BA,wBAAgB,UAAU,IAAI,OAAO,CAMpC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useMounted —— React SSR / hydrate 安全护栏
|
|
3
|
+
*
|
|
4
|
+
* 用法:
|
|
5
|
+
* const mounted = useMounted();
|
|
6
|
+
* if (!mounted) return <div data-ssr-placeholder />; // 占位(SSR + first render 都返回这个)
|
|
7
|
+
* // ... 真正渲染依赖 localStorage / window / 异步 fetch 结果的内容
|
|
8
|
+
*
|
|
9
|
+
* 为什么需要:
|
|
10
|
+
* SSR 阶段 React 渲染一次 HTML;浏览器 hydrate 时再渲染一次。两次渲染必须输出
|
|
11
|
+
* **完全相同** 的 DOM,否则 React 报错 #418/#423/#425(hydration mismatch)。
|
|
12
|
+
*
|
|
13
|
+
* 但有些数据天然只有 client 才有:
|
|
14
|
+
* - localStorage / sessionStorage 里的 buyer token
|
|
15
|
+
* - window.location / navigator
|
|
16
|
+
* - 异步 fetch 拿到的优惠券、订单等
|
|
17
|
+
*
|
|
18
|
+
* useMounted() 的核心约定:
|
|
19
|
+
* - SSR 阶段 + client 首次 render:返回 false → 渲染占位
|
|
20
|
+
* - client useEffect 跑过后:返回 true → 重新 render 真内容
|
|
21
|
+
*
|
|
22
|
+
* 这样 SSR HTML 和 client first render 永远一致(都是占位)→ 不会 mismatch。
|
|
23
|
+
* 占位渲染完成后 React 进入"被 hydrate 之后"状态,setState 触发的二次 render
|
|
24
|
+
* 是合法的 client update,可以随便变。
|
|
25
|
+
*/
|
|
26
|
+
import * as React from 'react';
|
|
27
|
+
export function useMounted() {
|
|
28
|
+
const [mounted, setMounted] = React.useState(false);
|
|
29
|
+
React.useEffect(() => {
|
|
30
|
+
setMounted(true);
|
|
31
|
+
}, []);
|
|
32
|
+
return mounted;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=useMounted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMounted.js","sourceRoot":"","sources":["../../../src/components/hooks/useMounted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -52,4 +52,5 @@ export { AppliedDiscountList, ClaimableDiscountList, DiscountClaimButton, MyDisc
|
|
|
52
52
|
export type { AppliedDiscountListProps, ClaimableDiscountListProps, DiscountClaimButtonProps, MyDiscountListProps, } from './DiscountComponents';
|
|
53
53
|
export { DiscountSelector } from './DiscountSelector';
|
|
54
54
|
export type { DiscountSelectorProps } from './DiscountSelector';
|
|
55
|
+
export { useMounted } from './hooks/useMounted';
|
|
55
56
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxE,YAAY,EACV,IAAI,EACJ,QAAQ,EACR,mBAAmB,EACnB,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,0BAA0B,EAC1B,2BAA2B,EAC3B,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGzG,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEvE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,YAAY,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AAExF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/components/index.js
CHANGED
|
@@ -39,4 +39,6 @@ export { AddressPicker } from './AddressPicker';
|
|
|
39
39
|
export { DiscountProvider, useDiscounts, useDiscountsOptional, useProductDiscounts, } from './DiscountProvider';
|
|
40
40
|
export { AppliedDiscountList, ClaimableDiscountList, DiscountClaimButton, MyDiscountList, } from './DiscountComponents';
|
|
41
41
|
export { DiscountSelector } from './DiscountSelector';
|
|
42
|
+
// SSR / hydrate 辅助 hook
|
|
43
|
+
export { useMounted } from './hooks/useMounted';
|
|
42
44
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGxE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAWxE,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGjF,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAG9E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,WAAW;AACX,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAU/B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,WAAW;AACX,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAe5B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGxE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAWxE,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGjF,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAG9E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,WAAW;AACX,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAU/B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,WAAW;AACX,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAe5B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
|
package/package.json
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
import * as React from 'react';
|
|
15
15
|
import { useAddressBook, type Address } from './AddressBookProvider';
|
|
16
|
+
import { useMounted } from './hooks/useMounted';
|
|
16
17
|
|
|
17
18
|
export interface AddressListProps {
|
|
18
19
|
/** 编辑按钮点击 */
|
|
@@ -40,8 +41,12 @@ export function AddressList(props: AddressListProps) {
|
|
|
40
41
|
onEdit, onAdd, emptyText = '还没有保存的地址',
|
|
41
42
|
renderItem, className, loadingFallback = null,
|
|
42
43
|
} = props;
|
|
44
|
+
const mounted = useMounted();
|
|
43
45
|
const { addresses, status, setDefault, deleteAddress } = useAddressBook();
|
|
44
46
|
|
|
47
|
+
if (!mounted) {
|
|
48
|
+
return <div data-address-list data-ssr-placeholder className={className} />;
|
|
49
|
+
}
|
|
45
50
|
if (status === 'loading' || status === 'unauthenticated') {
|
|
46
51
|
return <>{loadingFallback}</>;
|
|
47
52
|
}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
import * as React from 'react';
|
|
23
23
|
import { useAddressBook, type Address } from './AddressBookProvider';
|
|
24
|
+
import { useMounted } from './hooks/useMounted';
|
|
24
25
|
import { AddressForm } from './AddressForm';
|
|
25
26
|
|
|
26
27
|
export interface AddressPickerProps {
|
|
@@ -47,6 +48,7 @@ export function AddressPicker(props: AddressPickerProps) {
|
|
|
47
48
|
emptyFallback,
|
|
48
49
|
className,
|
|
49
50
|
} = props;
|
|
51
|
+
const mounted = useMounted();
|
|
50
52
|
const { addresses, defaultAddress, status } = useAddressBook();
|
|
51
53
|
|
|
52
54
|
// 非受控 fallback
|
|
@@ -69,6 +71,9 @@ export function AddressPicker(props: AddressPickerProps) {
|
|
|
69
71
|
}
|
|
70
72
|
}, [defaultAddress, addresses, selectedId, setSelectedId]);
|
|
71
73
|
|
|
74
|
+
if (!mounted) {
|
|
75
|
+
return <div data-address-picker data-ssr-placeholder className={className} />;
|
|
76
|
+
}
|
|
72
77
|
if (status === 'loading') {
|
|
73
78
|
return <div data-address-picker data-loading>加载地址中…</div>;
|
|
74
79
|
}
|
|
@@ -17,6 +17,7 @@ import * as React from 'react';
|
|
|
17
17
|
import { useDiscounts, useProductDiscounts, type Discount, type DiscountClaim } from './DiscountProvider';
|
|
18
18
|
import { useAnalytics } from './AnalyticsProvider';
|
|
19
19
|
import { Money } from './Money';
|
|
20
|
+
import { useMounted } from './hooks/useMounted';
|
|
20
21
|
|
|
21
22
|
// ============================================================
|
|
22
23
|
// AppliedDiscountList
|
|
@@ -65,12 +66,18 @@ export interface ClaimableDiscountListProps {
|
|
|
65
66
|
|
|
66
67
|
export function ClaimableDiscountList(props: ClaimableDiscountListProps) {
|
|
67
68
|
const { scope = 'store', productHandle, first = 10, className, emptyText = null, renderItem } = props;
|
|
69
|
+
const mounted = useMounted();
|
|
68
70
|
const { publicDiscounts, publicDiscountsStatus } = useDiscounts();
|
|
69
71
|
const { discounts: productDiscs, loading: productLoading } = useProductDiscounts(scope === 'product' ? productHandle : null);
|
|
70
72
|
|
|
71
73
|
const list = scope === 'product' ? productDiscs : publicDiscounts;
|
|
72
74
|
const loading = scope === 'product' ? productLoading : publicDiscountsStatus === 'loading';
|
|
73
75
|
|
|
76
|
+
// SSR 安全:首次渲染返回固定占位(空容器),避免和 client 拉到数据后的渲染 mismatch
|
|
77
|
+
if (!mounted) {
|
|
78
|
+
return <div data-claimable-discount-list data-scope={scope} data-ssr-placeholder className={className} />;
|
|
79
|
+
}
|
|
80
|
+
|
|
74
81
|
if (loading) return null;
|
|
75
82
|
if (list.length === 0) return <>{emptyText}</>;
|
|
76
83
|
|
|
@@ -200,8 +207,12 @@ export interface MyDiscountListProps {
|
|
|
200
207
|
|
|
201
208
|
export function MyDiscountList(props: MyDiscountListProps) {
|
|
202
209
|
const { className, emptyText = '还没有优惠券', filter = 'available' } = props;
|
|
210
|
+
const mounted = useMounted();
|
|
203
211
|
const { myDiscounts, myDiscountsStatus } = useDiscounts();
|
|
204
212
|
|
|
213
|
+
if (!mounted) {
|
|
214
|
+
return <div data-my-discount-list data-ssr-placeholder className={className} />;
|
|
215
|
+
}
|
|
205
216
|
if (myDiscountsStatus === 'loading') return null;
|
|
206
217
|
if (myDiscountsStatus === 'unauthenticated') return null;
|
|
207
218
|
|
|
@@ -20,6 +20,7 @@ import * as React from 'react';
|
|
|
20
20
|
import { useDiscounts, type DiscountClaim } from './DiscountProvider';
|
|
21
21
|
import { useAnalytics } from './AnalyticsProvider';
|
|
22
22
|
import { Money } from './Money';
|
|
23
|
+
import { useMounted } from './hooks/useMounted';
|
|
23
24
|
|
|
24
25
|
export interface DiscountSelectorProps {
|
|
25
26
|
className?: string;
|
|
@@ -31,6 +32,7 @@ export interface DiscountSelectorProps {
|
|
|
31
32
|
|
|
32
33
|
export function DiscountSelector(props: DiscountSelectorProps) {
|
|
33
34
|
const { className, unauthenticatedFallback, renderApplied } = props;
|
|
35
|
+
const mounted = useMounted();
|
|
34
36
|
const {
|
|
35
37
|
myDiscounts, myDiscountsStatus,
|
|
36
38
|
cartAllocations, appliedClaim,
|
|
@@ -41,6 +43,12 @@ export function DiscountSelector(props: DiscountSelectorProps) {
|
|
|
41
43
|
const [open, setOpen] = React.useState(false);
|
|
42
44
|
const [pending, setPending] = React.useState(false);
|
|
43
45
|
|
|
46
|
+
// SSR + client 首次 render:返回固定占位,保证 hydration 不 mismatch。
|
|
47
|
+
// mounted 后才进入真正的渲染分支。
|
|
48
|
+
if (!mounted) {
|
|
49
|
+
return <div data-discount-selector data-ssr-placeholder className={className} />;
|
|
50
|
+
}
|
|
51
|
+
|
|
44
52
|
// 服务端已经决定了 cart 上是哪张券
|
|
45
53
|
const appliedAlloc = cartAllocations[0];
|
|
46
54
|
const appliedClaimId = appliedClaim?.claimId ?? null;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useMounted —— React SSR / hydrate 安全护栏
|
|
3
|
+
*
|
|
4
|
+
* 用法:
|
|
5
|
+
* const mounted = useMounted();
|
|
6
|
+
* if (!mounted) return <div data-ssr-placeholder />; // 占位(SSR + first render 都返回这个)
|
|
7
|
+
* // ... 真正渲染依赖 localStorage / window / 异步 fetch 结果的内容
|
|
8
|
+
*
|
|
9
|
+
* 为什么需要:
|
|
10
|
+
* SSR 阶段 React 渲染一次 HTML;浏览器 hydrate 时再渲染一次。两次渲染必须输出
|
|
11
|
+
* **完全相同** 的 DOM,否则 React 报错 #418/#423/#425(hydration mismatch)。
|
|
12
|
+
*
|
|
13
|
+
* 但有些数据天然只有 client 才有:
|
|
14
|
+
* - localStorage / sessionStorage 里的 buyer token
|
|
15
|
+
* - window.location / navigator
|
|
16
|
+
* - 异步 fetch 拿到的优惠券、订单等
|
|
17
|
+
*
|
|
18
|
+
* useMounted() 的核心约定:
|
|
19
|
+
* - SSR 阶段 + client 首次 render:返回 false → 渲染占位
|
|
20
|
+
* - client useEffect 跑过后:返回 true → 重新 render 真内容
|
|
21
|
+
*
|
|
22
|
+
* 这样 SSR HTML 和 client first render 永远一致(都是占位)→ 不会 mismatch。
|
|
23
|
+
* 占位渲染完成后 React 进入"被 hydrate 之后"状态,setState 触发的二次 render
|
|
24
|
+
* 是合法的 client update,可以随便变。
|
|
25
|
+
*/
|
|
26
|
+
import * as React from 'react';
|
|
27
|
+
|
|
28
|
+
export function useMounted(): boolean {
|
|
29
|
+
const [mounted, setMounted] = React.useState(false);
|
|
30
|
+
React.useEffect(() => {
|
|
31
|
+
setMounted(true);
|
|
32
|
+
}, []);
|
|
33
|
+
return mounted;
|
|
34
|
+
}
|
package/src/components/index.ts
CHANGED