@arcblock/ux 2.10.67 → 2.10.68
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 +2 -18
- 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 +1 -15
- 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 +3 -14
- 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 +4 -16
- 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 +11 -6
- package/lib/Util/index.js +6 -0
- 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} +17 -19
- 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} +13 -17
- 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} +8 -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} +7 -13
- 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 +14 -8
- 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
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
|
|
|
@@ -239,7 +244,7 @@ export function openWebWallet({
|
|
|
239
244
|
}: {
|
|
240
245
|
webWalletUrl: string;
|
|
241
246
|
action?: string;
|
|
242
|
-
locale?:
|
|
247
|
+
locale?: Locale;
|
|
243
248
|
url: string;
|
|
244
249
|
windowFeatures: $TSFixMe;
|
|
245
250
|
}) {
|
|
@@ -409,15 +414,16 @@ type TranslationsObject = {
|
|
|
409
414
|
* @return {string} The translated string based on the locale, with fallback options if necessary.
|
|
410
415
|
*/
|
|
411
416
|
export const getTranslation = (
|
|
412
|
-
translations:
|
|
413
|
-
locale:
|
|
414
|
-
options: { fallbackLocale?:
|
|
417
|
+
translations: TranslationsObject,
|
|
418
|
+
locale: Locale,
|
|
419
|
+
options: { fallbackLocale?: Locale; defaultValue?: string } = {}
|
|
415
420
|
) => {
|
|
416
421
|
const { fallbackLocale = 'en', defaultValue = 'unknown' } = options;
|
|
417
422
|
|
|
418
423
|
if (typeof translations === 'string') {
|
|
419
424
|
return translations;
|
|
420
425
|
}
|
|
426
|
+
|
|
421
427
|
let translation;
|
|
422
428
|
if (locale) {
|
|
423
429
|
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(() => {
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import PropTypes from 'prop-types';
|
|
2
|
-
import { Link as RouterLink, NavLink as RouterNavLink } from 'react-router-dom';
|
|
3
|
-
|
|
4
|
-
// 包裹 router Link/NavLink 组件, 支持 external link (external 为 true 时渲染为 a 标签)
|
|
5
|
-
function ExternalLink({ children, routerLinkComponent: RouterLinkComponent, to, external, ...rest }) {
|
|
6
|
-
if (external) {
|
|
7
|
-
return (
|
|
8
|
-
<a href={to} {...rest}>
|
|
9
|
-
{children}
|
|
10
|
-
</a>
|
|
11
|
-
);
|
|
12
|
-
}
|
|
13
|
-
return (
|
|
14
|
-
<RouterLinkComponent to={to} {...rest}>
|
|
15
|
-
{children}
|
|
16
|
-
</RouterLinkComponent>
|
|
17
|
-
);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
ExternalLink.propTypes = {
|
|
21
|
-
children: PropTypes.any.isRequired,
|
|
22
|
-
routerLinkComponent: PropTypes.elementType.isRequired,
|
|
23
|
-
external: PropTypes.bool,
|
|
24
|
-
to: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
ExternalLink.defaultProps = {
|
|
28
|
-
external: false,
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export function Link(props) {
|
|
32
|
-
return <ExternalLink routerLinkComponent={RouterLink} {...props} />;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function NavLink({ className, ...rest }) {
|
|
36
|
-
// NavLink#className 支持 function
|
|
37
|
-
const classes = rest.external && typeof className === 'function' ? className({}) : className;
|
|
38
|
-
return <ExternalLink routerLinkComponent={RouterNavLink} className={classes} {...rest} />;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
NavLink.propTypes = {
|
|
42
|
-
className: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
NavLink.defaultProps = {
|
|
46
|
-
className: '',
|
|
47
|
-
};
|
package/src/Logo/index.jsx
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import PropTypes from 'prop-types';
|
|
2
|
-
|
|
3
|
-
import { styled } from '../Theme';
|
|
4
|
-
|
|
5
|
-
// eslint-disable-next-line import/no-unresolved
|
|
6
|
-
import LightLogo from './images/logo-light-top.svg?react';
|
|
7
|
-
// eslint-disable-next-line import/no-unresolved
|
|
8
|
-
import LightText from './images/logo-light-text.svg?react';
|
|
9
|
-
// eslint-disable-next-line import/no-unresolved
|
|
10
|
-
import DarkLogo from './images/logo-dark-top.svg?react';
|
|
11
|
-
// eslint-disable-next-line import/no-unresolved
|
|
12
|
-
import DarkText from './images/logo-dark-text.svg?react';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
@typedef {import('react').HTMLAttributes<HTMLSpanElement> & {
|
|
16
|
-
mode?: 'light' | 'dark',
|
|
17
|
-
layout?: 'vertical' | 'horizontal',
|
|
18
|
-
showText?: boolean,
|
|
19
|
-
showLogo?: boolean,
|
|
20
|
-
}} LogoProps
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @description
|
|
25
|
-
* @export
|
|
26
|
-
* @param {LogoProps} props
|
|
27
|
-
* @return {React.ReactComponentElement}
|
|
28
|
-
*/
|
|
29
|
-
export default function Logo({ showText, showLogo, mode, layout, ...rest }) {
|
|
30
|
-
const logo = mode === 'light' ? <LightLogo /> : <DarkLogo />;
|
|
31
|
-
const text = mode === 'light' ? <LightText className="logo-text" /> : <DarkText className="logo-text" />;
|
|
32
|
-
|
|
33
|
-
return (
|
|
34
|
-
<Container layout={layout} {...rest}>
|
|
35
|
-
{showLogo && logo}
|
|
36
|
-
{showText && text}
|
|
37
|
-
</Container>
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
Logo.propTypes = {
|
|
42
|
-
mode: PropTypes.oneOf(['light', 'dark']),
|
|
43
|
-
layout: PropTypes.oneOf(['vertical', 'horizontal']),
|
|
44
|
-
showText: PropTypes.bool,
|
|
45
|
-
showLogo: PropTypes.bool,
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
Logo.defaultProps = {
|
|
49
|
-
mode: 'dark',
|
|
50
|
-
layout: 'vertical',
|
|
51
|
-
showText: true,
|
|
52
|
-
showLogo: true,
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
/** @type {import('@emotion/styled').StyledComponent<HTMLSpanElement, {}, { ref?: React.Ref<any> | undefined;}>} */
|
|
56
|
-
const Container = styled('span')`
|
|
57
|
-
display: inline-flex;
|
|
58
|
-
flex-direction: ${(props) => (props.layout === 'horizontal' ? 'row' : 'column')};
|
|
59
|
-
justify-content: center;
|
|
60
|
-
align-items: center;
|
|
61
|
-
|
|
62
|
-
.logo-text {
|
|
63
|
-
${(props) => (props.layout === 'vertical' ? 'margin-top: 8px;' : '')}
|
|
64
|
-
${(props) => (props.layout === 'vertical' ? '' : 'margin-left: 8px;')};
|
|
65
|
-
}
|
|
66
|
-
`;
|