@oxyhq/services 26.0.0 → 26.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/README.md +2 -2
- package/android/src/main/java/so/oxy/identity/OxyIdentityStore.kt +127 -21
- package/expo-module.config.json +1 -4
- package/lib/commonjs/index.js +49 -18
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/notifications/deviceNotifications.js +0 -63
- package/lib/commonjs/notifications/deviceNotifications.js.map +1 -1
- package/lib/commonjs/ui/boot/runProviderColdBoot.js +64 -20
- package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
- package/lib/commonjs/ui/components/FollowButton.js +4 -4
- package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
- package/lib/commonjs/ui/components/OxyAccountDialogScreen.js +1 -13
- package/lib/commonjs/ui/components/OxyAccountDialogScreen.js.map +1 -1
- package/lib/commonjs/ui/components/OxyAuthChooser.js +8 -9
- package/lib/commonjs/ui/components/OxyAuthChooser.js.map +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +7 -8
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
- package/lib/commonjs/ui/components/ProfileButton.js +1 -1
- package/lib/commonjs/ui/components/ProfileButton.js.map +1 -1
- package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +30 -25
- package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -1
- package/lib/commonjs/ui/components/authChooser/primitives.js +9 -9
- package/lib/commonjs/ui/components/authChooser/primitives.js.map +1 -1
- package/lib/commonjs/ui/components/authChooser/useUsernameAvailability.js +2 -2
- package/lib/commonjs/ui/components/authChooser/useUsernameAvailability.js.map +1 -1
- package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +2 -2
- package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
- package/lib/commonjs/ui/components/internal/PinInput.js +1 -3
- package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -1
- package/lib/commonjs/ui/components/logo/LogoText.js +4 -4
- package/lib/commonjs/ui/components/logo/LogoText.js.map +1 -1
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +2 -2
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -1
- package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +2 -2
- package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -1
- package/lib/commonjs/ui/components/styles/shadow.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +46 -32
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/commitSessionFlow.js +43 -3
- package/lib/commonjs/ui/context/commitSessionFlow.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js +2 -15
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/commonjs/ui/context/useOxyAccountGraph.js +4 -3
- package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +5 -5
- package/lib/commonjs/ui/hooks/mutations/mutationFactory.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +11 -11
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +9 -9
- package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/usePaymentQueries.js +2 -3
- package/lib/commonjs/ui/hooks/queries/usePaymentQueries.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/userCache.js +17 -17
- package/lib/commonjs/ui/hooks/queries/userCache.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAssets.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAsyncAction.js +7 -7
- package/lib/commonjs/ui/hooks/useAsyncAction.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAuth.js +2 -4
- package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAvatarPicker.js +5 -5
- package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +1 -1
- package/lib/commonjs/ui/hooks/useOnlineStatus.js +2 -3
- package/lib/commonjs/ui/hooks/useOnlineStatus.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionManagement.js +2 -0
- package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSettingToggle.js +4 -4
- package/lib/commonjs/ui/hooks/useSettingToggle.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSurfaceHeader.js +11 -68
- package/lib/commonjs/ui/hooks/useSurfaceHeader.js.map +1 -1
- package/lib/commonjs/ui/oauth/browserAuthTransport.js +64 -66
- package/lib/commonjs/ui/oauth/browserAuthTransport.js.map +1 -1
- package/lib/commonjs/ui/oauth/legacyRedirectLanes.js +48 -0
- package/lib/commonjs/ui/oauth/legacyRedirectLanes.js.map +1 -0
- package/lib/commonjs/ui/oauth/oauthPopup.js +0 -47
- package/lib/commonjs/ui/oauth/oauthPopup.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountMembersScreen.js +10 -10
- package/lib/commonjs/ui/screens/AccountMembersScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +19 -41
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountVerificationScreen.js +4 -4
- package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AppInfoScreen.js +9 -9
- package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AvatarCropScreen.js +3 -3
- package/lib/commonjs/ui/screens/AvatarCropScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ChangeAvatarScreen.js +7 -6
- package/lib/commonjs/ui/screens/ChangeAvatarScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ConnectedAppsScreen.js +4 -4
- package/lib/commonjs/ui/screens/ConnectedAppsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/CreateAccountScreen.js +13 -35
- package/lib/commonjs/ui/screens/CreateAccountScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +5 -5
- package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/EditProfileScreen.js +3 -2
- package/lib/commonjs/ui/screens/EditProfileScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FAQScreen.js +2 -2
- package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FeedbackScreen.js +89 -90
- package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FileManagementScreen.js +20 -20
- package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FollowersListScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FollowingListScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/HelpSupportScreen.js +7 -7
- package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/HistoryViewScreen.js +34 -9
- package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +3 -3
- package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +3 -3
- package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ManageAccountScreen.js +15 -15
- package/lib/commonjs/ui/screens/ManageAccountScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +19 -19
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +15 -15
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ProfileScreen.js +7 -17
- package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +2 -2
- package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/UserListScreen.js +7 -13
- package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +6 -5
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +4 -1
- package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
- package/lib/commonjs/ui/screens/fileManagement/hooks/useFileUploadState.js +24 -34
- package/lib/commonjs/ui/screens/fileManagement/hooks/useFileUploadState.js.map +1 -1
- package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js +1 -1
- package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +4 -3
- package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js +1 -1
- package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
- package/lib/commonjs/ui/session/index.js +0 -7
- package/lib/commonjs/ui/session/index.js.map +1 -1
- package/lib/commonjs/ui/utils/crossOriginRestore.js +140 -0
- package/lib/commonjs/ui/utils/crossOriginRestore.js.map +1 -0
- package/lib/commonjs/ui/utils/fileManagement.js +24 -24
- package/lib/commonjs/ui/utils/fileManagement.js.map +1 -1
- package/lib/commonjs/ui/utils/oauthReturn.js +30 -19
- package/lib/commonjs/ui/utils/oauthReturn.js.map +1 -1
- package/lib/commonjs/ui/utils/userUtils.js +28 -27
- package/lib/commonjs/ui/utils/userUtils.js.map +1 -1
- package/lib/module/index.js +8 -20
- package/lib/module/index.js.map +1 -1
- package/lib/module/notifications/deviceNotifications.js +0 -62
- package/lib/module/notifications/deviceNotifications.js.map +1 -1
- package/lib/module/ui/boot/runProviderColdBoot.js +65 -21
- package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
- package/lib/module/ui/components/FollowButton.js +1 -1
- package/lib/module/ui/components/FollowButton.js.map +1 -1
- package/lib/module/ui/components/OxyAccountDialogScreen.js +1 -13
- package/lib/module/ui/components/OxyAccountDialogScreen.js.map +1 -1
- package/lib/module/ui/components/OxyAuthChooser.js +4 -5
- package/lib/module/ui/components/OxyAuthChooser.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +6 -7
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/OxySignInButton.js.map +1 -1
- package/lib/module/ui/components/ProfileButton.js +2 -2
- package/lib/module/ui/components/ProfileButton.js.map +1 -1
- package/lib/module/ui/components/authChooser/AccountsMenuView.js +8 -3
- package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -1
- package/lib/module/ui/components/authChooser/primitives.js +1 -1
- package/lib/module/ui/components/authChooser/primitives.js.map +1 -1
- package/lib/module/ui/components/authChooser/useUsernameAvailability.js +1 -1
- package/lib/module/ui/components/authChooser/useUsernameAvailability.js.map +1 -1
- package/lib/module/ui/components/fileManagement/UploadPreview.js +1 -1
- package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
- package/lib/module/ui/components/internal/PinInput.js +1 -3
- package/lib/module/ui/components/internal/PinInput.js.map +1 -1
- package/lib/module/ui/components/logo/LogoText.js +4 -4
- package/lib/module/ui/components/logo/LogoText.js.map +1 -1
- package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
- package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
- package/lib/module/ui/components/payment/PaymentSummaryStep.js +2 -2
- package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -1
- package/lib/module/ui/components/styles/shadow.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +49 -35
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/commitSessionFlow.js +42 -3
- package/lib/module/ui/context/commitSessionFlow.js.map +1 -1
- package/lib/module/ui/context/hooks/useAuthOperations.js +2 -15
- package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/module/ui/context/useOxyAccountGraph.js +4 -3
- package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
- package/lib/module/ui/hooks/mutations/mutationFactory.js +1 -1
- package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -1
- package/lib/module/ui/hooks/mutations/useAccountMutations.js +1 -1
- package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/module/ui/hooks/mutations/useServicesMutations.js +1 -1
- package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -1
- package/lib/module/ui/hooks/queries/usePaymentQueries.js +2 -3
- package/lib/module/ui/hooks/queries/usePaymentQueries.js.map +1 -1
- package/lib/module/ui/hooks/queries/userCache.js +17 -17
- package/lib/module/ui/hooks/queries/userCache.js.map +1 -1
- package/lib/module/ui/hooks/useAssets.js.map +1 -1
- package/lib/module/ui/hooks/useAsyncAction.js +1 -1
- package/lib/module/ui/hooks/useAsyncAction.js.map +1 -1
- package/lib/module/ui/hooks/useAuth.js +2 -4
- package/lib/module/ui/hooks/useAuth.js.map +1 -1
- package/lib/module/ui/hooks/useAvatarPicker.js +1 -1
- package/lib/module/ui/hooks/useAvatarPicker.js.map +1 -1
- package/lib/module/ui/hooks/useOnlineStatus.js +2 -3
- package/lib/module/ui/hooks/useOnlineStatus.js.map +1 -1
- package/lib/module/ui/hooks/useSessionManagement.js +2 -0
- package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/module/ui/hooks/useSettingToggle.js +1 -1
- package/lib/module/ui/hooks/useSettingToggle.js.map +1 -1
- package/lib/module/ui/hooks/useSurfaceHeader.js +11 -68
- package/lib/module/ui/hooks/useSurfaceHeader.js.map +1 -1
- package/lib/module/ui/oauth/browserAuthTransport.js +64 -66
- package/lib/module/ui/oauth/browserAuthTransport.js.map +1 -1
- package/lib/module/ui/oauth/legacyRedirectLanes.js +44 -0
- package/lib/module/ui/oauth/legacyRedirectLanes.js.map +1 -0
- package/lib/module/ui/oauth/oauthPopup.js +1 -48
- package/lib/module/ui/oauth/oauthPopup.js.map +1 -1
- package/lib/module/ui/screens/AccountMembersScreen.js +1 -1
- package/lib/module/ui/screens/AccountMembersScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +15 -37
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountVerificationScreen.js +1 -1
- package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
- package/lib/module/ui/screens/AppInfoScreen.js +1 -1
- package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/module/ui/screens/AvatarCropScreen.js +1 -1
- package/lib/module/ui/screens/AvatarCropScreen.js.map +1 -1
- package/lib/module/ui/screens/ChangeAvatarScreen.js +5 -4
- package/lib/module/ui/screens/ChangeAvatarScreen.js.map +1 -1
- package/lib/module/ui/screens/ConnectedAppsScreen.js +2 -2
- package/lib/module/ui/screens/ConnectedAppsScreen.js.map +1 -1
- package/lib/module/ui/screens/CreateAccountScreen.js +12 -34
- package/lib/module/ui/screens/CreateAccountScreen.js.map +1 -1
- package/lib/module/ui/screens/EditProfileFieldScreen.js +4 -4
- package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
- package/lib/module/ui/screens/EditProfileScreen.js +4 -3
- package/lib/module/ui/screens/EditProfileScreen.js.map +1 -1
- package/lib/module/ui/screens/FAQScreen.js +1 -1
- package/lib/module/ui/screens/FAQScreen.js.map +1 -1
- package/lib/module/ui/screens/FeedbackScreen.js +91 -94
- package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/module/ui/screens/FileManagementScreen.js +1 -1
- package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/FollowersListScreen.js.map +1 -1
- package/lib/module/ui/screens/FollowingListScreen.js.map +1 -1
- package/lib/module/ui/screens/HelpSupportScreen.js +1 -1
- package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/module/ui/screens/HistoryViewScreen.js +30 -5
- package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
- package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -1
- package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
- package/lib/module/ui/screens/LegalDocumentsScreen.js +1 -1
- package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
- package/lib/module/ui/screens/ManageAccountScreen.js +3 -3
- package/lib/module/ui/screens/ManageAccountScreen.js.map +1 -1
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js +4 -4
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/module/ui/screens/PrivacySettingsScreen.js +11 -11
- package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/ProfileScreen.js +8 -18
- package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/module/ui/screens/SavesCollectionsScreen.js +1 -1
- package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
- package/lib/module/ui/screens/UserListScreen.js +8 -14
- package/lib/module/ui/screens/UserListScreen.js.map +1 -1
- package/lib/module/ui/screens/WelcomeNewUserScreen.js +6 -5
- package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +4 -1
- package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
- package/lib/module/ui/screens/fileManagement/hooks/useFileUploadState.js +5 -15
- package/lib/module/ui/screens/fileManagement/hooks/useFileUploadState.js.map +1 -1
- package/lib/module/ui/screens/trust/TrustCenterScreen.js +1 -1
- package/lib/module/ui/screens/trust/TrustCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +5 -4
- package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
- package/lib/module/ui/screens/trust/TrustRewardsScreen.js +1 -1
- package/lib/module/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
- package/lib/module/ui/session/index.js +0 -1
- package/lib/module/ui/session/index.js.map +1 -1
- package/lib/module/ui/utils/crossOriginRestore.js +131 -0
- package/lib/module/ui/utils/crossOriginRestore.js.map +1 -0
- package/lib/module/ui/utils/fileManagement.js +25 -25
- package/lib/module/ui/utils/fileManagement.js.map +1 -1
- package/lib/module/ui/utils/oauthReturn.js +30 -20
- package/lib/module/ui/utils/oauthReturn.js.map +1 -1
- package/lib/module/ui/utils/userUtils.js +28 -27
- package/lib/module/ui/utils/userUtils.js.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +2 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts +0 -51
- package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts +30 -11
- package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts +0 -7
- package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts +1 -2
- package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ProfileButton.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts +1 -1
- package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts +1 -1
- package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/internal/PinInput.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/payment/types.d.ts +6 -6
- package/lib/typescript/commonjs/ui/components/payment/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts +40 -0
- package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts +2 -11
- package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +7 -26
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts +1 -0
- package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/queries/paymentTypes.d.ts +2 -3
- package/lib/typescript/commonjs/ui/hooks/queries/paymentTypes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/queries/usePaymentQueries.d.ts +2 -3
- package/lib/typescript/commonjs/ui/hooks/queries/usePaymentQueries.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts +2 -2
- package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts +2 -2
- package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +2 -4
- package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts +2 -3
- package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useSurfaceHeader.d.ts +2 -7
- package/lib/typescript/commonjs/ui/hooks/useSurfaceHeader.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/oauth/browserAuthTransport.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts +40 -0
- package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/oauth/oauthPopup.d.ts +0 -6
- package/lib/typescript/commonjs/ui/oauth/oauthPopup.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/ChangeAvatarScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/CreateAccountScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/EditProfileScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts +2 -2
- package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts +0 -3
- package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts +0 -3
- package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/ManageAccountScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/ProfileScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts +0 -7
- package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/fileManagement/hooks/useFileUploadState.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/trust/trustTier.d.ts +1 -1
- package/lib/typescript/commonjs/ui/screens/trust/trustTier.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/session/index.d.ts +0 -1
- package/lib/typescript/commonjs/ui/session/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/types/navigation.d.ts +19 -27
- package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts +43 -0
- package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts +5 -5
- package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts +12 -15
- package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/userUtils.d.ts +14 -7
- package/lib/typescript/commonjs/ui/utils/userUtils.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +2 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/notifications/deviceNotifications.d.ts +0 -51
- package/lib/typescript/module/notifications/deviceNotifications.d.ts.map +1 -1
- package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts +30 -11
- package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts +0 -7
- package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxySignInButton.d.ts +1 -2
- package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ProfileButton.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/authChooser/primitives.d.ts +1 -1
- package/lib/typescript/module/ui/components/authChooser/primitives.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts +1 -1
- package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/internal/PinInput.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/payment/types.d.ts +6 -6
- package/lib/typescript/module/ui/components/payment/types.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/commitSessionFlow.d.ts +40 -0
- package/lib/typescript/module/ui/context/commitSessionFlow.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts +2 -11
- package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +7 -26
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts +1 -0
- package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/queries/paymentTypes.d.ts +2 -3
- package/lib/typescript/module/ui/hooks/queries/paymentTypes.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/queries/usePaymentQueries.d.ts +2 -3
- package/lib/typescript/module/ui/hooks/queries/usePaymentQueries.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/queries/userCache.d.ts +2 -2
- package/lib/typescript/module/ui/hooks/queries/userCache.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAssets.d.ts +1 -1
- package/lib/typescript/module/ui/hooks/useAssets.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts +2 -2
- package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAuth.d.ts +2 -4
- package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts +2 -3
- package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useSurfaceHeader.d.ts +2 -7
- package/lib/typescript/module/ui/hooks/useSurfaceHeader.d.ts.map +1 -1
- package/lib/typescript/module/ui/oauth/browserAuthTransport.d.ts.map +1 -1
- package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts +40 -0
- package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts.map +1 -0
- package/lib/typescript/module/ui/oauth/oauthPopup.d.ts +0 -6
- package/lib/typescript/module/ui/oauth/oauthPopup.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/ChangeAvatarScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/CreateAccountScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/EditProfileScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts +2 -2
- package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts +0 -3
- package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts +0 -3
- package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/ManageAccountScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/ProfileScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/UserListScreen.d.ts +0 -7
- package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/fileManagement/hooks/useFileUploadState.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/trust/trustTier.d.ts +1 -1
- package/lib/typescript/module/ui/screens/trust/trustTier.d.ts.map +1 -1
- package/lib/typescript/module/ui/session/index.d.ts +0 -1
- package/lib/typescript/module/ui/session/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/types/navigation.d.ts +19 -27
- package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts +43 -0
- package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/fileManagement.d.ts +5 -5
- package/lib/typescript/module/ui/utils/fileManagement.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/oauthReturn.d.ts +12 -15
- package/lib/typescript/module/ui/utils/oauthReturn.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/userUtils.d.ts +14 -7
- package/lib/typescript/module/ui/utils/userUtils.d.ts.map +1 -1
- package/package.json +10 -22
- package/src/index.ts +16 -18
- package/src/notifications/deviceNotifications.ts +0 -82
- package/src/ui/boot/__tests__/coldBootWebAuthMode.test.ts +281 -0
- package/src/ui/boot/runProviderColdBoot.ts +101 -24
- package/src/ui/components/FollowButton.tsx +1 -1
- package/src/ui/components/OxyAccountDialogScreen.tsx +1 -13
- package/src/ui/components/OxyAuthChooser.tsx +4 -14
- package/src/ui/components/OxyProvider.tsx +7 -8
- package/src/ui/components/OxySignInButton.tsx +1 -2
- package/src/ui/components/ProfileButton.tsx +2 -5
- package/src/ui/components/authChooser/AccountsMenuView.tsx +10 -5
- package/src/ui/components/authChooser/primitives.tsx +1 -1
- package/src/ui/components/authChooser/useUsernameAvailability.ts +1 -1
- package/src/ui/components/fileManagement/UploadPreview.tsx +1 -1
- package/src/ui/components/internal/PinInput.tsx +0 -1
- package/src/ui/components/logo/LogoText.tsx +4 -4
- package/src/ui/components/payment/PaymentDetailsStep.tsx +1 -1
- package/src/ui/components/payment/PaymentSummaryStep.tsx +2 -2
- package/src/ui/components/payment/types.ts +24 -24
- package/src/ui/components/styles/shadow.tsx +2 -2
- package/src/ui/context/OxyContext.tsx +46 -35
- package/src/ui/context/__tests__/commitSessionFlow.test.ts +89 -13
- package/src/ui/context/commitSessionFlow.ts +61 -3
- package/src/ui/context/hooks/useAuthOperations.ts +1 -26
- package/src/ui/context/oxyContextTypes.ts +7 -26
- package/src/ui/context/useOxyAccountGraph.ts +4 -4
- package/src/ui/hooks/mutations/mutationFactory.ts +1 -1
- package/src/ui/hooks/mutations/useAccountMutations.ts +1 -1
- package/src/ui/hooks/mutations/useServicesMutations.ts +1 -1
- package/src/ui/hooks/queries/paymentTypes.ts +2 -3
- package/src/ui/hooks/queries/usePaymentQueries.ts +2 -3
- package/src/ui/hooks/queries/userCache.ts +148 -169
- package/src/ui/hooks/useAssets.ts +1 -1
- package/src/ui/hooks/useAsyncAction.ts +3 -3
- package/src/ui/hooks/useAuth.ts +2 -4
- package/src/ui/hooks/useAvatarPicker.ts +1 -1
- package/src/ui/hooks/useOnlineStatus.ts +2 -3
- package/src/ui/hooks/useSessionManagement.ts +2 -0
- package/src/ui/hooks/useSettingToggle.ts +1 -1
- package/src/ui/hooks/useSurfaceHeader.ts +15 -90
- package/src/ui/oauth/__tests__/oauthPopup.test.ts +0 -26
- package/src/ui/oauth/browserAuthTransport.ts +49 -55
- package/src/ui/oauth/legacyRedirectLanes.ts +43 -0
- package/src/ui/oauth/oauthPopup.ts +3 -61
- package/src/ui/screens/AccountMembersScreen.tsx +1 -1
- package/src/ui/screens/AccountSettingsScreen.tsx +17 -45
- package/src/ui/screens/AccountVerificationScreen.tsx +1 -1
- package/src/ui/screens/AppInfoScreen.tsx +1 -1
- package/src/ui/screens/AvatarCropScreen.tsx +1 -1
- package/src/ui/screens/ChangeAvatarScreen.tsx +4 -7
- package/src/ui/screens/ConnectedAppsScreen.tsx +2 -2
- package/src/ui/screens/CreateAccountScreen.tsx +13 -43
- package/src/ui/screens/EditProfileFieldScreen.tsx +4 -4
- package/src/ui/screens/EditProfileScreen.tsx +3 -6
- package/src/ui/screens/FAQScreen.tsx +1 -1
- package/src/ui/screens/FeedbackScreen.tsx +575 -741
- package/src/ui/screens/FileManagementScreen.tsx +1 -1
- package/src/ui/screens/FollowersListScreen.tsx +0 -3
- package/src/ui/screens/FollowingListScreen.tsx +0 -3
- package/src/ui/screens/HelpSupportScreen.tsx +1 -1
- package/src/ui/screens/HistoryViewScreen.tsx +20 -5
- package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
- package/src/ui/screens/LegalDocumentsScreen.tsx +1 -1
- package/src/ui/screens/ManageAccountScreen.tsx +2 -9
- package/src/ui/screens/PremiumSubscriptionScreen.tsx +4 -4
- package/src/ui/screens/PrivacySettingsScreen.tsx +12 -15
- package/src/ui/screens/ProfileScreen.tsx +6 -24
- package/src/ui/screens/SavesCollectionsScreen.tsx +1 -1
- package/src/ui/screens/UserListScreen.tsx +8 -18
- package/src/ui/screens/WelcomeNewUserScreen.tsx +6 -6
- package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +1 -1
- package/src/ui/screens/fileManagement/hooks/useFileUploadState.ts +5 -14
- package/src/ui/screens/trust/TrustCenterScreen.tsx +2 -2
- package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +5 -6
- package/src/ui/screens/trust/TrustRewardsScreen.tsx +1 -1
- package/src/ui/screens/trust/TrustRulesScreen.tsx +1 -1
- package/src/ui/screens/trust/trustTier.ts +1 -1
- package/src/ui/session/index.ts +0 -1
- package/src/ui/types/navigation.ts +19 -27
- package/src/ui/utils/__tests__/crossOriginRestore.test.ts +143 -0
- package/src/ui/utils/crossOriginRestore.ts +169 -0
- package/src/ui/utils/fileManagement.ts +92 -108
- package/src/ui/utils/oauthReturn.ts +33 -23
- package/src/ui/utils/userUtils.ts +32 -27
- package/android/src/main/java/so/oxy/session/OxyBackgroundSession.kt +0 -184
- package/android/src/main/java/so/oxy/session/OxyBackgroundSessionApi.kt +0 -162
- package/android/src/main/java/so/oxy/session/OxyBackgroundSessionModule.kt +0 -116
- package/android/src/main/java/so/oxy/session/OxyBackgroundSessionStore.kt +0 -179
- package/android/src/main/java/so/oxy/session/OxyBackgroundToken.kt +0 -61
- package/android/src/main/java/so/oxy/storage/OxyEncryptedPrefs.kt +0 -241
- package/lib/commonjs/ui/session/backgroundSession.js +0 -258
- package/lib/commonjs/ui/session/backgroundSession.js.map +0 -1
- package/lib/commonjs/ui/session/useBackgroundSessionSync.js +0 -81
- package/lib/commonjs/ui/session/useBackgroundSessionSync.js.map +0 -1
- package/lib/commonjs/ui/utils/netConnectivity.js +0 -28
- package/lib/commonjs/ui/utils/netConnectivity.js.map +0 -1
- package/lib/module/ui/session/backgroundSession.js +0 -252
- package/lib/module/ui/session/backgroundSession.js.map +0 -1
- package/lib/module/ui/session/useBackgroundSessionSync.js +0 -76
- package/lib/module/ui/session/useBackgroundSessionSync.js.map +0 -1
- package/lib/module/ui/utils/netConnectivity.js +0 -23
- package/lib/module/ui/utils/netConnectivity.js.map +0 -1
- package/lib/typescript/commonjs/ui/session/backgroundSession.d.ts +0 -42
- package/lib/typescript/commonjs/ui/session/backgroundSession.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/session/useBackgroundSessionSync.d.ts +0 -23
- package/lib/typescript/commonjs/ui/session/useBackgroundSessionSync.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts +0 -17
- package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts.map +0 -1
- package/lib/typescript/module/ui/session/backgroundSession.d.ts +0 -42
- package/lib/typescript/module/ui/session/backgroundSession.d.ts.map +0 -1
- package/lib/typescript/module/ui/session/useBackgroundSessionSync.d.ts +0 -23
- package/lib/typescript/module/ui/session/useBackgroundSessionSync.d.ts.map +0 -1
- package/lib/typescript/module/ui/utils/netConnectivity.d.ts +0 -17
- package/lib/typescript/module/ui/utils/netConnectivity.d.ts.map +0 -1
- package/lib/typescript/types/expo-image-picker.d.ts +0 -35
- package/src/types/expo-image-picker.d.ts +0 -35
- package/src/ui/boot/__tests__/coldBootNoIdpRedirect.test.ts +0 -215
- package/src/ui/session/__tests__/backgroundSession.test.ts +0 -392
- package/src/ui/session/backgroundSession.ts +0 -313
- package/src/ui/session/useBackgroundSessionSync.ts +0 -92
- package/src/ui/utils/netConnectivity.ts +0 -27
|
@@ -39,10 +39,10 @@
|
|
|
39
39
|
* It is a cache write only — zero network, one `setQueryData` per key.
|
|
40
40
|
*/
|
|
41
41
|
|
|
42
|
-
import type {
|
|
43
|
-
import type {
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
42
|
+
import type { QueryClient } from '@tanstack/react-query';
|
|
43
|
+
import type { UserNameResponse } from '@oxyhq/contracts';
|
|
44
|
+
import { queryKeys } from './queryKeys';
|
|
45
|
+
import { useAuthStore } from '../../stores/authStore';
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* A user-shaped object that can be upserted into the cache. Intentionally
|
|
@@ -53,30 +53,30 @@ import { queryKeys } from "./queryKeys";
|
|
|
53
53
|
* pass through untouched (so the upsert never has to know the full DTO shape).
|
|
54
54
|
*/
|
|
55
55
|
export interface CacheableUser {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
56
|
+
id?: string;
|
|
57
|
+
/** Some sources (post/notification actors) carry the id as Mongo `_id`. */
|
|
58
|
+
_id?: string;
|
|
59
|
+
username?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Canonical structured name (`UserNameResponse`) OR a plain display string on
|
|
62
|
+
* the looser actor objects. Normalized to the object shape on write.
|
|
63
|
+
*/
|
|
64
|
+
name?: string | UserNameResponse;
|
|
65
|
+
/** Avatar file id. `null`/`''` are treated as "no avatar" (never degrade). */
|
|
66
|
+
avatar?: string | null;
|
|
67
|
+
/** Social counts. A partial `_count` never replaces a fuller one. */
|
|
68
|
+
_count?: { followers?: number; following?: number } | null;
|
|
69
|
+
/**
|
|
70
|
+
* Viewer-relative follow relationship. Present ONLY on an authenticated
|
|
71
|
+
* single-profile fetch; `null`/absent for anon/self/bulk/feed. Never stripped
|
|
72
|
+
* from an existing entry by a source that lacks it.
|
|
73
|
+
*/
|
|
74
|
+
relationship?: { isFollowing?: boolean; followsYou?: boolean } | null;
|
|
75
|
+
[key: string]: unknown;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
/** The degraded display-name sentinel (ghost-author rule). */
|
|
79
|
-
const DEGRADED_DISPLAY_NAME =
|
|
79
|
+
const DEGRADED_DISPLAY_NAME = 'Unknown user';
|
|
80
80
|
|
|
81
81
|
/** A cache entry always carries a resolved string `id`. */
|
|
82
82
|
type CachedUser = CacheableUser & { id: string; name?: UserNameResponse };
|
|
@@ -88,34 +88,28 @@ type CachedUser = CacheableUser & { id: string; name?: UserNameResponse };
|
|
|
88
88
|
* meaningful (a real `verified: false` or `_count.followers: 0`).
|
|
89
89
|
*/
|
|
90
90
|
function isMeaningful(value: unknown): boolean {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
if (value === undefined || value === null) return false;
|
|
92
|
+
if (typeof value === 'string') return value.trim() !== '';
|
|
93
|
+
return true;
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
/** A display name is meaningful only when non-empty AND not the degraded sentinel. */
|
|
97
97
|
function isMeaningfulDisplayName(value: unknown): value is string {
|
|
98
|
-
|
|
99
|
-
typeof value === "string" &&
|
|
100
|
-
value.trim() !== "" &&
|
|
101
|
-
value !== DEGRADED_DISPLAY_NAME
|
|
102
|
-
);
|
|
98
|
+
return typeof value === 'string' && value.trim() !== '' && value !== DEGRADED_DISPLAY_NAME;
|
|
103
99
|
}
|
|
104
100
|
|
|
105
101
|
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
106
|
-
|
|
102
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
107
103
|
}
|
|
108
104
|
|
|
109
105
|
/** Normalize the polymorphic `name` (string | object | nullish) to the canonical object shape. */
|
|
110
|
-
function normalizeName(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
return name;
|
|
106
|
+
function normalizeName(name: CacheableUser['name']): UserNameResponse | undefined {
|
|
107
|
+
if (name === undefined || name === null) return undefined;
|
|
108
|
+
if (typeof name === 'string') {
|
|
109
|
+
const trimmed = name.trim();
|
|
110
|
+
return trimmed ? { displayName: trimmed } : undefined;
|
|
111
|
+
}
|
|
112
|
+
return name;
|
|
119
113
|
}
|
|
120
114
|
|
|
121
115
|
/**
|
|
@@ -125,12 +119,12 @@ function normalizeName(
|
|
|
125
119
|
* object so the cache never holds a bare-string name).
|
|
126
120
|
*/
|
|
127
121
|
function toCachedUser(user: CacheableUser, fallbackId: string): CachedUser {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
122
|
+
const { name: rawName, ...rest } = user;
|
|
123
|
+
const id = String(user.id ?? user._id ?? fallbackId);
|
|
124
|
+
const name = normalizeName(rawName);
|
|
125
|
+
const normalized: CachedUser = { ...rest, id };
|
|
126
|
+
if (name !== undefined) normalized.name = name;
|
|
127
|
+
return normalized;
|
|
134
128
|
}
|
|
135
129
|
|
|
136
130
|
/**
|
|
@@ -138,43 +132,39 @@ function toCachedUser(user: CacheableUser, fallbackId: string): CachedUser {
|
|
|
138
132
|
* when no id can be resolved (nothing to key on).
|
|
139
133
|
*/
|
|
140
134
|
function normalizeIncoming(user: CacheableUser): CachedUser | null {
|
|
141
|
-
|
|
142
|
-
|
|
135
|
+
const cached = toCachedUser(user, '');
|
|
136
|
+
return cached.id ? cached : null;
|
|
143
137
|
}
|
|
144
138
|
|
|
145
139
|
/** Merge two `name` objects field-by-field, with anti-degradation on `displayName`. */
|
|
146
140
|
function mergeName(
|
|
147
|
-
|
|
148
|
-
|
|
141
|
+
existing: UserNameResponse | undefined,
|
|
142
|
+
incoming: UserNameResponse | undefined,
|
|
149
143
|
): UserNameResponse | undefined {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
144
|
+
if (incoming === undefined) return existing;
|
|
145
|
+
if (existing === undefined) return incoming;
|
|
146
|
+
const merged: UserNameResponse = { ...existing };
|
|
147
|
+
for (const [key, value] of Object.entries(incoming)) {
|
|
148
|
+
if (key === 'displayName') continue;
|
|
149
|
+
if (isMeaningful(value)) merged[key] = value;
|
|
150
|
+
}
|
|
151
|
+
// Never let an empty / `'Unknown user'` displayName overwrite a real one.
|
|
152
|
+
if (isMeaningfulDisplayName(incoming.displayName)) {
|
|
153
|
+
merged.displayName = incoming.displayName;
|
|
154
|
+
}
|
|
155
|
+
return merged;
|
|
162
156
|
}
|
|
163
157
|
|
|
164
158
|
/** Merge `_count` field-by-field so a partial count never replaces a fuller one. */
|
|
165
159
|
function mergeCount(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
): CacheableUser[
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
merged.followers = incoming.followers;
|
|
175
|
-
if (typeof incoming.following === "number")
|
|
176
|
-
merged.following = incoming.following;
|
|
177
|
-
return merged;
|
|
160
|
+
existing: CacheableUser['_count'],
|
|
161
|
+
incoming: CacheableUser['_count'],
|
|
162
|
+
): CacheableUser['_count'] {
|
|
163
|
+
if (!isPlainObject(incoming)) return existing;
|
|
164
|
+
const merged: { followers?: number; following?: number } = { ...(isPlainObject(existing) ? existing : {}) };
|
|
165
|
+
if (typeof incoming.followers === 'number') merged.followers = incoming.followers;
|
|
166
|
+
if (typeof incoming.following === 'number') merged.following = incoming.following;
|
|
167
|
+
return merged;
|
|
178
168
|
}
|
|
179
169
|
|
|
180
170
|
/**
|
|
@@ -182,18 +172,16 @@ function mergeCount(
|
|
|
182
172
|
* or an anon/self/bulk `null`) must NEVER strip an existing viewer relationship.
|
|
183
173
|
*/
|
|
184
174
|
function mergeRelationship(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
): CacheableUser[
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
merged.followsYou = incoming.followsYou;
|
|
196
|
-
return merged;
|
|
175
|
+
existing: CacheableUser['relationship'],
|
|
176
|
+
incoming: CacheableUser['relationship'],
|
|
177
|
+
): CacheableUser['relationship'] {
|
|
178
|
+
if (!isPlainObject(incoming)) return existing;
|
|
179
|
+
const merged: { isFollowing?: boolean; followsYou?: boolean } = {
|
|
180
|
+
...(isPlainObject(existing) ? existing : {}),
|
|
181
|
+
};
|
|
182
|
+
if (typeof incoming.isFollowing === 'boolean') merged.isFollowing = incoming.isFollowing;
|
|
183
|
+
if (typeof incoming.followsYou === 'boolean') merged.followsYou = incoming.followsYou;
|
|
184
|
+
return merged;
|
|
197
185
|
}
|
|
198
186
|
|
|
199
187
|
/**
|
|
@@ -205,63 +193,54 @@ function mergeRelationship(
|
|
|
205
193
|
* only the by-username key carries it (`useUserByUsername`).
|
|
206
194
|
*/
|
|
207
195
|
function mergeUsers(
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
196
|
+
existing: CachedUser,
|
|
197
|
+
incoming: CachedUser,
|
|
198
|
+
options?: { includeRelationship?: boolean },
|
|
211
199
|
): CachedUser {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
merged.relationship = undefined;
|
|
234
|
-
}
|
|
235
|
-
return merged;
|
|
200
|
+
const includeRelationship = options?.includeRelationship ?? true;
|
|
201
|
+
const merged: CachedUser = { ...existing };
|
|
202
|
+
for (const [key, value] of Object.entries(incoming)) {
|
|
203
|
+
if (key === 'name' || key === '_count' || key === 'relationship') continue;
|
|
204
|
+
if (key === 'id') {
|
|
205
|
+
merged.id = incoming.id;
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
if (isMeaningful(value)) merged[key] = value;
|
|
209
|
+
}
|
|
210
|
+
const name = mergeName(existing.name, incoming.name);
|
|
211
|
+
if (name !== undefined) merged.name = name;
|
|
212
|
+
const count = mergeCount(existing._count, incoming._count);
|
|
213
|
+
if (count !== undefined) merged._count = count;
|
|
214
|
+
if (includeRelationship) {
|
|
215
|
+
const relationship = mergeRelationship(existing.relationship, incoming.relationship);
|
|
216
|
+
if (relationship !== undefined) merged.relationship = relationship;
|
|
217
|
+
} else {
|
|
218
|
+
delete merged.relationship;
|
|
219
|
+
}
|
|
220
|
+
return merged;
|
|
236
221
|
}
|
|
237
222
|
|
|
238
223
|
/** Merge-upsert a normalized user into one cache key (see module docs for semantics). */
|
|
239
224
|
function upsertOneKey(
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
225
|
+
queryClient: QueryClient,
|
|
226
|
+
key: readonly unknown[],
|
|
227
|
+
incoming: CachedUser,
|
|
228
|
+
options: { includeRelationship: boolean },
|
|
244
229
|
): void {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
mergeOpts,
|
|
260
|
-
);
|
|
261
|
-
const dataUpdatedAt = queryClient.getQueryState(key)?.dataUpdatedAt ?? 0;
|
|
262
|
-
queryClient.setQueryData<CachedUser>(key, merged, {
|
|
263
|
-
updatedAt: dataUpdatedAt,
|
|
264
|
-
});
|
|
230
|
+
const mergeOpts = { includeRelationship: options.includeRelationship };
|
|
231
|
+
const existing = queryClient.getQueryData<CacheableUser>(key);
|
|
232
|
+
if (existing === undefined) {
|
|
233
|
+
// Cold slot: seed the full incoming object, STALE, so react-query refetches
|
|
234
|
+
// the full authoritative profile (relationship, counts, createdAt, …).
|
|
235
|
+
const seeded = mergeUsers({ id: incoming.id }, incoming, mergeOpts);
|
|
236
|
+
queryClient.setQueryData<CachedUser>(key, seeded, { updatedAt: 0 });
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
// Existing entry: merge and leave its freshness lifecycle untouched. The
|
|
240
|
+
// existing entry is keyed by `incoming.id`, so use it as the fallback id.
|
|
241
|
+
const merged = mergeUsers(toCachedUser(existing, incoming.id), incoming, mergeOpts);
|
|
242
|
+
const dataUpdatedAt = queryClient.getQueryState(key)?.dataUpdatedAt ?? 0;
|
|
243
|
+
queryClient.setQueryData<CachedUser>(key, merged, { updatedAt: dataUpdatedAt });
|
|
265
244
|
}
|
|
266
245
|
|
|
267
246
|
/**
|
|
@@ -272,7 +251,7 @@ function upsertOneKey(
|
|
|
272
251
|
* empty string is honoured (anonymous scope).
|
|
273
252
|
*/
|
|
274
253
|
function resolveViewerId(viewerId?: string): string {
|
|
275
|
-
|
|
254
|
+
return viewerId ?? useAuthStore.getState().user?.id ?? '';
|
|
276
255
|
}
|
|
277
256
|
|
|
278
257
|
/**
|
|
@@ -286,29 +265,29 @@ function resolveViewerId(viewerId?: string): string {
|
|
|
286
265
|
* the current auth-store user id.
|
|
287
266
|
*/
|
|
288
267
|
export function upsertCachedUser(
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
268
|
+
queryClient: QueryClient,
|
|
269
|
+
user: CacheableUser,
|
|
270
|
+
viewerId?: string,
|
|
292
271
|
): void {
|
|
293
|
-
|
|
294
|
-
|
|
272
|
+
const incoming = normalizeIncoming(user);
|
|
273
|
+
if (!incoming) return;
|
|
295
274
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
275
|
+
// By-id identity entry (read by `useUserById`). Not viewer-scoped — never store
|
|
276
|
+
// the viewer-relative `relationship` here or one viewer's follow state leaks
|
|
277
|
+
// into every other viewer's by-id cache entry.
|
|
278
|
+
upsertOneKey(queryClient, queryKeys.users.detail(incoming.id), incoming, {
|
|
279
|
+
includeRelationship: false,
|
|
280
|
+
});
|
|
302
281
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
282
|
+
const username = incoming.username;
|
|
283
|
+
if (typeof username === 'string' && username.trim() !== '') {
|
|
284
|
+
// By-username entry (read by `useUserByUsername`). Viewer-scoped because the
|
|
285
|
+
// authenticated single-profile fetch embeds the viewer `relationship`. Build
|
|
286
|
+
// the key through the SAME helper the hook uses so username normalization
|
|
287
|
+
// (`trim().toLowerCase()`) matches byte-for-byte.
|
|
288
|
+
const key = queryKeys.users.byUsername(username, resolveViewerId(viewerId));
|
|
289
|
+
upsertOneKey(queryClient, key, incoming, { includeRelationship: true });
|
|
290
|
+
}
|
|
312
291
|
}
|
|
313
292
|
|
|
314
293
|
/**
|
|
@@ -317,13 +296,13 @@ export function upsertCachedUser(
|
|
|
317
296
|
* appears twice merges both slices into the single cache entry.
|
|
318
297
|
*/
|
|
319
298
|
export function upsertCachedUsers(
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
299
|
+
queryClient: QueryClient,
|
|
300
|
+
users: readonly CacheableUser[] | null | undefined,
|
|
301
|
+
viewerId?: string,
|
|
323
302
|
): void {
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
303
|
+
if (!Array.isArray(users) || users.length === 0) return;
|
|
304
|
+
const resolvedViewerId = resolveViewerId(viewerId);
|
|
305
|
+
for (const user of users) {
|
|
306
|
+
if (user) upsertCachedUser(queryClient, user, resolvedViewerId);
|
|
307
|
+
}
|
|
329
308
|
}
|
|
@@ -48,7 +48,7 @@ export const useAssets = () => {
|
|
|
48
48
|
// Upload asset with progress tracking
|
|
49
49
|
const upload = useCallback(async (
|
|
50
50
|
file: File,
|
|
51
|
-
metadata?: Record<string,
|
|
51
|
+
metadata?: Record<string, any>
|
|
52
52
|
): Promise<Asset | null> => {
|
|
53
53
|
if (!oxyInstance) {
|
|
54
54
|
throw new Error('OxyServices instance not configured. Call setOxyAssetInstance first.');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useState, useCallback } from 'react';
|
|
2
|
-
import { toast } from '@oxyhq/bloom
|
|
2
|
+
import { toast } from '@oxyhq/bloom';
|
|
3
3
|
|
|
4
4
|
interface UseAsyncActionOptions<T> {
|
|
5
5
|
/** Function to execute */
|
|
@@ -7,11 +7,11 @@ interface UseAsyncActionOptions<T> {
|
|
|
7
7
|
/** Success message to display */
|
|
8
8
|
successMessage?: string;
|
|
9
9
|
/** Error message to display (or function to get message from error) */
|
|
10
|
-
errorMessage?: string | ((error:
|
|
10
|
+
errorMessage?: string | ((error: any) => string);
|
|
11
11
|
/** Callback on success */
|
|
12
12
|
onSuccess?: (result: T) => void;
|
|
13
13
|
/** Callback on error */
|
|
14
|
-
onError?: (error:
|
|
14
|
+
onError?: (error: any) => void;
|
|
15
15
|
/** Show loading toast */
|
|
16
16
|
showLoadingToast?: boolean;
|
|
17
17
|
/** Loading message */
|
package/src/ui/hooks/useAuth.ts
CHANGED
|
@@ -17,10 +17,8 @@
|
|
|
17
17
|
* }
|
|
18
18
|
* ```
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
* - Web:
|
|
22
|
-
* origin stays signed out until the user presses "Continue with Oxy". There is
|
|
23
|
-
* no cross-origin silent SSO: the SDK never navigates the tab on its own.
|
|
20
|
+
* Cross-domain session (zero cookies):
|
|
21
|
+
* - Web: silent OAuth (`prompt=none`) on cold boot; hub-ticket sync to auth.oxy.so after sign-in
|
|
24
22
|
* - Native: shared Keychain / app-group identity (Commons)
|
|
25
23
|
* - Realtime sync: Socket.IO `session_state` on `device:<deviceId>` once authenticated
|
|
26
24
|
* - Manual sign-in: signIn() opens the in-app account dialog (web + native)
|
|
@@ -24,7 +24,7 @@ import { useCallback } from 'react';
|
|
|
24
24
|
import type { OxyServices } from '@oxyhq/core';
|
|
25
25
|
import { translate, updateAvatarVisibility } from '@oxyhq/core';
|
|
26
26
|
import type { QueryClient } from '@tanstack/react-query';
|
|
27
|
-
import { toast } from '@oxyhq/bloom
|
|
27
|
+
import { toast } from '@oxyhq/bloom';
|
|
28
28
|
import { updateProfileWithAvatar } from '../utils/avatarUtils';
|
|
29
29
|
import { openWithinOrPresent } from '../navigation/surfaces';
|
|
30
30
|
import type { AvatarCropResult } from '../screens/AvatarCropScreen';
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* useOnlineStatus
|
|
3
3
|
*
|
|
4
4
|
* Reactive boolean reflecting TanStack Query's `onlineManager` state.
|
|
5
|
-
* Mirrors browser `online`/`offline` events on web and NetInfo
|
|
6
|
-
*
|
|
7
|
-
* `ConnectionStatusToasts` semantics).
|
|
5
|
+
* Mirrors browser `online`/`offline` events on web and NetInfo updates on
|
|
6
|
+
* native (both wired up in `OxyProvider`).
|
|
8
7
|
*
|
|
9
8
|
* Use this for surfacing offline UI — an OfflineBanner, a disabled "Sync"
|
|
10
9
|
* button, an inline "queued" badge on pending writes, etc. For pending /
|
|
@@ -9,6 +9,7 @@ import type { OxyServices } from '@oxyhq/core';
|
|
|
9
9
|
import type { QueryClient } from '@tanstack/react-query';
|
|
10
10
|
import { clearQueryCache } from './queryClient';
|
|
11
11
|
import { isWebBrowser } from '../utils/isWebBrowser';
|
|
12
|
+
import { clearCrossOriginRestoreGuards } from '../utils/crossOriginRestore';
|
|
12
13
|
import { resetSessionScopedStores } from '../stores/resetSessionScopedStores';
|
|
13
14
|
|
|
14
15
|
export interface UseSessionManagementOptions {
|
|
@@ -196,6 +197,7 @@ export const useSessionManagement = ({
|
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
await clearSessionStorage();
|
|
200
|
+
clearCrossOriginRestoreGuards();
|
|
199
201
|
onAuthStateChange?.(null);
|
|
200
202
|
}, [clearSessionStorage, logoutStore, onAuthStateChange, oxyServices, queryClient, storage, logger]);
|
|
201
203
|
|
|
@@ -10,13 +10,8 @@ import type { DialogHeaderConfig } from '@oxyhq/bloom/dialog';
|
|
|
10
10
|
* design-system fields Bloom's nav header supports: the single trailing
|
|
11
11
|
* `primaryAction` CTA (Upload / Save), a trailing icon `actions` row, a header
|
|
12
12
|
* `search` / `segments` in the large-title zone, an `onImage` `tone` over media,
|
|
13
|
-
* and a wizard `progress` bar.
|
|
14
|
-
*
|
|
15
|
-
* Only the NODE fields (`left`/`right`/`titleContent`, and an action's `icon`)
|
|
16
|
-
* must be referentially stable — a node can only be compared by identity, so an
|
|
17
|
-
* inline one thrashes the header. The rich OBJECT fields are compared by value
|
|
18
|
-
* (see {@link surfaceHeaderContentEqual}), so an inline `primaryAction` /
|
|
19
|
-
* `actions` / `search` / `segments` / `progress` is safe to pass.
|
|
13
|
+
* and a wizard `progress` bar. Object/slot fields MUST be referentially stable
|
|
14
|
+
* (memoize them with `useMemo`) so the header does not thrash.
|
|
20
15
|
*/
|
|
21
16
|
export type SurfaceHeaderContent = Pick<
|
|
22
17
|
DialogHeaderConfig,
|
|
@@ -47,86 +42,16 @@ interface SurfaceHeaderContextValue {
|
|
|
47
42
|
*/
|
|
48
43
|
export const SurfaceHeaderContext = createContext<SurfaceHeaderContextValue | null>(null);
|
|
49
44
|
|
|
50
|
-
type HeaderPrimaryAction = NonNullable<SurfaceHeaderContent['primaryAction']>;
|
|
51
|
-
type HeaderAction = NonNullable<SurfaceHeaderContent['actions']>[number];
|
|
52
|
-
type HeaderSearch = NonNullable<SurfaceHeaderContent['search']>;
|
|
53
|
-
type HeaderSegments = NonNullable<SurfaceHeaderContent['segments']>;
|
|
54
|
-
type HeaderProgress = NonNullable<SurfaceHeaderContent['progress']>;
|
|
55
|
-
|
|
56
|
-
function primaryActionEqual(
|
|
57
|
-
a: HeaderPrimaryAction | undefined,
|
|
58
|
-
b: HeaderPrimaryAction | undefined,
|
|
59
|
-
): boolean {
|
|
60
|
-
if (a === b) return true;
|
|
61
|
-
if (!a || !b) return false;
|
|
62
|
-
// `onPress` is a fresh closure each render — its identity never changes what
|
|
63
|
-
// the button renders, so compare only the render-affecting scalars.
|
|
64
|
-
return a.label === b.label && !!a.disabled === !!b.disabled && !!a.loading === !!b.loading;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function actionsEqual(a: HeaderAction[] | undefined, b: HeaderAction[] | undefined): boolean {
|
|
68
|
-
if (a === b) return true;
|
|
69
|
-
if (!a || !b || a.length !== b.length) return false;
|
|
70
|
-
for (let i = 0; i < a.length; i += 1) {
|
|
71
|
-
const x = a[i];
|
|
72
|
-
const y = b[i];
|
|
73
|
-
if (!x || !y) return false;
|
|
74
|
-
// `icon` is a node (identity); `onPress` is ignored, like `primaryAction`'s.
|
|
75
|
-
if (
|
|
76
|
-
x.accessibilityLabel !== y.accessibilityLabel ||
|
|
77
|
-
!!x.disabled !== !!y.disabled ||
|
|
78
|
-
x.icon !== y.icon
|
|
79
|
-
) {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return true;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function searchEqual(a: HeaderSearch | undefined, b: HeaderSearch | undefined): boolean {
|
|
87
|
-
if (a === b) return true;
|
|
88
|
-
if (!a || !b) return false;
|
|
89
|
-
return a.value === b.value && a.placeholder === b.placeholder;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function segmentsEqual(a: HeaderSegments | undefined, b: HeaderSegments | undefined): boolean {
|
|
93
|
-
if (a === b) return true;
|
|
94
|
-
if (!a || !b || a.value !== b.value || a.items.length !== b.items.length) return false;
|
|
95
|
-
for (let i = 0; i < a.items.length; i += 1) {
|
|
96
|
-
const x = a.items[i];
|
|
97
|
-
const y = b.items[i];
|
|
98
|
-
if (!x || !y || x.key !== y.key || x.label !== y.label) return false;
|
|
99
|
-
}
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function progressEqual(a: HeaderProgress | undefined, b: HeaderProgress | undefined): boolean {
|
|
104
|
-
if (a === b) return true;
|
|
105
|
-
if (!a || !b) return false;
|
|
106
|
-
return a.step === b.step && a.total === b.total;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
45
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* This MIRRORS Bloom's own `configsEqual` (`@oxyhq/bloom/dialog`), which guards
|
|
113
|
-
* the header store one layer down — deliberately field for field. The two must
|
|
114
|
-
* not diverge: this comparator is the gate that decides whether the host's
|
|
115
|
-
* `setContent` fires, so a comparator STRICTER than Bloom's re-introduces the
|
|
116
|
-
* update loop Bloom's own guard was written to prevent.
|
|
117
|
-
*
|
|
118
|
-
* Scalars (`title`/`subtitle`/`largeTitle`/`tone`) compare by value. The rich
|
|
119
|
-
* object fields (`primaryAction`/`actions`/`search`/`segments`/`progress`)
|
|
120
|
-
* compare by their render-affecting scalars, so a screen may build them inline:
|
|
121
|
-
* a fresh object with unchanged contents is NOT a change. Only the node fields
|
|
122
|
-
* (`titleContent`/`left`/`right`, and an action's `icon`) compare by identity —
|
|
123
|
-
* there is nothing else to compare a `ReactNode` by — so those, and only those,
|
|
124
|
-
* carry the memoize-me contract.
|
|
46
|
+
* Shallow value-equality for a surface's header contribution.
|
|
125
47
|
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
48
|
+
* Scalars (`title`/`subtitle`/`largeTitle`/`tone`) compare by value; the object
|
|
49
|
+
* and node fields (`titleContent`/`left`/`right`/`primaryAction`/`actions`/
|
|
50
|
+
* `search`/`segments`/`progress`) compare by identity — callers memoize them, per
|
|
51
|
+
* this hook's contract. Function-typed affordances compare by PRESENCE, never
|
|
52
|
+
* identity: `onBack` legitimately gets a fresh closure each render, and its
|
|
53
|
+
* identity never changes what the header renders, so it must not count as a
|
|
54
|
+
* change (that is exactly what would drive the update loop).
|
|
130
55
|
*/
|
|
131
56
|
function surfaceHeaderContentEqual(
|
|
132
57
|
a: SurfaceHeaderContent | null,
|
|
@@ -142,12 +67,12 @@ function surfaceHeaderContentEqual(
|
|
|
142
67
|
a.left === b.left &&
|
|
143
68
|
a.right === b.right &&
|
|
144
69
|
!!a.onBack === !!b.onBack &&
|
|
70
|
+
a.primaryAction === b.primaryAction &&
|
|
71
|
+
a.actions === b.actions &&
|
|
72
|
+
a.search === b.search &&
|
|
73
|
+
a.segments === b.segments &&
|
|
145
74
|
a.tone === b.tone &&
|
|
146
|
-
|
|
147
|
-
actionsEqual(a.actions, b.actions) &&
|
|
148
|
-
searchEqual(a.search, b.search) &&
|
|
149
|
-
segmentsEqual(a.segments, b.segments) &&
|
|
150
|
-
progressEqual(a.progress, b.progress)
|
|
75
|
+
a.progress === b.progress
|
|
151
76
|
);
|
|
152
77
|
}
|
|
153
78
|
|