@nlabs/metropolisjs 0.1.1 → 0.2.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/.github/copilot-instructions.md +167 -0
- package/AGENTS.md +13 -0
- package/CHANGELOG.md +112 -0
- package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
- package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
- package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
- package/README.md +1343 -0
- package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
- package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
- package/docs/ACTIONS.md +63 -0
- package/docs/COLLECTIONS.md +1038 -0
- package/docs/CONNECTIONS.md +1367 -0
- package/docs/CRUD_INTEGRATION.md +702 -0
- package/examples/connections-usage.tsx +909 -0
- package/examples/content-actions-usage.ts +144 -0
- package/examples/crud-usage.tsx +847 -0
- package/examples/extensibility-usage.tsx +889 -0
- package/examples/factory-pattern-usage.ts +283 -0
- package/examples/i18n-import-examples.ts +86 -0
- package/examples/i18n-namespace-usage.ts +118 -0
- package/examples/i18next-singleton-demo.ts +187 -0
- package/examples/permission-system-usage.tsx +415 -0
- package/examples/project-details.tsx +397 -0
- package/examples/shared-i18n-usage.tsx +203 -0
- package/examples/signup-error-handling.ts +100 -0
- package/examples/translation-types.ts +86 -0
- package/examples/translation-usage.tsx +336 -0
- package/factoryPatternGuide.md +244 -0
- package/index.js +1 -0
- package/jest.config.mjs +28 -0
- package/lex.config.mjs +26 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
- package/lib/actions/appActions/appActions.d.ts +29 -0
- package/lib/actions/appActions/appActions.d.ts.map +1 -0
- package/lib/actions/appActions/appActions.js +159 -0
- package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
- package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
- package/lib/actions/connectionActions/connectionActions.js +131 -0
- package/lib/actions/contentActions/contentActions.d.ts +34 -0
- package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
- package/lib/actions/contentActions/contentActions.js +314 -0
- package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
- package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
- package/lib/actions/conversationActions/conversationActions.js +225 -0
- package/lib/actions/eventActions/eventActions.d.ts +65 -0
- package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
- package/lib/actions/eventActions/eventActions.js +436 -0
- package/lib/actions/groupActions/groupActions.d.ts +30 -0
- package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
- package/lib/actions/groupActions/groupActions.js +229 -0
- package/lib/actions/imageActions/imageActions.d.ts +62 -0
- package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
- package/lib/actions/imageActions/imageActions.js +593 -0
- package/lib/actions/index.d.ts +21 -0
- package/lib/actions/index.d.ts.map +1 -0
- package/lib/actions/index.js +22 -0
- package/lib/actions/locationActions/locationActions.d.ts +60 -0
- package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
- package/lib/actions/locationActions/locationActions.js +388 -0
- package/lib/actions/messageActions/messageActions.d.ts +38 -0
- package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
- package/lib/actions/messageActions/messageActions.js +235 -0
- package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
- package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
- package/lib/actions/permissionActions/permissionActions.js +330 -0
- package/lib/actions/personaActions/personaActions.d.ts +65 -0
- package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
- package/lib/actions/personaActions/personaActions.js +572 -0
- package/lib/actions/postActions/postActions.d.ts +36 -0
- package/lib/actions/postActions/postActions.d.ts.map +1 -0
- package/lib/actions/postActions/postActions.js +447 -0
- package/lib/actions/reactionActions/reactionActions.d.ts +38 -0
- package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
- package/lib/actions/reactionActions/reactionActions.js +413 -0
- package/lib/actions/sseActions/sseActions.d.ts +38 -0
- package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
- package/lib/actions/sseActions/sseActions.js +148 -0
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
- package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
- package/lib/actions/tagActions/tagActions.d.ts +37 -0
- package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
- package/lib/actions/tagActions/tagActions.js +347 -0
- package/lib/actions/translationActions/translationActions.d.ts +38 -0
- package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
- package/lib/actions/translationActions/translationActions.js +189 -0
- package/lib/actions/userActions/userActions.d.ts +78 -0
- package/lib/actions/userActions/userActions.d.ts.map +1 -0
- package/lib/actions/userActions/userActions.js +844 -0
- package/lib/actions/videoActions/videoActions.d.ts +41 -0
- package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
- package/lib/actions/videoActions/videoActions.js +532 -0
- package/lib/actions/websocketActions/websocketActions.d.ts +30 -0
- package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
- package/lib/actions/websocketActions/websocketActions.js +377 -0
- package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
- package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
- package/lib/adapters/appAdapter/appAdapter.js +90 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +21 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -0
- package/lib/adapters/contentAdapter/contentAdapter.d.ts +32 -0
- package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
- package/lib/adapters/contentAdapter/contentAdapter.js +107 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +24 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -0
- package/lib/adapters/eventAdapter/eventAdapter.d.ts +46 -0
- package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
- package/lib/adapters/eventAdapter/eventAdapter.js +162 -0
- package/lib/adapters/fileAdapter/fileAdapter.d.ts +30 -0
- package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
- package/lib/adapters/fileAdapter/fileAdapter.js +118 -0
- package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
- package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
- package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
- package/lib/adapters/imageAdapter/imageAdapter.d.ts +38 -0
- package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
- package/lib/adapters/imageAdapter/imageAdapter.js +134 -0
- package/lib/adapters/index.d.ts +34 -0
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +19 -0
- package/lib/adapters/locationAdapter/locationAdapter.d.ts +28 -0
- package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
- package/lib/adapters/locationAdapter/locationAdapter.js +95 -0
- package/lib/adapters/messageAdapter/messageAdapter.d.ts +31 -0
- package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
- package/lib/adapters/messageAdapter/messageAdapter.js +82 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
- package/lib/adapters/personaAdapter/personaAdapter.d.ts +44 -0
- package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
- package/lib/adapters/personaAdapter/personaAdapter.js +161 -0
- package/lib/adapters/postAdapter/postAdapter.d.ts +33 -0
- package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
- package/lib/adapters/postAdapter/postAdapter.js +115 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +23 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +17 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +24 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -0
- package/lib/adapters/tagAdapter/tagAdapter.d.ts +21 -0
- package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
- package/lib/adapters/tagAdapter/tagAdapter.js +98 -0
- package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
- package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
- package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
- package/lib/adapters/userAdapter/userAdapter.d.ts +67 -0
- package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
- package/lib/adapters/userAdapter/userAdapter.js +302 -0
- package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
- package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
- package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
- package/lib/config/index.d.ts +44 -0
- package/lib/config/index.d.ts.map +1 -0
- package/lib/config/index.js +97 -0
- package/lib/constants/Collections.d.ts +44 -0
- package/lib/constants/Collections.d.ts.map +1 -0
- package/lib/constants/Collections.js +40 -0
- package/lib/constants/MetropolisConstants.d.ts +15 -0
- package/lib/constants/MetropolisConstants.d.ts.map +1 -0
- package/lib/constants/MetropolisConstants.js +15 -0
- package/lib/graphql/message.d.ts +3 -0
- package/lib/graphql/message.d.ts.map +1 -0
- package/lib/graphql/message.js +20 -0
- package/lib/graphql/notification.d.ts +3 -0
- package/lib/graphql/notification.d.ts.map +1 -0
- package/lib/graphql/notification.js +20 -0
- package/lib/graphql/session.d.ts +2 -0
- package/lib/graphql/session.d.ts.map +1 -0
- package/lib/graphql/session.js +17 -0
- package/lib/index.d.ts +52 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +248 -0
- package/lib/stores/appStore.d.ts +23 -0
- package/lib/stores/appStore.d.ts.map +1 -0
- package/lib/stores/appStore.js +23 -0
- package/lib/stores/contentStore.d.ts +36 -0
- package/lib/stores/contentStore.d.ts.map +1 -0
- package/lib/stores/contentStore.js +139 -0
- package/lib/stores/conversationStore.d.ts +38 -0
- package/lib/stores/conversationStore.d.ts.map +1 -0
- package/lib/stores/conversationStore.js +117 -0
- package/lib/stores/eventStore.d.ts +37 -0
- package/lib/stores/eventStore.d.ts.map +1 -0
- package/lib/stores/eventStore.js +47 -0
- package/lib/stores/groupStore.d.ts +37 -0
- package/lib/stores/groupStore.d.ts.map +1 -0
- package/lib/stores/groupStore.js +68 -0
- package/lib/stores/imageStore.d.ts +40 -0
- package/lib/stores/imageStore.d.ts.map +1 -0
- package/lib/stores/imageStore.js +53 -0
- package/lib/stores/index.d.ts +24 -0
- package/lib/stores/index.d.ts.map +1 -0
- package/lib/stores/index.js +24 -0
- package/lib/stores/locationStore.d.ts +34 -0
- package/lib/stores/locationStore.d.ts.map +1 -0
- package/lib/stores/locationStore.js +42 -0
- package/lib/stores/messageStore.d.ts +51 -0
- package/lib/stores/messageStore.d.ts.map +1 -0
- package/lib/stores/messageStore.js +137 -0
- package/lib/stores/notificationStore.d.ts +33 -0
- package/lib/stores/notificationStore.d.ts.map +1 -0
- package/lib/stores/notificationStore.js +55 -0
- package/lib/stores/permissionStore.d.ts +37 -0
- package/lib/stores/permissionStore.d.ts.map +1 -0
- package/lib/stores/permissionStore.js +117 -0
- package/lib/stores/personaStore.d.ts +26 -0
- package/lib/stores/personaStore.d.ts.map +1 -0
- package/lib/stores/personaStore.js +118 -0
- package/lib/stores/postStore.d.ts +34 -0
- package/lib/stores/postStore.d.ts.map +1 -0
- package/lib/stores/postStore.js +53 -0
- package/lib/stores/reactionStore.d.ts +25 -0
- package/lib/stores/reactionStore.d.ts.map +1 -0
- package/lib/stores/reactionStore.js +28 -0
- package/lib/stores/subscriptionStore.d.ts +41 -0
- package/lib/stores/subscriptionStore.d.ts.map +1 -0
- package/lib/stores/subscriptionStore.js +85 -0
- package/lib/stores/tagStore.d.ts +34 -0
- package/lib/stores/tagStore.d.ts.map +1 -0
- package/lib/stores/tagStore.js +87 -0
- package/lib/stores/translationStore.d.ts +42 -0
- package/lib/stores/translationStore.d.ts.map +1 -0
- package/lib/stores/translationStore.js +122 -0
- package/lib/stores/userStore.d.ts +74 -0
- package/lib/stores/userStore.d.ts.map +1 -0
- package/lib/stores/userStore.js +319 -0
- package/lib/stores/videoStore.d.ts +39 -0
- package/lib/stores/videoStore.d.ts.map +1 -0
- package/lib/stores/videoStore.js +132 -0
- package/lib/stores/websocketStore.d.ts +24 -0
- package/lib/stores/websocketStore.d.ts.map +1 -0
- package/lib/stores/websocketStore.js +51 -0
- package/lib/types/apps.types.d.ts +17 -0
- package/lib/types/apps.types.d.ts.map +1 -0
- package/lib/types/apps.types.js +6 -0
- package/lib/types/common.types.d.ts +31 -0
- package/lib/types/common.types.d.ts.map +1 -0
- package/lib/types/common.types.js +6 -0
- package/lib/types/conversations.types.d.ts +17 -0
- package/lib/types/conversations.types.d.ts.map +1 -0
- package/lib/types/conversations.types.js +6 -0
- package/lib/types/edges.types.d.ts +38 -0
- package/lib/types/edges.types.d.ts.map +1 -0
- package/lib/types/edges.types.js +6 -0
- package/lib/types/groups.types.d.ts +19 -0
- package/lib/types/groups.types.d.ts.map +1 -0
- package/lib/types/groups.types.js +6 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +12 -0
- package/lib/types/subscriptions.types.d.ts +32 -0
- package/lib/types/subscriptions.types.d.ts.map +1 -0
- package/lib/types/subscriptions.types.js +6 -0
- package/lib/types/videos.types.d.ts +61 -0
- package/lib/types/videos.types.d.ts.map +1 -0
- package/lib/types/videos.types.js +6 -0
- package/lib/utils/MetropolisProvider.d.ts +58 -0
- package/lib/utils/MetropolisProvider.d.ts.map +1 -0
- package/lib/utils/MetropolisProvider.js +31 -0
- package/lib/utils/actionFactory.d.ts +24 -0
- package/lib/utils/actionFactory.d.ts.map +1 -0
- package/lib/utils/actionFactory.js +95 -0
- package/lib/utils/api.d.ts +44 -0
- package/lib/utils/api.d.ts.map +1 -0
- package/lib/utils/api.js +253 -0
- package/lib/utils/app.d.ts +7 -0
- package/lib/utils/app.d.ts.map +1 -0
- package/lib/utils/app.js +15 -0
- package/lib/utils/baseActionFactory.d.ts +16 -0
- package/lib/utils/baseActionFactory.d.ts.map +1 -0
- package/lib/utils/baseActionFactory.js +72 -0
- package/lib/utils/configUtils.d.ts +11 -0
- package/lib/utils/configUtils.d.ts.map +1 -0
- package/lib/utils/configUtils.js +20 -0
- package/lib/utils/dateUtils.d.ts +3 -0
- package/lib/utils/dateUtils.d.ts.map +1 -0
- package/lib/utils/dateUtils.js +11 -0
- package/lib/utils/file.d.ts +3 -0
- package/lib/utils/file.d.ts.map +1 -0
- package/lib/utils/file.js +156 -0
- package/lib/utils/i18n.d.ts +7 -0
- package/lib/utils/i18n.d.ts.map +1 -0
- package/lib/utils/i18n.js +96 -0
- package/lib/utils/index.d.ts +20 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +26 -0
- package/lib/utils/location.d.ts +10 -0
- package/lib/utils/location.d.ts.map +1 -0
- package/lib/utils/location.js +82 -0
- package/lib/utils/permissionUtils.d.ts +22 -0
- package/lib/utils/permissionUtils.d.ts.map +1 -0
- package/lib/utils/permissionUtils.js +72 -0
- package/lib/utils/requestCache.d.ts +8 -0
- package/lib/utils/requestCache.d.ts.map +1 -0
- package/lib/utils/requestCache.js +53 -0
- package/lib/utils/session.d.ts +14 -0
- package/lib/utils/session.d.ts.map +1 -0
- package/lib/utils/session.js +107 -0
- package/lib/utils/useConversationTyping.d.ts +26 -0
- package/lib/utils/useConversationTyping.d.ts.map +1 -0
- package/lib/utils/useConversationTyping.js +117 -0
- package/lib/utils/useMetropolis.d.ts +67 -0
- package/lib/utils/useMetropolis.d.ts.map +1 -0
- package/lib/utils/useMetropolis.js +311 -0
- package/lib/utils/useTranslations.d.ts +16 -0
- package/lib/utils/useTranslations.d.ts.map +1 -0
- package/lib/utils/useTranslations.js +105 -0
- package/lib/utils/validatorFactory.d.ts +49 -0
- package/lib/utils/validatorFactory.d.ts.map +1 -0
- package/lib/utils/validatorFactory.js +95 -0
- package/package.json +75 -28
- package/temp_signin.ts +73 -0
- package/tsconfig.lint.json +25 -0
- package/tsconfig.test.json +14 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
4
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
5
|
+
*/ import { useCallback, useEffect, useState } from 'react';
|
|
6
|
+
import { useFlux } from '@nlabs/arkhamjs-utils-react';
|
|
7
|
+
import { hasPermission as checkPermission, isAdmin as checkIsAdmin, isGuest as checkIsGuest, isModerator as checkIsModerator, isSuperAdmin as checkIsSuperAdmin, isUser as checkIsUser } from '../adapters/permissionAdapter/permissionAdapter.js';
|
|
8
|
+
export const usePermissions = ()=>{
|
|
9
|
+
const flux = useFlux();
|
|
10
|
+
const [userLevel, setUserLevel] = useState(0);
|
|
11
|
+
useEffect(()=>{
|
|
12
|
+
const updateUserLevel = ()=>{
|
|
13
|
+
const session = flux.getState('user.session', {});
|
|
14
|
+
const level = session.userAccess ?? 0;
|
|
15
|
+
setUserLevel(level);
|
|
16
|
+
};
|
|
17
|
+
updateUserLevel();
|
|
18
|
+
const unsubscribe = flux.on('USER_SIGN_IN_SUCCESS', updateUserLevel);
|
|
19
|
+
const unsubscribeUpdate = flux.on('USER_UPDATE_ITEM_SUCCESS', updateUserLevel);
|
|
20
|
+
const unsubscribeSession = flux.on('USER_GET_SESSION_SUCCESS', updateUserLevel);
|
|
21
|
+
const unsubscribeSignOut = flux.on('USER_SIGN_OUT_SUCCESS', ()=>setUserLevel(0));
|
|
22
|
+
return ()=>{
|
|
23
|
+
unsubscribe();
|
|
24
|
+
unsubscribeUpdate();
|
|
25
|
+
unsubscribeSession();
|
|
26
|
+
unsubscribeSignOut();
|
|
27
|
+
};
|
|
28
|
+
}, [
|
|
29
|
+
flux
|
|
30
|
+
]);
|
|
31
|
+
const hasPermissionLevel = useCallback((requiredLevel)=>{
|
|
32
|
+
return checkPermission(userLevel, requiredLevel);
|
|
33
|
+
}, [
|
|
34
|
+
userLevel
|
|
35
|
+
]);
|
|
36
|
+
const checkResourcePermission = useCallback((resource, requiredLevel)=>{
|
|
37
|
+
const permissions = flux.getState(`permission.userPermissions.${flux.getState('user.session.userId')}`, []);
|
|
38
|
+
const resourcePermission = permissions.find((p)=>p.resource === resource);
|
|
39
|
+
if (resourcePermission && resourcePermission.level !== undefined) {
|
|
40
|
+
return resourcePermission.level >= requiredLevel;
|
|
41
|
+
}
|
|
42
|
+
return checkPermission(userLevel, requiredLevel);
|
|
43
|
+
}, [
|
|
44
|
+
flux,
|
|
45
|
+
userLevel
|
|
46
|
+
]);
|
|
47
|
+
return {
|
|
48
|
+
userLevel,
|
|
49
|
+
hasPermission: hasPermissionLevel,
|
|
50
|
+
isGuest: checkIsGuest(userLevel),
|
|
51
|
+
isUser: checkIsUser(userLevel),
|
|
52
|
+
isModerator: checkIsModerator(userLevel),
|
|
53
|
+
isAdmin: checkIsAdmin(userLevel),
|
|
54
|
+
isSuperAdmin: checkIsSuperAdmin(userLevel),
|
|
55
|
+
checkResource: checkResourcePermission
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
export const PermissionGuard = ({ requiredLevel, resource, fallback = null, children })=>{
|
|
59
|
+
const { hasPermission, checkResource } = usePermissions();
|
|
60
|
+
const hasAccess = resource ? checkResource(resource, requiredLevel) : hasPermission(requiredLevel);
|
|
61
|
+
if (!hasAccess) {
|
|
62
|
+
return /*#__PURE__*/ _jsx(_Fragment, {
|
|
63
|
+
children: fallback
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return /*#__PURE__*/ _jsx(_Fragment, {
|
|
67
|
+
children: children
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
export { PermissionLevel } from '../adapters/permissionAdapter/permissionAdapter.js';
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvcGVybWlzc2lvblV0aWxzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VGbHV4fSBmcm9tICdAbmxhYnMvYXJraGFtanMtdXRpbHMtcmVhY3QnO1xuXG5pbXBvcnQge1xuICBoYXNQZXJtaXNzaW9uIGFzIGNoZWNrUGVybWlzc2lvbixcbiAgaXNBZG1pbiBhcyBjaGVja0lzQWRtaW4sXG4gIGlzR3Vlc3QgYXMgY2hlY2tJc0d1ZXN0LFxuICBpc01vZGVyYXRvciBhcyBjaGVja0lzTW9kZXJhdG9yLFxuICBpc1N1cGVyQWRtaW4gYXMgY2hlY2tJc1N1cGVyQWRtaW4sXG4gIGlzVXNlciBhcyBjaGVja0lzVXNlcixcbiAgUGVybWlzc2lvbkxldmVsXG59IGZyb20gJy4uL2FkYXB0ZXJzL3Blcm1pc3Npb25BZGFwdGVyL3Blcm1pc3Npb25BZGFwdGVyLmpzJztcbmltcG9ydCB0eXBlIHtQZXJtaXNzaW9ufSBmcm9tICcuLi9hZGFwdGVycy9wZXJtaXNzaW9uQWRhcHRlci9wZXJtaXNzaW9uQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7VXNlcn0gZnJvbSAnLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25HdWFyZFByb3BzIHtcbiAgcmVxdWlyZWRMZXZlbDogUGVybWlzc2lvbkxldmVsO1xuICByZXNvdXJjZT86IHN0cmluZztcbiAgZmFsbGJhY2s/OiBSZWFjdC5SZWFjdE5vZGU7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlUGVybWlzc2lvbnNSZXR1cm4ge1xuICB1c2VyTGV2ZWw6IG51bWJlcjtcbiAgaGFzUGVybWlzc2lvbjogKHJlcXVpcmVkTGV2ZWw6IFBlcm1pc3Npb25MZXZlbCkgPT4gYm9vbGVhbjtcbiAgaXNHdWVzdDogYm9vbGVhbjtcbiAgaXNVc2VyOiBib29sZWFuO1xuICBpc01vZGVyYXRvcjogYm9vbGVhbjtcbiAgaXNBZG1pbjogYm9vbGVhbjtcbiAgaXNTdXBlckFkbWluOiBib29sZWFuO1xuICBjaGVja1Jlc291cmNlOiAocmVzb3VyY2U6IHN0cmluZywgcmVxdWlyZWRMZXZlbDogUGVybWlzc2lvbkxldmVsKSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgdXNlUGVybWlzc2lvbnMgPSAoKTogVXNlUGVybWlzc2lvbnNSZXR1cm4gPT4ge1xuICBjb25zdCBmbHV4ID0gdXNlRmx1eCgpO1xuICBjb25zdCBbdXNlckxldmVsLCBzZXRVc2VyTGV2ZWxdID0gdXNlU3RhdGU8bnVtYmVyPigwKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZVVzZXJMZXZlbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb246IFBhcnRpYWw8VXNlcj4gPSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCB7fSk7XG4gICAgICBjb25zdCBsZXZlbCA9IHNlc3Npb24udXNlckFjY2VzcyA/PyAwO1xuICAgICAgc2V0VXNlckxldmVsKGxldmVsKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlVXNlckxldmVsKCk7XG5cbiAgICBjb25zdCB1bnN1YnNjcmliZSA9IGZsdXgub24oJ1VTRVJfU0lHTl9JTl9TVUNDRVNTJywgdXBkYXRlVXNlckxldmVsKTtcbiAgICBjb25zdCB1bnN1YnNjcmliZVVwZGF0ZSA9IGZsdXgub24oJ1VTRVJfVVBEQVRFX0lURU1fU1VDQ0VTUycsIHVwZGF0ZVVzZXJMZXZlbCk7XG4gICAgY29uc3QgdW5zdWJzY3JpYmVTZXNzaW9uID0gZmx1eC5vbignVVNFUl9HRVRfU0VTU0lPTl9TVUNDRVNTJywgdXBkYXRlVXNlckxldmVsKTtcbiAgICBjb25zdCB1bnN1YnNjcmliZVNpZ25PdXQgPSBmbHV4Lm9uKCdVU0VSX1NJR05fT1VUX1NVQ0NFU1MnLCAoKSA9PiBzZXRVc2VyTGV2ZWwoMCkpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB1bnN1YnNjcmliZVVwZGF0ZSgpO1xuICAgICAgdW5zdWJzY3JpYmVTZXNzaW9uKCk7XG4gICAgICB1bnN1YnNjcmliZVNpZ25PdXQoKTtcbiAgICB9O1xuICB9LCBbZmx1eF0pO1xuXG4gIGNvbnN0IGhhc1Blcm1pc3Npb25MZXZlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChyZXF1aXJlZExldmVsOiBQZXJtaXNzaW9uTGV2ZWwpID0+IHtcbiAgICAgIHJldHVybiBjaGVja1Blcm1pc3Npb24odXNlckxldmVsLCByZXF1aXJlZExldmVsKTtcbiAgICB9LFxuICAgIFt1c2VyTGV2ZWxdXG4gICk7XG5cbiAgY29uc3QgY2hlY2tSZXNvdXJjZVBlcm1pc3Npb24gPSB1c2VDYWxsYmFjayhcbiAgICAocmVzb3VyY2U6IHN0cmluZywgcmVxdWlyZWRMZXZlbDogUGVybWlzc2lvbkxldmVsKTogYm9vbGVhbiA9PiB7XG4gICAgICBjb25zdCBwZXJtaXNzaW9uczogUGVybWlzc2lvbltdID0gZmx1eC5nZXRTdGF0ZShgcGVybWlzc2lvbi51c2VyUGVybWlzc2lvbnMuJHtmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJyl9YCwgW10pO1xuICAgICAgXG4gICAgICBjb25zdCByZXNvdXJjZVBlcm1pc3Npb24gPSBwZXJtaXNzaW9ucy5maW5kKChwKSA9PiBwLnJlc291cmNlID09PSByZXNvdXJjZSk7XG4gICAgICBpZiAocmVzb3VyY2VQZXJtaXNzaW9uICYmIHJlc291cmNlUGVybWlzc2lvbi5sZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXNvdXJjZVBlcm1pc3Npb24ubGV2ZWwgPj0gcmVxdWlyZWRMZXZlbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoZWNrUGVybWlzc2lvbih1c2VyTGV2ZWwsIHJlcXVpcmVkTGV2ZWwpO1xuICAgIH0sXG4gICAgW2ZsdXgsIHVzZXJMZXZlbF1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHVzZXJMZXZlbCxcbiAgICBoYXNQZXJtaXNzaW9uOiBoYXNQZXJtaXNzaW9uTGV2ZWwsXG4gICAgaXNHdWVzdDogY2hlY2tJc0d1ZXN0KHVzZXJMZXZlbCksXG4gICAgaXNVc2VyOiBjaGVja0lzVXNlcih1c2VyTGV2ZWwpLFxuICAgIGlzTW9kZXJhdG9yOiBjaGVja0lzTW9kZXJhdG9yKHVzZXJMZXZlbCksXG4gICAgaXNBZG1pbjogY2hlY2tJc0FkbWluKHVzZXJMZXZlbCksXG4gICAgaXNTdXBlckFkbWluOiBjaGVja0lzU3VwZXJBZG1pbih1c2VyTGV2ZWwpLFxuICAgIGNoZWNrUmVzb3VyY2U6IGNoZWNrUmVzb3VyY2VQZXJtaXNzaW9uXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgUGVybWlzc2lvbkd1YXJkOiBSZWFjdC5GQzxQZXJtaXNzaW9uR3VhcmRQcm9wcz4gPSAoe1xuICByZXF1aXJlZExldmVsLFxuICByZXNvdXJjZSxcbiAgZmFsbGJhY2sgPSBudWxsLFxuICBjaGlsZHJlblxufSkgPT4ge1xuICBjb25zdCB7aGFzUGVybWlzc2lvbiwgY2hlY2tSZXNvdXJjZX0gPSB1c2VQZXJtaXNzaW9ucygpO1xuXG4gIGNvbnN0IGhhc0FjY2VzcyA9IHJlc291cmNlIFxuICAgID8gY2hlY2tSZXNvdXJjZShyZXNvdXJjZSwgcmVxdWlyZWRMZXZlbCkgXG4gICAgOiBoYXNQZXJtaXNzaW9uKHJlcXVpcmVkTGV2ZWwpO1xuXG4gIGlmICghaGFzQWNjZXNzKSB7XG4gICAgcmV0dXJuIDw+e2ZhbGxiYWNrfTwvPjtcbiAgfVxuXG4gIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG59O1xuXG5leHBvcnQge1Blcm1pc3Npb25MZXZlbH0gZnJvbSAnLi4vYWRhcHRlcnMvcGVybWlzc2lvbkFkYXB0ZXIvcGVybWlzc2lvbkFkYXB0ZXIuanMnO1xuZXhwb3J0IHR5cGUge1Blcm1pc3Npb259IGZyb20gJy4uL2FkYXB0ZXJzL3Blcm1pc3Npb25BZGFwdGVyL3Blcm1pc3Npb25BZGFwdGVyLmpzJztcbiJdLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidXNlRmx1eCIsImhhc1Blcm1pc3Npb24iLCJjaGVja1Blcm1pc3Npb24iLCJpc0FkbWluIiwiY2hlY2tJc0FkbWluIiwiaXNHdWVzdCIsImNoZWNrSXNHdWVzdCIsImlzTW9kZXJhdG9yIiwiY2hlY2tJc01vZGVyYXRvciIsImlzU3VwZXJBZG1pbiIsImNoZWNrSXNTdXBlckFkbWluIiwiaXNVc2VyIiwiY2hlY2tJc1VzZXIiLCJ1c2VQZXJtaXNzaW9ucyIsImZsdXgiLCJ1c2VyTGV2ZWwiLCJzZXRVc2VyTGV2ZWwiLCJ1cGRhdGVVc2VyTGV2ZWwiLCJzZXNzaW9uIiwiZ2V0U3RhdGUiLCJsZXZlbCIsInVzZXJBY2Nlc3MiLCJ1bnN1YnNjcmliZSIsIm9uIiwidW5zdWJzY3JpYmVVcGRhdGUiLCJ1bnN1YnNjcmliZVNlc3Npb24iLCJ1bnN1YnNjcmliZVNpZ25PdXQiLCJoYXNQZXJtaXNzaW9uTGV2ZWwiLCJyZXF1aXJlZExldmVsIiwiY2hlY2tSZXNvdXJjZVBlcm1pc3Npb24iLCJyZXNvdXJjZSIsInBlcm1pc3Npb25zIiwicmVzb3VyY2VQZXJtaXNzaW9uIiwiZmluZCIsInAiLCJ1bmRlZmluZWQiLCJjaGVja1Jlc291cmNlIiwiUGVybWlzc2lvbkd1YXJkIiwiZmFsbGJhY2siLCJjaGlsZHJlbiIsImhhc0FjY2VzcyIsIlBlcm1pc3Npb25MZXZl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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FluxFramework } from '@nlabs/arkhamjs';
|
|
2
|
+
export interface ActionRequestOptions {
|
|
3
|
+
readonly cacheTimeout?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare const getCachedRequest: <T>(flux: FluxFramework, scope: string, payload?: Record<string, unknown>, options?: ActionRequestOptions) => T | undefined;
|
|
6
|
+
export declare const setCachedRequest: <T>(flux: FluxFramework, scope: string, payload: Record<string, unknown>, data: T, options?: ActionRequestOptions) => Promise<T>;
|
|
7
|
+
export declare const clearCachedRequest: (flux: FluxFramework, scope: string) => Promise<void>;
|
|
8
|
+
//# sourceMappingURL=requestCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestCache.d.ts","sourceRoot":"","sources":["../../src/utils/requestCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAiCD,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAChC,MAAM,aAAa,EACnB,OAAO,MAAM,EACb,UAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,UAAS,oBAAyB,KACjC,CAAC,GAAG,SAsBN,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,CAAC,EACtC,MAAM,aAAa,EACnB,OAAO,MAAM,EACb,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,MAAM,CAAC,EACP,UAAS,oBAAyB,KACjC,OAAO,CAAC,CAAC,CAeX,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,MAAM,aAAa,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAMzF,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const REQUEST_CACHE_PATH = 'app.requestCache';
|
|
2
|
+
const normalizePayload = (value)=>{
|
|
3
|
+
if (Array.isArray(value)) {
|
|
4
|
+
return value.map(normalizePayload);
|
|
5
|
+
}
|
|
6
|
+
if (value && typeof value === 'object') {
|
|
7
|
+
return Object.keys(value).sort().reduce((result, key)=>{
|
|
8
|
+
result[key] = normalizePayload(value[key]);
|
|
9
|
+
return result;
|
|
10
|
+
}, {});
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
};
|
|
14
|
+
const getPayloadKey = (payload = {})=>JSON.stringify(normalizePayload(payload));
|
|
15
|
+
const getCachePath = (scope)=>`${REQUEST_CACHE_PATH}.${scope}`;
|
|
16
|
+
export const getCachedRequest = (flux, scope, payload = {}, options = {})=>{
|
|
17
|
+
const cacheTimeout = Number(options?.cacheTimeout || 0);
|
|
18
|
+
if (cacheTimeout <= 0) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const entry = flux.getState(getCachePath(scope));
|
|
22
|
+
if (!entry) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const payloadKey = getPayloadKey(payload);
|
|
26
|
+
const timeoutMinutes = Number(entry.cacheTimeout || 0);
|
|
27
|
+
const expiresAt = entry.cacheTimestamp + timeoutMinutes * 60 * 1000;
|
|
28
|
+
if (entry.payloadKey !== payloadKey || Date.now() > expiresAt) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
return entry.data;
|
|
32
|
+
};
|
|
33
|
+
export const setCachedRequest = async (flux, scope, payload = {}, data, options = {})=>{
|
|
34
|
+
const cacheTimeout = Number(options?.cacheTimeout || 0);
|
|
35
|
+
if (cacheTimeout <= 0 || typeof flux?.setState !== 'function') {
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
await flux.setState(getCachePath(scope), {
|
|
39
|
+
cacheTimeout,
|
|
40
|
+
cacheTimestamp: Date.now(),
|
|
41
|
+
data,
|
|
42
|
+
payloadKey: getPayloadKey(payload)
|
|
43
|
+
});
|
|
44
|
+
return data;
|
|
45
|
+
};
|
|
46
|
+
export const clearCachedRequest = async (flux, scope)=>{
|
|
47
|
+
if (typeof flux?.setState !== 'function') {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
await flux.setState(getCachePath(scope), undefined);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvcmVxdWVzdENhY2hlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtGbHV4RnJhbWV3b3JrfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvblJlcXVlc3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2FjaGVUaW1lb3V0PzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVxdWVzdENhY2hlRW50cnk8VCA9IHVua25vd24+IHtcbiAgcmVhZG9ubHkgY2FjaGVUaW1lb3V0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNhY2hlVGltZXN0YW1wOiBudW1iZXI7XG4gIHJlYWRvbmx5IGRhdGE6IFQ7XG4gIHJlYWRvbmx5IHBheWxvYWRLZXk6IHN0cmluZztcbn1cblxuY29uc3QgUkVRVUVTVF9DQUNIRV9QQVRIID0gJ2FwcC5yZXF1ZXN0Q2FjaGUnO1xuXG5jb25zdCBub3JtYWxpemVQYXlsb2FkID0gKHZhbHVlOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gIGlmKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcChub3JtYWxpemVQYXlsb2FkKTtcbiAgfVxuXG4gIGlmKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAuc29ydCgpXG4gICAgICAucmVkdWNlKChyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXkpID0+IHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBub3JtYWxpemVQYXlsb2FkKCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCBnZXRQYXlsb2FkS2V5ID0gKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBzdHJpbmcgPT5cbiAgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplUGF5bG9hZChwYXlsb2FkKSk7XG5cbmNvbnN0IGdldENhY2hlUGF0aCA9IChzY29wZTogc3RyaW5nKTogc3RyaW5nID0+IGAke1JFUVVFU1RfQ0FDSEVfUEFUSH0uJHtzY29wZX1gO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2FjaGVkUmVxdWVzdCA9IDxUPihcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgc2NvcGU6IHN0cmluZyxcbiAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbiAgb3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuKTogVCB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGNhY2hlVGltZW91dCA9IE51bWJlcihvcHRpb25zPy5jYWNoZVRpbWVvdXQgfHwgMCk7XG5cbiAgaWYoY2FjaGVUaW1lb3V0IDw9IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZW50cnkgPSBmbHV4LmdldFN0YXRlPFJlcXVlc3RDYWNoZUVudHJ5PFQ+IHwgdW5kZWZpbmVkPihnZXRDYWNoZVBhdGgoc2NvcGUpKTtcblxuICBpZighZW50cnkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcGF5bG9hZEtleSA9IGdldFBheWxvYWRLZXkocGF5bG9hZCk7XG4gIGNvbnN0IHRpbWVvdXRNaW51dGVzID0gTnVtYmVyKGVudHJ5LmNhY2hlVGltZW91dCB8fCAwKTtcbiAgY29uc3QgZXhwaXJlc0F0ID0gZW50cnkuY2FjaGVUaW1lc3RhbXAgKyAodGltZW91dE1pbnV0ZXMgKiA2MCAqIDEwMDApO1xuXG4gIGlmKGVudHJ5LnBheWxvYWRLZXkgIT09IHBheWxvYWRLZXkgfHwgRGF0ZS5ub3coKSA+IGV4cGlyZXNBdCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gZW50cnkuZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDYWNoZWRSZXF1ZXN0ID0gYXN5bmMgPFQ+KFxuICBmbHV4OiBGbHV4RnJhbWV3b3JrLFxuICBzY29wZTogc3RyaW5nLFxuICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICBkYXRhOiBULFxuICBvcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+ID0+IHtcbiAgY29uc3QgY2FjaGVUaW1lb3V0ID0gTnVtYmVyKG9wdGlvbnM/LmNhY2hlVGltZW91dCB8fCAwKTtcblxuICBpZihjYWNoZVRpbWVvdXQgPD0gMCB8fCB0eXBlb2YgZmx1eD8uc2V0U3RhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGF3YWl0IGZsdXguc2V0U3RhdGUoZ2V0Q2FjaGVQYXRoKHNjb3BlKSwge1xuICAgIGNhY2hlVGltZW91dCxcbiAgICBjYWNoZVRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICBkYXRhLFxuICAgIHBheWxvYWRLZXk6IGdldFBheWxvYWRLZXkocGF5bG9hZClcbiAgfSBhcyBSZXF1ZXN0Q2FjaGVFbnRyeTxUPik7XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYXJDYWNoZWRSZXF1ZXN0ID0gYXN5bmMgKGZsdXg6IEZsdXhGcmFtZXdvcmssIHNjb3BlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYodHlwZW9mIGZsdXg/LnNldFN0YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZmx1eC5zZXRTdGF0ZShnZXRDYWNoZVBhdGgoc2NvcGUpLCB1bmRlZmluZWQpO1xufTtcbiJdLCJuYW1lcyI6WyJSRVFVRVNUX0NBQ0hFX1BBVEgiLCJub3JtYWxpemVQYXlsb2FkIiwidmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJPYmplY3QiLCJrZXlzIiwic29ydCIsInJlZHVjZSIsInJlc3VsdCIsImtleSIsImdldFBheWxvYWRLZXkiLCJwYXlsb2FkIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldENhY2hlUGF0aCIsInNjb3BlIiwiZ2V0Q2FjaGVkUmVxdWVzdCIsImZsdXgiLCJvcHRpb25zIiwiY2FjaGVUaW1lb3V0IiwiTnVtYmVyIiwidW5kZWZpbmVkIiwiZW50cnkiLCJnZXRTdGF0ZSIsInBheWxvYWRLZXkiLCJ0aW1lb3V0TWludXRlcyIsImV4cGlyZXNBdCIsImNhY2hlVGltZXN0YW1wIiwiRGF0ZSIsIm5vdyIsImRhdGEiLCJzZXRDYWNoZWRSZXF1ZXN0Iiwic2V0U3RhdGUiLCJjbGVhckNhY2hlZFJlcXVlc3QiXSwibWFwcGluZ3MiOiJBQWFBLE1BQU1BLHFCQUFxQjtBQUUzQixNQUFNQyxtQkFBbUIsQ0FBQ0M7SUFDeEIsSUFBR0MsTUFBTUMsT0FBTyxDQUFDRixRQUFRO1FBQ3ZCLE9BQU9BLE1BQU1HLEdBQUcsQ0FBQ0o7SUFDbkI7SUFFQSxJQUFHQyxTQUFTLE9BQU9BLFVBQVUsVUFBVTtRQUNyQyxPQUFPSSxPQUFPQyxJQUFJLENBQUNMLE9BQ2hCTSxJQUFJLEdBQ0pDLE1BQU0sQ0FBQyxDQUFDQyxRQUFpQ0M7WUFDeENELE1BQU0sQ0FBQ0MsSUFBSSxHQUFHVixpQkFBaUIsQUFBQ0MsS0FBaUMsQ0FBQ1MsSUFBSTtZQUN0RSxPQUFPRDtRQUNULEdBQUcsQ0FBQztJQUNSO0lBRUEsT0FBT1I7QUFDVDtBQUVBLE1BQU1VLGdCQUFnQixDQUFDQyxVQUFtQyxDQUFDLENBQUMsR0FDMURDLEtBQUtDLFNBQVMsQ0FBQ2QsaUJBQWlCWTtBQUVsQyxNQUFNRyxlQUFlLENBQUNDLFFBQTBCLEdBQUdqQixtQkFBbUIsQ0FBQyxFQUFFaUIsT0FBTztBQUVoRixPQUFPLE1BQU1DLG1CQUFtQixDQUM5QkMsTUFDQUYsT0FDQUosVUFBbUMsQ0FBQyxDQUFDLEVBQ3JDTyxVQUFnQyxDQUFDLENBQUM7SUFFbEMsTUFBTUMsZUFBZUMsT0FBT0YsU0FBU0MsZ0JBQWdCO0lBRXJELElBQUdBLGdCQUFnQixHQUFHO1FBQ3BCLE9BQU9FO0lBQ1Q7SUFFQSxNQUFNQyxRQUFRTCxLQUFLTSxRQUFRLENBQW1DVCxhQUFhQztJQUUzRSxJQUFHLENBQUNPLE9BQU87UUFDVCxPQUFPRDtJQUNUO0lBRUEsTUFBTUcsYUFBYWQsY0FBY0M7SUFDakMsTUFBTWMsaUJBQWlCTCxPQUFPRSxNQUFNSCxZQUFZLElBQUk7SUFDcEQsTUFBTU8sWUFBWUosTUFBTUssY0FBYyxHQUFJRixpQkFBaUIsS0FBSztJQUVoRSxJQUFHSCxNQUFNRSxVQUFVLEtBQUtBLGNBQWNJLEtBQUtDLEdBQUcsS0FBS0gsV0FBVztRQUM1RCxPQUFPTDtJQUNUO0lBRUEsT0FBT0MsTUFBTVEsSUFBSTtBQUNuQixFQUFFO0FBRUYsT0FBTyxNQUFNQyxtQkFBbUIsT0FDOUJkLE1BQ0FGLE9BQ0FKLFVBQW1DLENBQUMsQ0FBQyxFQUNyQ21CLE1BQ0FaLFVBQWdDLENBQUMsQ0FBQztJQUVsQyxNQUFNQyxlQUFlQyxPQUFPRixTQUFTQyxnQkFBZ0I7SUFFckQsSUFBR0EsZ0JBQWdCLEtBQUssT0FBT0YsTUFBTWUsYUFBYSxZQUFZO1FBQzVELE9BQU9GO0lBQ1Q7SUFFQSxNQUFNYixLQUFLZSxRQUFRLENBQUNsQixhQUFhQyxRQUFRO1FBQ3ZDSTtRQUNBUSxnQkFBZ0JDLEtBQUtDLEdBQUc7UUFDeEJDO1FBQ0FOLFlBQVlkLGNBQWNDO0lBQzVCO0lBRUEsT0FBT21CO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTUcscUJBQXFCLE9BQU9oQixNQUFxQkY7SUFDNUQsSUFBRyxPQUFPRSxNQUFNZSxhQUFhLFlBQVk7UUFDdkM7SUFDRjtJQUVBLE1BQU1mLEtBQUtlLFFBQVEsQ0FBQ2xCLGFBQWFDLFFBQVFNO0FBQzNDLEVBQUUifQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FluxFramework } from '@nlabs/arkhamjs';
|
|
2
|
+
import type { SessionType } from './api.js';
|
|
3
|
+
import type { ConfigAppSessionType } from '../config/index.js';
|
|
4
|
+
export declare const parseJwtExpiryMs: (token: string) => number;
|
|
5
|
+
export declare const parseJwtIssuedMs: (token: string) => number;
|
|
6
|
+
export declare const normalizeSession: (session?: Record<string, unknown>) => Record<string, unknown>;
|
|
7
|
+
export declare const isValidSession: (session?: Record<string, unknown>) => boolean;
|
|
8
|
+
export declare const getRefreshWindowMinutes: (sessionLifetimeMinutes: number, sessionConfig?: ConfigAppSessionType) => number;
|
|
9
|
+
export declare const storeSession: (flux: FluxFramework, session?: Record<string, unknown>) => Promise<SessionType>;
|
|
10
|
+
export declare const readStoredSession: (flux: FluxFramework) => Promise<SessionType>;
|
|
11
|
+
export declare const clearPersistedSession: (flux: FluxFramework) => Promise<void>;
|
|
12
|
+
export declare const hydrateSessionFromStorage: (flux: FluxFramework) => Promise<SessionType>;
|
|
13
|
+
export declare const isLoggedIn: (flux: FluxFramework) => boolean;
|
|
14
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AA4D7D,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,MACF,CAAC;AAEhD,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,MACF,CAAC;AAEhD,eAAO,MAAM,gBAAgB,GAAI,UAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAiB9F,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,UAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,KAAG,OAatE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,wBAAwB,MAAM,EAC9B,gBAAe,oBAAyB,KACvC,MASF,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,MAAM,aAAa,EACnB,UAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,KACpC,OAAO,CAAC,WAAW,CAYrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,MAAM,aAAa,KAAG,OAAO,CAAC,WAAW,CACsB,CAAC;AAExG,eAAO,MAAM,qBAAqB,GAAU,MAAM,aAAa,KAAG,OAAO,CAAC,IAAI,CAE7E,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAU,MAAM,aAAa,KAAG,OAAO,CAAC,WAAW,CAUxF,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,aAAa,KAAG,OAIhD,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const MILLIS_THRESHOLD = 1_000_000_000_000;
|
|
2
|
+
const SECONDS_THRESHOLD = 1_000_000_000;
|
|
3
|
+
const decodeJwtPayload = (token)=>{
|
|
4
|
+
try {
|
|
5
|
+
if (!token) {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
const tokenParts = token.split('.');
|
|
9
|
+
if (tokenParts.length < 2 || typeof atob !== 'function') {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
const payloadBase64 = tokenParts[1]?.replace(/-/g, '+').replace(/_/g, '/');
|
|
13
|
+
const normalized = payloadBase64?.padEnd(Math.ceil(payloadBase64.length / 4) * 4, '=');
|
|
14
|
+
return JSON.parse(atob(normalized || ''));
|
|
15
|
+
} catch (error) {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const parseTimestampMs = (value)=>{
|
|
20
|
+
const numericValue = Number(value || 0);
|
|
21
|
+
if (numericValue > MILLIS_THRESHOLD) {
|
|
22
|
+
return numericValue;
|
|
23
|
+
}
|
|
24
|
+
if (numericValue > SECONDS_THRESHOLD) {
|
|
25
|
+
return numericValue * 1000;
|
|
26
|
+
}
|
|
27
|
+
return 0;
|
|
28
|
+
};
|
|
29
|
+
const getSessionToken = (session)=>String(session.token || session.idToken?.jwtToken || session.accessToken?.jwtToken || '');
|
|
30
|
+
const buildTokenValue = (token, currentToken)=>currentToken && typeof currentToken === 'object' ? currentToken : {
|
|
31
|
+
jwtToken: token
|
|
32
|
+
};
|
|
33
|
+
const getNormalizedSessionTimestamps = (session, token)=>{
|
|
34
|
+
const payload = decodeJwtPayload(token);
|
|
35
|
+
const expires = parseTimestampMs(session.expires) || parseTimestampMs(payload.exp);
|
|
36
|
+
const issued = parseTimestampMs(session.issued) || parseTimestampMs(payload.iat);
|
|
37
|
+
return {
|
|
38
|
+
expires,
|
|
39
|
+
issued
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export const parseJwtExpiryMs = (token)=>parseTimestampMs(decodeJwtPayload(token).exp);
|
|
43
|
+
export const parseJwtIssuedMs = (token)=>parseTimestampMs(decodeJwtPayload(token).iat);
|
|
44
|
+
export const normalizeSession = (session = {})=>{
|
|
45
|
+
const token = getSessionToken(session);
|
|
46
|
+
if (!token) {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
const { expires, issued } = getNormalizedSessionTimestamps(session, token);
|
|
50
|
+
return {
|
|
51
|
+
...session,
|
|
52
|
+
accessToken: buildTokenValue(token, session.accessToken),
|
|
53
|
+
expires,
|
|
54
|
+
idToken: buildTokenValue(token, session.idToken),
|
|
55
|
+
issued,
|
|
56
|
+
token
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
export const isValidSession = (session = {})=>{
|
|
60
|
+
const normalized = normalizeSession(session);
|
|
61
|
+
const token = String(normalized?.token || '');
|
|
62
|
+
if (!token) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const sessionExpires = Number(normalized?.expires || 0);
|
|
66
|
+
const tokenExpires = parseJwtExpiryMs(token);
|
|
67
|
+
const expiresAt = sessionExpires > 0 ? sessionExpires : tokenExpires;
|
|
68
|
+
return Boolean(expiresAt && Date.now() < expiresAt);
|
|
69
|
+
};
|
|
70
|
+
export const getRefreshWindowMinutes = (sessionLifetimeMinutes, sessionConfig = {})=>{
|
|
71
|
+
const lifetimeMinutes = Math.max(1, Number(sessionLifetimeMinutes || 0));
|
|
72
|
+
const refreshAfterRatio = Number(sessionConfig.refreshAfterRatio || 0);
|
|
73
|
+
if (refreshAfterRatio > 0 && refreshAfterRatio < 1) {
|
|
74
|
+
return Math.max(1, Math.round(lifetimeMinutes * (1 - refreshAfterRatio)));
|
|
75
|
+
}
|
|
76
|
+
return Math.max(1, Number(sessionConfig.minMinutes || 5));
|
|
77
|
+
};
|
|
78
|
+
export const storeSession = (flux, session = {})=>{
|
|
79
|
+
return (async ()=>{
|
|
80
|
+
const normalizedSession = normalizeSession(session);
|
|
81
|
+
if (!Object.keys(normalizedSession).length) {
|
|
82
|
+
await clearPersistedSession(flux);
|
|
83
|
+
return {};
|
|
84
|
+
}
|
|
85
|
+
await Promise.resolve(flux.setState('user.session', normalizedSession));
|
|
86
|
+
return normalizedSession;
|
|
87
|
+
})();
|
|
88
|
+
};
|
|
89
|
+
export const readStoredSession = async (flux)=>normalizeSession(flux.getState('user.session', {}) || {});
|
|
90
|
+
export const clearPersistedSession = async (flux)=>{
|
|
91
|
+
await Promise.resolve(flux.setState('user.session', {}));
|
|
92
|
+
};
|
|
93
|
+
export const hydrateSessionFromStorage = async (flux)=>{
|
|
94
|
+
const currentSession = await readStoredSession(flux);
|
|
95
|
+
if (isValidSession(currentSession)) {
|
|
96
|
+
await storeSession(flux, currentSession);
|
|
97
|
+
return currentSession;
|
|
98
|
+
}
|
|
99
|
+
await clearPersistedSession(flux);
|
|
100
|
+
return {};
|
|
101
|
+
};
|
|
102
|
+
export const isLoggedIn = (flux)=>{
|
|
103
|
+
const currentSession = flux.getState('user.session', {}) || {};
|
|
104
|
+
return isValidSession(currentSession);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvc2Vzc2lvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7Rmx1eEZyYW1ld29ya30gZnJvbSAnQG5sYWJzL2Fya2hhbWpzJztcbmltcG9ydCB0eXBlIHtTZXNzaW9uVHlwZX0gZnJvbSAnLi9hcGkuanMnO1xuaW1wb3J0IHR5cGUge0NvbmZpZ0FwcFNlc3Npb25UeXBlfSBmcm9tICcuLi9jb25maWcvaW5kZXguanMnO1xuXG5jb25zdCBNSUxMSVNfVEhSRVNIT0xEID0gMV8wMDBfMDAwXzAwMF8wMDA7XG5jb25zdCBTRUNPTkRTX1RIUkVTSE9MRCA9IDFfMDAwXzAwMF8wMDA7XG5cbmNvbnN0IGRlY29kZUp3dFBheWxvYWQgPSAodG9rZW46IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgdHJ5IHtcbiAgICBpZighdG9rZW4pIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlblBhcnRzID0gdG9rZW4uc3BsaXQoJy4nKTtcbiAgICBpZih0b2tlblBhcnRzLmxlbmd0aCA8IDIgfHwgdHlwZW9mIGF0b2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkQmFzZTY0ID0gdG9rZW5QYXJ0c1sxXT8ucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICBjb25zdCBub3JtYWxpemVkID0gcGF5bG9hZEJhc2U2ND8ucGFkRW5kKE1hdGguY2VpbChwYXlsb2FkQmFzZTY0Lmxlbmd0aCAvIDQpICogNCwgJz0nKTtcblxuICAgIHJldHVybiBKU09OLnBhcnNlKGF0b2Iobm9ybWFsaXplZCB8fCAnJykpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59O1xuXG5jb25zdCBwYXJzZVRpbWVzdGFtcE1zID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKHZhbHVlIHx8IDApO1xuXG4gIGlmKG51bWVyaWNWYWx1ZSA+IE1JTExJU19USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbnVtZXJpY1ZhbHVlO1xuICB9XG5cbiAgaWYobnVtZXJpY1ZhbHVlID4gU0VDT05EU19USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbnVtZXJpY1ZhbHVlICogMTAwMDtcbiAgfVxuXG4gIHJldHVybiAwO1xufTtcblxuY29uc3QgZ2V0U2Vzc2lvblRva2VuID0gKHNlc3Npb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nID0+XG4gIFN0cmluZyhcbiAgICBzZXNzaW9uLnRva2VuXG4gICAgfHwgKHNlc3Npb24uaWRUb2tlbiBhcyB7and0VG9rZW4/OiBzdHJpbmd9IHwgdW5kZWZpbmVkKT8uand0VG9rZW5cbiAgICB8fCAoc2Vzc2lvbi5hY2Nlc3NUb2tlbiBhcyB7and0VG9rZW4/OiBzdHJpbmd9IHwgdW5kZWZpbmVkKT8uand0VG9rZW5cbiAgICB8fCAnJ1xuICApO1xuXG5jb25zdCBidWlsZFRva2VuVmFsdWUgPSAodG9rZW46IHN0cmluZywgY3VycmVudFRva2VuPzogdW5rbm93bikgPT5cbiAgY3VycmVudFRva2VuICYmIHR5cGVvZiBjdXJyZW50VG9rZW4gPT09ICdvYmplY3QnXG4gICAgPyBjdXJyZW50VG9rZW5cbiAgICA6IHtqd3RUb2tlbjogdG9rZW59O1xuXG5jb25zdCBnZXROb3JtYWxpemVkU2Vzc2lvblRpbWVzdGFtcHMgPSAoc2Vzc2lvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHRva2VuOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcGF5bG9hZCA9IGRlY29kZUp3dFBheWxvYWQodG9rZW4pO1xuICBjb25zdCBleHBpcmVzID0gcGFyc2VUaW1lc3RhbXBNcyhzZXNzaW9uLmV4cGlyZXMpIHx8IHBhcnNlVGltZXN0YW1wTXMocGF5bG9hZC5leHApO1xuICBjb25zdCBpc3N1ZWQgPSBwYXJzZVRpbWVzdGFtcE1zKHNlc3Npb24uaXNzdWVkKSB8fCBwYXJzZVRpbWVzdGFtcE1zKHBheWxvYWQuaWF0KTtcblxuICByZXR1cm4ge2V4cGlyZXMsIGlzc3VlZH07XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VKd3RFeHBpcnlNcyA9ICh0b2tlbjogc3RyaW5nKTogbnVtYmVyID0+XG4gIHBhcnNlVGltZXN0YW1wTXMoZGVjb2RlSnd0UGF5bG9hZCh0b2tlbikuZXhwKTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlSnd0SXNzdWVkTXMgPSAodG9rZW46IHN0cmluZyk6IG51bWJlciA9PlxuICBwYXJzZVRpbWVzdGFtcE1zKGRlY29kZUp3dFBheWxvYWQodG9rZW4pLmlhdCk7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVTZXNzaW9uID0gKHNlc3Npb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHRva2VuID0gZ2V0U2Vzc2lvblRva2VuKHNlc3Npb24pO1xuXG4gIGlmKCF0b2tlbikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHtleHBpcmVzLCBpc3N1ZWR9ID0gZ2V0Tm9ybWFsaXplZFNlc3Npb25UaW1lc3RhbXBzKHNlc3Npb24sIHRva2VuKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnNlc3Npb24sXG4gICAgYWNjZXNzVG9rZW46IGJ1aWxkVG9rZW5WYWx1ZSh0b2tlbiwgc2Vzc2lvbi5hY2Nlc3NUb2tlbiksXG4gICAgZXhwaXJlcyxcbiAgICBpZFRva2VuOiBidWlsZFRva2VuVmFsdWUodG9rZW4sIHNlc3Npb24uaWRUb2tlbiksXG4gICAgaXNzdWVkLFxuICAgIHRva2VuXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNWYWxpZFNlc3Npb24gPSAoc2Vzc2lvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2Vzc2lvbihzZXNzaW9uKTtcbiAgY29uc3QgdG9rZW4gPSBTdHJpbmcobm9ybWFsaXplZD8udG9rZW4gfHwgJycpO1xuXG4gIGlmKCF0b2tlbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHNlc3Npb25FeHBpcmVzID0gTnVtYmVyKG5vcm1hbGl6ZWQ/LmV4cGlyZXMgfHwgMCk7XG4gIGNvbnN0IHRva2VuRXhwaXJlcyA9IHBhcnNlSnd0RXhwaXJ5TXModG9rZW4pO1xuICBjb25zdCBleHBpcmVzQXQgPSBzZXNzaW9uRXhwaXJlcyA+IDAgPyBzZXNzaW9uRXhwaXJlcyA6IHRva2VuRXhwaXJlcztcblxuICByZXR1cm4gQm9vbGVhbihleHBpcmVzQXQgJiYgRGF0ZS5ub3coKSA8IGV4cGlyZXNBdCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVmcmVzaFdpbmRvd01pbnV0ZXMgPSAoXG4gIHNlc3Npb25MaWZldGltZU1pbnV0ZXM6IG51bWJlcixcbiAgc2Vzc2lvbkNvbmZpZzogQ29uZmlnQXBwU2Vzc2lvblR5cGUgPSB7fVxuKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbGlmZXRpbWVNaW51dGVzID0gTWF0aC5tYXgoMSwgTnVtYmVyKHNlc3Npb25MaWZldGltZU1pbnV0ZXMgfHwgMCkpO1xuICBjb25zdCByZWZyZXNoQWZ0ZXJSYXRpbyA9IE51bWJlcihzZXNzaW9uQ29uZmlnLnJlZnJlc2hBZnRlclJhdGlvIHx8IDApO1xuXG4gIGlmKHJlZnJlc2hBZnRlclJhdGlvID4gMCAmJiByZWZyZXNoQWZ0ZXJSYXRpbyA8IDEpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChsaWZldGltZU1pbnV0ZXMgKiAoMSAtIHJlZnJlc2hBZnRlclJhdGlvKSkpO1xuICB9XG5cbiAgcmV0dXJuIE1hdGgubWF4KDEsIE51bWJlcihzZXNzaW9uQ29uZmlnLm1pbk1pbnV0ZXMgfHwgNSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHN0b3JlU2Vzc2lvbiA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgc2Vzc2lvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuKTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2Vzc2lvbiA9IG5vcm1hbGl6ZVNlc3Npb24oc2Vzc2lvbikgYXMgU2Vzc2lvblR5cGU7XG5cbiAgICBpZighT2JqZWN0LmtleXMobm9ybWFsaXplZFNlc3Npb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmxlbmd0aCkge1xuICAgICAgYXdhaXQgY2xlYXJQZXJzaXN0ZWRTZXNzaW9uKGZsdXgpO1xuICAgICAgcmV0dXJuIHt9IGFzIFNlc3Npb25UeXBlO1xuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShmbHV4LnNldFN0YXRlKCd1c2VyLnNlc3Npb24nLCBub3JtYWxpemVkU2Vzc2lvbikpO1xuICAgIHJldHVybiBub3JtYWxpemVkU2Vzc2lvbjtcbiAgfSkoKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWFkU3RvcmVkU2Vzc2lvbiA9IGFzeW5jIChmbHV4OiBGbHV4RnJhbWV3b3JrKTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT5cbiAgbm9ybWFsaXplU2Vzc2lvbigoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgYXMgU2Vzc2lvblR5cGU7XG5cbmV4cG9ydCBjb25zdCBjbGVhclBlcnNpc3RlZFNlc3Npb24gPSBhc3luYyAoZmx1eDogRmx1eEZyYW1ld29yayk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLnJlc29sdmUoZmx1eC5zZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlID0gYXN5bmMgKGZsdXg6IEZsdXhGcmFtZXdvcmspOiBQcm9taXNlPFNlc3Npb25UeXBlPiA9PiB7XG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uID0gYXdhaXQgcmVhZFN0b3JlZFNlc3Npb24oZmx1eCk7XG5cbiAgaWYoaXNWYWxpZFNlc3Npb24oY3VycmVudFNlc3Npb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgYXdhaXQgc3RvcmVTZXNzaW9uKGZsdXgsIGN1cnJlbnRTZXNzaW9uIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIHJldHVybiBjdXJyZW50U2Vzc2lvbjtcbiAgfVxuXG4gIGF3YWl0IGNsZWFyUGVyc2lzdGVkU2Vzc2lvbihmbHV4KTtcbiAgcmV0dXJuIHt9IGFzIFNlc3Npb25UeXBlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzTG9nZ2VkSW4gPSAoZmx1eDogRmx1eEZyYW1ld29yayk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBjdXJyZW50U2Vzc2lvbiA9IChmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCB7fSkgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIHJldHVybiBpc1ZhbGlkU2Vzc2lvbihjdXJyZW50U2Vzc2lvbik7XG59O1xuIl0sIm5hbWVzIjpbIk1JTExJU19USFJFU0hPTEQiLCJTRUNPTkRTX1RIUkVTSE9MRCIsImRlY29kZUp3dFBheWxvYWQiLCJ0b2tlbiIsInRva2VuUGFydHMiLCJzcGxpdCIsImxlbmd0aCIsImF0b2IiLCJwYXlsb2FkQmFzZTY0IiwicmVwbGFjZSIsIm5vcm1hbGl6ZWQiLCJwYWRFbmQiLCJNYXRoIiwiY2VpbCIsIkpTT04iLCJwYXJzZSIsImVycm9yIiwicGFyc2VUaW1lc3RhbXBNcyIsInZhbHVlIiwibnVtZXJpY1ZhbHVlIiwiTnVtYmVyIiwiZ2V0U2Vzc2lvblRva2VuIiwic2Vzc2lvbiIsIlN0cmluZyIsImlkVG9rZW4iLCJqd3RUb2tlbiIsImFjY2Vzc1Rva2VuIiwiYnVpbGRUb2tlblZhbHVlIiwiY3VycmVudFRva2VuIiwiZ2V0Tm9ybWFsaXplZFNlc3Npb25UaW1lc3RhbXBzIiwicGF5bG9hZCIsImV4cGlyZXMiLCJleHAiLCJpc3N1ZWQiLCJpYXQiLCJwYXJzZUp3dEV4cGlyeU1zIiwicGFyc2VKd3RJc3N1ZWRNcyIsIm5vcm1hbGl6ZVNlc3Npb24iLCJpc1ZhbGlkU2Vzc2lvbiIsInNlc3Npb25FeHBpcmVzIiwidG9rZW5FeHBpcmVzIiwiZXhwaXJlc0F0IiwiQm9vbGVhbiIsIkRhdGUiLCJub3ciLCJnZXRSZWZyZXNoV2luZG93TWludXRlcyIsInNlc3Npb25MaWZldGltZU1pbnV0ZXMiLCJzZXNzaW9uQ29uZmlnIiwibGlmZXRpbWVNaW51dGVzIiwibWF4IiwicmVmcmVzaEFmdGVyUmF0aW8iLCJyb3VuZCIsIm1pbk1pbnV0ZXMiLCJzdG9yZVNlc3Npb24iLCJmbHV4Iiwibm9ybWFsaXplZFNlc3Npb24iLCJPYmplY3QiLCJrZXlzIiwiY2xlYXJQZXJzaXN0ZWRTZXNzaW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRTdGF0ZSIsInJlYWRTdG9yZWRTZXNzaW9uIiwiZ2V0U3RhdGUiLCJoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlIiwiY3VycmVudFNlc3Npb24iLCJpc0xvZ2dlZEluIl0sIm1hcHBpbmdzIjoiQUFJQSxNQUFNQSxtQkFBbUI7QUFDekIsTUFBTUMsb0JBQW9CO0FBRTFCLE1BQU1DLG1CQUFtQixDQUFDQztJQUN4QixJQUFJO1FBQ0YsSUFBRyxDQUFDQSxPQUFPO1lBQ1QsT0FBTyxDQUFDO1FBQ1Y7UUFFQSxNQUFNQyxhQUFhRCxNQUFNRSxLQUFLLENBQUM7UUFDL0IsSUFBR0QsV0FBV0UsTUFBTSxHQUFHLEtBQUssT0FBT0MsU0FBUyxZQUFZO1lBQ3RELE9BQU8sQ0FBQztRQUNWO1FBRUEsTUFBTUMsZ0JBQWdCSixVQUFVLENBQUMsRUFBRSxFQUFFSyxRQUFRLE1B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
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
type TypingUser = {
|
|
2
|
+
readonly imageUrl?: string;
|
|
3
|
+
readonly name?: string;
|
|
4
|
+
readonly personaId?: string;
|
|
5
|
+
readonly thumbUrl?: string;
|
|
6
|
+
readonly userId?: string;
|
|
7
|
+
readonly username?: string;
|
|
8
|
+
};
|
|
9
|
+
export type ConversationTypingOptions = {
|
|
10
|
+
readonly name?: string;
|
|
11
|
+
readonly personaId?: string;
|
|
12
|
+
readonly userId?: string;
|
|
13
|
+
readonly username?: string;
|
|
14
|
+
readonly users?: TypingUser[];
|
|
15
|
+
};
|
|
16
|
+
export type UseConversationTypingOptions = {
|
|
17
|
+
readonly debounceMs?: number;
|
|
18
|
+
readonly idleMs?: number;
|
|
19
|
+
};
|
|
20
|
+
export declare const useConversationTyping: ({ debounceMs, idleMs }?: UseConversationTypingOptions) => {
|
|
21
|
+
setConversation: (conversationId: string, options?: ConversationTypingOptions) => void;
|
|
22
|
+
stopTyping: (conversationId?: string, options?: ConversationTypingOptions) => void;
|
|
23
|
+
syncDraft: (conversationId: string, draft: string, options?: ConversationTypingOptions) => void;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=useConversationTyping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConversationTyping.d.ts","sourceRoot":"","sources":["../../src/utils/useConversationTyping.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAKF,eAAO,MAAM,qBAAqB,GAAI,yBAGnC,4BAAiC;sCAyEmB,MAAM,YAAW,yBAAyB;oDAiBJ,yBAAyB;gCA3CrE,MAAM,SAAS,MAAM,YAAW,yBAAyB;CA8DzG,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
import { useWebsocketActions } from './useMetropolis.js';
|
|
3
|
+
const DEFAULT_DEBOUNCE_MS = 300;
|
|
4
|
+
const DEFAULT_IDLE_MS = 60000;
|
|
5
|
+
export const useConversationTyping = ({ debounceMs = DEFAULT_DEBOUNCE_MS, idleMs = DEFAULT_IDLE_MS } = {})=>{
|
|
6
|
+
const websocketActions = useWebsocketActions();
|
|
7
|
+
const typingTimeoutRef = useRef(null);
|
|
8
|
+
const typingDebounceRef = useRef(null);
|
|
9
|
+
const typingConversationIdRef = useRef('');
|
|
10
|
+
const typingOptionsRef = useRef({});
|
|
11
|
+
const typingStateRef = useRef(false);
|
|
12
|
+
const clearTypingTimer = useCallback(()=>{
|
|
13
|
+
if (typingTimeoutRef.current) {
|
|
14
|
+
clearTimeout(typingTimeoutRef.current);
|
|
15
|
+
typingTimeoutRef.current = null;
|
|
16
|
+
}
|
|
17
|
+
}, []);
|
|
18
|
+
const clearTypingDebounce = useCallback(()=>{
|
|
19
|
+
if (typingDebounceRef.current) {
|
|
20
|
+
clearTimeout(typingDebounceRef.current);
|
|
21
|
+
typingDebounceRef.current = null;
|
|
22
|
+
}
|
|
23
|
+
}, []);
|
|
24
|
+
const updateTypingState = useCallback((conversationId, isTyping, options = {})=>{
|
|
25
|
+
const previousConversationId = typingConversationIdRef.current;
|
|
26
|
+
const typingOptions = Object.keys(options).length ? options : typingOptionsRef.current;
|
|
27
|
+
typingOptionsRef.current = typingOptions;
|
|
28
|
+
if (previousConversationId && previousConversationId !== conversationId && typingStateRef.current) {
|
|
29
|
+
websocketActions.sendTyping(previousConversationId, false, typingOptions);
|
|
30
|
+
typingStateRef.current = false;
|
|
31
|
+
}
|
|
32
|
+
if (!conversationId) {
|
|
33
|
+
typingConversationIdRef.current = '';
|
|
34
|
+
typingStateRef.current = false;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (previousConversationId === conversationId && typingStateRef.current === isTyping) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
websocketActions.sendTyping(conversationId, isTyping, typingOptions);
|
|
41
|
+
typingConversationIdRef.current = conversationId;
|
|
42
|
+
typingStateRef.current = isTyping;
|
|
43
|
+
}, [
|
|
44
|
+
websocketActions
|
|
45
|
+
]);
|
|
46
|
+
const syncDraft = useCallback((conversationId, draft, options = {})=>{
|
|
47
|
+
typingOptionsRef.current = options;
|
|
48
|
+
clearTypingDebounce();
|
|
49
|
+
clearTypingTimer();
|
|
50
|
+
if (!conversationId) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (draft.trim()) {
|
|
54
|
+
if (!typingStateRef.current || typingConversationIdRef.current !== conversationId) {
|
|
55
|
+
typingDebounceRef.current = setTimeout(()=>{
|
|
56
|
+
updateTypingState(conversationId, true, options);
|
|
57
|
+
typingDebounceRef.current = null;
|
|
58
|
+
}, debounceMs);
|
|
59
|
+
}
|
|
60
|
+
typingTimeoutRef.current = setTimeout(()=>{
|
|
61
|
+
updateTypingState(conversationId, false, options);
|
|
62
|
+
}, idleMs);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
updateTypingState(conversationId, false, options);
|
|
66
|
+
}, [
|
|
67
|
+
clearTypingDebounce,
|
|
68
|
+
clearTypingTimer,
|
|
69
|
+
debounceMs,
|
|
70
|
+
idleMs,
|
|
71
|
+
updateTypingState
|
|
72
|
+
]);
|
|
73
|
+
const setConversation = useCallback((conversationId, options = {})=>{
|
|
74
|
+
clearTypingDebounce();
|
|
75
|
+
clearTypingTimer();
|
|
76
|
+
typingOptionsRef.current = options;
|
|
77
|
+
if (typingConversationIdRef.current && typingConversationIdRef.current !== conversationId && typingStateRef.current) {
|
|
78
|
+
websocketActions.sendTyping(typingConversationIdRef.current, false, typingOptionsRef.current);
|
|
79
|
+
typingStateRef.current = false;
|
|
80
|
+
}
|
|
81
|
+
typingConversationIdRef.current = conversationId;
|
|
82
|
+
if (!conversationId) {
|
|
83
|
+
typingStateRef.current = false;
|
|
84
|
+
}
|
|
85
|
+
}, [
|
|
86
|
+
clearTypingDebounce,
|
|
87
|
+
clearTypingTimer,
|
|
88
|
+
websocketActions
|
|
89
|
+
]);
|
|
90
|
+
const stopTyping = useCallback((conversationId = typingConversationIdRef.current, options = {})=>{
|
|
91
|
+
clearTypingDebounce();
|
|
92
|
+
clearTypingTimer();
|
|
93
|
+
updateTypingState(conversationId, false, options);
|
|
94
|
+
}, [
|
|
95
|
+
clearTypingDebounce,
|
|
96
|
+
clearTypingTimer,
|
|
97
|
+
updateTypingState
|
|
98
|
+
]);
|
|
99
|
+
useEffect(()=>{
|
|
100
|
+
return ()=>{
|
|
101
|
+
clearTypingDebounce();
|
|
102
|
+
clearTypingTimer();
|
|
103
|
+
updateTypingState(typingConversationIdRef.current, false, typingOptionsRef.current);
|
|
104
|
+
};
|
|
105
|
+
}, [
|
|
106
|
+
clearTypingDebounce,
|
|
107
|
+
clearTypingTimer,
|
|
108
|
+
updateTypingState
|
|
109
|
+
]);
|
|
110
|
+
return {
|
|
111
|
+
setConversation,
|
|
112
|
+
stopTyping,
|
|
113
|
+
syncDraft
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvdXNlQ29udmVyc2F0aW9uVHlwaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7dXNlV2Vic29ja2V0QWN0aW9uc30gZnJvbSAnLi91c2VNZXRyb3BvbGlzLmpzJztcblxudHlwZSBUeXBpbmdVc2VyID0ge1xuICByZWFkb25seSBpbWFnZVVybD86IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcGVyc29uYUlkPzogc3RyaW5nO1xuICByZWFkb25seSB0aHVtYlVybD86IHN0cmluZztcbiAgcmVhZG9ubHkgdXNlcklkPzogc3RyaW5nO1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvblR5cGluZ09wdGlvbnMgPSB7XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgdXNlcklkPzogc3RyaW5nO1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdXNlcnM/OiBUeXBpbmdVc2VyW107XG59O1xuXG5leHBvcnQgdHlwZSBVc2VDb252ZXJzYXRpb25UeXBpbmdPcHRpb25zID0ge1xuICByZWFkb25seSBkZWJvdW5jZU1zPzogbnVtYmVyO1xuICByZWFkb25seSBpZGxlTXM/OiBudW1iZXI7XG59O1xuXG5jb25zdCBERUZBVUxUX0RFQk9VTkNFX01TID0gMzAwO1xuY29uc3QgREVGQVVMVF9JRExFX01TID0gNjAwMDA7XG5cbmV4cG9ydCBjb25zdCB1c2VDb252ZXJzYXRpb25UeXBpbmcgPSAoe1xuICBkZWJvdW5jZU1zID0gREVGQVVMVF9ERUJPVU5DRV9NUyxcbiAgaWRsZU1zID0gREVGQVVMVF9JRExFX01TXG59OiBVc2VDb252ZXJzYXRpb25UeXBpbmdPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qgd2Vic29ja2V0QWN0aW9ucyA9IHVzZVdlYnNvY2tldEFjdGlvbnMoKTtcbiAgY29uc3QgdHlwaW5nVGltZW91dFJlZiA9IHVzZVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGw+KG51bGwpO1xuICBjb25zdCB0eXBpbmdEZWJvdW5jZVJlZiA9IHVzZVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGw+KG51bGwpO1xuICBjb25zdCB0eXBpbmdDb252ZXJzYXRpb25JZFJlZiA9IHVzZVJlZignJyk7XG4gIGNvbnN0IHR5cGluZ09wdGlvbnNSZWYgPSB1c2VSZWY8Q29udmVyc2F0aW9uVHlwaW5nT3B0aW9ucz4oe30pO1xuICBjb25zdCB0eXBpbmdTdGF0ZVJlZiA9IHVzZVJlZihmYWxzZSk7XG5cbiAgY29uc3QgY2xlYXJUeXBpbmdUaW1lciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZih0eXBpbmdUaW1lb3V0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0eXBpbmdUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgdHlwaW5nVGltZW91dFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBjbGVhclR5cGluZ0RlYm91bmNlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmKHR5cGluZ0RlYm91bmNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0eXBpbmdEZWJvdW5jZVJlZi5jdXJyZW50KTtcbiAgICAgIHR5cGluZ0RlYm91bmNlUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IHVwZGF0ZVR5cGluZ1N0YXRlID0gdXNlQ2FsbGJhY2soKGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsIGlzVHlwaW5nOiBib29sZWFuLCBvcHRpb25zOiBDb252ZXJzYXRpb25UeXBpbmdPcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCBwcmV2aW91c0NvbnZlcnNhdGlvbklkID0gdHlwaW5nQ29udmVyc2F0aW9uSWRSZWYuY3VycmVudDtcbiAgICBjb25zdCB0eXBpbmdPcHRpb25zID0gT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID8gb3B0aW9ucyA6IHR5cGluZ09wdGlvbnNSZWYuY3VycmVudDtcbiAgICB0eXBpbmdPcHRpb25zUmVmLmN1cnJlbnQgPSB0eXBpbmdPcHRpb25zO1xuXG4gICAgaWYocHJldmlvdXNDb252ZXJzYXRpb25JZCAmJiBwcmV2aW91c0NvbnZlcnNhdGlvbklkICE9PSBjb252ZXJzYXRpb25JZCAmJiB0eXBpbmdTdGF0ZVJlZi5jdXJyZW50KSB7XG4gICAgICB3ZWJzb2NrZXRBY3Rpb25zLnNlbmRUeXBpbmcocHJldmlvdXNDb252ZXJzYXRpb25JZCwgZmFsc2UsIHR5cGluZ09wdGlvbnMpO1xuICAgICAgdHlwaW5nU3RhdGVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmKCFjb252ZXJzYXRpb25JZCkge1xuICAgICAgdHlwaW5nQ29udmVyc2F0aW9uSWRSZWYuY3VycmVudCA9ICcnO1xuICAgICAgdHlwaW5nU3RhdGVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmKHByZXZpb3VzQ29udmVyc2F0aW9uSWQgPT09IGNvbnZlcnNhdGlvbklkICYmIHR5cGluZ1N0YXRlUmVmLmN1cnJlbnQgPT09IGlzVHlwaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2Vic29ja2V0QWN0aW9ucy5zZW5kVHlwaW5nKGNvbnZlcnNhdGlvbklkLCBpc1R5cGluZywgdHlwaW5nT3B0aW9ucyk7XG4gICAgdHlwaW5nQ29udmVyc2F0aW9uSWRSZWYuY3VycmVudCA9IGNvbnZlcnNhdGlvbklkO1xuICAgIHR5cGluZ1N0YXRlUmVmLmN1cnJlbnQgPSBpc1R5cGluZztcbiAgfSwgW3dlYnNvY2tldEFjdGlvbnNdKTtcblxuICBjb25zdCBzeW5jRHJhZnQgPSB1c2VDYWxsYmFjaygoY29udmVyc2F0aW9uSWQ6IHN0cmluZywgZHJhZnQ6IHN0cmluZywgb3B0aW9uczogQ29udmVyc2F0aW9uVHlwaW5nT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgdHlwaW5nT3B0aW9uc1JlZi5jdXJyZW50ID0gb3B0aW9ucztcbiAgICBjbGVhclR5cGluZ0RlYm91bmNlKCk7XG4gICAgY2xlYXJUeXBpbmdUaW1lcigpO1xuXG4gICAgaWYoIWNvbnZlcnNhdGlvbklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYoZHJhZnQudHJpbSgpKSB7XG4gICAgICBpZighdHlwaW5nU3RhdGVSZWYuY3VycmVudCB8fCB0eXBpbmdDb252ZXJzYXRpb25JZFJlZi5jdXJyZW50ICE9PSBjb252ZXJzYXRpb25JZCkge1xuICAgICAgICB0eXBpbmdEZWJvdW5jZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdXBkYXRlVHlwaW5nU3RhdGUoY29udmVyc2F0aW9uSWQsIHRydWUsIG9wdGlvbnMpO1xuICAgICAgICAgIHR5cGluZ0RlYm91bmNlUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9LCBkZWJvdW5jZU1zKTtcbiAgICAgIH1cblxuICAgICAgdHlwaW5nVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVR5cGluZ1N0YXRlKGNvbnZlcnNhdGlvbklkLCBmYWxzZSwgb3B0aW9ucyk7XG4gICAgICB9LCBpZGxlTXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVwZGF0ZVR5cGluZ1N0YXRlKGNvbnZlcnNhdGlvbklkLCBmYWxzZSwgb3B0aW9ucyk7XG4gIH0sIFtjbGVhclR5cGluZ0RlYm91bmNlLCBjbGVhclR5cGluZ1RpbWVyLCBkZWJvdW5jZU1zLCBpZGxlTXMsIHVwZGF0ZVR5cGluZ1N0YXRlXSk7XG5cbiAgY29uc3Qgc2V0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soKGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnNhdGlvblR5cGluZ09wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNsZWFyVHlwaW5nRGVib3VuY2UoKTtcbiAgICBjbGVhclR5cGluZ1RpbWVyKCk7XG4gICAgdHlwaW5nT3B0aW9uc1JlZi5jdXJyZW50ID0gb3B0aW9ucztcblxuICAgIGlmKHR5cGluZ0NvbnZlcnNhdGlvbklkUmVmLmN1cnJlbnQgJiYgdHlwaW5nQ29udmVyc2F0aW9uSWRSZWYuY3VycmVudCAhPT0gY29udmVyc2F0aW9uSWQgJiYgdHlwaW5nU3RhdGVSZWYuY3VycmVudCkge1xuICAgICAgd2Vic29ja2V0QWN0aW9ucy5zZW5kVHlwaW5nKHR5cGluZ0NvbnZlcnNhdGlvbklkUmVmLmN1cnJlbnQsIGZhbHNlLCB0eXBpbmdPcHRpb25zUmVmLmN1cnJlbnQpO1xuICAgICAgdHlwaW5nU3RhdGVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHR5cGluZ0NvbnZlcnNhdGlvbklkUmVmLmN1cnJlbnQgPSBjb252ZXJzYXRpb25JZDtcblxuICAgIGlmKCFjb252ZXJzYXRpb25JZCkge1xuICAgICAgdHlwaW5nU3RhdGVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cbiAgfSwgW2NsZWFyVHlwaW5nRGVib3VuY2UsIGNsZWFyVHlwaW5nVGltZXIsIHdlYnNvY2tldEFjdGlvbnNdKTtcblxuICBjb25zdCBzdG9wVHlwaW5nID0gdXNlQ2FsbGJhY2soKGNvbnZlcnNhdGlvbklkID0gdHlwaW5nQ29udmVyc2F0aW9uSWRSZWYuY3VycmVudCwgb3B0aW9uczogQ29udmVyc2F0aW9uVHlwaW5nT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY2xlYXJUeXBpbmdEZWJvdW5jZSgpO1xuICAgIGNsZWFyVHlwaW5nVGltZXIoKTtcbiAgICB1cGRhdGVUeXBpbmdTdGF0ZShjb252ZXJzYXRpb25JZCwgZmFsc2UsIG9wdGlvbnMpO1xuICB9LCBbY2xlYXJUeXBpbmdEZWJvdW5jZSwgY2xlYXJUeXBpbmdUaW1lciwgdXBkYXRlVHlwaW5nU3RhdGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGVhclR5cGluZ0RlYm91bmNlKCk7XG4gICAgICBjbGVhclR5cGluZ1RpbWVyKCk7XG4gICAgICB1cGRhdGVUeXBpbmdTdGF0ZSh0eXBpbmdDb252ZXJzYXRpb25JZFJlZi5jdXJyZW50LCBmYWxzZSwgdHlwaW5nT3B0aW9uc1JlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbY2xlYXJUeXBpbmdEZWJvdW5jZSwgY2xlYXJUeXBpbmdUaW1lciwgdXBkYXRlVHlwaW5nU3RhdGVdKTtcblxuICByZXR1cm4ge1xuICAgIHNldENvbnZlcnNhdGlvbixcbiAgICBzdG9wVHlwaW5nLFxuICAgIHN5bmNEcmFmdFxuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZVdlYnNvY2tldEFjdGlvbnMiLCJERUZBVUxUX0RFQk9VTkNFX01TIiwiREVGQVVMVF9JRExFX01TIiwidXNlQ29udmVyc2F0aW9uVHlwaW5nIiwiZGVib3VuY2VNcyIsImlkbGVNcyIsIndlYnNvY2tldEFjdGlvbnMiLCJ0eXBpbmdUaW1lb3V0UmVmIiwidHlwaW5nRGVib3VuY2VSZWYiLCJ0eXBpbmdDb252ZXJzYXRpb25JZFJlZiIsInR5cGluZ09wdGlvbnNSZWYiLCJ0eXBpbmdTdGF0ZVJlZiIsImNsZWFyVHlwaW5nVGltZXIiLCJjdXJyZW50IiwiY2xlYXJUaW1lb3V0IiwiY2xlYXJUeXBpbmdEZWJvdW5jZSIsInVwZGF0ZVR5cGluZ1N0YXRlIiwiY29udmVyc2F0aW9uSWQiLCJpc1R5cGluZyIsIm9wdGlvbnMiLCJwcmV2aW91c0NvbnZlcnNhdGlvbklkIiwidHlwaW5nT3B0aW9ucyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJzZW5kVHlwaW5nIiwic3luY0RyYWZ0IiwiZHJhZnQiLCJ0cmltIiwic2V0VGltZW91dCIsInNldENvbnZlcnNhdGlvbiIsInN0b3BUeXBpbmciXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLFdBQVcsRUFBRUMsU0FBUyxFQUFFQyxNQUFNLFFBQU8sUUFBUTtBQUVyRCxTQUFRQyxtQkFBbUIsUUFBTyxxQkFBcUI7QUF3QnZELE1BQU1DLHNCQUFzQjtBQUM1QixNQUFNQyxrQkFBa0I7QUFFeEIsT0FBTyxNQUFNQyx3QkFBd0IsQ0FBQyxFQUNwQ0MsYUFBYUgsbUJBQW1CLEVBQ2hDSSxTQUFTSCxlQUFlLEVBQ0ssR0FBRyxDQUFDLENBQUM7SUFDbEMsTUFBTUksbUJBQW1CTjtJQUN6QixNQUFNTyxtQkFBbUJSLE9BQTZDO0lBQ3RFLE1BQU1TLG9CQUFvQlQsT0FBNkM7SUFDdkUsTUFBTVUsMEJBQTBCVixPQUFPO0lBQ3ZDLE1BQU1XLG1CQUFtQlgsT0FBa0MsQ0FBQztJQUM1RCxNQUFNWSxpQkFBaUJaLE9BQU87SUFFOUIsTUFBTWEsbUJBQW1CZixZQUFZO1FBQ25DLElBQUdVLGlCQUFpQk0sT0FBTyxFQUFFO1lBQzNCQyxhQUFhUCxpQkFBaUJNLE9BQU87WUFDckNOLGlCQUFpQk0sT0FBTyxHQUFHO1FBQzdCO0lBQ0YsR0FBRyxFQUFFO0lBRUwsTUFBTUUsc0JBQXNCbEIsWUFBWTtRQUN0QyxJQUFHVyxrQkFBa0JLLE9BQU8sRUFBRTtZQUM1QkMsYUFBYU4sa0JBQWtCSyxPQUFPO1lBQ3RDTCxrQkFBa0JLLE9BQU8sR0FBRztRQUM5QjtJQUNGLEdBQUcsRUFBRTtJQUVMLE1BQU1HLG9CQUFvQm5CLFlBQVksQ0FBQ29CLGdCQUF3QkMsVUFBbUJDLFVBQXFDLENBQUMsQ0FBQztRQUN2SCxNQUFNQyx5QkFBeUJYLHdCQUF3QkksT0FBTztRQUM5RCxNQUFNUSxnQkFBZ0JDLE9BQU9DLElBQUksQ0FBQ0osU0FBU0ssTUFBTSxHQUFHTCxVQUFV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
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { FluxFramework } from '@nlabs/arkhamjs';
|
|
2
|
+
import type { MetropolisEnvironmentConfiguration } from '../config/index.js';
|
|
3
|
+
import type { ActionType } from '../utils/actionFactory.js';
|
|
4
|
+
/**
|
|
5
|
+
* Main hook to access Metropolis actions.
|
|
6
|
+
*
|
|
7
|
+
* @param actionTypes - Optional array of action types to create. If not provided, creates all actions.
|
|
8
|
+
* @returns Object containing the requested actions
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* // Get all actions (default behavior)
|
|
13
|
+
* const {userActions, postActions} = useMetropolis();
|
|
14
|
+
*
|
|
15
|
+
* // Get only specific actions (more performant)
|
|
16
|
+
* const {userActions} = useMetropolis(['user']);
|
|
17
|
+
* const {userActions, postActions} = useMetropolis(['user', 'post']);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare const useMetropolis: <T extends ActionType[] = ActionType[]>(actionTypes?: T) => Record<string, any>;
|
|
21
|
+
/**
|
|
22
|
+
* Hook to access the Metropolis configuration from context.
|
|
23
|
+
*
|
|
24
|
+
* @returns The resolved environment-specific configuration
|
|
25
|
+
* @throws Error if used outside of Metropolis component
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* const config = useMetropolisConfig();
|
|
30
|
+
* const apiUrl = config.app?.api?.url;
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare const useMetropolisConfig: () => MetropolisEnvironmentConfiguration;
|
|
34
|
+
/**
|
|
35
|
+
* Hook to access the Flux framework instance from context.
|
|
36
|
+
*
|
|
37
|
+
* @returns The Flux framework instance
|
|
38
|
+
* @throws Error if used outside of Metropolis component and no Flux available
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* const flux = useMetropolisFlux();
|
|
43
|
+
* const state = flux.getState('user.session');
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare const useMetropolisFlux: () => FluxFramework;
|
|
47
|
+
/**
|
|
48
|
+
* Specialized hooks for individual action types.
|
|
49
|
+
* These hooks only create the specific action type, improving performance.
|
|
50
|
+
*/
|
|
51
|
+
export declare const useContentActions: () => any;
|
|
52
|
+
export declare const useEventActions: () => any;
|
|
53
|
+
export declare const useGroupActions: () => any;
|
|
54
|
+
export declare const useImageActions: () => any;
|
|
55
|
+
export declare const useLocationActions: () => any;
|
|
56
|
+
export declare const useMessageActions: () => any;
|
|
57
|
+
export declare const useSubscriptionActions: () => any;
|
|
58
|
+
export declare const usePermissionActions: () => any;
|
|
59
|
+
export declare const usePostActions: () => any;
|
|
60
|
+
export declare const usePersonaActions: () => any;
|
|
61
|
+
export declare const useReactionActions: () => any;
|
|
62
|
+
export declare const useTagActions: () => any;
|
|
63
|
+
export declare const useVideoActions: () => any;
|
|
64
|
+
export declare const useTranslationActions: () => any;
|
|
65
|
+
export declare const useUserActions: () => any;
|
|
66
|
+
export declare const useWebsocketActions: () => any;
|
|
67
|
+
//# sourceMappingURL=useMetropolis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMetropolis.d.ts","sourceRoot":"","sources":["../../src/utils/useMetropolis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAC,kCAAkC,EAAC,MAAM,oBAAoB,CAAC;AAI3E,OAAO,KAAK,EAAgB,UAAU,EAAC,MAAM,2BAA2B,CAAC;AAmHzE;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,EACjE,cAAc,CAAC,wBA0BhB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,QAAO,kCAWtC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,QAAO,aAMpC,CAAC;AAEF;;;GAGG;AAEH,eAAO,MAAM,iBAAiB,WAG7B,CAAC;AAEF,eAAO,MAAM,eAAe,WAG3B,CAAC;AAEF,eAAO,MAAM,eAAe,WAG3B,CAAC;AAEF,eAAO,MAAM,eAAe,WAG3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAG9B,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAG7B,CAAC;AAEF,eAAO,MAAM,sBAAsB,WAGlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,WAGhC,CAAC;AAEF,eAAO,MAAM,cAAc,WAG1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAG7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAG9B,CAAC;AAEF,eAAO,MAAM,aAAa,WAGzB,CAAC;AAEF,eAAO,MAAM,eAAe,WAG3B,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAGjC,CAAC;AAEF,eAAO,MAAM,cAAc,WAG1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,WAG/B,CAAC"}
|