@dynamic-labs/sdk-react-core 3.0.0-alpha.38 → 3.0.0-alpha.39

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.cjs +1 -1
  3. package/package.js +1 -1
  4. package/package.json +11 -11
  5. package/src/lib/components/UserProfile/UserProfile.cjs +1 -1
  6. package/src/lib/components/UserProfile/UserProfile.js +1 -1
  7. package/src/lib/locale/en/translation.cjs +16 -0
  8. package/src/lib/locale/en/translation.d.ts +16 -0
  9. package/src/lib/locale/en/translation.js +16 -0
  10. package/src/lib/shared/assets/authenticator.cjs +54 -0
  11. package/src/lib/shared/assets/authenticator.js +30 -0
  12. package/src/lib/shared/assets/index.d.ts +2 -0
  13. package/src/lib/shared/assets/shield.cjs +59 -0
  14. package/src/lib/shared/assets/shield.js +35 -0
  15. package/src/lib/styles/index.shadow.cjs +1 -1
  16. package/src/lib/styles/index.shadow.js +1 -1
  17. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.cjs +1 -1
  18. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.js +1 -1
  19. package/src/lib/views/FarcasterQrCodeView/FarcasterQrCodeView.cjs +1 -1
  20. package/src/lib/views/FarcasterQrCodeView/FarcasterQrCodeView.js +1 -1
  21. package/src/lib/views/LoginView/sections/SocialSignInSection/DynamicSocialSignIn/DynamicSocialSignIn.cjs +1 -1
  22. package/src/lib/views/LoginView/sections/SocialSignInSection/DynamicSocialSignIn/DynamicSocialSignIn.js +1 -1
  23. package/src/lib/widgets/DynamicWidget/components/DynamicWidgetViews/DynamicWidgetViews.cjs +2 -0
  24. package/src/lib/widgets/DynamicWidget/components/DynamicWidgetViews/DynamicWidgetViews.js +2 -0
  25. package/src/lib/widgets/DynamicWidget/components/DynamicWidgetWallets/DynamicWidgetWallets.cjs +1 -1
  26. package/src/lib/widgets/DynamicWidget/components/DynamicWidgetWallets/DynamicWidgetWallets.js +1 -1
  27. package/src/lib/widgets/DynamicWidget/context/DynamicWidgetContext.cjs +6 -2
  28. package/src/lib/widgets/DynamicWidget/context/DynamicWidgetContext.js +6 -2
  29. package/src/lib/widgets/DynamicWidget/context/DynamicWidgetContext.types.d.ts +3 -1
  30. package/src/lib/widgets/DynamicWidget/views/ManageMfaWidgetView/ManageMfaWidgetView.cjs +128 -0
  31. package/src/lib/widgets/DynamicWidget/views/ManageMfaWidgetView/ManageMfaWidgetView.d.ts +4 -0
  32. package/src/lib/widgets/DynamicWidget/views/ManageMfaWidgetView/ManageMfaWidgetView.js +123 -0
  33. package/src/lib/widgets/DynamicWidget/views/ManageMfaWidgetView/components/UserDeviceTile.cjs +109 -0
  34. package/src/lib/widgets/DynamicWidget/views/ManageMfaWidgetView/components/UserDeviceTile.d.ts +8 -0
  35. package/src/lib/widgets/DynamicWidget/views/ManageMfaWidgetView/components/UserDeviceTile.js +105 -0
  36. package/src/lib/widgets/DynamicWidget/views/ManageMfaWidgetView/components/index.d.ts +1 -0
  37. package/src/lib/widgets/DynamicWidget/views/ManageMfaWidgetView/index.d.ts +1 -0
  38. package/src/lib/widgets/DynamicWidget/views/SettingsView/SettingsView.cjs +14 -12
  39. package/src/lib/widgets/DynamicWidget/views/SettingsView/SettingsView.js +14 -12
@@ -96,7 +96,7 @@ var useInternalDynamicContext = require('../../../context/DynamicContext/useDyna
96
96
 
97
97
  // Hook exposed to customers and used internally to handle social account linking
98
98
  const useSocialAccounts = ({ sessionTimeout } = {
99
- sessionTimeout: 10000,
99
+ sessionTimeout: 20000,
100
100
  }) => {
101
101
  var _a;
102
102
  const { environmentId, user, projectSettings } = useInternalDynamicContext.useInternalDynamicContext();
@@ -92,7 +92,7 @@ import { useInternalDynamicContext } from '../../../context/DynamicContext/useDy
92
92
 
93
93
  // Hook exposed to customers and used internally to handle social account linking
94
94
  const useSocialAccounts = ({ sessionTimeout } = {
95
- sessionTimeout: 10000,
95
+ sessionTimeout: 20000,
96
96
  }) => {
97
97
  var _a;
98
98
  const { environmentId, user, projectSettings } = useInternalDynamicContext();
@@ -32,7 +32,7 @@ const FarcasterQrCodeView = () => {
32
32
  const { connectSocialAccount } = useSocialAuth.useSocialAuth({
33
33
  onError: () => setError('Something went wrong'),
34
34
  onFarcasterUrl: (url) => setUrl(url),
35
- sessionTimeout: 10000,
35
+ sessionTimeout: 20000,
36
36
  });
37
37
  useEffectOnce.useEffectOnce(() => {
38
38
  connectSocialAccount({
@@ -28,7 +28,7 @@ const FarcasterQrCodeView = () => {
28
28
  const { connectSocialAccount } = useSocialAuth({
29
29
  onError: () => setError('Something went wrong'),
30
30
  onFarcasterUrl: (url) => setUrl(url),
31
- sessionTimeout: 10000,
31
+ sessionTimeout: 20000,
32
32
  });
33
33
  useEffectOnce(() => {
34
34
  connectSocialAccount({
@@ -104,7 +104,7 @@ const DynamicSocialSignIn = ({ defaultProvider, numOfItemsToDisplay, collapsedLa
104
104
  onSettled: () => {
105
105
  setSocialProvider(undefined);
106
106
  },
107
- sessionTimeout: 10000,
107
+ sessionTimeout: 20000,
108
108
  });
109
109
  const onSelectProvider = (provider) => {
110
110
  var _a;
@@ -100,7 +100,7 @@ const DynamicSocialSignIn = ({ defaultProvider, numOfItemsToDisplay, collapsedLa
100
100
  onSettled: () => {
101
101
  setSocialProvider(undefined);
102
102
  },
103
- sessionTimeout: 10000,
103
+ sessionTimeout: 20000,
104
104
  });
105
105
  const onSelectProvider = (provider) => {
106
106
  var _a;
@@ -11,9 +11,11 @@ var EditProfileView = require('../../views/EditProfileView/EditProfileView.cjs')
11
11
  var SendBalanceWidgetView = require('../../views/SendBalanceWidgetView/SendBalanceWidgetView.cjs');
12
12
  var ManagePasskeysWidgetView = require('../../views/ManagePasskeysWidgetView/ManagePasskeysWidgetView.cjs');
13
13
  var SettingsView = require('../../views/SettingsView/SettingsView.cjs');
14
+ var ManageMfaWidgetView = require('../../views/ManageMfaWidgetView/ManageMfaWidgetView.cjs');
14
15
 
15
16
  const mapViewToComponent = {
16
17
  'edit-profile': EditProfileView.EditProfileView,
18
+ 'manage-mfa': ManageMfaWidgetView.ManageMfaWidgetView,
17
19
  'manage-passkeys': ManagePasskeysWidgetView.ManagePasskeysWidgetView,
18
20
  profile: ProfileView.ProfileView,
19
21
  'send-balance': SendBalanceWidgetView.SendBalanceWidgetView,
@@ -7,9 +7,11 @@ import { EditProfileView } from '../../views/EditProfileView/EditProfileView.js'
7
7
  import { SendBalanceWidgetView } from '../../views/SendBalanceWidgetView/SendBalanceWidgetView.js';
8
8
  import { ManagePasskeysWidgetView } from '../../views/ManagePasskeysWidgetView/ManagePasskeysWidgetView.js';
9
9
  import { SettingsView } from '../../views/SettingsView/SettingsView.js';
10
+ import { ManageMfaWidgetView } from '../../views/ManageMfaWidgetView/ManageMfaWidgetView.js';
10
11
 
11
12
  const mapViewToComponent = {
12
13
  'edit-profile': EditProfileView,
14
+ 'manage-mfa': ManageMfaWidgetView,
13
15
  'manage-passkeys': ManagePasskeysWidgetView,
14
16
  profile: ProfileView,
15
17
  'send-balance': SendBalanceWidgetView,
@@ -73,12 +73,12 @@ require('../../../../components/Input/Input.cjs');
73
73
  require('../../../../components/PasskeyCreatedSuccessBanner/PasskeyCreatedSuccessBanner.cjs');
74
74
  require('../../../../context/PasskeyContext/PasskeyContext.cjs');
75
75
  require('../../views/ManagePasskeysWidgetView/PasskeyCard/PasskeyCard.cjs');
76
+ require('../../../../components/MenuList/Dropdown/Dropdown.cjs');
76
77
  require('../../../../../polyfills.cjs');
77
78
  require('../../../../context/ErrorBoundary/ErrorBoundaryBase.cjs');
78
79
  require('../../../../context/ErrorBoundary/ErrorBoundaryContext.cjs');
79
80
  require('../../../DynamicBridgeWidget/context/DynamicBridgeWidgetContext/DynamicBridgeWidgetContext.cjs');
80
81
  require('../DynamicWidgetCard/DynamicWidgetCard.cjs');
81
- require('../../../../components/MenuList/Dropdown/Dropdown.cjs');
82
82
  require('../../../../components/IsBrowser/IsBrowser.cjs');
83
83
  require('../../../../context/WidgetRegistry/WidgetRegistryContextProvider.cjs');
84
84
  require('../../../../context/FundingContext/FundingContext.cjs');
@@ -69,12 +69,12 @@ import '../../../../components/Input/Input.js';
69
69
  import '../../../../components/PasskeyCreatedSuccessBanner/PasskeyCreatedSuccessBanner.js';
70
70
  import '../../../../context/PasskeyContext/PasskeyContext.js';
71
71
  import '../../views/ManagePasskeysWidgetView/PasskeyCard/PasskeyCard.js';
72
+ import '../../../../components/MenuList/Dropdown/Dropdown.js';
72
73
  import '../../../../../polyfills.js';
73
74
  import '../../../../context/ErrorBoundary/ErrorBoundaryBase.js';
74
75
  import '../../../../context/ErrorBoundary/ErrorBoundaryContext.js';
75
76
  import '../../../DynamicBridgeWidget/context/DynamicBridgeWidgetContext/DynamicBridgeWidgetContext.js';
76
77
  import '../DynamicWidgetCard/DynamicWidgetCard.js';
77
- import '../../../../components/MenuList/Dropdown/Dropdown.js';
78
78
  import '../../../../components/IsBrowser/IsBrowser.js';
79
79
  import '../../../../context/WidgetRegistry/WidgetRegistryContextProvider.js';
80
80
  import '../../../../context/FundingContext/FundingContext.js';
@@ -104,9 +104,13 @@ const DynamicWidgetContextProvider = ({ children, }) => {
104
104
  setDynamicWidgetView('wallets');
105
105
  }, [isKYCEnabled, multiWallet]);
106
106
  const overridenWidgetView = React.useMemo(() => {
107
- if (dynamicWidgetView === 'manage-passkeys')
107
+ if (dynamicWidgetView === 'manage-passkeys' ||
108
+ dynamicWidgetView === 'manage-mfa')
108
109
  return 'settings';
109
- if (!isKYCEnabled && !multiWallet && dynamicWidgetView !== 'settings')
110
+ if (!isKYCEnabled &&
111
+ !multiWallet &&
112
+ dynamicWidgetView !== 'settings' &&
113
+ dynamicWidgetView !== 'profile')
110
114
  return 'wallets';
111
115
  if (dynamicWidgetView === 'edit-profile')
112
116
  return 'profile';
@@ -100,9 +100,13 @@ const DynamicWidgetContextProvider = ({ children, }) => {
100
100
  setDynamicWidgetView('wallets');
101
101
  }, [isKYCEnabled, multiWallet]);
102
102
  const overridenWidgetView = useMemo(() => {
103
- if (dynamicWidgetView === 'manage-passkeys')
103
+ if (dynamicWidgetView === 'manage-passkeys' ||
104
+ dynamicWidgetView === 'manage-mfa')
104
105
  return 'settings';
105
- if (!isKYCEnabled && !multiWallet && dynamicWidgetView !== 'settings')
106
+ if (!isKYCEnabled &&
107
+ !multiWallet &&
108
+ dynamicWidgetView !== 'settings' &&
109
+ dynamicWidgetView !== 'profile')
106
110
  return 'wallets';
107
111
  if (dynamicWidgetView === 'edit-profile')
108
112
  return 'profile';
@@ -14,7 +14,9 @@ export interface WidgetContextProps {
14
14
  export declare const DynamicSettingsViews: readonly ["settings"];
15
15
  export type DynamicSettingsType = typeof DynamicSettingsViews[number];
16
16
  export declare const DynamicPasskeyWidgetViews: readonly ["manage-passkeys"];
17
+ export declare const DynamicMfaWidgetViews: readonly ["manage-mfa"];
17
18
  export type DynamicPasskeyWidgetViewsType = typeof DynamicPasskeyWidgetViews[number];
19
+ export type DynamicMfaWidgetViewsType = typeof DynamicMfaWidgetViews[number];
18
20
  export declare const DynamicTransactionsWidgetViews: readonly ["send-balance"];
19
21
  export type DynamicTransactionsWidgetViewsType = typeof DynamicTransactionsWidgetViews[number];
20
- export type DynamicWidgetViews = 'wallets' | 'profile' | 'edit-profile' | DynamicTransactionsWidgetViewsType | DynamicPasskeyWidgetViewsType | DynamicSettingsType;
22
+ export type DynamicWidgetViews = 'wallets' | 'profile' | 'edit-profile' | DynamicTransactionsWidgetViewsType | DynamicPasskeyWidgetViewsType | DynamicMfaWidgetViewsType | DynamicSettingsType;
@@ -0,0 +1,128 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var _tslib = require('../../../../../../_virtual/_tslib.cjs');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var React = require('react');
9
+ var reactI18next = require('react-i18next');
10
+ var DynamicWidgetContext = require('../../context/DynamicWidgetContext.cjs');
11
+ require('../../../../components/Accordion/components/AccordionItem/AccordionItem.cjs');
12
+ require('../../../../components/Alert/Alert.cjs');
13
+ var useDynamicEvents = require('../../../../utils/hooks/events/useDynamicEvents/useDynamicEvents.cjs');
14
+ require('@dynamic-labs/utils');
15
+ require('../../../../context/DynamicContext/DynamicContext.cjs');
16
+ require('@dynamic-labs/sdk-api-core');
17
+ require('../../../../shared/logger.cjs');
18
+ require('@dynamic-labs/iconic');
19
+ require('@dynamic-labs/wallet-connector-core');
20
+ require('../../../../context/ViewContext/ViewContext.cjs');
21
+ var add = require('../../../../shared/assets/add.cjs');
22
+ var chevronLeft = require('../../../../shared/assets/chevron-left.cjs');
23
+ require('@dynamic-labs/wallet-book');
24
+ require('../../../../utils/constants/colors.cjs');
25
+ require('../../../../utils/constants/values.cjs');
26
+ require('../../../../shared/utils/classes/storage/localStorage.cjs');
27
+ require('../../../../shared/utils/classes/storage/sessionStorage.cjs');
28
+ var useEffectOnce = require('../../../../shared/utils/hooks/useEffectOnce/useEffectOnce.cjs');
29
+ require('../../../../shared/consts/index.cjs');
30
+ require('../../../../context/CaptchaContext/CaptchaContext.cjs');
31
+ require('../../../../context/ErrorContext/ErrorContext.cjs');
32
+ require('@dynamic-labs/multi-wallet');
33
+ require('react-international-phone');
34
+ require('../../../../config/ApiEndpoint.cjs');
35
+ require('@dynamic-labs/store');
36
+ require('../../../../locale/locale.cjs');
37
+ require('../../../../context/AccessDeniedContext/AccessDeniedContext.cjs');
38
+ require('../../../../context/AccountExistsContext/AccountExistsContext.cjs');
39
+ require('../../../../context/UserWalletsContext/UserWalletsContext.cjs');
40
+ require('../../../../events/dynamicEvents.cjs');
41
+ require('../../../../context/VerificationContext/VerificationContext.cjs');
42
+ require('react-dom');
43
+ require('../../../../context/WalletContext/WalletContext.cjs');
44
+ require('../../../../utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.cjs');
45
+ require('../../../../context/ThemeContext/ThemeContext.cjs');
46
+ require('../../../../utils/hooks/useUserUpdateRequest/useUpdateUser/userFieldsSchema.cjs');
47
+ require('@dynamic-labs/types');
48
+ require('../../../../context/LoadingContext/LoadingContext.cjs');
49
+ require('yup');
50
+ require('../../../../context/MockContext/MockContext.cjs');
51
+ require('../../../../views/CollectUserDataView/useFields.cjs');
52
+ require('../../../../context/FieldsStateContext/FieldsStateContext.cjs');
53
+ require('../../../../context/UserFieldEditorContext/UserFieldEditorContext.cjs');
54
+ require('@dynamic-labs/rpc-providers');
55
+ var Typography = require('../../../../components/Typography/Typography.cjs');
56
+ require('../../../../context/FooterAnimationContext/index.cjs');
57
+ require('../../../../components/ShadowDOM/ShadowDOM.cjs');
58
+ require('../../../../components/Transition/ZoomTransition/ZoomTransition.cjs');
59
+ require('../../../../components/Transition/SlideInUpTransition/SlideInUpTransition.cjs');
60
+ require('../../../../components/Transition/OpacityTransition/OpacityTransition.cjs');
61
+ require('../../../../components/OverlayCard/OverlayCardTarget/OverlayCardTarget.cjs');
62
+ require('../../../../context/SocialRedirectContext/SocialRedirectContext.cjs');
63
+ require('../../../../context/WalletGroupContext/WalletGroupContext.cjs');
64
+ require('../../components/DynamicWidgetHeader/DynamicWidgetHeader.cjs');
65
+ require('react-focus-lock');
66
+ var IconButton = require('../../../../components/IconButton/IconButton.cjs');
67
+ require('../../../../components/MenuList/Dropdown/Dropdown.cjs');
68
+ var TypographyButton = require('../../../../components/TypographyButton/TypographyButton.cjs');
69
+ require('formik');
70
+ require('../../../../views/TransactionConfirmationView/helpers/transactionErrorMessage.cjs');
71
+ var ModalHeader = require('../../../../components/ModalHeader/ModalHeader.cjs');
72
+ require('../../../../components/Input/Input.cjs');
73
+ require('../../../../components/PasskeyCreatedSuccessBanner/PasskeyCreatedSuccessBanner.cjs');
74
+ require('../../../../context/PasskeyContext/PasskeyContext.cjs');
75
+ require('../ManagePasskeysWidgetView/PasskeyCard/PasskeyCard.cjs');
76
+ var UserDeviceTile = require('./components/UserDeviceTile.cjs');
77
+ require('../../../../../polyfills.cjs');
78
+ require('../../../../context/ErrorBoundary/ErrorBoundaryBase.cjs');
79
+ require('../../../../context/ErrorBoundary/ErrorBoundaryContext.cjs');
80
+ require('../../../DynamicBridgeWidget/context/DynamicBridgeWidgetContext/DynamicBridgeWidgetContext.cjs');
81
+ require('../../components/DynamicWidgetCard/DynamicWidgetCard.cjs');
82
+ require('../../../../components/IsBrowser/IsBrowser.cjs');
83
+ require('../../../../context/WidgetRegistry/WidgetRegistryContextProvider.cjs');
84
+ require('../../../../context/FundingContext/FundingContext.cjs');
85
+ require('../../../../components/Popper/Popper/Popper.cjs');
86
+ require('../../../../components/Popper/PopperContext/PopperContext.cjs');
87
+ require('../../../../views/WalletList/WalletList.cjs');
88
+ require('../../../DynamicBridgeWidget/views/WalletsView/components/SecondaryWallets/SecondaryWallets.cjs');
89
+ require('@hcaptcha/react-hcaptcha');
90
+ var useMfa = require('../../../../utils/hooks/useMfa/useMfa.cjs');
91
+ require('../../../../context/IpConfigurationContext/IpConfigurationContext.cjs');
92
+ require('../../../../context/SendBalanceContext/SendBalanceContext.cjs');
93
+ require('../../../../context/ConnectWithOtpContext/ConnectWithOtpContext.cjs');
94
+ require('../../../../context/ConnectWithOtpContext/constants.cjs');
95
+ require('../../../../context/ReinitializeContext/ReinitializeContextProvider.cjs');
96
+ var useDynamicModals = require('../../../../utils/hooks/useDynamicModals/useDynamicModals.cjs');
97
+ require('../../../../components/InlineWidget/InlineWidget.cjs');
98
+ require('qrcode');
99
+
100
+ const sortDevicesByDefault = (a, b) => a._default === b._default ? 0 : a._default ? -1 : 1;
101
+ const ManageMfaWidgetView = () => {
102
+ const [userDevices, setUserDevices] = React.useState([]);
103
+ const { setDynamicWidgetView } = DynamicWidgetContext.useWidgetContext();
104
+ const { setShowMfaQRCode } = useDynamicModals.useDynamicModals();
105
+ const { getUserDevices, deleteUserDevice } = useMfa.useMfa();
106
+ const { t } = reactI18next.useTranslation();
107
+ const getDevices = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
108
+ const devices = yield getUserDevices();
109
+ // set the user devices with the default device first
110
+ setUserDevices(devices.sort(sortDevicesByDefault));
111
+ }), [getUserDevices]);
112
+ // re-fetch devices when a new device is added
113
+ useDynamicEvents.useDynamicEvents('mfaCompletionSuccess', () => getDevices());
114
+ // delete device and then re-fetch devices
115
+ const deleteDevice = (id) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
116
+ yield deleteUserDevice(id);
117
+ getDevices();
118
+ });
119
+ // load devices on initial page load
120
+ useEffectOnce.useEffectOnce(() => {
121
+ getDevices();
122
+ });
123
+ const backButton = (jsxRuntime.jsx(IconButton.IconButton, { type: 'button', onClick: () => setDynamicWidgetView('settings'), "data-testid": 'back-button', children: jsxRuntime.jsx(chevronLeft.ReactComponent, {}) }));
124
+ return (jsxRuntime.jsxs("div", { className: 'manage-mfa-widget-view', children: [jsxRuntime.jsx(ModalHeader.ModalHeader, { leading: backButton, children: jsxRuntime.jsx("div", { className: 'send-balance-page-layout__header-content', children: jsxRuntime.jsx(Typography.Typography, { variant: 'title', color: 'primary', copykey: 'dyn_manage_mfa.title', children: t('dyn_manage_mfa.title') }) }) }), jsxRuntime.jsx("div", { className: 'manage-mfa-widget-view__description-container', children: jsxRuntime.jsx(Typography.Typography, { className: 'manage-mfa-widget-view__description-container__text', variant: 'body_small', color: 'secondary', copykey: 'dyn_manage_mfa.description', children: t('dyn_manage_mfa.description') }) }), jsxRuntime.jsxs("div", { className: 'manage-mfa-widget-view__scroll-container', children: [userDevices.length === 0 && (jsxRuntime.jsx(Typography.Typography, { className: 'manage-mfa-widget-view__no-devices', variant: 'body_normal', color: 'secondary', copykey: 'dyn_manage_mfa.no_devices', children: t('dyn_manage_mfa.no_devices') })), userDevices.map((device, index) => (jsxRuntime.jsx(UserDeviceTile.UserDeviceTile, { userDevice: device, index: index, deleteDevice: deleteDevice }, device.id)))] }), jsxRuntime.jsx("div", { className: 'manage-mfa-widget-view__add-mfa-button-container', children: jsxRuntime.jsx(TypographyButton.TypographyButton, { buttonClassName: 'manage-mfa-widget-view__add-mfa-button-container__button', onClick: () => setShowMfaQRCode(true), copykey: 'dyn_manage_mfa.add_mfa_button', startSlot: jsxRuntime.jsx(add.ReactComponent, {}), children: t('dyn_manage_mfa.add_mfa_button') }) })] }));
125
+ };
126
+
127
+ exports.ManageMfaWidgetView = ManageMfaWidgetView;
128
+ exports.sortDevicesByDefault = sortDevicesByDefault;
@@ -0,0 +1,4 @@
1
+ import { FC } from 'react';
2
+ import { MFADevice } from '@dynamic-labs/sdk-api-core';
3
+ export declare const sortDevicesByDefault: (a: MFADevice, b: MFADevice) => 0 | 1 | -1;
4
+ export declare const ManageMfaWidgetView: FC;
@@ -0,0 +1,123 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../../../_virtual/_tslib.js';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+ import { useState, useCallback } from 'react';
5
+ import { useTranslation } from 'react-i18next';
6
+ import { useWidgetContext } from '../../context/DynamicWidgetContext.js';
7
+ import '../../../../components/Accordion/components/AccordionItem/AccordionItem.js';
8
+ import '../../../../components/Alert/Alert.js';
9
+ import { useDynamicEvents } from '../../../../utils/hooks/events/useDynamicEvents/useDynamicEvents.js';
10
+ import '@dynamic-labs/utils';
11
+ import '../../../../context/DynamicContext/DynamicContext.js';
12
+ import '@dynamic-labs/sdk-api-core';
13
+ import '../../../../shared/logger.js';
14
+ import '@dynamic-labs/iconic';
15
+ import '@dynamic-labs/wallet-connector-core';
16
+ import '../../../../context/ViewContext/ViewContext.js';
17
+ import { ReactComponent as SvgAdd } from '../../../../shared/assets/add.js';
18
+ import { ReactComponent as SvgChevronLeft } from '../../../../shared/assets/chevron-left.js';
19
+ import '@dynamic-labs/wallet-book';
20
+ import '../../../../utils/constants/colors.js';
21
+ import '../../../../utils/constants/values.js';
22
+ import '../../../../shared/utils/classes/storage/localStorage.js';
23
+ import '../../../../shared/utils/classes/storage/sessionStorage.js';
24
+ import { useEffectOnce } from '../../../../shared/utils/hooks/useEffectOnce/useEffectOnce.js';
25
+ import '../../../../shared/consts/index.js';
26
+ import '../../../../context/CaptchaContext/CaptchaContext.js';
27
+ import '../../../../context/ErrorContext/ErrorContext.js';
28
+ import '@dynamic-labs/multi-wallet';
29
+ import 'react-international-phone';
30
+ import '../../../../config/ApiEndpoint.js';
31
+ import '@dynamic-labs/store';
32
+ import '../../../../locale/locale.js';
33
+ import '../../../../context/AccessDeniedContext/AccessDeniedContext.js';
34
+ import '../../../../context/AccountExistsContext/AccountExistsContext.js';
35
+ import '../../../../context/UserWalletsContext/UserWalletsContext.js';
36
+ import '../../../../events/dynamicEvents.js';
37
+ import '../../../../context/VerificationContext/VerificationContext.js';
38
+ import 'react-dom';
39
+ import '../../../../context/WalletContext/WalletContext.js';
40
+ import '../../../../utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.js';
41
+ import '../../../../context/ThemeContext/ThemeContext.js';
42
+ import '../../../../utils/hooks/useUserUpdateRequest/useUpdateUser/userFieldsSchema.js';
43
+ import '@dynamic-labs/types';
44
+ import '../../../../context/LoadingContext/LoadingContext.js';
45
+ import 'yup';
46
+ import '../../../../context/MockContext/MockContext.js';
47
+ import '../../../../views/CollectUserDataView/useFields.js';
48
+ import '../../../../context/FieldsStateContext/FieldsStateContext.js';
49
+ import '../../../../context/UserFieldEditorContext/UserFieldEditorContext.js';
50
+ import '@dynamic-labs/rpc-providers';
51
+ import { Typography } from '../../../../components/Typography/Typography.js';
52
+ import '../../../../context/FooterAnimationContext/index.js';
53
+ import '../../../../components/ShadowDOM/ShadowDOM.js';
54
+ import '../../../../components/Transition/ZoomTransition/ZoomTransition.js';
55
+ import '../../../../components/Transition/SlideInUpTransition/SlideInUpTransition.js';
56
+ import '../../../../components/Transition/OpacityTransition/OpacityTransition.js';
57
+ import '../../../../components/OverlayCard/OverlayCardTarget/OverlayCardTarget.js';
58
+ import '../../../../context/SocialRedirectContext/SocialRedirectContext.js';
59
+ import '../../../../context/WalletGroupContext/WalletGroupContext.js';
60
+ import '../../components/DynamicWidgetHeader/DynamicWidgetHeader.js';
61
+ import 'react-focus-lock';
62
+ import { IconButton } from '../../../../components/IconButton/IconButton.js';
63
+ import '../../../../components/MenuList/Dropdown/Dropdown.js';
64
+ import { TypographyButton } from '../../../../components/TypographyButton/TypographyButton.js';
65
+ import 'formik';
66
+ import '../../../../views/TransactionConfirmationView/helpers/transactionErrorMessage.js';
67
+ import { ModalHeader } from '../../../../components/ModalHeader/ModalHeader.js';
68
+ import '../../../../components/Input/Input.js';
69
+ import '../../../../components/PasskeyCreatedSuccessBanner/PasskeyCreatedSuccessBanner.js';
70
+ import '../../../../context/PasskeyContext/PasskeyContext.js';
71
+ import '../ManagePasskeysWidgetView/PasskeyCard/PasskeyCard.js';
72
+ import { UserDeviceTile } from './components/UserDeviceTile.js';
73
+ import '../../../../../polyfills.js';
74
+ import '../../../../context/ErrorBoundary/ErrorBoundaryBase.js';
75
+ import '../../../../context/ErrorBoundary/ErrorBoundaryContext.js';
76
+ import '../../../DynamicBridgeWidget/context/DynamicBridgeWidgetContext/DynamicBridgeWidgetContext.js';
77
+ import '../../components/DynamicWidgetCard/DynamicWidgetCard.js';
78
+ import '../../../../components/IsBrowser/IsBrowser.js';
79
+ import '../../../../context/WidgetRegistry/WidgetRegistryContextProvider.js';
80
+ import '../../../../context/FundingContext/FundingContext.js';
81
+ import '../../../../components/Popper/Popper/Popper.js';
82
+ import '../../../../components/Popper/PopperContext/PopperContext.js';
83
+ import '../../../../views/WalletList/WalletList.js';
84
+ import '../../../DynamicBridgeWidget/views/WalletsView/components/SecondaryWallets/SecondaryWallets.js';
85
+ import '@hcaptcha/react-hcaptcha';
86
+ import { useMfa } from '../../../../utils/hooks/useMfa/useMfa.js';
87
+ import '../../../../context/IpConfigurationContext/IpConfigurationContext.js';
88
+ import '../../../../context/SendBalanceContext/SendBalanceContext.js';
89
+ import '../../../../context/ConnectWithOtpContext/ConnectWithOtpContext.js';
90
+ import '../../../../context/ConnectWithOtpContext/constants.js';
91
+ import '../../../../context/ReinitializeContext/ReinitializeContextProvider.js';
92
+ import { useDynamicModals } from '../../../../utils/hooks/useDynamicModals/useDynamicModals.js';
93
+ import '../../../../components/InlineWidget/InlineWidget.js';
94
+ import 'qrcode';
95
+
96
+ const sortDevicesByDefault = (a, b) => a._default === b._default ? 0 : a._default ? -1 : 1;
97
+ const ManageMfaWidgetView = () => {
98
+ const [userDevices, setUserDevices] = useState([]);
99
+ const { setDynamicWidgetView } = useWidgetContext();
100
+ const { setShowMfaQRCode } = useDynamicModals();
101
+ const { getUserDevices, deleteUserDevice } = useMfa();
102
+ const { t } = useTranslation();
103
+ const getDevices = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
104
+ const devices = yield getUserDevices();
105
+ // set the user devices with the default device first
106
+ setUserDevices(devices.sort(sortDevicesByDefault));
107
+ }), [getUserDevices]);
108
+ // re-fetch devices when a new device is added
109
+ useDynamicEvents('mfaCompletionSuccess', () => getDevices());
110
+ // delete device and then re-fetch devices
111
+ const deleteDevice = (id) => __awaiter(void 0, void 0, void 0, function* () {
112
+ yield deleteUserDevice(id);
113
+ getDevices();
114
+ });
115
+ // load devices on initial page load
116
+ useEffectOnce(() => {
117
+ getDevices();
118
+ });
119
+ const backButton = (jsx(IconButton, { type: 'button', onClick: () => setDynamicWidgetView('settings'), "data-testid": 'back-button', children: jsx(SvgChevronLeft, {}) }));
120
+ return (jsxs("div", { className: 'manage-mfa-widget-view', children: [jsx(ModalHeader, { leading: backButton, children: jsx("div", { className: 'send-balance-page-layout__header-content', children: jsx(Typography, { variant: 'title', color: 'primary', copykey: 'dyn_manage_mfa.title', children: t('dyn_manage_mfa.title') }) }) }), jsx("div", { className: 'manage-mfa-widget-view__description-container', children: jsx(Typography, { className: 'manage-mfa-widget-view__description-container__text', variant: 'body_small', color: 'secondary', copykey: 'dyn_manage_mfa.description', children: t('dyn_manage_mfa.description') }) }), jsxs("div", { className: 'manage-mfa-widget-view__scroll-container', children: [userDevices.length === 0 && (jsx(Typography, { className: 'manage-mfa-widget-view__no-devices', variant: 'body_normal', color: 'secondary', copykey: 'dyn_manage_mfa.no_devices', children: t('dyn_manage_mfa.no_devices') })), userDevices.map((device, index) => (jsx(UserDeviceTile, { userDevice: device, index: index, deleteDevice: deleteDevice }, device.id)))] }), jsx("div", { className: 'manage-mfa-widget-view__add-mfa-button-container', children: jsx(TypographyButton, { buttonClassName: 'manage-mfa-widget-view__add-mfa-button-container__button', onClick: () => setShowMfaQRCode(true), copykey: 'dyn_manage_mfa.add_mfa_button', startSlot: jsx(SvgAdd, {}), children: t('dyn_manage_mfa.add_mfa_button') }) })] }));
121
+ };
122
+
123
+ export { ManageMfaWidgetView, sortDevicesByDefault };
@@ -0,0 +1,109 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var DotsMenu = require('../../../components/DotsMenu/DotsMenu.cjs');
8
+ require('@dynamic-labs/sdk-api-core');
9
+ require('@dynamic-labs/utils');
10
+ require('@dynamic-labs/wallet-connector-core');
11
+ require('../../../../../shared/logger.cjs');
12
+ require('@dynamic-labs/iconic');
13
+ require('../../../../../context/ViewContext/ViewContext.cjs');
14
+ require('react');
15
+ var authenticator = require('../../../../../shared/assets/authenticator.cjs');
16
+ require('@dynamic-labs/wallet-book');
17
+ require('../../../../../utils/constants/colors.cjs');
18
+ require('../../../../../utils/constants/values.cjs');
19
+ require('../../../../../shared/utils/classes/storage/localStorage.cjs');
20
+ require('../../../../../shared/utils/classes/storage/sessionStorage.cjs');
21
+ require('../../../../../shared/consts/index.cjs');
22
+ var getTimeSince = require('../../../helpers/getTimeSince.cjs');
23
+ require('../../../../../components/Accordion/components/AccordionItem/AccordionItem.cjs');
24
+ require('../../../../../components/Alert/Alert.cjs');
25
+ require('../../../../../events/dynamicEvents.cjs');
26
+ require('../../../../../../../_virtual/_tslib.cjs');
27
+ require('../../../../../context/DynamicContext/DynamicContext.cjs');
28
+ require('../../../../../context/CaptchaContext/CaptchaContext.cjs');
29
+ require('../../../../../context/ErrorContext/ErrorContext.cjs');
30
+ require('@dynamic-labs/multi-wallet');
31
+ require('react-international-phone');
32
+ require('../../../../../config/ApiEndpoint.cjs');
33
+ require('@dynamic-labs/store');
34
+ require('../../../../../locale/locale.cjs');
35
+ require('../../../../../context/AccessDeniedContext/AccessDeniedContext.cjs');
36
+ require('../../../../../context/AccountExistsContext/AccountExistsContext.cjs');
37
+ require('../../../../../context/UserWalletsContext/UserWalletsContext.cjs');
38
+ require('../../../../../context/VerificationContext/VerificationContext.cjs');
39
+ require('react-dom');
40
+ require('../../../../../context/WalletContext/WalletContext.cjs');
41
+ require('../../../../../utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.cjs');
42
+ require('../../../../../context/ThemeContext/ThemeContext.cjs');
43
+ require('../../../../../utils/hooks/useUserUpdateRequest/useUpdateUser/userFieldsSchema.cjs');
44
+ require('@dynamic-labs/types');
45
+ require('../../../../../context/LoadingContext/LoadingContext.cjs');
46
+ require('yup');
47
+ require('../../../../../context/MockContext/MockContext.cjs');
48
+ require('../../../../../views/CollectUserDataView/useFields.cjs');
49
+ require('../../../../../context/FieldsStateContext/FieldsStateContext.cjs');
50
+ require('../../../../../context/UserFieldEditorContext/UserFieldEditorContext.cjs');
51
+ require('@dynamic-labs/rpc-providers');
52
+ require('react-i18next');
53
+ var Typography = require('../../../../../components/Typography/Typography.cjs');
54
+ require('../../../../../context/FooterAnimationContext/index.cjs');
55
+ require('../../../../../components/ShadowDOM/ShadowDOM.cjs');
56
+ require('../../../../../components/Transition/ZoomTransition/ZoomTransition.cjs');
57
+ require('../../../../../components/Transition/SlideInUpTransition/SlideInUpTransition.cjs');
58
+ require('../../../../../components/Transition/OpacityTransition/OpacityTransition.cjs');
59
+ require('../../../../../components/OverlayCard/OverlayCardTarget/OverlayCardTarget.cjs');
60
+ require('../../../../../context/SocialRedirectContext/SocialRedirectContext.cjs');
61
+ require('../../../../../context/WalletGroupContext/WalletGroupContext.cjs');
62
+ require('../../../components/DynamicWidgetHeader/DynamicWidgetHeader.cjs');
63
+ require('react-focus-lock');
64
+ require('../../../context/DynamicWidgetContext.cjs');
65
+ require('formik');
66
+ require('../../../../../views/TransactionConfirmationView/helpers/transactionErrorMessage.cjs');
67
+ require('../../../../../components/IconButton/IconButton.cjs');
68
+ require('../../../../../components/Input/Input.cjs');
69
+ require('../../../../../components/PasskeyCreatedSuccessBanner/PasskeyCreatedSuccessBanner.cjs');
70
+ require('../../../../../context/PasskeyContext/PasskeyContext.cjs');
71
+ require('../../ManagePasskeysWidgetView/PasskeyCard/PasskeyCard.cjs');
72
+ require('../../../../../../polyfills.cjs');
73
+ require('../../../../../context/ErrorBoundary/ErrorBoundaryBase.cjs');
74
+ require('../../../../../context/ErrorBoundary/ErrorBoundaryContext.cjs');
75
+ require('../../../../DynamicBridgeWidget/context/DynamicBridgeWidgetContext/DynamicBridgeWidgetContext.cjs');
76
+ require('../../../components/DynamicWidgetCard/DynamicWidgetCard.cjs');
77
+ require('../../../../../components/IsBrowser/IsBrowser.cjs');
78
+ require('../../../../../components/MenuList/Dropdown/Dropdown.cjs');
79
+ require('../../../../../context/WidgetRegistry/WidgetRegistryContextProvider.cjs');
80
+ require('../../../../../context/FundingContext/FundingContext.cjs');
81
+ require('../../../../../components/Popper/Popper/Popper.cjs');
82
+ require('../../../../../components/Popper/PopperContext/PopperContext.cjs');
83
+ require('../../../../../views/WalletList/WalletList.cjs');
84
+ require('../../../../DynamicBridgeWidget/views/WalletsView/components/SecondaryWallets/SecondaryWallets.cjs');
85
+ require('@hcaptcha/react-hcaptcha');
86
+ require('../../../../../context/IpConfigurationContext/IpConfigurationContext.cjs');
87
+ require('../../../../../context/SendBalanceContext/SendBalanceContext.cjs');
88
+ require('../../../../../context/ConnectWithOtpContext/ConnectWithOtpContext.cjs');
89
+ require('../../../../../context/ConnectWithOtpContext/constants.cjs');
90
+ require('../../../../../context/ReinitializeContext/ReinitializeContextProvider.cjs');
91
+ require('../../../../../components/InlineWidget/InlineWidget.cjs');
92
+ require('qrcode');
93
+
94
+ const UserDeviceTile = ({ userDevice, index, deleteDevice, }) => {
95
+ const optionsMenu = [
96
+ {
97
+ Icon: null,
98
+ callback: () => deleteDevice(userDevice.id),
99
+ text: 'Delete',
100
+ },
101
+ ];
102
+ const timeSinceCreated = userDevice.createdAt && getTimeSince.getTimeSince(new Date(userDevice.createdAt));
103
+ return (jsxRuntime.jsxs("div", { className: 'manage-mfa-widget-view__list-tile', children: [jsxRuntime.jsx(authenticator.ReactComponent, { className: 'manage-mfa-widget-view__list-tile__icon' }), jsxRuntime.jsxs("div", { className: 'manage-mfa-widget-view__list-tile__details', children: [jsxRuntime.jsxs(Typography.Typography, { variant: 'body_normal', color: 'primary', children: ["Authenticator App ", index + 1] }), timeSinceCreated && (jsxRuntime.jsxs(Typography.Typography, { variant: 'body_small', color: 'secondary', children: ["Created ", timeSinceCreated.value, " ", timeSinceCreated.unit, " ago"] }))] }), jsxRuntime.jsx("div", { style: {
104
+ cursor: 'pointer',
105
+ display: 'flex',
106
+ }, children: jsxRuntime.jsx(DotsMenu.DotsMenu, { direction: 'left', "data-testid": 'dots-menu', options: optionsMenu, buttonClassName: 'manage-mfa-widget-view__list-tile__dots-menu', buttonClassNameWithOpenMenu: 'manage-mfa-widget-view__list-tile__dots-menu' }) })] }, userDevice.id));
107
+ };
108
+
109
+ exports.UserDeviceTile = UserDeviceTile;
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { MFADevice } from '@dynamic-labs/sdk-api-core';
3
+ export type UserDeviceTileProps = {
4
+ userDevice: MFADevice;
5
+ index: number;
6
+ deleteDevice: (id: string) => void;
7
+ };
8
+ export declare const UserDeviceTile: ({ userDevice, index, deleteDevice, }: UserDeviceTileProps) => JSX.Element;