@micha.bigler/ui-core-micha 3.14.4 → 4.0.1
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/CHANGELOG.md +29 -0
- package/README.md +7 -0
- package/dist/chat/kitSxRegistry.js +9 -0
- package/dist/components/charts/kitSxRegistry.js +6 -0
- package/dist/entries/charts.js +6 -0
- package/dist/entries/chat.js +8 -0
- package/dist/entries/markdown.js +1 -0
- package/dist/index.js +0 -14
- package/dist/pages/AccountPage.js +1 -2
- package/dist/pages/LoginPage.js +1 -2
- package/dist/pages/PasswordChangePage.js +1 -2
- package/dist/pages/PasswordInvitePage.js +1 -2
- package/dist/pages/PasswordResetRequestPage.js +1 -2
- package/dist/pages/SignUpPage.js +1 -2
- package/dist/pages/SignupConfirmPage.js +1 -2
- package/dist/theme/kitSxEntry.js +11 -0
- package/dist/theme/kitSxRegistry.js +2 -15
- package/package.json +31 -7
- package/.github/workflows/ci.yml +0 -35
- package/.github/workflows/publish.yml +0 -126
- package/DESIGN.md +0 -60
- package/WORK_ORDERS.md +0 -150
- package/dev/entries.jsx +0 -721
- package/dev/fixtures.js +0 -26
- package/dev/main.jsx +0 -75
- package/dev/mockTransport.jsx +0 -128
- package/docs/CHART-LAYOUT.md +0 -157
- package/docs/DARK-TOKENS.md +0 -140
- package/docs/TYPE-SCALE.md +0 -111
- package/docs/messaging-deviations.md +0 -118
- package/index.html +0 -12
- package/renovate.json +0 -10
- package/scripts/chart-api-census.mjs +0 -415
- package/src/auth/AuthContext.jsx +0 -158
- package/src/auth/ReauthModal.jsx +0 -82
- package/src/auth/UserMenu.jsx +0 -121
- package/src/auth/apiClient.jsx +0 -232
- package/src/auth/authApi.jsx +0 -539
- package/src/auth/authConfig.jsx +0 -34
- package/src/auth/reauth.js +0 -47
- package/src/chat/ChatComposer.jsx +0 -36
- package/src/chat/ChatList.jsx +0 -87
- package/src/chat/ChatThread.jsx +0 -128
- package/src/chat/ChatWorkspace.jsx +0 -244
- package/src/chat/MarkdownReply.jsx +0 -22
- package/src/chat/ModelPicker.jsx +0 -85
- package/src/chat/api.js +0 -18
- package/src/chat/useChatSocket.js +0 -32
- package/src/chat/wire.js +0 -7
- package/src/components/AccessCodeManager.jsx +0 -288
- package/src/components/AccessCodeSingleUseToggle.jsx +0 -92
- package/src/components/AllowedEmailDomainsManager.jsx +0 -92
- package/src/components/AuthFactorRequirementCard.jsx +0 -95
- package/src/components/BulkInviteCsvTab.jsx +0 -198
- package/src/components/EmptyState.jsx +0 -38
- package/src/components/LoginForm.jsx +0 -159
- package/src/components/MFAComponent.jsx +0 -350
- package/src/components/MfaLoginComponent.jsx +0 -252
- package/src/components/MobileBottomNav.jsx +0 -82
- package/src/components/PasskeysComponent.jsx +0 -252
- package/src/components/PasswordChangeForm.jsx +0 -87
- package/src/components/PasswordResetRequestForm.jsx +0 -43
- package/src/components/PasswordSetForm.jsx +0 -97
- package/src/components/ProfileComponent.jsx +0 -348
- package/src/components/QrSignupManager.jsx +0 -404
- package/src/components/QrSignupValidityManager.jsx +0 -106
- package/src/components/RegistrationMethodsManager.jsx +0 -150
- package/src/components/SecurityComponent.jsx +0 -141
- package/src/components/SocialLoginButtons.jsx +0 -83
- package/src/components/SoftChip.jsx +0 -93
- package/src/components/StatTile.jsx +0 -39
- package/src/components/SupportRecoveryRequestsTab.jsx +0 -482
- package/src/components/TurnstileWidget.jsx +0 -99
- package/src/components/UserInviteComponent.jsx +0 -76
- package/src/components/UserListComponent.jsx +0 -618
- package/src/components/charts/BarChart.jsx +0 -102
- package/src/components/charts/ChartFrame.jsx +0 -214
- package/src/components/charts/LineChart.jsx +0 -126
- package/src/components/charts/ScatterChart.jsx +0 -299
- package/src/components/charts/TimeSeriesChart.jsx +0 -300
- package/src/components/charts/chartDefaults.js +0 -644
- package/src/components/charts/chartLabels.js +0 -36
- package/src/components/charts/exportChart.js +0 -258
- package/src/components/charts/formatters.js +0 -39
- package/src/components/charts/palette.js +0 -33
- package/src/components/charts/yearTickInterval.js +0 -7
- package/src/i18n/authTranslations.ts +0 -2651
- package/src/i18n/chartsTranslations.ts +0 -91
- package/src/i18n/chatTranslations.ts +0 -55
- package/src/i18n/messagingTranslations.ts +0 -120
- package/src/i18n/notificationsTranslations.ts +0 -32
- package/src/i18n/onboardingTranslations.ts +0 -29
- package/src/i18n/sectionNavTranslations.ts +0 -20
- package/src/i18n/uiCoreTranslations.js +0 -29
- package/src/i18n/userMenuTranslations.ts +0 -5
- package/src/index.js +0 -158
- package/src/layout/PageLayout.jsx +0 -36
- package/src/layout/SectionNav.jsx +0 -320
- package/src/messaging/AttachmentList.jsx +0 -145
- package/src/messaging/Composer.jsx +0 -197
- package/src/messaging/ConversationLaunchers.jsx +0 -51
- package/src/messaging/ConversationList.jsx +0 -109
- package/src/messaging/DirectMessageLauncher.jsx +0 -112
- package/src/messaging/MessageBubble.jsx +0 -183
- package/src/messaging/MessagingProvider.jsx +0 -0
- package/src/messaging/MessagingScopeConfig.jsx +0 -24
- package/src/messaging/PollCard.jsx +0 -163
- package/src/messaging/ReactionBar.jsx +0 -43
- package/src/messaging/ReadTicks.jsx +0 -82
- package/src/messaging/Thread.jsx +0 -195
- package/src/messaging/api.js +0 -48
- package/src/messaging/composerImageCompression.js +0 -35
- package/src/messaging/linkifyText.jsx +0 -37
- package/src/notifications/NotificationBell.jsx +0 -84
- package/src/notifications/NotificationSettings.jsx +0 -330
- package/src/notifications/NotificationsProvider.jsx +0 -224
- package/src/notifications/PopupSurface.jsx +0 -105
- package/src/notifications/api.js +0 -55
- package/src/notifications/feedApi.js +0 -18
- package/src/notifications/realtime.jsx +0 -138
- package/src/notifications/serviceWorker/sw.js +0 -50
- package/src/onboarding/OnboardingProvider.jsx +0 -326
- package/src/onboarding/OnboardingWizard.jsx +0 -61
- package/src/onboarding/WizardDialogShell.jsx +0 -51
- package/src/onboarding/api.js +0 -13
- package/src/onboarding/stepSelection.js +0 -16
- package/src/onboarding/steps/BrowserPushStep.jsx +0 -121
- package/src/onboarding/steps/CompleteNameStep.jsx +0 -46
- package/src/onboarding/steps/CookieConsentStep.jsx +0 -133
- package/src/onboarding/steps/PwaInstallStep.jsx +0 -47
- package/src/pages/AccountPage.jsx +0 -394
- package/src/pages/LoginPage.jsx +0 -343
- package/src/pages/PasswordChangePage.jsx +0 -62
- package/src/pages/PasswordInvitePage.jsx +0 -177
- package/src/pages/PasswordResetRequestPage.jsx +0 -68
- package/src/pages/SignUpPage.jsx +0 -268
- package/src/pages/SignupConfirmPage.jsx +0 -155
- package/src/testing/checkKitIntegration.js +0 -233
- package/src/theme/createAppTheme.js +0 -423
- package/src/theme/fonts.js +0 -3
- package/src/theme/index.js +0 -21
- package/src/theme/kitSxRegistry.js +0 -285
- package/src/theme/themeCompleteness.js +0 -1045
- package/src/theme/tokens.js +0 -478
- package/src/utils/auth-errors.js +0 -76
- package/src/utils/authService.js +0 -223
- package/src/utils/resolveErrorText.js +0 -28
- package/src/utils/webauthn.js +0 -51
- package/tests/AccountPage.profileStatements.test.jsx +0 -162
- package/tests/AccountPage.test.jsx +0 -200
- package/tests/AuthContext.test.jsx +0 -129
- package/tests/BarChart.test.jsx +0 -112
- package/tests/BrowserPushStep.test.jsx +0 -110
- package/tests/ChartFrame.test.jsx +0 -336
- package/tests/ConversationList.test.jsx +0 -144
- package/tests/CookieConsentStep.test.jsx +0 -69
- package/tests/EmptyState.test.jsx +0 -62
- package/tests/LineChart.test.jsx +0 -80
- package/tests/MessagingProvider.test.jsx +0 -50
- package/tests/MobileBottomNav.test.jsx +0 -319
- package/tests/NotificationBell.test.jsx +0 -60
- package/tests/NotificationSettings.test.jsx +0 -276
- package/tests/NotificationsProvider.test.jsx +0 -240
- package/tests/OnboardingProvider.test.jsx +0 -294
- package/tests/OnboardingWizard.test.jsx +0 -143
- package/tests/PasswordChangeForm.test.jsx +0 -70
- package/tests/PasswordInvitePage.test.jsx +0 -142
- package/tests/PasswordSetForm.test.jsx +0 -70
- package/tests/PopupSurface.test.jsx +0 -142
- package/tests/ProfileComponent.refresh.test.jsx +0 -194
- package/tests/QrSignupManager.registrationContext.test.jsx +0 -106
- package/tests/QrSignupManagerInfoBox.test.jsx +0 -49
- package/tests/ScatterChart.test.jsx +0 -270
- package/tests/SectionNav.test.jsx +0 -363
- package/tests/SignUpPage.test.jsx +0 -208
- package/tests/SoftChip.test.jsx +0 -105
- package/tests/StatTile.test.jsx +0 -57
- package/tests/Thread.test.jsx +0 -151
- package/tests/TimeSeriesChart.test.jsx +0 -367
- package/tests/UserListComponent.test.jsx +0 -192
- package/tests/UserMenu.test.jsx +0 -171
- package/tests/apiClientLanguage.test.js +0 -33
- package/tests/apiClientPublicPaths.test.js +0 -178
- package/tests/authApiLogin.test.js +0 -42
- package/tests/authApiRegistration.test.js +0 -31
- package/tests/authErrorCodeRendering.test.jsx +0 -77
- package/tests/authErrors.test.js +0 -74
- package/tests/authTranslations.test.js +0 -74
- package/tests/chart-api-census.test.js +0 -366
- package/tests/chartAxisTickBand.test.jsx +0 -95
- package/tests/chartDefaults.test.js +0 -902
- package/tests/chartLabels.test.js +0 -50
- package/tests/chartsPalette.test.js +0 -99
- package/tests/chatApi.test.js +0 -48
- package/tests/chatDriverNames.test.jsx +0 -71
- package/tests/chatExports.test.js +0 -3
- package/tests/chatList.test.jsx +0 -84
- package/tests/chatPicker.test.jsx +0 -82
- package/tests/chatSocket.test.jsx +0 -26
- package/tests/chatThread.test.jsx +0 -116
- package/tests/chatTranslations.test.js +0 -47
- package/tests/chatWorkspace.test.jsx +0 -234
- package/tests/checkKitIntegration.test.jsx +0 -219
- package/tests/createAppTheme.test.js +0 -132
- package/tests/createAppThemeDark.test.js +0 -127
- package/tests/createAppThemeLightGuard.test.js +0 -40
- package/tests/createAppThemePageContrast.test.js +0 -108
- package/tests/createAppThemeTypography.test.js +0 -53
- package/tests/errorCallSiteGuard.test.js +0 -32
- package/tests/exportChart.test.js +0 -313
- package/tests/feedApi.test.js +0 -46
- package/tests/fixtures/light-theme-baseline.json +0 -2234
- package/tests/i18nAggregate.test.js +0 -120
- package/tests/i18nGermanVariant.test.js +0 -65
- package/tests/loginPageErrorResolution.test.jsx +0 -102
- package/tests/messagingApi.test.js +0 -32
- package/tests/messagingChunk6.test.jsx +0 -116
- package/tests/messagingCompactBubble.test.jsx +0 -64
- package/tests/messagingComposer.test.jsx +0 -136
- package/tests/messagingComposerChunk5.test.jsx +0 -113
- package/tests/messagingContractConformance.test.js +0 -69
- package/tests/messagingDirectMessageLauncher.test.jsx +0 -151
- package/tests/messagingExports.test.js +0 -21
- package/tests/messagingInteractions.test.jsx +0 -136
- package/tests/messagingLastMessagePreview.test.jsx +0 -93
- package/tests/messagingLinkify.test.jsx +0 -51
- package/tests/messagingMessageActions.test.jsx +0 -163
- package/tests/messagingMsg6.test.jsx +0 -105
- package/tests/messagingMsg6f.test.jsx +0 -155
- package/tests/messagingMsg6g.test.jsx +0 -166
- package/tests/messagingMsg6h.test.jsx +0 -136
- package/tests/messagingMsg6i.test.jsx +0 -129
- package/tests/messagingPollRendering.test.jsx +0 -142
- package/tests/messagingReactionMerge.test.jsx +0 -77
- package/tests/messagingReadTicksTooltip.test.jsx +0 -36
- package/tests/messagingThreadReceipts.test.jsx +0 -178
- package/tests/messagingThreadingQuoting.test.jsx +0 -87
- package/tests/messagingUnreadLifecycle.test.jsx +0 -78
- package/tests/notificationsApi.test.js +0 -41
- package/tests/notificationsExports.test.js +0 -34
- package/tests/onboardingDescriptors.test.js +0 -132
- package/tests/packageTreeShaking.test.js +0 -126
- package/tests/realtime.test.jsx +0 -219
- package/tests/resolveErrorText.test.js +0 -72
- package/tests/stepSelection.test.js +0 -53
- package/tests/themeCompleteness.test.js +0 -626
- package/tests/timeSeriesLegend.test.js +0 -99
- package/tests/userScreenTranslations.test.jsx +0 -218
- package/tsconfig.build.json +0 -18
- package/vite.config.mjs +0 -6
- package/work-orders/AUTH-1.md +0 -74
- package/work-orders/AUTH-2.md +0 -74
- package/work-orders/AUTH-4.md +0 -183
- package/work-orders/AUTH-5.md +0 -154
- package/work-orders/AUTH-7.md +0 -181
- package/work-orders/AUTH-8.md +0 -184
- package/work-orders/CHART-1.md +0 -285
- package/work-orders/CHART-2.md +0 -222
- package/work-orders/CHART-3.md +0 -163
- package/work-orders/CHART-4.md +0 -203
- package/work-orders/CHART-5.md +0 -226
- package/work-orders/CHART-6.md +0 -428
- package/work-orders/CHART-7.md +0 -175
- package/work-orders/DX-1.md +0 -169
- package/work-orders/DX-2.md +0 -188
- package/work-orders/DX-3.md +0 -195
- package/work-orders/I18N-1.md +0 -254
- package/work-orders/I18N-3.md +0 -207
- package/work-orders/MSG-3.md +0 -375
- package/work-orders/MSG-3b.md +0 -1002
- package/work-orders/MSG-3c.md +0 -378
- package/work-orders/MSG-3d.md +0 -268
- package/work-orders/MSG-3e.md +0 -164
- package/work-orders/MSG-3f.md +0 -391
- package/work-orders/MSG-6e.md +0 -308
- package/work-orders/MSG-6f.md +0 -214
- package/work-orders/MSG-6g.md +0 -244
- package/work-orders/MSG-6h.md +0 -238
- package/work-orders/MSG-6i.md +0 -271
- package/work-orders/MSG-6j.md +0 -117
- package/work-orders/NOTIF-12.md +0 -214
- package/work-orders/NOTIF-13.md +0 -142
- package/work-orders/NOTIF-14.md +0 -151
- package/work-orders/PRIM-1.md +0 -177
- package/work-orders/SHELL-1.md +0 -255
- package/work-orders/SHELL-2.md +0 -197
- package/work-orders/SHELL-3.md +0 -359
- package/work-orders/SHELL-4.md +0 -351
- package/work-orders/SHELL-5.md +0 -345
- package/work-orders/SHELL-6.md +0 -210
- package/work-orders/THEME-1.md +0 -587
- package/work-orders/THEME-10.md +0 -303
- package/work-orders/THEME-11.md +0 -208
- package/work-orders/THEME-2.md +0 -339
- package/work-orders/THEME-3.md +0 -210
- package/work-orders/THEME-4.md +0 -271
- package/work-orders/THEME-5.md +0 -341
- package/work-orders/THEME-6.md +0 -247
- package/work-orders/THEME-7.md +0 -82
- package/work-orders/THEME-8.md +0 -211
- package/work-orders/THEME-9.md +0 -194
- package/work-orders/UCM-AUTH-10.md +0 -490
- package/work-orders/UCM-AUTH-11.md +0 -185
- package/work-orders/UCM-AUTH-12.md +0 -98
- package/work-orders/UCM-AUTH-13.md +0 -47
- package/work-orders/UCM-AUTH-9.md +0 -207
- package/work-orders/UCM-CHART-10.md +0 -150
- package/work-orders/UCM-CHART-11.md +0 -132
- package/work-orders/UCM-CHART-12.md +0 -348
- package/work-orders/UCM-CHART-13.md +0 -122
- package/work-orders/UCM-CHART-14.md +0 -198
- package/work-orders/UCM-CHART-15.md +0 -187
- package/work-orders/UCM-CHART-16.md +0 -169
- package/work-orders/UCM-CHART-17.md +0 -195
- package/work-orders/UCM-CHART-18.md +0 -200
- package/work-orders/UCM-CHART-8.md +0 -147
- package/work-orders/UCM-CHART-9.md +0 -265
- package/work-orders/UCM-CHAT-1.md +0 -190
- package/work-orders/UCM-CHAT-2.md +0 -75
- package/work-orders/UCM-CI-1.md +0 -65
- package/work-orders/UCM-DEP-1.md +0 -63
- package/work-orders/UCM-I18N-4.md +0 -226
- package/work-orders/UCM-I18N-5.md +0 -211
- package/work-orders/UCM-MSG-20.md +0 -192
- package/work-orders/UCM-PRIM-2.md +0 -114
- package/work-orders/UCM-SHELL-7.md +0 -134
- package/work-orders/UCM-SHELL-8.md +0 -125
- package/work-orders/UCM-TEST-1.md +0 -304
- package/work-orders/UCM-THEME-13.md +0 -69
- package/work-orders/UCM-THEME-14.md +0 -312
- package/work-orders/UCM-THEME-15.md +0 -356
- package/work-orders/UCM-THEME-16.md +0 -80
- package/work-orders/UCM-THEME-17.md +0 -111
- package/work-orders/UCM-THEME-18.md +0 -184
- package/work-orders/assets/AUTH-4-user-list-card.html +0 -407
- package/work-orders/assets/PRIM-1-dashboard-primitives.html +0 -624
- package/work-orders/assets/SHELL-2-account-navigation.html +0 -1159
- package/work-orders/assets/THEME-1-baseline-reference-sheet.html +0 -1352
- package/work-orders/assets/UCM-CHAT-1-ai-chat.html +0 -447
- package/work-orders/assets/UCM-THEME-13-dark-prototype.html +0 -390
- package/work-orders/assets/UCM-THEME-17-type-scale.html +0 -391
package/src/onboarding/api.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import apiClient from '../auth/apiClient';
|
|
2
|
-
|
|
3
|
-
const STEP_CONFIG_URL = '/api/onboarding/step-config/';
|
|
4
|
-
|
|
5
|
-
export async function getOnboardingStepConfig() {
|
|
6
|
-
const response = await apiClient.get(STEP_CONFIG_URL);
|
|
7
|
-
return response.data;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export async function patchOnboardingStepConfig(payload) {
|
|
11
|
-
const response = await apiClient.patch(STEP_CONFIG_URL, payload);
|
|
12
|
-
return response.data;
|
|
13
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure onboarding step selection.
|
|
3
|
-
*
|
|
4
|
-
* @param {Array} descriptors Step descriptors in display order.
|
|
5
|
-
* @param {Object} configMap Enabled state keyed by dcm onboarding step key.
|
|
6
|
-
* @param {Object} ctx Runtime context supplied to each step condition.
|
|
7
|
-
* @param {Set} dismissedSet Persistently dismissed step ids.
|
|
8
|
-
* @returns {Array} Steps that should be shown.
|
|
9
|
-
*/
|
|
10
|
-
export function selectActiveSteps(descriptors, configMap, ctx, dismissedSet = new Set()) {
|
|
11
|
-
return descriptors.filter((step) => {
|
|
12
|
-
if (configMap[step.id] === false) return false;
|
|
13
|
-
if (step.persistDismissed && dismissedSet.has(step.id)) return false;
|
|
14
|
-
return step.condition(ctx);
|
|
15
|
-
});
|
|
16
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useState } from 'react';
|
|
2
|
-
import { useTranslation } from 'react-i18next';
|
|
3
|
-
import Alert from '@mui/material/Alert';
|
|
4
|
-
import Box from '@mui/material/Box';
|
|
5
|
-
import Button from '@mui/material/Button';
|
|
6
|
-
import CircularProgress from '@mui/material/CircularProgress';
|
|
7
|
-
import FormControlLabel from '@mui/material/FormControlLabel';
|
|
8
|
-
import Switch from '@mui/material/Switch';
|
|
9
|
-
import Typography from '@mui/material/Typography';
|
|
10
|
-
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
|
|
11
|
-
import NotificationsIcon from '@mui/icons-material/Notifications';
|
|
12
|
-
import {
|
|
13
|
-
getVapidPublicKey,
|
|
14
|
-
patchNotificationPreferences,
|
|
15
|
-
savePushSubscription,
|
|
16
|
-
urlBase64ToUint8Array,
|
|
17
|
-
} from '../../notifications/api';
|
|
18
|
-
|
|
19
|
-
export const BROWSER_PUSH_FORM_CONTROL_LABEL_SX = { alignItems: 'flex-start', ml: 0 };
|
|
20
|
-
|
|
21
|
-
export function BrowserPushStep({ onComplete, onDismiss, ctx }) {
|
|
22
|
-
const { t } = useTranslation();
|
|
23
|
-
const [loading, setLoading] = useState(false);
|
|
24
|
-
const [savingEmail, setSavingEmail] = useState(false);
|
|
25
|
-
const [emailOptedIn, setEmailOptedIn] = useState(Boolean(ctx?.emailOptedIn));
|
|
26
|
-
const [pushSubscribed, setPushSubscribed] = useState(Boolean(ctx?.pushState?.subscribed));
|
|
27
|
-
const [error, setError] = useState('');
|
|
28
|
-
const pushSupported = Boolean(ctx?.pushState?.supported);
|
|
29
|
-
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
setEmailOptedIn(Boolean(ctx?.emailOptedIn));
|
|
32
|
-
}, [ctx?.emailOptedIn]);
|
|
33
|
-
|
|
34
|
-
useEffect(() => {
|
|
35
|
-
setPushSubscribed(Boolean(ctx?.pushState?.subscribed));
|
|
36
|
-
}, [ctx?.pushState?.subscribed]);
|
|
37
|
-
|
|
38
|
-
const handleEmailToggle = async (event) => {
|
|
39
|
-
const nextEmailOptedIn = event.target.checked;
|
|
40
|
-
const previousEmailOptedIn = emailOptedIn;
|
|
41
|
-
setSavingEmail(true);
|
|
42
|
-
setError('');
|
|
43
|
-
setEmailOptedIn(nextEmailOptedIn);
|
|
44
|
-
try {
|
|
45
|
-
await patchNotificationPreferences({ email_opt_in: nextEmailOptedIn });
|
|
46
|
-
} catch {
|
|
47
|
-
setEmailOptedIn(previousEmailOptedIn);
|
|
48
|
-
setError(t('NotificationSettings.SAVE_ERROR'));
|
|
49
|
-
} finally {
|
|
50
|
-
setSavingEmail(false);
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const enable = async () => {
|
|
55
|
-
setLoading(true);
|
|
56
|
-
setError('');
|
|
57
|
-
try {
|
|
58
|
-
if (typeof Notification === 'undefined') {
|
|
59
|
-
setError(t('NotificationSettings.PUSH_ERROR'));
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const permission = await Notification.requestPermission();
|
|
63
|
-
if (permission !== 'granted') {
|
|
64
|
-
setError(t('NotificationSettings.PUSH_DENIED'));
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const vapidPublicKey = await getVapidPublicKey();
|
|
68
|
-
const registration = await navigator.serviceWorker.ready;
|
|
69
|
-
const subscription = await registration.pushManager.subscribe({
|
|
70
|
-
userVisibleOnly: true,
|
|
71
|
-
applicationServerKey: urlBase64ToUint8Array(vapidPublicKey),
|
|
72
|
-
});
|
|
73
|
-
await savePushSubscription(subscription.toJSON(), navigator.userAgent);
|
|
74
|
-
await patchNotificationPreferences({ push_opt_in: true });
|
|
75
|
-
setPushSubscribed(true);
|
|
76
|
-
onComplete();
|
|
77
|
-
} catch (requestError) {
|
|
78
|
-
if (requestError?.response?.status === 409) {
|
|
79
|
-
setError(t('NotificationSettings.PUSH_CONFLICT'));
|
|
80
|
-
} else {
|
|
81
|
-
setError(t('NotificationSettings.PUSH_ERROR'));
|
|
82
|
-
}
|
|
83
|
-
} finally {
|
|
84
|
-
setLoading(false);
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
return (
|
|
89
|
-
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
|
|
90
|
-
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}><NotificationsIcon color="primary" /><Typography variant="h6">{t('Onboarding.NOTIFICATIONS_TITLE')}</Typography></Box>
|
|
91
|
-
<Typography variant="body2" color="text.secondary">{t('Onboarding.NOTIFICATIONS_BODY')}</Typography>
|
|
92
|
-
{error && <Alert severity="warning" onClose={() => setError('')}>{error}</Alert>}
|
|
93
|
-
<FormControlLabel
|
|
94
|
-
control={<Switch checked={emailOptedIn} onChange={handleEmailToggle} disabled={savingEmail} />}
|
|
95
|
-
label={<Box><Typography variant="body1">{t('Onboarding.EMAIL_NOTIFICATIONS_LABEL')}</Typography><Typography variant="caption" color="text.secondary">{t('Onboarding.EMAIL_NOTIFICATIONS_HINT')}</Typography></Box>}
|
|
96
|
-
labelPlacement="end"
|
|
97
|
-
sx={BROWSER_PUSH_FORM_CONTROL_LABEL_SX}
|
|
98
|
-
/>
|
|
99
|
-
{pushSupported && (
|
|
100
|
-
<Box>
|
|
101
|
-
<Typography variant="body1" gutterBottom>{t('Onboarding.PUSH_NOTIFICATIONS_LABEL')}</Typography>
|
|
102
|
-
<Typography variant="caption" color="text.secondary" display="block" sx={{ mb: 1.5 }}>{t('Onboarding.PUSH_NOTIFICATIONS_HINT')}</Typography>
|
|
103
|
-
{pushSubscribed ? (
|
|
104
|
-
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
|
|
105
|
-
<CheckCircleIcon color="success" fontSize="small" />
|
|
106
|
-
<Typography variant="body2">{t('Onboarding.PUSH_ENABLED')}</Typography>
|
|
107
|
-
</Box>
|
|
108
|
-
) : (
|
|
109
|
-
<Button variant="contained" onClick={enable} disabled={loading} startIcon={loading ? <CircularProgress size={16} /> : undefined}>{t('NotificationSettings.PUSH_ENABLE')}</Button>
|
|
110
|
-
)}
|
|
111
|
-
</Box>
|
|
112
|
-
)}
|
|
113
|
-
<Box sx={{ display: 'flex', justifyContent: 'flex-end', gap: 1 }}>
|
|
114
|
-
<Button variant="text" onClick={onDismiss} disabled={loading || savingEmail}>{t('Onboarding.SKIP')}</Button>
|
|
115
|
-
<Button variant="contained" onClick={onComplete} disabled={loading || savingEmail}>{t('Onboarding.CONTINUE')}</Button>
|
|
116
|
-
</Box>
|
|
117
|
-
</Box>
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export default BrowserPushStep;
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import { useTranslation } from 'react-i18next';
|
|
3
|
-
import Alert from '@mui/material/Alert';
|
|
4
|
-
import Box from '@mui/material/Box';
|
|
5
|
-
import Button from '@mui/material/Button';
|
|
6
|
-
import CircularProgress from '@mui/material/CircularProgress';
|
|
7
|
-
import TextField from '@mui/material/TextField';
|
|
8
|
-
import Typography from '@mui/material/Typography';
|
|
9
|
-
import PersonIcon from '@mui/icons-material/Person';
|
|
10
|
-
import { updateUserProfile } from '../../auth/authApi';
|
|
11
|
-
|
|
12
|
-
export function CompleteNameStep({ onComplete }) {
|
|
13
|
-
const { t } = useTranslation();
|
|
14
|
-
const [firstName, setFirstName] = useState('');
|
|
15
|
-
const [lastName, setLastName] = useState('');
|
|
16
|
-
const [loading, setLoading] = useState(false);
|
|
17
|
-
const [error, setError] = useState('');
|
|
18
|
-
|
|
19
|
-
const submit = async (event) => {
|
|
20
|
-
event.preventDefault();
|
|
21
|
-
if (!firstName.trim() || !lastName.trim()) return;
|
|
22
|
-
setLoading(true);
|
|
23
|
-
setError('');
|
|
24
|
-
try {
|
|
25
|
-
await updateUserProfile({ first_name: firstName.trim(), last_name: lastName.trim() });
|
|
26
|
-
onComplete();
|
|
27
|
-
} catch {
|
|
28
|
-
setError(t('Onboarding.COMPLETE_NAME_ERROR'));
|
|
29
|
-
} finally {
|
|
30
|
-
setLoading(false);
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
return (
|
|
35
|
-
<Box component="form" onSubmit={submit} sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
|
|
36
|
-
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}><PersonIcon color="primary" /><Typography variant="h6">{t('Onboarding.COMPLETE_NAME_TITLE')}</Typography></Box>
|
|
37
|
-
<Typography variant="body2" color="text.secondary">{t('Onboarding.COMPLETE_NAME_BODY')}</Typography>
|
|
38
|
-
{error && <Alert severity="error" onClose={() => setError('')}>{error}</Alert>}
|
|
39
|
-
<TextField label={t('Onboarding.FIRST_NAME_LABEL')} value={firstName} onChange={(event) => setFirstName(event.target.value)} required fullWidth size="small" />
|
|
40
|
-
<TextField label={t('Onboarding.LAST_NAME_LABEL')} value={lastName} onChange={(event) => setLastName(event.target.value)} required fullWidth size="small" />
|
|
41
|
-
<Box sx={{ display: 'flex', justifyContent: 'flex-end' }}><Button variant="contained" type="submit" disabled={loading || !firstName.trim() || !lastName.trim()} startIcon={loading ? <CircularProgress size={16} /> : undefined}>{t('Onboarding.SAVE')}</Button></Box>
|
|
42
|
-
</Box>
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export default CompleteNameStep;
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import { useTranslation } from 'react-i18next';
|
|
3
|
-
import Alert from '@mui/material/Alert';
|
|
4
|
-
import Box from '@mui/material/Box';
|
|
5
|
-
import Button from '@mui/material/Button';
|
|
6
|
-
import Checkbox from '@mui/material/Checkbox';
|
|
7
|
-
import CircularProgress from '@mui/material/CircularProgress';
|
|
8
|
-
import FormControlLabel from '@mui/material/FormControlLabel';
|
|
9
|
-
import Link from '@mui/material/Link';
|
|
10
|
-
import Typography from '@mui/material/Typography';
|
|
11
|
-
import PrivacyTipIcon from '@mui/icons-material/PrivacyTip';
|
|
12
|
-
import { fetchCookieStatement, fetchPrivacyStatement, updateUserProfile } from '../../auth/authApi';
|
|
13
|
-
|
|
14
|
-
export function CookieConsentStep({ onComplete }) {
|
|
15
|
-
const { t } = useTranslation();
|
|
16
|
-
const [privacyAccepted, setPrivacyAccepted] = useState(false);
|
|
17
|
-
const [cookiesAccepted, setCookiesAccepted] = useState(false);
|
|
18
|
-
const [privacyText, setPrivacyText] = useState('');
|
|
19
|
-
const [cookieText, setCookieText] = useState('');
|
|
20
|
-
const [showPrivacyText, setShowPrivacyText] = useState(false);
|
|
21
|
-
const [showCookieText, setShowCookieText] = useState(false);
|
|
22
|
-
const [loading, setLoading] = useState(false);
|
|
23
|
-
const [error, setError] = useState('');
|
|
24
|
-
|
|
25
|
-
const togglePrivacyText = async () => {
|
|
26
|
-
if (!showPrivacyText && !privacyText) {
|
|
27
|
-
try {
|
|
28
|
-
setPrivacyText(await fetchPrivacyStatement());
|
|
29
|
-
} catch {
|
|
30
|
-
// Non-fatal: the link simply won't reveal inline text this time.
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
setShowPrivacyText((previous) => !previous);
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const toggleCookieText = async () => {
|
|
37
|
-
if (!showCookieText && !cookieText) {
|
|
38
|
-
try {
|
|
39
|
-
setCookieText(await fetchCookieStatement());
|
|
40
|
-
} catch {
|
|
41
|
-
// Non-fatal: the link simply won't reveal inline text this time.
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
setShowCookieText((previous) => !previous);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const submit = async (event) => {
|
|
48
|
-
event.preventDefault();
|
|
49
|
-
if (!privacyAccepted) return;
|
|
50
|
-
setLoading(true);
|
|
51
|
-
setError('');
|
|
52
|
-
try {
|
|
53
|
-
await updateUserProfile({
|
|
54
|
-
accepted_privacy_statement: true,
|
|
55
|
-
accepted_convenience_cookies: cookiesAccepted,
|
|
56
|
-
});
|
|
57
|
-
onComplete();
|
|
58
|
-
} catch {
|
|
59
|
-
setError(t('Onboarding.PRIVACY_COOKIES_ERROR'));
|
|
60
|
-
} finally {
|
|
61
|
-
setLoading(false);
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
return (
|
|
66
|
-
<Box component="form" onSubmit={submit} sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
|
|
67
|
-
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
|
|
68
|
-
<PrivacyTipIcon color="primary" />
|
|
69
|
-
<Typography variant="h6">{t('Onboarding.PRIVACY_COOKIES_TITLE')}</Typography>
|
|
70
|
-
</Box>
|
|
71
|
-
<Typography variant="body2" color="text.secondary">{t('Onboarding.PRIVACY_COOKIES_BODY')}</Typography>
|
|
72
|
-
{error && <Alert severity="error" onClose={() => setError('')}>{error}</Alert>}
|
|
73
|
-
|
|
74
|
-
<Box>
|
|
75
|
-
<FormControlLabel
|
|
76
|
-
control={(
|
|
77
|
-
<Checkbox
|
|
78
|
-
checked={privacyAccepted}
|
|
79
|
-
onChange={(event) => setPrivacyAccepted(event.target.checked)}
|
|
80
|
-
required
|
|
81
|
-
/>
|
|
82
|
-
)}
|
|
83
|
-
label={t('Onboarding.PRIVACY_AGREEMENT_LABEL')}
|
|
84
|
-
/>
|
|
85
|
-
<Box>
|
|
86
|
-
<Link component="button" type="button" variant="body2" onClick={togglePrivacyText}>
|
|
87
|
-
{t('Onboarding.VIEW_STATEMENT')}
|
|
88
|
-
</Link>
|
|
89
|
-
{showPrivacyText && privacyText && (
|
|
90
|
-
<Typography variant="body2" color="text.secondary" sx={{ mt: 1, whiteSpace: 'pre-wrap' }}>
|
|
91
|
-
{privacyText}
|
|
92
|
-
</Typography>
|
|
93
|
-
)}
|
|
94
|
-
</Box>
|
|
95
|
-
</Box>
|
|
96
|
-
|
|
97
|
-
<Box>
|
|
98
|
-
<FormControlLabel
|
|
99
|
-
control={(
|
|
100
|
-
<Checkbox
|
|
101
|
-
checked={cookiesAccepted}
|
|
102
|
-
onChange={(event) => setCookiesAccepted(event.target.checked)}
|
|
103
|
-
/>
|
|
104
|
-
)}
|
|
105
|
-
label={t('Onboarding.COOKIES_OPT_IN_LABEL')}
|
|
106
|
-
/>
|
|
107
|
-
<Box>
|
|
108
|
-
<Link component="button" type="button" variant="body2" onClick={toggleCookieText}>
|
|
109
|
-
{t('Onboarding.VIEW_STATEMENT')}
|
|
110
|
-
</Link>
|
|
111
|
-
{showCookieText && cookieText && (
|
|
112
|
-
<Typography variant="body2" color="text.secondary" sx={{ mt: 1, whiteSpace: 'pre-wrap' }}>
|
|
113
|
-
{cookieText}
|
|
114
|
-
</Typography>
|
|
115
|
-
)}
|
|
116
|
-
</Box>
|
|
117
|
-
</Box>
|
|
118
|
-
|
|
119
|
-
<Box sx={{ display: 'flex', justifyContent: 'flex-end' }}>
|
|
120
|
-
<Button
|
|
121
|
-
variant="contained"
|
|
122
|
-
type="submit"
|
|
123
|
-
disabled={loading || !privacyAccepted}
|
|
124
|
-
startIcon={loading ? <CircularProgress size={16} /> : undefined}
|
|
125
|
-
>
|
|
126
|
-
{t('Onboarding.CONTINUE')}
|
|
127
|
-
</Button>
|
|
128
|
-
</Box>
|
|
129
|
-
</Box>
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export default CookieConsentStep;
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { useTranslation } from 'react-i18next';
|
|
3
|
-
import Box from '@mui/material/Box';
|
|
4
|
-
import Button from '@mui/material/Button';
|
|
5
|
-
import Typography from '@mui/material/Typography';
|
|
6
|
-
import InstallMobileIcon from '@mui/icons-material/InstallMobile';
|
|
7
|
-
|
|
8
|
-
export function PwaInstallStep({ onComplete, onDismiss, ctx }) {
|
|
9
|
-
const { t } = useTranslation();
|
|
10
|
-
const isIos = Boolean(ctx?.pwaInstall?.isIos);
|
|
11
|
-
const deferredPrompt = ctx?.pwaInstall?.deferredPrompt;
|
|
12
|
-
|
|
13
|
-
const handleInstall = async () => {
|
|
14
|
-
if (!deferredPrompt) {
|
|
15
|
-
onComplete();
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
deferredPrompt.prompt();
|
|
19
|
-
try {
|
|
20
|
-
await deferredPrompt.userChoice;
|
|
21
|
-
} finally {
|
|
22
|
-
onComplete();
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
|
|
28
|
-
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
|
|
29
|
-
<InstallMobileIcon color="primary" />
|
|
30
|
-
<Typography variant="h6">{t('Onboarding.PWA_INSTALL_TITLE')}</Typography>
|
|
31
|
-
</Box>
|
|
32
|
-
<Typography variant="body2" color="text.secondary">
|
|
33
|
-
{t(isIos ? 'Onboarding.PWA_INSTALL_IOS_BODY' : 'Onboarding.PWA_INSTALL_BODY')}
|
|
34
|
-
</Typography>
|
|
35
|
-
<Box sx={{ display: 'flex', justifyContent: 'flex-end', gap: 1 }}>
|
|
36
|
-
<Button variant="text" onClick={onDismiss}>{t('Onboarding.SKIP')}</Button>
|
|
37
|
-
{isIos ? (
|
|
38
|
-
<Button variant="contained" onClick={onComplete}>{t('Onboarding.CONTINUE')}</Button>
|
|
39
|
-
) : (
|
|
40
|
-
<Button variant="contained" onClick={handleInstall}>{t('Onboarding.PWA_INSTALL_ACTION')}</Button>
|
|
41
|
-
)}
|
|
42
|
-
</Box>
|
|
43
|
-
</Box>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export default PwaInstallStep;
|