@arcblock/did-connect-react 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +134 -0
- package/lib/Address/index.js +4 -0
- package/lib/Avatar/index.js +4 -0
- package/lib/Button/index.js +17 -0
- package/lib/Connect/assets/locale.js +143 -0
- package/lib/Connect/assets/login-bg.png +0 -0
- package/lib/Connect/assets/login-slogan.js +9 -0
- package/lib/Connect/components/action-button.js +26 -0
- package/lib/Connect/components/app-tips.js +132 -0
- package/lib/Connect/components/auto-height.js +31 -0
- package/lib/Connect/components/back-button.js +24 -0
- package/lib/Connect/components/connect-status.js +263 -0
- package/lib/Connect/components/did-connect-title.js +126 -0
- package/lib/Connect/components/download-tips.js +52 -0
- package/lib/Connect/components/loading.js +26 -0
- package/lib/Connect/components/login-item/connect-choose-list.js +249 -0
- package/lib/Connect/components/login-item/login-method-item.js +129 -0
- package/lib/Connect/components/login-item/mobile-login-item.js +114 -0
- package/lib/Connect/components/login-item/passkey-login-item.js +44 -0
- package/lib/Connect/components/login-item/web-login-item.js +97 -0
- package/lib/Connect/components/mask-overlay.js +34 -0
- package/lib/Connect/components/refresh-overlay.js +57 -0
- package/lib/Connect/components/switch-app.js +70 -0
- package/lib/Connect/contexts/state.js +142 -0
- package/lib/Connect/fullpage.js +5 -0
- package/lib/Connect/hooks/auth-url.js +23 -0
- package/lib/Connect/hooks/method-list.js +46 -0
- package/lib/Connect/hooks/page-show.js +17 -0
- package/lib/Connect/hooks/security.js +27 -0
- package/lib/Connect/hooks/token.js +305 -0
- package/lib/Connect/hooks/use-apps.js +19 -0
- package/lib/Connect/hooks/use-quick-connect.js +97 -0
- package/lib/Connect/index.js +498 -0
- package/lib/Connect/landing-page.js +5 -0
- package/lib/Connect/plugins/email/index.js +62 -0
- package/lib/Connect/plugins/email/list-item.js +28 -0
- package/lib/Connect/plugins/email/placeholder.js +283 -0
- package/lib/Connect/plugins/index.js +4 -0
- package/lib/Connect/use-connect.js +164 -0
- package/lib/Connect/with-blocklet.js +15 -0
- package/lib/Connect/with-bridge-call.js +108 -0
- package/lib/Federated/context.js +61 -0
- package/lib/Federated/index.js +7 -0
- package/lib/Logo/index.js +4 -0
- package/lib/OAuth/context.js +234 -0
- package/lib/OAuth/guest.svg.js +5 -0
- package/lib/OAuth/index.js +7 -0
- package/lib/OAuth/passport-switcher.js +114 -0
- package/lib/Passkey/actions.js +165 -0
- package/lib/Passkey/constants.js +4 -0
- package/lib/Passkey/context.js +266 -0
- package/lib/Passkey/dialog.js +277 -0
- package/lib/Passkey/icon.js +13 -0
- package/lib/Passkey/index.js +9 -0
- package/lib/Service/index.js +62 -0
- package/lib/Session/assets/did-spaces-guide-cover.svg.js +135 -0
- package/lib/Session/assets/did-spaces-guide-icon.svg.js +9 -0
- package/lib/Session/context.js +5 -0
- package/lib/Session/did-spaces-guide.js +136 -0
- package/lib/Session/hooks/use-federated.js +64 -0
- package/lib/Session/hooks/use-mobile.js +8 -0
- package/lib/Session/hooks/use-protected-routes.js +11 -0
- package/lib/Session/hooks/use-session-token.js +169 -0
- package/lib/Session/hooks/use-verify.js +45 -0
- package/lib/Session/index.js +896 -0
- package/lib/Session/libs/constants.js +15 -0
- package/lib/Session/libs/did-spaces.js +10 -0
- package/lib/Session/libs/federated.js +42 -0
- package/lib/Session/libs/index.js +15 -0
- package/lib/Session/libs/locales.js +161 -0
- package/lib/Session/libs/login-mobile.js +55 -0
- package/lib/Session/window-focus-aware.js +17 -0
- package/lib/SessionManager/index.js +4 -0
- package/lib/Storage/engine/cookie.js +21 -0
- package/lib/Storage/engine/local-storage.js +36 -0
- package/lib/Storage/index.js +23 -0
- package/lib/User/index.js +6 -0
- package/lib/User/use-did.js +59 -0
- package/lib/User/wrap-did.js +13 -0
- package/lib/WebWalletSWKeeper/index.js +5 -0
- package/lib/constant.js +22 -0
- package/lib/error.js +8 -0
- package/lib/hooks/use-locale.js +7 -0
- package/lib/index.js +33 -0
- package/lib/locales/en.js +17 -0
- package/lib/locales/index.js +10 -0
- package/lib/locales/zh.js +17 -0
- package/lib/package.json.js +7 -0
- package/lib/types.d.ts +355 -0
- package/lib/utils.js +214 -0
- package/package.json +84 -0
- package/src/Address/index.jsx +2 -0
- package/src/Avatar/index.jsx +2 -0
- package/src/Button/Button.stories.jsx +7 -0
- package/src/Button/index.jsx +21 -0
- package/src/Connect/Connect.stories.jsx +34 -0
- package/src/Connect/assets/locale.js +145 -0
- package/src/Connect/assets/login-bg.png +0 -0
- package/src/Connect/assets/login-slogan.js +7 -0
- package/src/Connect/components/action-button.jsx +22 -0
- package/src/Connect/components/app-tips.jsx +156 -0
- package/src/Connect/components/auto-height.jsx +38 -0
- package/src/Connect/components/back-button.jsx +23 -0
- package/src/Connect/components/connect-status.jsx +259 -0
- package/src/Connect/components/did-connect-title.jsx +106 -0
- package/src/Connect/components/download-tips.jsx +55 -0
- package/src/Connect/components/loading.jsx +25 -0
- package/src/Connect/components/login-item/connect-choose-list.jsx +304 -0
- package/src/Connect/components/login-item/login-method-item.jsx +118 -0
- package/src/Connect/components/login-item/mobile-login-item.jsx +179 -0
- package/src/Connect/components/login-item/passkey-login-item.jsx +52 -0
- package/src/Connect/components/login-item/web-login-item.jsx +149 -0
- package/src/Connect/components/mask-overlay.jsx +32 -0
- package/src/Connect/components/refresh-overlay.jsx +52 -0
- package/src/Connect/components/switch-app.jsx +69 -0
- package/src/Connect/contexts/state.jsx +219 -0
- package/src/Connect/fullpage.jsx +3 -0
- package/src/Connect/hooks/auth-url.js +31 -0
- package/src/Connect/hooks/method-list.js +121 -0
- package/src/Connect/hooks/page-show.js +24 -0
- package/src/Connect/hooks/security.js +40 -0
- package/src/Connect/hooks/token.js +639 -0
- package/src/Connect/hooks/use-apps.js +69 -0
- package/src/Connect/hooks/use-quick-connect.js +130 -0
- package/src/Connect/index.jsx +600 -0
- package/src/Connect/landing-page.jsx +3 -0
- package/src/Connect/plugins/email/index.jsx +82 -0
- package/src/Connect/plugins/email/list-item.jsx +31 -0
- package/src/Connect/plugins/email/placeholder.jsx +365 -0
- package/src/Connect/plugins/index.js +2 -0
- package/src/Connect/use-connect.jsx +321 -0
- package/src/Connect/with-blocklet.jsx +26 -0
- package/src/Connect/with-bridge-call.jsx +138 -0
- package/src/Federated/context.jsx +93 -0
- package/src/Federated/index.jsx +1 -0
- package/src/Logo/index.jsx +2 -0
- package/src/OAuth/context.jsx +346 -0
- package/src/OAuth/guest.svg +20 -0
- package/src/OAuth/index.jsx +1 -0
- package/src/OAuth/passport-switcher.jsx +133 -0
- package/src/Passkey/actions.jsx +212 -0
- package/src/Passkey/constants.js +2 -0
- package/src/Passkey/context.jsx +381 -0
- package/src/Passkey/dialog.jsx +391 -0
- package/src/Passkey/icon.jsx +10 -0
- package/src/Passkey/index.jsx +2 -0
- package/src/Service/index.jsx +96 -0
- package/src/Session/assets/did-spaces-guide-cover.svg +128 -0
- package/src/Session/assets/did-spaces-guide-icon.svg +7 -0
- package/src/Session/context.jsx +7 -0
- package/src/Session/did-spaces-guide.jsx +173 -0
- package/src/Session/hooks/use-federated.js +88 -0
- package/src/Session/hooks/use-mobile.jsx +6 -0
- package/src/Session/hooks/use-protected-routes.js +16 -0
- package/src/Session/hooks/use-session-token.js +365 -0
- package/src/Session/hooks/use-verify.jsx +76 -0
- package/src/Session/index.jsx +1687 -0
- package/src/Session/libs/constants.js +14 -0
- package/src/Session/libs/did-spaces.js +38 -0
- package/src/Session/libs/federated.js +79 -0
- package/src/Session/libs/index.js +5 -0
- package/src/Session/libs/locales.js +160 -0
- package/src/Session/libs/login-mobile.js +80 -0
- package/src/Session/window-focus-aware.jsx +28 -0
- package/src/SessionManager/index.jsx +2 -0
- package/src/Storage/engine/cookie.js +23 -0
- package/src/Storage/engine/local-storage.js +55 -0
- package/src/Storage/index.js +25 -0
- package/src/User/index.js +4 -0
- package/src/User/use-did.js +80 -0
- package/src/User/wrap-did.jsx +18 -0
- package/src/WebWalletSWKeeper/index.jsx +3 -0
- package/src/constant.js +26 -0
- package/src/error.js +6 -0
- package/src/hooks/use-locale.jsx +6 -0
- package/src/index.js +43 -0
- package/src/locales/en.jsx +15 -0
- package/src/locales/index.jsx +13 -0
- package/src/locales/zh.jsx +15 -0
- package/src/types.d.ts +355 -0
- package/src/utils.js +395 -0
- package/vite.config.mjs +29 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { useCreation } from 'ahooks';
|
|
2
|
+
import { getApps, getFederatedEnabled, getMaster } from '@arcblock/ux/lib/Util/federated';
|
|
3
|
+
import isUndefined from 'lodash/isUndefined';
|
|
4
|
+
import { use } from 'react';
|
|
5
|
+
import { SessionContext } from '../../Session/context';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @param {object} param
|
|
10
|
+
* @param {object} param.blocklet
|
|
11
|
+
* @param {string} param.action
|
|
12
|
+
* @param {string} [param.sourceAppPid]
|
|
13
|
+
* @param {object} param.connectState
|
|
14
|
+
* @param {boolean} [param.enableSwitchApp]
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
17
|
+
export default function useApps({ blocklet, action, sourceAppPid, connectState, enableSwitchApp }) {
|
|
18
|
+
const sessionContext = use(SessionContext);
|
|
19
|
+
|
|
20
|
+
const canSwitchApp = useCreation(() => {
|
|
21
|
+
if (enableSwitchApp === true) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
if (enableSwitchApp === false) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (sessionContext?.session?.user) {
|
|
29
|
+
if (!['login', 'invite', 'connect-to-did-space', 'connect-to-did-domain'].includes(action)) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}, [action, sessionContext?.session?.user]);
|
|
35
|
+
|
|
36
|
+
const autoGenerateSourceAppPid = useCreation(() => {
|
|
37
|
+
if (isUndefined(sourceAppPid)) {
|
|
38
|
+
const federatedEnabled = getFederatedEnabled(blocklet);
|
|
39
|
+
const master = getMaster(blocklet);
|
|
40
|
+
if (federatedEnabled && master?.appPid) {
|
|
41
|
+
return master.appPid;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return sourceAppPid;
|
|
45
|
+
}, [sourceAppPid, blocklet]);
|
|
46
|
+
|
|
47
|
+
const appInfoList = useCreation(() => {
|
|
48
|
+
const appList = getApps(blocklet);
|
|
49
|
+
|
|
50
|
+
return appList.filter((x) => {
|
|
51
|
+
if (canSwitchApp) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!isUndefined(sourceAppPid)) {
|
|
56
|
+
return x.sourceAppPid === sourceAppPid;
|
|
57
|
+
}
|
|
58
|
+
if (!isUndefined(connectState.sourceAppPid)) {
|
|
59
|
+
return x.sourceAppPid === connectState.sourceAppPid;
|
|
60
|
+
}
|
|
61
|
+
if (sessionContext?.session?.user) {
|
|
62
|
+
return x.sourceAppPid === sessionContext.session.user.sourceAppPid;
|
|
63
|
+
}
|
|
64
|
+
return x.sourceAppPid === autoGenerateSourceAppPid;
|
|
65
|
+
});
|
|
66
|
+
}, [canSwitchApp, sourceAppPid, connectState.sourceAppPid, autoGenerateSourceAppPid, sessionContext?.session?.user]);
|
|
67
|
+
|
|
68
|
+
return { appInfoList, autoGenerateSourceAppPid, canSwitchApp };
|
|
69
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { useCreation, useMemoizedFn, useReactive, useRequest } from 'ahooks';
|
|
2
|
+
import { joinURL } from 'ufo';
|
|
3
|
+
import pick from 'lodash/pick';
|
|
4
|
+
import unionBy from 'lodash/unionBy';
|
|
5
|
+
import sortBy from 'lodash/sortBy';
|
|
6
|
+
import Toast from '@arcblock/ux/lib/Toast';
|
|
7
|
+
import { getFederatedEnabled, getMaster } from '@arcblock/ux/lib/Util/federated';
|
|
8
|
+
|
|
9
|
+
import { BLOCKLET_SERVICE_PATH_PREFIX } from '../../constant';
|
|
10
|
+
import { createAxios, logger } from '../../utils';
|
|
11
|
+
|
|
12
|
+
const prefix = joinURL(BLOCKLET_SERVICE_PATH_PREFIX, '/api/user-session');
|
|
13
|
+
|
|
14
|
+
export default function useQuickConnect({
|
|
15
|
+
appPid,
|
|
16
|
+
sourceAppPid,
|
|
17
|
+
loginAppPid,
|
|
18
|
+
autoFetch = true,
|
|
19
|
+
baseUrl = '/',
|
|
20
|
+
fetchAll = false,
|
|
21
|
+
} = {}) {
|
|
22
|
+
const api = useCreation(() => {
|
|
23
|
+
return createAxios(
|
|
24
|
+
{
|
|
25
|
+
baseURL: joinURL(baseUrl, prefix),
|
|
26
|
+
},
|
|
27
|
+
{ lazy: true, lazyTime: 500 }
|
|
28
|
+
);
|
|
29
|
+
}, [baseUrl]);
|
|
30
|
+
|
|
31
|
+
const getUserSessions = useMemoizedFn(async () => {
|
|
32
|
+
if (!window.blocklet) {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let selfUserSessions = [];
|
|
37
|
+
try {
|
|
38
|
+
({ data: selfUserSessions = [] } = await api.get(''));
|
|
39
|
+
} catch (err) {
|
|
40
|
+
logger.error('Failed to get user-sessions', err);
|
|
41
|
+
}
|
|
42
|
+
const result = selfUserSessions.map((x) => ({
|
|
43
|
+
...x,
|
|
44
|
+
appUrl: baseUrl,
|
|
45
|
+
}));
|
|
46
|
+
const enabledFederated = getFederatedEnabled();
|
|
47
|
+
const master = getMaster();
|
|
48
|
+
// NOTICE: 联合查询 master 中的会话列表
|
|
49
|
+
if (fetchAll && enabledFederated) {
|
|
50
|
+
if (master) {
|
|
51
|
+
let masterUserSessions = [];
|
|
52
|
+
try {
|
|
53
|
+
({ data: masterUserSessions = [] } = await api.get(joinURL(master.appUrl, prefix)));
|
|
54
|
+
} catch (err) {
|
|
55
|
+
logger.error('Failed to get master user-sessions', err);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return result.concat(masterUserSessions.map((x) => ({ ...x, appUrl: master.appUrl })));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (!enabledFederated || !master) {
|
|
62
|
+
return result.filter((x) => x?.user?.sourceAppPid === null);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
});
|
|
66
|
+
const currentState = useReactive({
|
|
67
|
+
loaded: false,
|
|
68
|
+
loadingId: null,
|
|
69
|
+
});
|
|
70
|
+
const userSessionsState = useRequest(getUserSessions, {
|
|
71
|
+
manual: !autoFetch,
|
|
72
|
+
onFinally() {
|
|
73
|
+
currentState.loaded = true;
|
|
74
|
+
},
|
|
75
|
+
refreshDeps: [baseUrl],
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const loginUserSession = async (userSession) => {
|
|
79
|
+
const params = pick(userSession, ['userDid', 'visitorId', 'passportId', 'id']);
|
|
80
|
+
try {
|
|
81
|
+
currentState.loadingId = userSession.id;
|
|
82
|
+
const { data } = await api.post(
|
|
83
|
+
'login',
|
|
84
|
+
{ ...params, appPid: loginAppPid },
|
|
85
|
+
{
|
|
86
|
+
baseURL: joinURL(userSession.appUrl || '/', prefix),
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
return data;
|
|
90
|
+
} catch (err) {
|
|
91
|
+
const errorMsg = err.response ? err.response?.data?.error || err.response?.data : err.message;
|
|
92
|
+
Toast.error(errorMsg);
|
|
93
|
+
logger.error('Quick login error', err);
|
|
94
|
+
throw err;
|
|
95
|
+
} finally {
|
|
96
|
+
currentState.loadingId = null;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const onlineUserSessions = useCreation(() => {
|
|
101
|
+
if (!userSessionsState.data) return [];
|
|
102
|
+
return userSessionsState.data.filter((x) => x.status !== 'expired');
|
|
103
|
+
}, [userSessionsState.data]);
|
|
104
|
+
|
|
105
|
+
const uniqueUserSessions = useCreation(() => {
|
|
106
|
+
const now = new Date().getTime();
|
|
107
|
+
const sortedUserSessions = sortBy(onlineUserSessions, (x) => now - new Date(x.updatedAt).getTime());
|
|
108
|
+
return unionBy(sortedUserSessions, (x) =>
|
|
109
|
+
[
|
|
110
|
+
x.userDid,
|
|
111
|
+
// 暂不以用户角色来做去重的因子
|
|
112
|
+
// x.user.role
|
|
113
|
+
].join('_')
|
|
114
|
+
);
|
|
115
|
+
}, [onlineUserSessions, sourceAppPid, appPid]);
|
|
116
|
+
|
|
117
|
+
const quickLoginEnabled = useCreation(() => {
|
|
118
|
+
return Boolean(uniqueUserSessions && uniqueUserSessions.length > 0);
|
|
119
|
+
}, [uniqueUserSessions]);
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
loadingId: currentState.loadingId,
|
|
123
|
+
userSessions: uniqueUserSessions,
|
|
124
|
+
quickLoginEnabled,
|
|
125
|
+
loginUserSession,
|
|
126
|
+
loading: userSessionsState.loading,
|
|
127
|
+
loaded: userSessionsState.loaded,
|
|
128
|
+
refresh: userSessionsState.refreshAsync,
|
|
129
|
+
};
|
|
130
|
+
}
|