@arcblock/ux 2.10.67 → 2.10.69
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/lib/Address/did-address.d.ts +6 -5
- package/lib/Address/index.d.ts +1 -1
- package/lib/Avatar/index.d.ts +10 -8
- package/lib/Avatar/index.js +6 -4
- package/lib/Blocklet/blocklet.d.ts +4 -4
- package/lib/Blocklet/blocklet.js +2 -2
- package/lib/BlockletContext/index.d.ts +3 -3
- package/lib/BlockletNFT/index.d.ts +6 -6
- package/lib/BlockletNFT/index.js +3 -3
- package/lib/BlockletV2/blocklet.d.ts +2 -2
- package/lib/Button/wrap.d.ts +4 -4
- package/lib/Button/wrap.js +2 -2
- package/lib/CardSelector/index.js +0 -1
- package/lib/Center/index.d.ts +1 -1
- package/lib/ClickToCopy/copy-button.d.ts +5 -4
- package/lib/ClickToCopy/copy-button.js +0 -1
- package/lib/ClickToCopy/hook.d.ts +3 -8
- package/lib/ClickToCopy/index.d.ts +6 -4
- package/lib/CodeBlock/index.d.ts +3 -1
- package/lib/CookieConsent/index.d.ts +8 -29
- package/lib/CookieConsent/index.js +3 -17
- package/lib/CountDown/index.d.ts +21 -25
- package/lib/CountDown/index.js +12 -11
- package/lib/DID/index.d.ts +9 -8
- package/lib/Datatable/index.d.ts +5 -5
- package/lib/Datatable/index.js +5 -5
- package/lib/Dialog/confirm.d.ts +6 -6
- package/lib/Dialog/confirm.js +3 -3
- package/lib/Dialog/types.d.ts +1 -1
- package/lib/DidLogo/index.d.ts +5 -25
- package/lib/DidLogo/index.js +4 -15
- package/lib/DriftBot/index.d.ts +13 -19
- package/lib/DriftBot/index.js +5 -6
- package/lib/Earth/index.d.ts +28 -10
- package/lib/Earth/index.js +12 -52
- package/lib/Earth/util.d.ts +10 -5
- package/lib/Earth/util.js +1 -0
- package/lib/ErrorBoundary/fallback.d.ts +12 -19
- package/lib/ErrorBoundary/fallback.js +2 -19
- package/lib/ErrorBoundary/index.d.ts +1 -1
- package/lib/Footer/index.d.ts +17 -24
- package/lib/Footer/index.js +2 -11
- package/lib/Header/header.d.ts +2 -2
- package/lib/Icon/image.d.ts +3 -2
- package/lib/Icon/index.d.ts +6 -4
- package/lib/Img/index.d.ts +1 -1
- package/lib/Img/index.js +1 -1
- package/lib/InfoRow/index.d.ts +9 -32
- package/lib/InfoRow/index.js +10 -23
- package/lib/Layout/dashboard/external-link.d.ts +13 -14
- package/lib/Layout/dashboard/external-link.js +5 -22
- package/lib/Layout/dashboard/full-page.d.ts +19 -11
- package/lib/Layout/dashboard/full-page.js +2 -6
- package/lib/Layout/dashboard/index.d.ts +20 -39
- package/lib/Layout/dashboard/index.js +10 -38
- package/lib/Layout/dashboard/sidebar.d.ts +17 -20
- package/lib/Layout/dashboard/sidebar.js +3 -16
- package/lib/Layout/dashboard-legacy/header.d.ts +10 -36
- package/lib/Layout/dashboard-legacy/header.js +5 -24
- package/lib/Layout/dashboard-legacy/index.d.ts +17 -56
- package/lib/Layout/dashboard-legacy/index.js +12 -41
- package/lib/Layout/dashboard-legacy/sidebar.d.ts +15 -26
- package/lib/Layout/dashboard-legacy/sidebar.js +5 -15
- package/lib/Layout/index.d.ts +17 -56
- package/lib/Layout/index.js +24 -50
- package/lib/LoadingMask/index.d.ts +8 -31
- package/lib/LoadingMask/index.js +3 -19
- package/lib/Locale/browser-lang.d.ts +4 -1
- package/lib/Locale/browser-lang.js +8 -3
- package/lib/Locale/context.d.ts +18 -8
- package/lib/Locale/context.js +1 -1
- package/lib/Locale/languages.d.ts +9 -55
- package/lib/Locale/selector.d.ts +10 -26
- package/lib/Locale/selector.js +8 -25
- package/lib/Locale/util.d.ts +4 -3
- package/lib/Locale/util.js +0 -1
- package/lib/Logo/index.d.ts +9 -40
- package/lib/Logo/index.js +88 -46
- package/lib/Metric/index.d.ts +9 -31
- package/lib/Metric/index.js +5 -20
- package/lib/NFTDisplay/aspect-ratio-container.d.ts +5 -12
- package/lib/NFTDisplay/aspect-ratio-container.js +0 -5
- package/lib/NFTDisplay/broken.d.ts +3 -13
- package/lib/NFTDisplay/broken.js +80 -10
- package/lib/NFTDisplay/displayApi.d.ts +1 -1
- package/lib/NFTDisplay/index.d.ts +28 -6
- package/lib/NFTDisplay/index.js +17 -51
- package/lib/NFTDisplay/svg-embedder/img.d.ts +8 -23
- package/lib/NFTDisplay/svg-embedder/img.js +3 -17
- package/lib/NFTDisplay/svg-embedder/inline-svg.d.ts +7 -13
- package/lib/NFTDisplay/svg-embedder/inline-svg.js +1 -8
- package/lib/NavMenu/nav-menu.d.ts +2 -0
- package/lib/NavMenu/nav-menu.js +0 -1
- package/lib/PageScroller/index.d.ts +14 -13
- package/lib/PageScroller/index.js +12 -37
- package/lib/PageScroller/usePrevValue.d.ts +1 -1
- package/lib/PageScroller/usePrevValue.js +1 -2
- package/lib/Passport/index.d.ts +1 -1
- package/lib/Passport/passport.d.ts +10 -30
- package/lib/Passport/passport.js +5 -19
- package/lib/PoweredByArcBlock/index.d.ts +4 -14
- package/lib/PoweredByArcBlock/index.js +1 -8
- package/lib/PricingTable/PricingPlan.d.ts +11 -9
- package/lib/PricingTable/PricingPlan.js +0 -4
- package/lib/PricingTable/index.d.ts +5 -3
- package/lib/PricingTable/index.js +1 -5
- package/lib/QRCode/index.d.ts +11 -22
- package/lib/QRCode/index.js +2 -17
- package/lib/RelativeTime/index.d.ts +12 -40
- package/lib/RelativeTime/index.js +7 -27
- package/lib/Result/common.d.ts +26 -45
- package/lib/Result/common.js +2 -4
- package/lib/Result/index.d.ts +5 -18
- package/lib/Result/index.js +1 -9
- package/lib/Result/result.d.ts +7 -29
- package/lib/Result/result.js +2 -17
- package/lib/Result/translations.d.ts +2 -54
- package/lib/Screenshot/BaseScreenshot/index.d.ts +7 -24
- package/lib/Screenshot/BaseScreenshot/index.js +2 -15
- package/lib/Screenshot/BaseScreenshot/shells/Macbook.d.ts +25 -19
- package/lib/Screenshot/BaseScreenshot/shells/Phone.d.ts +25 -19
- package/lib/Screenshot/index.d.ts +84 -28
- package/lib/Screenshot/index.js +14 -43
- package/lib/SessionBlocklet/index.d.ts +6 -19
- package/lib/SessionBlocklet/index.js +5 -15
- package/lib/SessionManager/index.d.ts +1 -1
- package/lib/SessionPermission/index.d.ts +9 -17
- package/lib/SessionPermission/index.js +3 -11
- package/lib/SessionUser/components/logged-in.d.ts +9 -31
- package/lib/SessionUser/components/logged-in.js +13 -29
- package/lib/SessionUser/components/session-user-item.d.ts +8 -1
- package/lib/SessionUser/components/session-user-item.js +2 -12
- package/lib/SessionUser/components/session-user-switch.d.ts +9 -21
- package/lib/SessionUser/components/session-user-switch.js +3 -15
- package/lib/SessionUser/components/un-login.d.ts +7 -23
- package/lib/SessionUser/components/un-login.js +4 -16
- package/lib/SessionUser/components/user-info.d.ts +12 -29
- package/lib/SessionUser/components/user-info.js +4 -19
- package/lib/SessionUser/index.d.ts +7 -30
- package/lib/SessionUser/index.js +5 -26
- package/lib/SessionUser/libs/translation.d.ts +2 -31
- package/lib/SessionUser/libs/translation.js +1 -0
- package/lib/SessionUser/libs/utils.d.ts +10 -9
- package/lib/Sparkline/index.d.ts +22 -1
- package/lib/Sparkline/index.js +25 -17
- package/lib/Spinner/index.d.ts +6 -1
- package/lib/Spinner/index.js +4 -11
- package/lib/Success/index.d.ts +5 -21
- package/lib/Success/index.js +10 -19
- package/lib/Tabs/index.d.ts +12 -26
- package/lib/Tabs/index.js +7 -37
- package/lib/TextCollapse/index.d.ts +10 -10
- package/lib/TextCollapse/index.js +4 -21
- package/lib/Theme/index.js +0 -2
- package/lib/Theme/theme-provider.d.ts +1 -1
- package/lib/Theme/theme.d.ts +4 -1
- package/lib/Theme/theme.js +1 -2
- package/lib/Typography/index.d.ts +5 -24
- package/lib/Typography/index.js +5 -17
- package/lib/Util/index.d.ts +17 -8
- package/lib/Util/index.js +22 -3
- package/lib/Video/index.d.ts +12 -16
- package/lib/Video/index.js +0 -14
- package/lib/Wallet/Action.d.ts +13 -18
- package/lib/Wallet/Action.js +0 -7
- package/lib/Wallet/Download.d.ts +24 -30
- package/lib/Wallet/Download.js +201 -18
- package/lib/Wallet/Open.d.ts +5 -15
- package/lib/Wallet/Open.js +5 -11
- package/lib/WalletOSIcon/index.d.ts +6 -25
- package/lib/WalletOSIcon/index.js +3 -16
- package/lib/WebWalletSWKeeper/index.d.ts +8 -20
- package/lib/WebWalletSWKeeper/index.js +14 -19
- package/lib/WechatPrompt/index.js +2 -0
- package/lib/global.d.ts +15 -0
- package/lib/type.d.ts +12 -3
- package/lib/withTheme/index.d.ts +8 -6
- package/lib/withTracker/index.d.ts +1 -1
- package/lib/withTracker/index.js +3 -0
- package/package.json +9 -5
- package/src/Address/did-address.tsx +7 -6
- package/src/Address/index.tsx +1 -1
- package/src/Avatar/index.jsx +6 -4
- package/src/Blocklet/blocklet.jsx +2 -2
- package/src/BlockletContext/index.tsx +3 -3
- package/src/BlockletNFT/index.jsx +3 -3
- package/src/BlockletV2/blocklet.tsx +2 -2
- package/src/Button/wrap.jsx +2 -2
- package/src/CardSelector/index.tsx +0 -1
- package/src/Center/index.tsx +1 -1
- package/src/ClickToCopy/copy-button.tsx +4 -4
- package/src/ClickToCopy/hook.ts +3 -2
- package/src/ClickToCopy/index.tsx +6 -5
- package/src/CodeBlock/index.tsx +3 -1
- package/src/CookieConsent/{index.jsx → index.tsx} +16 -19
- package/src/CountDown/{index.jsx → index.tsx} +30 -16
- package/src/DID/index.tsx +9 -8
- package/src/Datatable/index.jsx +5 -5
- package/src/Dialog/confirm.jsx +3 -3
- package/src/Dialog/types.d.ts +1 -1
- package/src/DidLogo/{index.jsx → index.tsx} +7 -14
- package/src/DriftBot/{index.jsx → index.tsx} +13 -11
- package/src/Earth/{index.jsx → index.tsx} +94 -66
- package/src/Earth/{util.js → util.ts} +20 -17
- package/src/ErrorBoundary/{fallback.jsx → fallback.tsx} +20 -21
- package/src/Footer/{index.jsx → index.tsx} +17 -14
- package/src/Header/header.tsx +2 -3
- package/src/Header/responsive-header.tsx +0 -1
- package/src/Icon/image.tsx +3 -3
- package/src/Icon/index.tsx +7 -4
- package/src/Img/index.jsx +1 -1
- package/src/InfoRow/{index.jsx → index.tsx} +32 -25
- package/src/Layout/dashboard/external-link.tsx +46 -0
- package/src/Layout/dashboard/{full-page.jsx → full-page.tsx} +20 -9
- package/src/Layout/dashboard/{index.jsx → index.tsx} +42 -44
- package/src/Layout/dashboard/{sidebar.jsx → sidebar.tsx} +23 -20
- package/src/Layout/dashboard-legacy/{header.jsx → header.tsx} +16 -26
- package/src/Layout/dashboard-legacy/{index.jsx → index.tsx} +32 -46
- package/src/Layout/dashboard-legacy/{sidebar.jsx → sidebar.tsx} +27 -19
- package/src/Layout/{index.jsx → index.tsx} +41 -47
- package/src/LoadingMask/{index.jsx → index.tsx} +18 -20
- package/src/Locale/{browser-lang.js → browser-lang.ts} +9 -7
- package/src/Locale/context.tsx +18 -11
- package/src/Locale/{languages.js → languages.ts} +1 -1
- package/src/Locale/{selector.jsx → selector.tsx} +32 -29
- package/src/Locale/{util.js → util.ts} +9 -2
- package/src/Logo/index.tsx +58 -0
- package/src/Metric/{index.jsx → index.tsx} +23 -18
- package/src/NFTDisplay/{aspect-ratio-container.jsx → aspect-ratio-container.tsx} +9 -7
- package/src/NFTDisplay/{broken.jsx → broken.tsx} +7 -12
- package/src/NFTDisplay/{displayApi.js → displayApi.ts} +4 -4
- package/src/NFTDisplay/{index.jsx → index.tsx} +59 -64
- package/src/NFTDisplay/svg-embedder/{img.jsx → img.tsx} +10 -18
- package/src/NFTDisplay/svg-embedder/{inline-svg.jsx → inline-svg.tsx} +8 -9
- package/src/NavMenu/nav-menu.tsx +2 -3
- package/src/PageScroller/{index.jsx → index.tsx} +40 -53
- package/src/PageScroller/{usePrevValue.js → usePrevValue.ts} +2 -3
- package/src/Passport/{passport.jsx → passport.tsx} +22 -19
- package/src/PoweredByArcBlock/{index.jsx → index.tsx} +6 -11
- package/src/PricingTable/{PricingPlan.jsx → PricingPlan.tsx} +15 -5
- package/src/PricingTable/{index.jsx → index.tsx} +9 -6
- package/src/QRCode/{index.jsx → index.tsx} +14 -19
- package/src/RelativeTime/{index.jsx → index.tsx} +24 -24
- package/src/Result/{common.jsx → common.tsx} +17 -13
- package/src/Result/index.tsx +30 -0
- package/src/Result/{result.jsx → result.tsx} +8 -17
- package/src/Result/{translations.js → translations.ts} +3 -1
- package/src/Screenshot/BaseScreenshot/{index.jsx → index.tsx} +9 -15
- package/src/Screenshot/BaseScreenshot/shells/{Macbook.jsx → Macbook.tsx} +3 -1
- package/src/Screenshot/BaseScreenshot/shells/{Phone.jsx → Phone.tsx} +3 -1
- package/src/Screenshot/{index.jsx → index.tsx} +60 -54
- package/src/SessionBlocklet/{index.jsx → index.tsx} +9 -14
- package/src/SessionPermission/index.tsx +25 -0
- package/src/SessionUser/components/{logged-in.jsx → logged-in.tsx} +49 -31
- package/src/SessionUser/components/session-user-item.tsx +97 -0
- package/src/SessionUser/components/{session-user-switch.jsx → session-user-switch.tsx} +16 -21
- package/src/SessionUser/components/{un-login.jsx → un-login.tsx} +10 -15
- package/src/SessionUser/components/{user-info.jsx → user-info.tsx} +16 -22
- package/src/SessionUser/index.tsx +26 -0
- package/src/SessionUser/libs/{translation.js → translation.ts} +3 -1
- package/src/SessionUser/libs/utils.ts +39 -0
- package/src/Sparkline/{index.jsx → index.tsx} +38 -22
- package/src/Spinner/index.tsx +20 -0
- package/src/Success/{index.jsx → index.tsx} +13 -16
- package/src/Tabs/{index.jsx → index.tsx} +26 -40
- package/src/TextCollapse/{index.jsx → index.tsx} +26 -21
- package/src/Theme/index.ts +0 -1
- package/src/Theme/theme-provider.tsx +1 -1
- package/src/Theme/theme.ts +6 -3
- package/src/Typography/{index.jsx → index.tsx} +19 -22
- package/src/Util/index.ts +26 -9
- package/src/Video/{index.jsx → index.tsx} +7 -10
- package/src/Wallet/{Action.jsx → Action.tsx} +16 -12
- package/src/Wallet/{Download.jsx → Download.tsx} +25 -21
- package/src/Wallet/{Open.jsx → Open.tsx} +8 -11
- package/src/WalletOSIcon/{index.jsx → index.tsx} +8 -16
- package/src/WebWalletSWKeeper/{index.jsx → index.tsx} +21 -24
- package/src/WechatPrompt/{index.jsx → index.tsx} +1 -0
- package/src/global.d.ts +15 -0
- package/src/type.d.ts +12 -3
- package/src/withTheme/{index.jsx → index.tsx} +12 -2
- package/src/withTracker/{index.jsx → index.tsx} +6 -4
- package/src/Layout/dashboard/external-link.jsx +0 -47
- package/src/Logo/index.jsx +0 -66
- package/src/Result/index.jsx +0 -33
- package/src/SessionPermission/index.jsx +0 -28
- package/src/SessionUser/components/session-user-item.jsx +0 -93
- package/src/SessionUser/index.jsx +0 -38
- package/src/SessionUser/libs/utils.js +0 -37
- package/src/Spinner/index.jsx +0 -21
- /package/src/ErrorBoundary/{index.jsx → index.ts} +0 -0
- /package/src/NFTDisplay/{loading.jsx → loading.tsx} +0 -0
- /package/src/Passport/{index.jsx → index.ts} +0 -0
- /package/src/SessionManager/{index.jsx → index.tsx} +0 -0
@@ -1,29 +1,38 @@
|
|
1
|
-
import
|
2
|
-
import { Box, Typography as MuiTypography, Skeleton } from '@mui/material';
|
1
|
+
import { Box, Typography as MuiTypography, Skeleton, type TypographyProps as MuiTypographyProps } from '@mui/material';
|
3
2
|
import { useCreation, useReactive, useSize } from 'ahooks';
|
4
3
|
import { useEffect, useRef } from 'react';
|
5
4
|
|
6
|
-
export
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
export interface TypographyProps extends MuiTypographyProps {
|
6
|
+
fontSize?: string | number;
|
7
|
+
minFontSize?: number;
|
8
|
+
}
|
9
|
+
|
10
|
+
export default function Typography({ children = null, minFontSize = 12, fontSize, sx, ...rest }: TypographyProps) {
|
11
|
+
const refMock = useRef<HTMLSpanElement>(null);
|
12
|
+
const refContainer = useRef<HTMLDivElement>(null);
|
13
|
+
const state = useReactive<{
|
14
|
+
fontSize?: number;
|
15
|
+
loading: boolean;
|
16
|
+
initialSize?: number;
|
17
|
+
}>({
|
18
|
+
// @ts-expect-error
|
10
19
|
fontSize,
|
11
20
|
loading: true,
|
12
|
-
initialSize: undefined,
|
13
21
|
});
|
14
22
|
const mockSize = useSize(refMock.current);
|
15
23
|
const containerSize = useSize(refContainer.current);
|
24
|
+
|
16
25
|
useEffect(() => {
|
17
26
|
if (state.loading) {
|
18
27
|
if (fontSize === 'auto') {
|
19
28
|
if (mockSize && !state.initialSize) {
|
20
|
-
const styleSize = getComputedStyle(refMock.current).fontSize;
|
29
|
+
const styleSize = getComputedStyle(refMock.current!).fontSize;
|
21
30
|
state.initialSize = Number(styleSize.replace('px', ''));
|
22
31
|
state.fontSize = state.initialSize;
|
23
32
|
}
|
24
33
|
if (containerSize && mockSize) {
|
25
|
-
if (containerSize.width < mockSize.width && state.fontSize > minFontSize) {
|
26
|
-
state.fontSize
|
34
|
+
if (containerSize.width < mockSize.width && state.fontSize! > minFontSize) {
|
35
|
+
state.fontSize!--;
|
27
36
|
} else {
|
28
37
|
state.loading = false;
|
29
38
|
}
|
@@ -72,15 +81,3 @@ export default function Typography({ minFontSize, fontSize, children, sx, ...res
|
|
72
81
|
</MuiTypography>
|
73
82
|
);
|
74
83
|
}
|
75
|
-
|
76
|
-
Typography.propTypes = {
|
77
|
-
fontSize: PropTyps.oneOfType([PropTyps.string, PropTyps.number]),
|
78
|
-
children: PropTyps.any.isRequired,
|
79
|
-
minFontSize: PropTyps.number,
|
80
|
-
sx: PropTyps.object,
|
81
|
-
};
|
82
|
-
Typography.defaultProps = {
|
83
|
-
fontSize: undefined,
|
84
|
-
minFontSize: 12,
|
85
|
-
sx: {},
|
86
|
-
};
|
package/src/Util/index.ts
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
import padStart from 'lodash/padStart';
|
3
3
|
import { getDIDMotifInfo, colors } from '@arcblock/did-motif';
|
4
4
|
import { DID_PREFIX, WELLKNOWN_SERVICE_PATH_PREFIX } from './constant';
|
5
|
-
import type { $TSFixMe } from '../type';
|
5
|
+
import type { $TSFixMe, Locale } from '../type';
|
6
6
|
|
7
7
|
let dateTool: $TSFixMe | null = null;
|
8
8
|
|
@@ -92,6 +92,11 @@ export const getBackground = (props: $TSFixMe) => {
|
|
92
92
|
return props.theme.palette.common.white;
|
93
93
|
};
|
94
94
|
|
95
|
+
/**
|
96
|
+
* 1. 将 props 中以 ::prop:: 开头的字符串替换为 component.defaultProps 中的值
|
97
|
+
* 2. 将 props 中由 jsonAttrs 指定的 json 字符串转换为对象
|
98
|
+
* 3. 最后将 props 中的 ::prop:: 字符串替换为 ''
|
99
|
+
*/
|
95
100
|
export function mergeProps<P extends object>(
|
96
101
|
props: Record<string, any>,
|
97
102
|
component: React.ComponentType<P>,
|
@@ -180,7 +185,7 @@ export function getDateTool() {
|
|
180
185
|
|
181
186
|
const createDateFormatter =
|
182
187
|
(format: string) =>
|
183
|
-
(date: string, { locale, tz }: { locale?:
|
188
|
+
(date: string, { locale, tz }: { locale?: Locale; tz?: string } = {}) => {
|
184
189
|
if (dateTool === null) {
|
185
190
|
throw new Error('call setDateTool to set the date tool library, such as: setDateTool(dayjs)');
|
186
191
|
}
|
@@ -207,7 +212,7 @@ const createDateFormatter =
|
|
207
212
|
* Ensure that the setDateTool() function is called first to set the time tool library.
|
208
213
|
* @returns formatted date string
|
209
214
|
*/
|
210
|
-
export function formatToDate(date: string, { locale = 'en', tz }: { locale?:
|
215
|
+
export function formatToDate(date: string, { locale = 'en', tz }: { locale?: Locale; tz?: string } = {}) {
|
211
216
|
return createDateFormatter('ll')(date, { locale, tz });
|
212
217
|
}
|
213
218
|
|
@@ -216,7 +221,7 @@ export function formatToDate(date: string, { locale = 'en', tz }: { locale?: str
|
|
216
221
|
* Ensure that the setDateTool() function is called first to set the time tool library.
|
217
222
|
* @returns formatted date string
|
218
223
|
*/
|
219
|
-
export function formatToDatetime(date: string, { locale = 'en', tz }: { locale?:
|
224
|
+
export function formatToDatetime(date: string, { locale = 'en', tz }: { locale?: Locale; tz?: string } = {}) {
|
220
225
|
return createDateFormatter('lll')(date, { locale, tz });
|
221
226
|
}
|
222
227
|
|
@@ -236,12 +241,16 @@ export function openWebWallet({
|
|
236
241
|
locale = 'en',
|
237
242
|
url,
|
238
243
|
windowFeatures,
|
244
|
+
appInfo,
|
245
|
+
memberAppInfo,
|
239
246
|
}: {
|
240
247
|
webWalletUrl: string;
|
241
248
|
action?: string;
|
242
|
-
locale?:
|
249
|
+
locale?: Locale;
|
243
250
|
url: string;
|
244
251
|
windowFeatures: $TSFixMe;
|
252
|
+
appInfo: $TSFixMe;
|
253
|
+
memberAppInfo: $TSFixMe;
|
245
254
|
}) {
|
246
255
|
// web wallet extension
|
247
256
|
const extension = detectWalletExtension();
|
@@ -250,9 +259,15 @@ export function openWebWallet({
|
|
250
259
|
action,
|
251
260
|
locale,
|
252
261
|
url: encodeURIComponent(url),
|
262
|
+
appInfo: {
|
263
|
+
...appInfo,
|
264
|
+
},
|
265
|
+
memberAppInfo: {
|
266
|
+
...memberAppInfo,
|
267
|
+
},
|
253
268
|
});
|
254
269
|
|
255
|
-
return;
|
270
|
+
return { type: 'extension' };
|
256
271
|
}
|
257
272
|
|
258
273
|
const defaultWindowFeatures = {
|
@@ -285,6 +300,7 @@ export function openWebWallet({
|
|
285
300
|
.map((key) => `${key}=${mergedWindowFeatures[key]}`)
|
286
301
|
.join(',');
|
287
302
|
window.open(windowUrl, 'targetWindow', strWindowFeatures);
|
303
|
+
return { type: 'web' };
|
288
304
|
}
|
289
305
|
|
290
306
|
export const getFontSize = (size: string) => {
|
@@ -409,15 +425,16 @@ type TranslationsObject = {
|
|
409
425
|
* @return {string} The translated string based on the locale, with fallback options if necessary.
|
410
426
|
*/
|
411
427
|
export const getTranslation = (
|
412
|
-
translations:
|
413
|
-
locale:
|
414
|
-
options: { fallbackLocale?:
|
428
|
+
translations: TranslationsObject,
|
429
|
+
locale: Locale,
|
430
|
+
options: { fallbackLocale?: Locale; defaultValue?: string } = {}
|
415
431
|
) => {
|
416
432
|
const { fallbackLocale = 'en', defaultValue = 'unknown' } = options;
|
417
433
|
|
418
434
|
if (typeof translations === 'string') {
|
419
435
|
return translations;
|
420
436
|
}
|
437
|
+
|
421
438
|
let translation;
|
422
439
|
if (locale) {
|
423
440
|
translation = translations[locale];
|
@@ -1,14 +1,18 @@
|
|
1
1
|
import { useState } from 'react';
|
2
|
-
import PropTypes from 'prop-types';
|
3
2
|
import Player from 'react-player';
|
4
3
|
import CircularProgress from '@mui/material/CircularProgress';
|
5
4
|
|
6
5
|
import { mergeProps } from '../Util';
|
7
6
|
import { styled } from '../Theme';
|
8
7
|
|
9
|
-
|
8
|
+
export interface VideoProps {
|
9
|
+
url: string;
|
10
|
+
width?: string | number;
|
11
|
+
height?: string | number;
|
12
|
+
style?: React.CSSProperties;
|
13
|
+
}
|
10
14
|
|
11
|
-
export default function Video(props) {
|
15
|
+
export default function Video(props: VideoProps) {
|
12
16
|
const newProps = mergeProps(props, Video, ['style']);
|
13
17
|
const { url, width, height, style } = newProps;
|
14
18
|
const [loaded, setLoaded] = useState(false);
|
@@ -36,13 +40,6 @@ export default function Video(props) {
|
|
36
40
|
);
|
37
41
|
}
|
38
42
|
|
39
|
-
Video.propTypes = {
|
40
|
-
url: oneOfType([string, array, object]).isRequired,
|
41
|
-
width: oneOfType([string, number]),
|
42
|
-
height: oneOfType([string, number]),
|
43
|
-
style: oneOfType([string, object]),
|
44
|
-
};
|
45
|
-
|
46
43
|
Video.defaultProps = {
|
47
44
|
width: 640,
|
48
45
|
height: 400,
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import PropTypes from 'prop-types';
|
2
1
|
import Typography from '@mui/material/Typography';
|
3
2
|
|
4
3
|
import logo from './images/abtwallet.png';
|
@@ -7,7 +6,14 @@ import colors from '../Colors';
|
|
7
6
|
import Button from '../Button';
|
8
7
|
import { styled } from '../Theme';
|
9
8
|
|
10
|
-
export
|
9
|
+
export interface WalletActionProps {
|
10
|
+
action?: string;
|
11
|
+
size?: 'xlarge' | 'large' | 'medium' | 'small';
|
12
|
+
textLayout?: 'vertical' | 'horizontal';
|
13
|
+
style?: React.CSSProperties;
|
14
|
+
}
|
15
|
+
|
16
|
+
export default function WalletAction(props: WalletActionProps) {
|
11
17
|
const newProps = mergeProps(props, WalletAction, ['style']);
|
12
18
|
const { action, size, textLayout, style = {}, ...rest } = newProps;
|
13
19
|
const styles = Object.assign({}, style, { border: 'none', padding: 0 });
|
@@ -32,17 +38,10 @@ export default function WalletAction(props) {
|
|
32
38
|
);
|
33
39
|
}
|
34
40
|
|
35
|
-
WalletAction.propTypes = {
|
36
|
-
action: PropTypes.string,
|
37
|
-
size: PropTypes.oneOf(['xlarge', 'large', 'medium', 'small']),
|
38
|
-
textLayout: PropTypes.oneOf(['vertical', 'horizontal']),
|
39
|
-
style: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
|
40
|
-
};
|
41
|
-
|
42
41
|
WalletAction.defaultProps = {
|
43
42
|
action: 'Login',
|
44
|
-
textLayout: 'vertical',
|
45
|
-
size: 'medium',
|
43
|
+
textLayout: 'vertical' as const,
|
44
|
+
size: 'medium' as const,
|
46
45
|
style: {},
|
47
46
|
};
|
48
47
|
|
@@ -61,7 +60,12 @@ const sizes = {
|
|
61
60
|
},
|
62
61
|
};
|
63
62
|
|
64
|
-
|
63
|
+
type ContentProps = {
|
64
|
+
size: NonNullable<WalletActionProps['size']>;
|
65
|
+
color: string;
|
66
|
+
};
|
67
|
+
|
68
|
+
const Content = styled('div')<ContentProps>`
|
65
69
|
display: flex;
|
66
70
|
justify-content: center;
|
67
71
|
align-items: center;
|
@@ -1,21 +1,31 @@
|
|
1
|
-
import PropTypes from 'prop-types';
|
2
1
|
import Typography from '@mui/material/Typography';
|
3
2
|
import useBrowser from '@arcblock/react-hooks/lib/useBrowser';
|
3
|
+
import { type SxProps } from '@mui/material';
|
4
4
|
|
5
|
-
|
6
|
-
import
|
7
|
-
|
8
|
-
import GooglePlayIcon from './images/google-play.svg?react';
|
9
|
-
// eslint-disable-next-line import/no-unresolved
|
10
|
-
import AndroidDownloadIcon from './images/android_download.svg?react';
|
5
|
+
import { ReactComponent as AppStoreIcon } from './images/app-store.svg';
|
6
|
+
import { ReactComponent as GooglePlayIcon } from './images/google-play.svg';
|
7
|
+
import { ReactComponent as AndroidDownloadIcon } from './images/android_download.svg';
|
11
8
|
|
12
9
|
import Button from '../Button';
|
13
10
|
import { mergeProps } from '../Util';
|
14
11
|
import { styled } from '../Theme';
|
12
|
+
import type { Locale } from '../type';
|
15
13
|
|
16
|
-
export
|
14
|
+
export interface WalletDownloadProps extends React.HTMLAttributes<HTMLDivElement> {
|
15
|
+
title?: string;
|
16
|
+
layout?: 'vertical' | 'horizontal';
|
17
|
+
storeLayout?: 'vertical' | 'horizontal';
|
18
|
+
style?: React.CSSProperties;
|
19
|
+
iosLink?: string;
|
20
|
+
androidLink?: string;
|
21
|
+
androidDownLoadUrl?: string;
|
22
|
+
locale?: Locale;
|
23
|
+
sx?: SxProps;
|
24
|
+
}
|
25
|
+
|
26
|
+
export default function WalletDownload(props: WalletDownloadProps) {
|
17
27
|
const browser = useBrowser();
|
18
|
-
const newProps = mergeProps(props, WalletDownload, ['style']);
|
28
|
+
const newProps = mergeProps(props, WalletDownload, ['style']) as WalletDownloadProps;
|
19
29
|
const { title, children, iosLink, androidLink, androidDownLoadUrl, locale, ...rest } = newProps;
|
20
30
|
|
21
31
|
const isAndroid = browser.mobile.android.phone || browser.mobile.android.tablet;
|
@@ -77,17 +87,6 @@ export default function WalletDownload(props) {
|
|
77
87
|
);
|
78
88
|
}
|
79
89
|
|
80
|
-
WalletDownload.propTypes = {
|
81
|
-
title: PropTypes.string,
|
82
|
-
layout: PropTypes.oneOf(['vertical', 'horizontal']),
|
83
|
-
storeLayout: PropTypes.oneOf(['vertical', 'horizontal']),
|
84
|
-
style: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
|
85
|
-
iosLink: PropTypes.string,
|
86
|
-
androidLink: PropTypes.string,
|
87
|
-
androidDownLoadUrl: PropTypes.string,
|
88
|
-
locale: PropTypes.oneOf(['en', 'zh']),
|
89
|
-
};
|
90
|
-
|
91
90
|
WalletDownload.defaultProps = {
|
92
91
|
title: 'Download DID Wallet',
|
93
92
|
layout: 'vertical',
|
@@ -97,9 +96,14 @@ WalletDownload.defaultProps = {
|
|
97
96
|
androidDownLoadUrl: 'https://releases.arcblockio.cn/arcwallet_android/latest/abtwallet.apk',
|
98
97
|
style: {},
|
99
98
|
locale: 'zh',
|
99
|
+
} as const;
|
100
|
+
|
101
|
+
type ContainerProps = {
|
102
|
+
layout?: WalletDownloadProps['layout'];
|
103
|
+
storeLayout?: WalletDownloadProps['storeLayout'];
|
100
104
|
};
|
101
105
|
|
102
|
-
const Container = styled('div')
|
106
|
+
const Container = styled('div')<ContainerProps>`
|
103
107
|
display: flex;
|
104
108
|
flex-direction: ${(props) => (props.layout === 'vertical' ? 'column' : 'row')};
|
105
109
|
align-items: center;
|
@@ -1,10 +1,15 @@
|
|
1
|
-
import PropTypes from 'prop-types';
|
2
1
|
import useBrowser from '@arcblock/react-hooks/lib/useBrowser';
|
3
2
|
import Fab from '@mui/material/Fab';
|
4
3
|
|
5
4
|
import { styled } from '../Theme';
|
5
|
+
import type { Locale } from '../type';
|
6
6
|
|
7
|
-
export
|
7
|
+
export interface OpenInWalletProps {
|
8
|
+
link: string;
|
9
|
+
locale?: Locale;
|
10
|
+
}
|
11
|
+
|
12
|
+
export default function OpenInWallet({ link, locale = 'zh' }: OpenInWalletProps) {
|
8
13
|
const buttonText = locale === 'zh' ? '在 DID 钱包打开' : 'Open in DID Wallet';
|
9
14
|
const browser = useBrowser();
|
10
15
|
|
@@ -17,6 +22,7 @@ export default function OpenInWallet({ locale, link }) {
|
|
17
22
|
href={deepLink}
|
18
23
|
variant="extended"
|
19
24
|
color="primary"
|
25
|
+
// @ts-expect-error
|
20
26
|
rounded
|
21
27
|
target="_blank"
|
22
28
|
className="open-in-wallet-button">
|
@@ -27,15 +33,6 @@ export default function OpenInWallet({ locale, link }) {
|
|
27
33
|
return null;
|
28
34
|
}
|
29
35
|
|
30
|
-
OpenInWallet.propTypes = {
|
31
|
-
locale: PropTypes.oneOf(['en', 'zh']),
|
32
|
-
link: PropTypes.string.isRequired,
|
33
|
-
};
|
34
|
-
|
35
|
-
OpenInWallet.defaultProps = {
|
36
|
-
locale: 'zh',
|
37
|
-
};
|
38
|
-
|
39
36
|
const Button = styled(Fab)`
|
40
37
|
&& {
|
41
38
|
font-size: 12px;
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import PropTypes from 'prop-types';
|
2
1
|
import { Icon } from '@iconify/react';
|
3
2
|
import ApiIcon from '@iconify-icons/mdi/api';
|
4
3
|
import IOSRoundedIcon from '@iconify-icons/material-symbols/ios-rounded';
|
@@ -9,7 +8,14 @@ import QuestionMarkRoundedIcon from '@iconify-icons/material-symbols/question-ma
|
|
9
8
|
import MailOutlineRoundedIcon from '@iconify-icons/material-symbols/mail-outline-rounded';
|
10
9
|
import { LOGIN_PROVIDER } from '../Util/constant';
|
11
10
|
|
12
|
-
export
|
11
|
+
export interface WalletOSIconProps {
|
12
|
+
loading?: false | true;
|
13
|
+
walletOS?: string;
|
14
|
+
provider?: string;
|
15
|
+
color?: string;
|
16
|
+
}
|
17
|
+
|
18
|
+
export default function WalletOSIcon({ loading = false, walletOS, provider, color = 'black' }: WalletOSIconProps) {
|
13
19
|
if (loading) {
|
14
20
|
return <Icon icon={QuestionMarkRoundedIcon} style={{ color: 'transparent' }} />;
|
15
21
|
}
|
@@ -31,17 +37,3 @@ export default function WalletOSIcon({ loading, walletOS, provider, color }) {
|
|
31
37
|
}
|
32
38
|
return null;
|
33
39
|
}
|
34
|
-
|
35
|
-
WalletOSIcon.propTypes = {
|
36
|
-
loading: PropTypes.bool,
|
37
|
-
walletOS: PropTypes.string,
|
38
|
-
provider: PropTypes.string,
|
39
|
-
color: PropTypes.string,
|
40
|
-
};
|
41
|
-
|
42
|
-
WalletOSIcon.defaultProps = {
|
43
|
-
loading: false,
|
44
|
-
walletOS: null,
|
45
|
-
provider: null,
|
46
|
-
color: 'black',
|
47
|
-
};
|
@@ -1,5 +1,4 @@
|
|
1
1
|
import { useEffect, useRef } from 'react';
|
2
|
-
import PropTypes from 'prop-types';
|
3
2
|
import useIdle from 'react-use/lib/useIdle';
|
4
3
|
import { useLocalStorageState } from 'ahooks';
|
5
4
|
import useBrowser from '@arcblock/react-hooks/lib/useBrowser';
|
@@ -12,21 +11,21 @@ const DEFAULT_MAX_IDLE_TIME = 1000 * 60 * 30;
|
|
12
11
|
// 可使用 localStorage.setItem('wallet_sw_keeper_disabled', 1) 来禁用嵌入 wallet iframe
|
13
12
|
const STORAGE_KEY_DISABLED = 'wallet_sw_keeper_disabled';
|
14
13
|
// iframe id, 如果存在多个 WebWalletSWKeeper 组件实例, 共享此 id, 保证只有一个 iframe
|
15
|
-
let id;
|
14
|
+
let id: string;
|
16
15
|
|
17
|
-
const injectIframe = (webWalletUrl) => {
|
16
|
+
const injectIframe = (webWalletUrl: string) => {
|
18
17
|
const iframe = document.createElement('iframe');
|
19
18
|
iframe.title = 'abt wallet';
|
20
19
|
iframe.id = id;
|
21
|
-
iframe.style.width = 0;
|
22
|
-
iframe.style.height = 0;
|
23
|
-
iframe.style.border = 0;
|
20
|
+
iframe.style.width = '0';
|
21
|
+
iframe.style.height = '0';
|
22
|
+
iframe.style.border = '0';
|
24
23
|
// https://stackoverflow.com/questions/27858989/iframe-with-0-height-creates-a-gap
|
25
24
|
iframe.style.display = 'block';
|
26
25
|
// fix: 页面自动滚动到底部问题 (https://github.com/blocklet/abt-wallet/issues/1160)
|
27
26
|
// top: 0 可能不是必须的, 但测试中发现, 如果不设置, 在某些特殊情况下似乎也会导致页面自动滚动到底部
|
28
27
|
iframe.style.position = 'absolute';
|
29
|
-
iframe.style.top = 0;
|
28
|
+
iframe.style.top = '0';
|
30
29
|
iframe.src = `${webWalletUrl}?action=iframe`;
|
31
30
|
document.body.appendChild(iframe);
|
32
31
|
};
|
@@ -40,18 +39,23 @@ const removeIframe = () => {
|
|
40
39
|
|
41
40
|
const cleanup = () => {
|
42
41
|
removeIframe();
|
43
|
-
id =
|
42
|
+
id = '';
|
44
43
|
};
|
45
44
|
|
46
|
-
const enable = (webWalletUrl) => {
|
45
|
+
const enable = (webWalletUrl: string) => {
|
47
46
|
if (!id) {
|
48
47
|
id = `web_wallet_sw_keeper_${Date.now()}`;
|
49
48
|
injectIframe(webWalletUrl);
|
50
49
|
}
|
51
50
|
};
|
52
51
|
|
52
|
+
interface WebWalletSWKeeperProps {
|
53
|
+
webWalletUrl: string;
|
54
|
+
maxIdleTime: number;
|
55
|
+
}
|
56
|
+
|
53
57
|
// 该组件通过嵌入一个 web wallet iframe 帮助 web wallet service worker 延最大空闲时间
|
54
|
-
function WebWalletSWKeeper({ webWalletUrl, maxIdleTime }) {
|
58
|
+
function WebWalletSWKeeper({ webWalletUrl, maxIdleTime = DEFAULT_MAX_IDLE_TIME }: WebWalletSWKeeperProps) {
|
55
59
|
// 渲染前先记录是否已经存在一个 WebWalletSWKeeper 实例
|
56
60
|
const instanceExists = useRef(!!id);
|
57
61
|
const isIdle = useIdle(maxIdleTime);
|
@@ -75,20 +79,9 @@ function WebWalletSWKeeper({ webWalletUrl, maxIdleTime }) {
|
|
75
79
|
return null;
|
76
80
|
}
|
77
81
|
|
78
|
-
|
79
|
-
webWalletUrl: PropTypes.string.isRequired,
|
80
|
-
maxIdleTime: PropTypes.number,
|
81
|
-
};
|
82
|
-
|
83
|
-
WebWalletSWKeeper.defaultProps = {
|
84
|
-
maxIdleTime: DEFAULT_MAX_IDLE_TIME,
|
85
|
-
};
|
86
|
-
|
87
|
-
export default WebWalletSWKeeper;
|
88
|
-
|
89
|
-
export const withWebWalletSWKeeper = (Component) => {
|
82
|
+
export const withWebWalletSWKeeper = <P extends { webWalletUrl: string }>(Component: React.ComponentType<P>) => {
|
90
83
|
// eslint-disable-next-line react/prop-types
|
91
|
-
return function WithWebWalletSWKeeperComponent({ webWalletUrl, maxIdleTime, ...rest }) {
|
84
|
+
return function WithWebWalletSWKeeperComponent({ webWalletUrl, maxIdleTime, ...rest }: WebWalletSWKeeperProps & P) {
|
92
85
|
const browser = useBrowser();
|
93
86
|
// eslint-disable-next-line no-param-reassign
|
94
87
|
webWalletUrl = webWalletUrl || getWebWalletUrl();
|
@@ -103,13 +96,17 @@ export const withWebWalletSWKeeper = (Component) => {
|
|
103
96
|
// - 检查到 wallet 浏览器插件
|
104
97
|
// - webWalletUrl 与当前页面 url 的 protocol 不同
|
105
98
|
// - wallet webview
|
99
|
+
|
100
|
+
const props = { webWalletUrl, ...rest } as unknown as P;
|
106
101
|
return (
|
107
102
|
<>
|
108
103
|
{!disabled && !extension && isSameProtocol && !isWalletWebview && (
|
109
104
|
<WebWalletSWKeeper webWalletUrl={webWalletUrl} maxIdleTime={maxIdleTime} />
|
110
105
|
)}
|
111
|
-
<Component
|
106
|
+
<Component {...props} />
|
112
107
|
</>
|
113
108
|
);
|
114
109
|
};
|
115
110
|
};
|
111
|
+
|
112
|
+
export default WebWalletSWKeeper;
|
package/src/global.d.ts
CHANGED
@@ -1,4 +1,19 @@
|
|
1
1
|
declare module '@arcblock/did-motif';
|
2
|
+
declare module 'd3-geo';
|
3
|
+
declare module 'topojson-client';
|
4
|
+
declare module 'versor';
|
5
|
+
declare module 'axios/*';
|
6
|
+
|
7
|
+
// ux svg 由 babel-plugin-inline-react-svg 处理
|
8
|
+
declare module '*.svg' {
|
9
|
+
import * as React from 'react';
|
10
|
+
const ReactComponent: React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
|
11
|
+
export { ReactComponent };
|
12
|
+
}
|
13
|
+
|
14
|
+
declare module '*.png' {
|
15
|
+
export default string;
|
16
|
+
}
|
2
17
|
|
3
18
|
type Blocklet = import('./type').Blocklet;
|
4
19
|
|
package/src/type.d.ts
CHANGED
@@ -1,5 +1,14 @@
|
|
1
|
+
import type { Theme } from '@mui/material';
|
2
|
+
import type { LiteralUnion } from 'type-fest';
|
3
|
+
|
1
4
|
export type $TSFixMe = any;
|
5
|
+
export type Translations = Record<string, Record<string, any>>;
|
6
|
+
export type Locale = LiteralUnion<'en' | 'zh', string>;
|
2
7
|
|
8
|
+
// TODO: 以下为 blocklet 应用专属的全局对象类型,可以更加具体
|
9
|
+
export type User = Record<string, any>;
|
10
|
+
export type Session = Record<string, any>;
|
11
|
+
export type Passport = Record<string, any>;
|
3
12
|
export type Blocklet = {
|
4
13
|
appId: string;
|
5
14
|
appIds: string[];
|
@@ -16,15 +25,15 @@ export type Blocklet = {
|
|
16
25
|
version: string;
|
17
26
|
mode: string;
|
18
27
|
tenantMode: 'single' | 'multiple';
|
19
|
-
theme:
|
20
|
-
navigation:
|
28
|
+
theme: Theme;
|
29
|
+
navigation: $TSFixMe[];
|
21
30
|
preferences: Record<string, any>;
|
22
31
|
languages: {
|
23
32
|
code: string;
|
24
33
|
name: string;
|
25
34
|
}[];
|
26
35
|
passportColor: string;
|
27
|
-
componentMountPoints:
|
36
|
+
componentMountPoints: $TSFixMe[];
|
28
37
|
alsoKnownAs: string[];
|
29
38
|
trustedFactories: string[];
|
30
39
|
[x: string]: any;
|
@@ -1,10 +1,20 @@
|
|
1
1
|
import { useEffect } from 'react';
|
2
2
|
import { Global, css } from '@emotion/react';
|
3
3
|
import CssBaseline from '@mui/material/CssBaseline';
|
4
|
+
import { type PaletteOptions } from '@mui/material/styles/createPalette';
|
5
|
+
import { type TypographyOptions } from '@mui/material/styles/createTypography';
|
4
6
|
|
5
7
|
import { createTheme, ThemeProvider } from '../Theme';
|
6
8
|
|
7
|
-
function withTheme
|
9
|
+
function withTheme<P extends object>(
|
10
|
+
Component: React.ComponentType<P>,
|
11
|
+
{
|
12
|
+
mode = 'light',
|
13
|
+
pageWidth = 'md',
|
14
|
+
palette,
|
15
|
+
typography,
|
16
|
+
}: { mode?: string; pageWidth?: string; palette?: PaletteOptions; typography?: TypographyOptions } = {}
|
17
|
+
) {
|
8
18
|
const theme = createTheme({ mode, pageWidth, palette, typography });
|
9
19
|
|
10
20
|
const globalStyles = css`
|
@@ -41,7 +51,7 @@ function withTheme(Component, { mode = 'light', pageWidth = 'md', palette, typog
|
|
41
51
|
}
|
42
52
|
`;
|
43
53
|
|
44
|
-
return function WithTheme(props) {
|
54
|
+
return function WithTheme(props: P) {
|
45
55
|
useEffect(() => {
|
46
56
|
const jssStyles = document.querySelector('#jss-server-side');
|
47
57
|
if (jssStyles && jssStyles.parentNode) {
|
@@ -2,9 +2,9 @@ import { useLocation } from 'react-router-dom';
|
|
2
2
|
import { useMount, useDeepCompareEffect } from 'ahooks';
|
3
3
|
import ReactGA from 'react-ga4';
|
4
4
|
|
5
|
-
export default (WrappedComponent) => {
|
5
|
+
export default <P extends object>(WrappedComponent: React.ComponentType<P>) => {
|
6
6
|
const trackingId = window.blocklet?.GA_MEASUREMENT_ID || '';
|
7
|
-
const trackPage = (page, title = document.title) => {
|
7
|
+
const trackPage = (page: string, title = document.title) => {
|
8
8
|
if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {
|
9
9
|
return;
|
10
10
|
}
|
@@ -14,7 +14,7 @@ export default (WrappedComponent) => {
|
|
14
14
|
}
|
15
15
|
};
|
16
16
|
|
17
|
-
const trackEvent = (category, action, label, value) => {
|
17
|
+
const trackEvent = (category: string, action: string, label: string, value: number) => {
|
18
18
|
if (trackingId) {
|
19
19
|
ReactGA.event({ category, action, label, value, transport: 'beacon' });
|
20
20
|
}
|
@@ -24,10 +24,12 @@ export default (WrappedComponent) => {
|
|
24
24
|
ReactGA.initialize(trackingId);
|
25
25
|
}
|
26
26
|
|
27
|
+
// @ts-ignore
|
27
28
|
window.trackPage = trackPage;
|
29
|
+
// @ts-ignore
|
28
30
|
window.trackEvent = trackEvent;
|
29
31
|
|
30
|
-
return function TrackedComponent(props) {
|
32
|
+
return function TrackedComponent(props: P) {
|
31
33
|
const location = useLocation();
|
32
34
|
|
33
35
|
useMount(() => {
|