@oxyhq/services 5.5.8 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -2
- package/lib/commonjs/core/index.js +69 -82
- package/lib/commonjs/core/index.js.map +1 -1
- package/lib/commonjs/index.js +24 -183
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/node/index.js +0 -2
- package/lib/commonjs/node/index.js.map +1 -1
- package/lib/commonjs/ui/components/FollowButton.js +100 -229
- package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
- package/lib/commonjs/ui/components/OxyPayButton.js +131 -0
- package/lib/commonjs/ui/components/OxyPayButton.js.map +1 -0
- package/lib/commonjs/ui/components/OxyProvider.js +41 -198
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/OxySignInButton.js +15 -2
- package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
- package/lib/commonjs/ui/components/icon/FAIRWalletIcon.js +66 -0
- package/lib/commonjs/ui/components/icon/FAIRWalletIcon.js.map +1 -0
- package/lib/commonjs/ui/components/icon/index.js +7 -0
- package/lib/commonjs/ui/components/icon/index.js.map +1 -1
- package/lib/commonjs/ui/components/index.js +7 -0
- package/lib/commonjs/ui/components/index.js.map +1 -1
- package/lib/commonjs/ui/components/internal/GroupedPillButtons.js +14 -7
- package/lib/commonjs/ui/components/internal/GroupedPillButtons.js.map +1 -1
- package/lib/commonjs/ui/components/internal/PinInput.js +108 -0
- package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -0
- package/lib/commonjs/ui/components/internal/TextField.js +20 -0
- package/lib/commonjs/ui/components/internal/TextField.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +26 -23
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/hooks/index.js +2 -15
- package/lib/commonjs/ui/hooks/index.js.map +1 -1
- package/lib/commonjs/ui/hooks/useFollow.js +52 -136
- package/lib/commonjs/ui/hooks/useFollow.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionSocket.js +52 -0
- package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -0
- package/lib/commonjs/ui/index.js +8 -191
- package/lib/commonjs/ui/index.js.map +1 -1
- package/lib/commonjs/ui/navigation/OxyRouter.js +52 -60
- package/lib/commonjs/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +18 -30
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +4 -22
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +6 -14
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +37 -66
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AppInfoScreen.js +21 -44
- package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FeedbackScreen.js +44 -23
- package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FileManagementScreen.js +59 -78
- package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +1588 -0
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +22 -36
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/RecoverAccountScreen.js +269 -0
- package/lib/commonjs/ui/screens/RecoverAccountScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/SessionManagementScreen.js +47 -69
- package/lib/commonjs/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SignInScreen.js +99 -333
- package/lib/commonjs/ui/screens/SignInScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SignUpScreen.js +136 -340
- package/lib/commonjs/ui/screens/SignUpScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js +192 -0
- package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js.map +1 -0
- package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js +135 -0
- package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js.map +1 -0
- package/lib/commonjs/ui/screens/internal/SignUpIdentityStep.js +108 -0
- package/lib/commonjs/ui/screens/internal/SignUpIdentityStep.js.map +1 -0
- package/lib/commonjs/ui/screens/internal/SignUpSecurityStep.js +126 -0
- package/lib/commonjs/ui/screens/internal/SignUpSecurityStep.js.map +1 -0
- package/lib/commonjs/ui/screens/internal/SignUpSummaryStep.js +84 -0
- package/lib/commonjs/ui/screens/internal/SignUpSummaryStep.js.map +1 -0
- package/lib/commonjs/ui/screens/internal/SignUpWelcomeStep.js +59 -0
- package/lib/commonjs/ui/screens/internal/SignUpWelcomeStep.js.map +1 -0
- package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +15 -2
- package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
- package/lib/commonjs/ui/stores/authStore.js +31 -0
- package/lib/commonjs/ui/stores/authStore.js.map +1 -0
- package/lib/commonjs/ui/stores/followStore.js +124 -0
- package/lib/commonjs/ui/stores/followStore.js.map +1 -0
- package/lib/commonjs/ui/styles/index.js +0 -11
- package/lib/commonjs/ui/styles/index.js.map +1 -1
- package/lib/commonjs/ui/utils/confirmAction.js +28 -0
- package/lib/commonjs/ui/utils/confirmAction.js.map +1 -0
- package/lib/module/core/index.js +69 -81
- package/lib/module/core/index.js.map +1 -1
- package/lib/module/index.js +14 -17
- package/lib/module/index.js.map +1 -1
- package/lib/module/node/index.js +0 -3
- package/lib/module/node/index.js.map +1 -1
- package/lib/module/ui/components/FollowButton.js +100 -229
- package/lib/module/ui/components/FollowButton.js.map +1 -1
- package/lib/module/ui/components/OxyPayButton.js +125 -0
- package/lib/module/ui/components/OxyPayButton.js.map +1 -0
- package/lib/module/ui/components/OxyProvider.js +42 -199
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/OxySignInButton.js +15 -2
- package/lib/module/ui/components/OxySignInButton.js.map +1 -1
- package/lib/module/ui/components/icon/FAIRWalletIcon.js +60 -0
- package/lib/module/ui/components/icon/FAIRWalletIcon.js.map +1 -0
- package/lib/module/ui/components/icon/index.js +1 -0
- package/lib/module/ui/components/icon/index.js.map +1 -1
- package/lib/module/ui/components/index.js +1 -0
- package/lib/module/ui/components/index.js.map +1 -1
- package/lib/module/ui/components/internal/GroupedPillButtons.js +15 -8
- package/lib/module/ui/components/internal/GroupedPillButtons.js.map +1 -1
- package/lib/module/ui/components/internal/PinInput.js +103 -0
- package/lib/module/ui/components/internal/PinInput.js.map +1 -0
- package/lib/module/ui/components/internal/TextField.js +20 -0
- package/lib/module/ui/components/internal/TextField.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +26 -23
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/hooks/index.js +1 -2
- package/lib/module/ui/hooks/index.js.map +1 -1
- package/lib/module/ui/hooks/useFollow.js +52 -137
- package/lib/module/ui/hooks/useFollow.js.map +1 -1
- package/lib/module/ui/hooks/useSessionSocket.js +47 -0
- package/lib/module/ui/hooks/useSessionSocket.js.map +1 -0
- package/lib/module/ui/index.js +2 -13
- package/lib/module/ui/index.js.map +1 -1
- package/lib/module/ui/navigation/OxyRouter.js +53 -61
- package/lib/module/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +6 -18
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js +5 -23
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +7 -15
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +38 -67
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/AppInfoScreen.js +22 -45
- package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/module/ui/screens/FeedbackScreen.js +44 -23
- package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/module/ui/screens/FileManagementScreen.js +59 -78
- package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/PaymentGatewayScreen.js +1583 -0
- package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -0
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js +23 -37
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/module/ui/screens/RecoverAccountScreen.js +263 -0
- package/lib/module/ui/screens/RecoverAccountScreen.js.map +1 -0
- package/lib/module/ui/screens/SessionManagementScreen.js +47 -69
- package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/SignInScreen.js +100 -334
- package/lib/module/ui/screens/SignInScreen.js.map +1 -1
- package/lib/module/ui/screens/SignUpScreen.js +137 -341
- package/lib/module/ui/screens/SignUpScreen.js.map +1 -1
- package/lib/module/ui/screens/internal/SignInPasswordStep.js +186 -0
- package/lib/module/ui/screens/internal/SignInPasswordStep.js.map +1 -0
- package/lib/module/ui/screens/internal/SignInUsernameStep.js +129 -0
- package/lib/module/ui/screens/internal/SignInUsernameStep.js.map +1 -0
- package/lib/module/ui/screens/internal/SignUpIdentityStep.js +102 -0
- package/lib/module/ui/screens/internal/SignUpIdentityStep.js.map +1 -0
- package/lib/module/ui/screens/internal/SignUpSecurityStep.js +120 -0
- package/lib/module/ui/screens/internal/SignUpSecurityStep.js.map +1 -0
- package/lib/module/ui/screens/internal/SignUpSummaryStep.js +79 -0
- package/lib/module/ui/screens/internal/SignUpSummaryStep.js.map +1 -0
- package/lib/module/ui/screens/internal/SignUpWelcomeStep.js +54 -0
- package/lib/module/ui/screens/internal/SignUpWelcomeStep.js.map +1 -0
- package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +16 -3
- package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
- package/lib/module/ui/stores/authStore.js +27 -0
- package/lib/module/ui/stores/authStore.js.map +1 -0
- package/lib/module/ui/stores/followStore.js +120 -0
- package/lib/module/ui/stores/followStore.js.map +1 -0
- package/lib/module/ui/styles/index.js +0 -1
- package/lib/module/ui/styles/index.js.map +1 -1
- package/lib/module/ui/utils/confirmAction.js +25 -0
- package/lib/module/ui/utils/confirmAction.js.map +1 -0
- package/lib/typescript/core/index.d.ts +28 -10
- package/lib/typescript/core/index.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +5 -4
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/models/secureSession.d.ts +0 -1
- package/lib/typescript/models/secureSession.d.ts.map +1 -1
- package/lib/typescript/node/index.d.ts +0 -1
- package/lib/typescript/node/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/FollowButton.d.ts +1 -77
- package/lib/typescript/ui/components/FollowButton.d.ts.map +1 -1
- package/lib/typescript/ui/components/OxyPayButton.d.ts +29 -0
- package/lib/typescript/ui/components/OxyPayButton.d.ts.map +1 -0
- package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/ui/components/OxySignInButton.d.ts.map +1 -1
- package/lib/typescript/ui/components/icon/FAIRWalletIcon.d.ts +8 -0
- package/lib/typescript/ui/components/icon/FAIRWalletIcon.d.ts.map +1 -0
- package/lib/typescript/ui/components/icon/index.d.ts +1 -0
- package/lib/typescript/ui/components/icon/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/index.d.ts +1 -0
- package/lib/typescript/ui/components/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/internal/GroupedPillButtons.d.ts.map +1 -1
- package/lib/typescript/ui/components/internal/PinInput.d.ts +12 -0
- package/lib/typescript/ui/components/internal/PinInput.d.ts.map +1 -0
- package/lib/typescript/ui/components/internal/TextField.d.ts +1 -0
- package/lib/typescript/ui/components/internal/TextField.d.ts.map +1 -1
- package/lib/typescript/ui/context/OxyContext.d.ts +0 -1
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/index.d.ts +1 -2
- package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useFollow.d.ts +14 -15
- package/lib/typescript/ui/hooks/useFollow.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSessionSocket.d.ts +11 -0
- package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -0
- package/lib/typescript/ui/index.d.ts +2 -5
- package/lib/typescript/ui/index.d.ts.map +1 -1
- package/lib/typescript/ui/navigation/OxyRouter.d.ts.map +1 -1
- package/lib/typescript/ui/navigation/types.d.ts +5 -23
- package/lib/typescript/ui/navigation/types.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountCenterScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AppInfoScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/FileManagementScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts +27 -0
- package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts.map +1 -0
- package/lib/typescript/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts +8 -0
- package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts.map +1 -0
- package/lib/typescript/ui/screens/SessionManagementScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SignInScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SignUpScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts +27 -0
- package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts.map +1 -0
- package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts +26 -0
- package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts.map +1 -0
- package/lib/typescript/ui/screens/internal/SignUpIdentityStep.d.ts +20 -0
- package/lib/typescript/ui/screens/internal/SignUpIdentityStep.d.ts.map +1 -0
- package/lib/typescript/ui/screens/internal/SignUpSecurityStep.d.ts +24 -0
- package/lib/typescript/ui/screens/internal/SignUpSecurityStep.d.ts.map +1 -0
- package/lib/typescript/ui/screens/internal/SignUpSummaryStep.d.ts +15 -0
- package/lib/typescript/ui/screens/internal/SignUpSummaryStep.d.ts.map +1 -0
- package/lib/typescript/ui/screens/internal/SignUpWelcomeStep.d.ts +13 -0
- package/lib/typescript/ui/screens/internal/SignUpWelcomeStep.d.ts.map +1 -0
- package/lib/typescript/ui/screens/karma/KarmaRewardsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts +14 -0
- package/lib/typescript/ui/stores/authStore.d.ts.map +1 -0
- package/lib/typescript/ui/stores/followStore.d.ts +15 -0
- package/lib/typescript/ui/stores/followStore.d.ts.map +1 -0
- package/lib/typescript/ui/styles/index.d.ts +0 -1
- package/lib/typescript/ui/styles/index.d.ts.map +1 -1
- package/lib/typescript/ui/utils/confirmAction.d.ts +7 -0
- package/lib/typescript/ui/utils/confirmAction.d.ts.map +1 -0
- package/package.json +12 -7
- package/src/core/index.ts +78 -88
- package/src/index.ts +8 -45
- package/src/models/secureSession.ts +1 -2
- package/src/node/index.ts +0 -3
- package/src/ui/components/FollowButton.tsx +100 -322
- package/src/ui/components/OxyPayButton.tsx +133 -0
- package/src/ui/components/OxyProvider.tsx +39 -201
- package/src/ui/components/OxySignInButton.tsx +13 -2
- package/src/ui/components/icon/FAIRWalletIcon.tsx +49 -0
- package/src/ui/components/icon/index.ts +1 -0
- package/src/ui/components/index.ts +1 -0
- package/src/ui/components/internal/GroupedPillButtons.tsx +12 -8
- package/src/ui/components/internal/PinInput.tsx +102 -0
- package/src/ui/components/internal/TextField.tsx +9 -0
- package/src/ui/context/OxyContext.tsx +26 -26
- package/src/ui/hooks/index.ts +1 -2
- package/src/ui/hooks/useFollow.ts +58 -129
- package/src/ui/hooks/useSessionSocket.ts +50 -0
- package/src/ui/index.ts +2 -37
- package/src/ui/navigation/OxyRouter.tsx +47 -63
- package/src/ui/navigation/types.ts +5 -26
- package/src/ui/screens/AccountCenterScreen.tsx +12 -21
- package/src/ui/screens/AccountOverviewScreen.tsx +6 -30
- package/src/ui/screens/AccountSettingsScreen.tsx +7 -22
- package/src/ui/screens/AccountSwitcherScreen.tsx +46 -88
- package/src/ui/screens/AppInfoScreen.tsx +27 -47
- package/src/ui/screens/FeedbackScreen.tsx +34 -19
- package/src/ui/screens/FileManagementScreen.tsx +293 -321
- package/src/ui/screens/PaymentGatewayScreen.tsx +1315 -0
- package/src/ui/screens/PremiumSubscriptionScreen.tsx +109 -124
- package/src/ui/screens/RecoverAccountScreen.tsx +260 -0
- package/src/ui/screens/SessionManagementScreen.tsx +65 -137
- package/src/ui/screens/SignInScreen.tsx +89 -283
- package/src/ui/screens/SignUpScreen.tsx +138 -291
- package/src/ui/screens/internal/SignInPasswordStep.tsx +179 -0
- package/src/ui/screens/internal/SignInUsernameStep.tsx +139 -0
- package/src/ui/screens/internal/SignUpIdentityStep.tsx +114 -0
- package/src/ui/screens/internal/SignUpSecurityStep.tsx +132 -0
- package/src/ui/screens/internal/SignUpSummaryStep.tsx +66 -0
- package/src/ui/screens/internal/SignUpWelcomeStep.tsx +52 -0
- package/src/ui/screens/karma/KarmaRewardsScreen.tsx +13 -3
- package/src/ui/stores/authStore.ts +24 -0
- package/src/ui/stores/followStore.ts +80 -0
- package/src/ui/styles/index.ts +0 -1
- package/src/ui/utils/confirmAction.ts +23 -0
- package/lib/commonjs/ui/components/bottomSheet/index.js +0 -37
- package/lib/commonjs/ui/components/bottomSheet/index.js.map +0 -1
- package/lib/commonjs/ui/hooks/useAuthFetch.js +0 -216
- package/lib/commonjs/ui/hooks/useAuthFetch.js.map +0 -1
- package/lib/commonjs/ui/hooks/useOxyFollow.js +0 -190
- package/lib/commonjs/ui/hooks/useOxyFollow.js.map +0 -1
- package/lib/commonjs/ui/screens/BillingManagementScreen.js +0 -636
- package/lib/commonjs/ui/screens/BillingManagementScreen.js.map +0 -1
- package/lib/commonjs/ui/store/index.js +0 -67
- package/lib/commonjs/ui/store/index.js.map +0 -1
- package/lib/commonjs/ui/store/setupOxyStore.js +0 -63
- package/lib/commonjs/ui/store/setupOxyStore.js.map +0 -1
- package/lib/commonjs/ui/store/slices/authSlice.js +0 -56
- package/lib/commonjs/ui/store/slices/authSlice.js.map +0 -1
- package/lib/commonjs/ui/store/slices/followSlice.js +0 -238
- package/lib/commonjs/ui/store/slices/followSlice.js.map +0 -1
- package/lib/commonjs/ui/store/slices/index.js +0 -129
- package/lib/commonjs/ui/store/slices/index.js.map +0 -1
- package/lib/commonjs/ui/store/slices/types.js +0 -19
- package/lib/commonjs/ui/store/slices/types.js.map +0 -1
- package/lib/commonjs/ui/styles/shadows.js +0 -123
- package/lib/commonjs/ui/styles/shadows.js.map +0 -1
- package/lib/commonjs/utils/polyfills.js +0 -42
- package/lib/commonjs/utils/polyfills.js.map +0 -1
- package/lib/module/ui/components/bottomSheet/index.js +0 -5
- package/lib/module/ui/components/bottomSheet/index.js.map +0 -1
- package/lib/module/ui/hooks/useAuthFetch.js +0 -211
- package/lib/module/ui/hooks/useAuthFetch.js.map +0 -1
- package/lib/module/ui/hooks/useOxyFollow.js +0 -186
- package/lib/module/ui/hooks/useOxyFollow.js.map +0 -1
- package/lib/module/ui/screens/BillingManagementScreen.js +0 -631
- package/lib/module/ui/screens/BillingManagementScreen.js.map +0 -1
- package/lib/module/ui/store/index.js +0 -33
- package/lib/module/ui/store/index.js.map +0 -1
- package/lib/module/ui/store/setupOxyStore.js +0 -59
- package/lib/module/ui/store/setupOxyStore.js.map +0 -1
- package/lib/module/ui/store/slices/authSlice.js +0 -48
- package/lib/module/ui/store/slices/authSlice.js.map +0 -1
- package/lib/module/ui/store/slices/followSlice.js +0 -232
- package/lib/module/ui/store/slices/followSlice.js.map +0 -1
- package/lib/module/ui/store/slices/index.js +0 -11
- package/lib/module/ui/store/slices/index.js.map +0 -1
- package/lib/module/ui/store/slices/types.js +0 -15
- package/lib/module/ui/store/slices/types.js.map +0 -1
- package/lib/module/ui/styles/shadows.js +0 -119
- package/lib/module/ui/styles/shadows.js.map +0 -1
- package/lib/module/utils/polyfills.js +0 -36
- package/lib/module/utils/polyfills.js.map +0 -1
- package/lib/typescript/types/react-redux.d.ts +0 -5
- package/lib/typescript/ui/components/bottomSheet/index.d.ts +0 -4
- package/lib/typescript/ui/components/bottomSheet/index.d.ts.map +0 -1
- package/lib/typescript/ui/hooks/useAuthFetch.d.ts +0 -34
- package/lib/typescript/ui/hooks/useAuthFetch.d.ts.map +0 -1
- package/lib/typescript/ui/hooks/useOxyFollow.d.ts +0 -81
- package/lib/typescript/ui/hooks/useOxyFollow.d.ts.map +0 -1
- package/lib/typescript/ui/screens/BillingManagementScreen.d.ts +0 -5
- package/lib/typescript/ui/screens/BillingManagementScreen.d.ts.map +0 -1
- package/lib/typescript/ui/store/index.d.ts +0 -27
- package/lib/typescript/ui/store/index.d.ts.map +0 -1
- package/lib/typescript/ui/store/setupOxyStore.d.ts +0 -29
- package/lib/typescript/ui/store/setupOxyStore.d.ts.map +0 -1
- package/lib/typescript/ui/store/slices/authSlice.d.ts +0 -32
- package/lib/typescript/ui/store/slices/authSlice.d.ts.map +0 -1
- package/lib/typescript/ui/store/slices/followSlice.d.ts +0 -120
- package/lib/typescript/ui/store/slices/followSlice.d.ts.map +0 -1
- package/lib/typescript/ui/store/slices/index.d.ts +0 -9
- package/lib/typescript/ui/store/slices/index.d.ts.map +0 -1
- package/lib/typescript/ui/store/slices/types.d.ts +0 -16
- package/lib/typescript/ui/store/slices/types.d.ts.map +0 -1
- package/lib/typescript/ui/styles/shadows.d.ts +0 -233
- package/lib/typescript/ui/styles/shadows.d.ts.map +0 -1
- package/lib/typescript/utils/polyfills.d.ts +0 -6
- package/lib/typescript/utils/polyfills.d.ts.map +0 -1
- package/src/__tests__/backend-middleware.test.ts +0 -209
- package/src/__tests__/polyfills.test.ts +0 -30
- package/src/__tests__/setup.ts +0 -43
- package/src/__tests__/ui/hooks/useAuthFetch.test.ts +0 -70
- package/src/__tests__/ui/hooks/useOxyFollow.test.tsx +0 -92
- package/src/__tests__/ui/screens/AccountSettingsScreen.test.tsx +0 -112
- package/src/__tests__/ui/store/setupOxyStore.test.ts +0 -50
- package/src/__tests__/validate-structure.js +0 -91
- package/src/__tests__/validation.js +0 -42
- package/src/types/react-redux.d.ts +0 -5
- package/src/ui/components/bottomSheet/index.tsx +0 -14
- package/src/ui/hooks/useAuthFetch.ts +0 -238
- package/src/ui/hooks/useOxyFollow.ts +0 -188
- package/src/ui/screens/BillingManagementScreen.tsx +0 -589
- package/src/ui/store/index.ts +0 -36
- package/src/ui/store/setupOxyStore.ts +0 -58
- package/src/ui/store/slices/authSlice.ts +0 -43
- package/src/ui/store/slices/followSlice.ts +0 -207
- package/src/ui/store/slices/index.ts +0 -31
- package/src/ui/store/slices/types.ts +0 -33
- package/src/ui/styles/shadows.ts +0 -112
- package/src/utils/polyfills.ts +0 -34
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration test for refactored authentication system
|
|
3
|
-
* Tests the backend middleware functionality
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { OxyServices } from '../../core';
|
|
7
|
-
|
|
8
|
-
describe('Authentication System Integration', () => {
|
|
9
|
-
let oxyServices: OxyServices;
|
|
10
|
-
let mockReq: any;
|
|
11
|
-
let mockRes: any;
|
|
12
|
-
let mockNext: any;
|
|
13
|
-
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
oxyServices = new OxyServices({
|
|
16
|
-
baseURL: 'https://api.test.com'
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
// Mock Express request/response objects
|
|
20
|
-
mockReq = {
|
|
21
|
-
headers: {},
|
|
22
|
-
user: undefined,
|
|
23
|
-
userId: undefined,
|
|
24
|
-
accessToken: undefined
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
mockRes = {
|
|
28
|
-
status: jest.fn().mockReturnThis(),
|
|
29
|
-
json: jest.fn().mockReturnThis()
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
mockNext = jest.fn();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
describe('Middleware Creation', () => {
|
|
36
|
-
test('should create authentication middleware', () => {
|
|
37
|
-
const middleware = oxyServices.createAuthenticateTokenMiddleware();
|
|
38
|
-
expect(typeof middleware).toBe('function');
|
|
39
|
-
expect(middleware.length).toBe(3); // req, res, next
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test('should create middleware with custom options', () => {
|
|
43
|
-
const customErrorHandler = jest.fn();
|
|
44
|
-
const middleware = oxyServices.createAuthenticateTokenMiddleware({
|
|
45
|
-
loadFullUser: false,
|
|
46
|
-
onError: customErrorHandler
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
expect(typeof middleware).toBe('function');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe('Token Validation', () => {
|
|
54
|
-
test('should handle missing token', async () => {
|
|
55
|
-
const middleware = oxyServices.createAuthenticateTokenMiddleware();
|
|
56
|
-
|
|
57
|
-
await middleware(mockReq, mockRes, mockNext);
|
|
58
|
-
|
|
59
|
-
expect(mockRes.status).toHaveBeenCalledWith(401);
|
|
60
|
-
expect(mockRes.json).toHaveBeenCalledWith({
|
|
61
|
-
message: 'Access token required',
|
|
62
|
-
code: 'MISSING_TOKEN'
|
|
63
|
-
});
|
|
64
|
-
expect(mockNext).not.toHaveBeenCalled();
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
test('should handle invalid token format', async () => {
|
|
68
|
-
mockReq.headers.authorization = 'InvalidFormat token123';
|
|
69
|
-
|
|
70
|
-
const middleware = oxyServices.createAuthenticateTokenMiddleware();
|
|
71
|
-
await middleware(mockReq, mockRes, mockNext);
|
|
72
|
-
|
|
73
|
-
expect(mockRes.status).toHaveBeenCalledWith(401);
|
|
74
|
-
expect(mockNext).not.toHaveBeenCalled();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test('should extract token from Bearer header', async () => {
|
|
78
|
-
mockReq.headers.authorization = 'Bearer valid.jwt.token';
|
|
79
|
-
|
|
80
|
-
const middleware = oxyServices.createAuthenticateTokenMiddleware();
|
|
81
|
-
await middleware(mockReq, mockRes, mockNext);
|
|
82
|
-
|
|
83
|
-
// Note: This will fail validation since it's not a real token,
|
|
84
|
-
// but we can verify the token was extracted
|
|
85
|
-
expect(mockRes.status).toHaveBeenCalled();
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
describe('Standalone Token Validation', () => {
|
|
90
|
-
test('should validate empty token', async () => {
|
|
91
|
-
const result = await oxyServices.authenticateToken('');
|
|
92
|
-
|
|
93
|
-
expect(result.valid).toBe(false);
|
|
94
|
-
expect(result.error).toBe('Token is required');
|
|
95
|
-
expect(result.userId).toBeUndefined();
|
|
96
|
-
expect(result.user).toBeUndefined();
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test('should validate invalid token', async () => {
|
|
100
|
-
const result = await oxyServices.authenticateToken('invalid.jwt.token');
|
|
101
|
-
|
|
102
|
-
expect(result.valid).toBe(false);
|
|
103
|
-
expect(result.error).toBeTruthy();
|
|
104
|
-
expect(result.userId).toBeUndefined();
|
|
105
|
-
expect(result.user).toBeUndefined();
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
test('should handle validation errors gracefully', async () => {
|
|
109
|
-
const result = await oxyServices.authenticateToken('malformed-token');
|
|
110
|
-
|
|
111
|
-
expect(result.valid).toBe(false);
|
|
112
|
-
expect(result.error).toMatch(/validation failed|Invalid/i);
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
describe('Custom Error Handling', () => {
|
|
117
|
-
test('should use custom error handler when provided', async () => {
|
|
118
|
-
const customErrorHandler = jest.fn();
|
|
119
|
-
const middleware = oxyServices.createAuthenticateTokenMiddleware({
|
|
120
|
-
onError: customErrorHandler
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
await middleware(mockReq, mockRes, mockNext);
|
|
124
|
-
|
|
125
|
-
expect(customErrorHandler).toHaveBeenCalledWith({
|
|
126
|
-
message: 'Access token required',
|
|
127
|
-
code: 'MISSING_TOKEN',
|
|
128
|
-
status: 401
|
|
129
|
-
});
|
|
130
|
-
expect(mockRes.status).not.toHaveBeenCalled();
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
describe('Backend Integration Example', () => {
|
|
135
|
-
test('should work with Express.js route patterns', () => {
|
|
136
|
-
// Simulate Express.js app setup
|
|
137
|
-
const mockApp = {
|
|
138
|
-
get: jest.fn(),
|
|
139
|
-
post: jest.fn(),
|
|
140
|
-
use: jest.fn()
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
// Create middleware
|
|
144
|
-
const authenticateToken = oxyServices.createAuthenticateTokenMiddleware({
|
|
145
|
-
loadFullUser: true
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
// Simulate route registration
|
|
149
|
-
mockApp.get('/api/protected', authenticateToken, (req: any, res: any) => {
|
|
150
|
-
res.json({
|
|
151
|
-
message: 'Access granted',
|
|
152
|
-
user: req.user,
|
|
153
|
-
userId: req.userId
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
expect(mockApp.get).toHaveBeenCalledWith(
|
|
158
|
-
'/api/protected',
|
|
159
|
-
authenticateToken,
|
|
160
|
-
expect.any(Function)
|
|
161
|
-
);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
test('should provide consistent interface for different auth patterns', () => {
|
|
165
|
-
// Pattern 1: Middleware
|
|
166
|
-
const middleware = oxyServices.createAuthenticateTokenMiddleware();
|
|
167
|
-
expect(typeof middleware).toBe('function');
|
|
168
|
-
|
|
169
|
-
// Pattern 2: Standalone validation
|
|
170
|
-
const validateToken = oxyServices.authenticateToken.bind(oxyServices);
|
|
171
|
-
expect(typeof validateToken).toBe('function');
|
|
172
|
-
|
|
173
|
-
// Pattern 3: Direct service methods
|
|
174
|
-
expect(typeof oxyServices.getAccessToken).toBe('function');
|
|
175
|
-
expect(typeof oxyServices.setTokens).toBe('function');
|
|
176
|
-
expect(typeof oxyServices.clearTokens).toBe('function');
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
describe('Zero-Config Setup Verification', () => {
|
|
181
|
-
test('should work with minimal configuration', () => {
|
|
182
|
-
// This simulates the zero-config setup promise
|
|
183
|
-
const minimalSetup = () => {
|
|
184
|
-
// Backend: Just create OxyServices and use middleware
|
|
185
|
-
const services = new OxyServices({ baseURL: 'https://api.example.com' });
|
|
186
|
-
const authMiddleware = services.createAuthenticateTokenMiddleware();
|
|
187
|
-
|
|
188
|
-
return { services, authMiddleware };
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
const { services, authMiddleware } = minimalSetup();
|
|
192
|
-
|
|
193
|
-
expect(services).toBeInstanceOf(OxyServices);
|
|
194
|
-
expect(typeof authMiddleware).toBe('function');
|
|
195
|
-
expect(services.getBaseURL()).toBe('https://api.example.com');
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
test('should support runtime configuration changes', () => {
|
|
199
|
-
const services = new OxyServices({ baseURL: 'https://dev-api.com' });
|
|
200
|
-
|
|
201
|
-
expect(services.getBaseURL()).toBe('https://dev-api.com');
|
|
202
|
-
|
|
203
|
-
// Simulate runtime change to production
|
|
204
|
-
services.setBaseURL('https://prod-api.com');
|
|
205
|
-
|
|
206
|
-
expect(services.getBaseURL()).toBe('https://prod-api.com');
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
});
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test file to verify FormData polyfill functionality
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { getFormDataConstructor } from '../utils/polyfills';
|
|
6
|
-
|
|
7
|
-
describe('FormData Polyfill Tests', () => {
|
|
8
|
-
it('should provide FormData constructor', () => {
|
|
9
|
-
const FormDataConstructor = getFormDataConstructor();
|
|
10
|
-
expect(FormDataConstructor).toBeDefined();
|
|
11
|
-
expect(typeof FormDataConstructor).toBe('function');
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('should create FormData instance successfully', () => {
|
|
15
|
-
const FormDataConstructor = getFormDataConstructor();
|
|
16
|
-
const formData = new FormDataConstructor();
|
|
17
|
-
expect(formData).toBeDefined();
|
|
18
|
-
expect(typeof formData.append).toBe('function');
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('should handle form data append operations', () => {
|
|
22
|
-
const FormDataConstructor = getFormDataConstructor();
|
|
23
|
-
const formData = new FormDataConstructor();
|
|
24
|
-
|
|
25
|
-
// Should not throw
|
|
26
|
-
expect(() => {
|
|
27
|
-
formData.append('test', 'value');
|
|
28
|
-
}).not.toThrow();
|
|
29
|
-
});
|
|
30
|
-
});
|
package/src/__tests__/setup.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import '@testing-library/jest-dom';
|
|
2
|
-
|
|
3
|
-
// Mock React Native APIs
|
|
4
|
-
global.jest = require('jest');
|
|
5
|
-
|
|
6
|
-
// Mock Dimensions
|
|
7
|
-
jest.mock('react-native', () => {
|
|
8
|
-
const RN = jest.requireActual('react-native');
|
|
9
|
-
return {
|
|
10
|
-
...RN,
|
|
11
|
-
Dimensions: {
|
|
12
|
-
get: jest.fn().mockReturnValue({ width: 375, height: 800 }),
|
|
13
|
-
},
|
|
14
|
-
Platform: {
|
|
15
|
-
OS: 'web',
|
|
16
|
-
select: (options: any) => options.web || options.default,
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
// Mock AsyncStorage
|
|
22
|
-
jest.mock('@react-native-async-storage/async-storage', () =>
|
|
23
|
-
require('@react-native-async-storage/async-storage/jest/async-storage-mock')
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
// Mock react-native-gesture-handler
|
|
27
|
-
jest.mock('react-native-gesture-handler', () => {
|
|
28
|
-
const View = require('react-native').View;
|
|
29
|
-
return {
|
|
30
|
-
ScrollView: View,
|
|
31
|
-
PanGestureHandler: View,
|
|
32
|
-
TapGestureHandler: View,
|
|
33
|
-
FlingGestureHandler: View,
|
|
34
|
-
PinchGestureHandler: View,
|
|
35
|
-
RotationGestureHandler: View,
|
|
36
|
-
State: {},
|
|
37
|
-
PanResponder: {
|
|
38
|
-
create: jest.fn(() => ({
|
|
39
|
-
panHandlers: {},
|
|
40
|
-
})),
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
});
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for refactored useAuthFetch hook
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { OxyServices } from '../../../core';
|
|
6
|
-
|
|
7
|
-
describe('useAuthFetch', () => {
|
|
8
|
-
let oxyServices: OxyServices;
|
|
9
|
-
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
oxyServices = new OxyServices({
|
|
12
|
-
baseURL: 'https://api.test.com'
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
describe('OxyServices integration', () => {
|
|
17
|
-
test('should set and get base URL', () => {
|
|
18
|
-
expect(oxyServices.getBaseURL()).toBe('https://api.test.com');
|
|
19
|
-
|
|
20
|
-
oxyServices.setBaseURL('https://new-api.test.com');
|
|
21
|
-
expect(oxyServices.getBaseURL()).toBe('https://new-api.test.com');
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
test('should throw error for empty base URL', () => {
|
|
25
|
-
expect(() => oxyServices.setBaseURL('')).toThrow('Base URL cannot be empty');
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
test('should handle token validation methods', () => {
|
|
29
|
-
// Test that core methods exist
|
|
30
|
-
expect(typeof oxyServices.getAccessToken).toBe('function');
|
|
31
|
-
expect(typeof oxyServices.setTokens).toBe('function');
|
|
32
|
-
expect(typeof oxyServices.clearTokens).toBe('function');
|
|
33
|
-
expect(typeof oxyServices.refreshTokens).toBe('function');
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
describe('URL resolution', () => {
|
|
38
|
-
test('should resolve relative URLs correctly', () => {
|
|
39
|
-
// This tests the logic that would be used in resolveURL function
|
|
40
|
-
const baseURL = 'https://api.test.com';
|
|
41
|
-
|
|
42
|
-
// Test relative URL with leading slash
|
|
43
|
-
const relativeUrl = '/api/users';
|
|
44
|
-
const expectedUrl = `${baseURL}${relativeUrl}`;
|
|
45
|
-
expect(expectedUrl).toBe('https://api.test.com/api/users');
|
|
46
|
-
|
|
47
|
-
// Test relative URL without leading slash
|
|
48
|
-
const relativeUrl2 = 'api/users';
|
|
49
|
-
const expectedUrl2 = `${baseURL}/${relativeUrl2}`;
|
|
50
|
-
expect(expectedUrl2).toBe('https://api.test.com/api/users');
|
|
51
|
-
|
|
52
|
-
// Test absolute URL (should remain unchanged)
|
|
53
|
-
const absoluteUrl = 'https://other-api.test.com/api/users';
|
|
54
|
-
expect(absoluteUrl).toBe('https://other-api.test.com/api/users');
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe('Authentication middleware compatibility', () => {
|
|
59
|
-
test('should create middleware function', () => {
|
|
60
|
-
const middleware = oxyServices.createAuthenticateTokenMiddleware();
|
|
61
|
-
expect(typeof middleware).toBe('function');
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test('should validate tokens', async () => {
|
|
65
|
-
const result = await oxyServices.authenticateToken('invalid-token');
|
|
66
|
-
expect(result.valid).toBe(false);
|
|
67
|
-
expect(result.error).toBeTruthy();
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
});
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { renderHook } from '@testing-library/react-native';
|
|
2
|
-
import { Provider } from 'react-redux';
|
|
3
|
-
import { configureStore } from '@reduxjs/toolkit';
|
|
4
|
-
import { useOxyFollow } from '../../../ui/hooks/useOxyFollow';
|
|
5
|
-
import { setupOxyStore } from '../../../ui/store/setupOxyStore';
|
|
6
|
-
import { OxyContextProvider } from '../../../ui/context/OxyContext';
|
|
7
|
-
import React from 'react';
|
|
8
|
-
|
|
9
|
-
// Mock OxyServices
|
|
10
|
-
const mockOxyServices = {
|
|
11
|
-
getFollowStatus: jest.fn(),
|
|
12
|
-
followUser: jest.fn(),
|
|
13
|
-
unfollowUser: jest.fn(),
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const createTestStore = () => {
|
|
17
|
-
return configureStore({
|
|
18
|
-
reducer: {
|
|
19
|
-
...setupOxyStore(),
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const createWrapper = (store: ReturnType<typeof createTestStore>) => {
|
|
25
|
-
return ({ children }: { children: React.ReactNode }) => (
|
|
26
|
-
<Provider store={store}>
|
|
27
|
-
<OxyContextProvider oxyServices={mockOxyServices}>
|
|
28
|
-
{children}
|
|
29
|
-
</OxyContextProvider>
|
|
30
|
-
</Provider>
|
|
31
|
-
);
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
describe('useOxyFollow', () => {
|
|
35
|
-
beforeEach(() => {
|
|
36
|
-
jest.clearAllMocks();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test('should work with external store containing Oxy reducers', () => {
|
|
40
|
-
const store = createTestStore();
|
|
41
|
-
const wrapper = createWrapper(store);
|
|
42
|
-
|
|
43
|
-
const { result } = renderHook(() => useOxyFollow('user1'), { wrapper });
|
|
44
|
-
|
|
45
|
-
expect(result.current).toHaveProperty('isFollowing');
|
|
46
|
-
expect(result.current).toHaveProperty('isLoading');
|
|
47
|
-
expect(result.current).toHaveProperty('error');
|
|
48
|
-
expect(result.current).toHaveProperty('toggleFollow');
|
|
49
|
-
expect(result.current).toHaveProperty('setFollowStatus');
|
|
50
|
-
expect(result.current).toHaveProperty('fetchStatus');
|
|
51
|
-
expect(result.current).toHaveProperty('clearError');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test('should support multiple users mode', () => {
|
|
55
|
-
const store = createTestStore();
|
|
56
|
-
const wrapper = createWrapper(store);
|
|
57
|
-
|
|
58
|
-
const { result } = renderHook(() => useOxyFollow(['user1', 'user2']), { wrapper });
|
|
59
|
-
|
|
60
|
-
expect(result.current).toHaveProperty('followData');
|
|
61
|
-
expect(result.current).toHaveProperty('toggleFollowForUser');
|
|
62
|
-
expect(result.current).toHaveProperty('setFollowStatusForUser');
|
|
63
|
-
expect(result.current).toHaveProperty('fetchStatusForUser');
|
|
64
|
-
expect(result.current).toHaveProperty('fetchAllStatuses');
|
|
65
|
-
expect(result.current).toHaveProperty('clearErrorForUser');
|
|
66
|
-
expect(result.current).toHaveProperty('isAnyLoading');
|
|
67
|
-
expect(result.current).toHaveProperty('hasAnyError');
|
|
68
|
-
expect(result.current).toHaveProperty('allFollowing');
|
|
69
|
-
expect(result.current).toHaveProperty('allNotFollowing');
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test('should integrate with custom app reducers', () => {
|
|
73
|
-
const store = configureStore({
|
|
74
|
-
reducer: {
|
|
75
|
-
...setupOxyStore(),
|
|
76
|
-
customApp: (state = { feature: 'enabled' }) => state,
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
const wrapper = createWrapper(store);
|
|
81
|
-
|
|
82
|
-
const { result } = renderHook(() => useOxyFollow('user1'), { wrapper });
|
|
83
|
-
|
|
84
|
-
// Should still work with Oxy features
|
|
85
|
-
expect(result.current.isFollowing).toBe(false);
|
|
86
|
-
expect(result.current.isLoading).toBe(false);
|
|
87
|
-
|
|
88
|
-
// Custom app state should also be accessible in the store
|
|
89
|
-
const state = store.getState();
|
|
90
|
-
expect(state.customApp.feature).toBe('enabled');
|
|
91
|
-
});
|
|
92
|
-
});
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { render, fireEvent, waitFor } from '@testing-library/react-native';
|
|
3
|
-
import AccountSettingsScreen from '../../../ui/screens/AccountSettingsScreen';
|
|
4
|
-
import { OxyContextProvider } from '../../../ui/context/OxyContext';
|
|
5
|
-
import { OxyServices } from '../../../core';
|
|
6
|
-
|
|
7
|
-
// Mock the OxyContext
|
|
8
|
-
jest.mock('../../../ui/context/OxyContext', () => ({
|
|
9
|
-
useOxy: jest.fn(() => ({
|
|
10
|
-
user: {
|
|
11
|
-
id: '123',
|
|
12
|
-
username: 'testuser',
|
|
13
|
-
email: 'test@example.com',
|
|
14
|
-
bio: 'Test bio',
|
|
15
|
-
avatar: { url: 'https://example.com/avatar.jpg' }
|
|
16
|
-
},
|
|
17
|
-
oxyServices: {
|
|
18
|
-
updateProfile: jest.fn(() => Promise.resolve({
|
|
19
|
-
id: '123',
|
|
20
|
-
username: 'testuser',
|
|
21
|
-
email: 'test@example.com'
|
|
22
|
-
}))
|
|
23
|
-
},
|
|
24
|
-
isLoading: false
|
|
25
|
-
})),
|
|
26
|
-
OxyContextProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>
|
|
27
|
-
}));
|
|
28
|
-
|
|
29
|
-
// Mock the Avatar component
|
|
30
|
-
jest.mock('../../../ui/components/Avatar', () => 'Avatar');
|
|
31
|
-
|
|
32
|
-
describe('AccountSettingsScreen', () => {
|
|
33
|
-
const mockOxyServices = {
|
|
34
|
-
updateProfile: jest.fn(() => Promise.resolve({
|
|
35
|
-
id: '123',
|
|
36
|
-
username: 'testuser',
|
|
37
|
-
email: 'test@example.com'
|
|
38
|
-
}))
|
|
39
|
-
} as unknown as OxyServices;
|
|
40
|
-
|
|
41
|
-
const defaultProps = {
|
|
42
|
-
goBack: jest.fn(),
|
|
43
|
-
theme: 'light' as const,
|
|
44
|
-
navigate: jest.fn(),
|
|
45
|
-
oxyServices: mockOxyServices,
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
it('renders correctly with default props', () => {
|
|
49
|
-
const { getByText, getByTestId } = render(
|
|
50
|
-
<AccountSettingsScreen {...defaultProps} />
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
// Check if the screen title is rendered
|
|
54
|
-
expect(getByText('Account Settings')).toBeTruthy();
|
|
55
|
-
|
|
56
|
-
// Check if profile form is rendered by default
|
|
57
|
-
expect(getByTestId('username-input')).toBeTruthy();
|
|
58
|
-
expect(getByTestId('email-input')).toBeTruthy();
|
|
59
|
-
expect(getByTestId('bio-input')).toBeTruthy();
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('switches between tabs correctly', async () => {
|
|
63
|
-
const { getByText, queryByTestId } = render(
|
|
64
|
-
<AccountSettingsScreen {...defaultProps} />
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
// Initially on profile tab
|
|
68
|
-
expect(queryByTestId('username-input')).toBeTruthy();
|
|
69
|
-
|
|
70
|
-
// Switch to password tab
|
|
71
|
-
fireEvent.press(getByText('Password'));
|
|
72
|
-
expect(queryByTestId('current-password-input')).toBeTruthy();
|
|
73
|
-
expect(queryByTestId('username-input')).toBeFalsy();
|
|
74
|
-
|
|
75
|
-
// Switch to notifications tab
|
|
76
|
-
fireEvent.press(getByText('Notifications'));
|
|
77
|
-
expect(queryByTestId('email-notifications-switch')).toBeTruthy();
|
|
78
|
-
expect(queryByTestId('current-password-input')).toBeFalsy();
|
|
79
|
-
|
|
80
|
-
// Switch back to profile tab
|
|
81
|
-
fireEvent.press(getByText('Profile'));
|
|
82
|
-
expect(queryByTestId('username-input')).toBeTruthy();
|
|
83
|
-
expect(queryByTestId('email-notifications-switch')).toBeFalsy();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('validates profile form inputs', async () => {
|
|
87
|
-
const { getByText, getByTestId } = render(
|
|
88
|
-
<AccountSettingsScreen {...defaultProps} />
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
// Clear username (which is required)
|
|
92
|
-
fireEvent.changeText(getByTestId('username-input'), '');
|
|
93
|
-
|
|
94
|
-
// Try to save with empty username
|
|
95
|
-
fireEvent.press(getByTestId('save-profile-button'));
|
|
96
|
-
|
|
97
|
-
// Should display error message
|
|
98
|
-
await waitFor(() => {
|
|
99
|
-
expect(getByText('Username is required')).toBeTruthy();
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('opens with the specified activeTab', () => {
|
|
104
|
-
const { queryByTestId } = render(
|
|
105
|
-
<AccountSettingsScreen {...defaultProps} activeTab="password" />
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
// Should be on password tab
|
|
109
|
-
expect(queryByTestId('current-password-input')).toBeTruthy();
|
|
110
|
-
expect(queryByTestId('username-input')).toBeFalsy();
|
|
111
|
-
});
|
|
112
|
-
});
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { configureStore } from '@reduxjs/toolkit';
|
|
2
|
-
import { setupOxyStore, oxyReducers } from '../../../ui/store/setupOxyStore';
|
|
3
|
-
import { authSlice, followSlice } from '../../../ui/store/slices';
|
|
4
|
-
|
|
5
|
-
describe('setupOxyStore', () => {
|
|
6
|
-
test('should return all Oxy reducers', () => {
|
|
7
|
-
const reducers = setupOxyStore();
|
|
8
|
-
|
|
9
|
-
expect(reducers).toHaveProperty('auth');
|
|
10
|
-
expect(reducers).toHaveProperty('follow');
|
|
11
|
-
expect(reducers.auth).toBe(authSlice.reducer);
|
|
12
|
-
expect(reducers.follow).toBe(followSlice.reducer);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test('should work with configureStore', () => {
|
|
16
|
-
const store = configureStore({
|
|
17
|
-
reducer: {
|
|
18
|
-
...setupOxyStore(),
|
|
19
|
-
customReducer: (state = { test: true }) => state,
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const state = store.getState();
|
|
24
|
-
expect(state).toHaveProperty('auth');
|
|
25
|
-
expect(state).toHaveProperty('follow');
|
|
26
|
-
expect(state).toHaveProperty('customReducer');
|
|
27
|
-
expect(state.customReducer.test).toBe(true);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test('should support tree-shaking with pick method', () => {
|
|
31
|
-
const authOnly = setupOxyStore.pick('auth');
|
|
32
|
-
expect(authOnly).toHaveProperty('auth');
|
|
33
|
-
expect(authOnly).not.toHaveProperty('follow');
|
|
34
|
-
|
|
35
|
-
const followOnly = setupOxyStore.pick('follow');
|
|
36
|
-
expect(followOnly).toHaveProperty('follow');
|
|
37
|
-
expect(followOnly).not.toHaveProperty('auth');
|
|
38
|
-
|
|
39
|
-
const both = setupOxyStore.pick('auth', 'follow');
|
|
40
|
-
expect(both).toHaveProperty('auth');
|
|
41
|
-
expect(both).toHaveProperty('follow');
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test('should export individual reducers', () => {
|
|
45
|
-
expect(oxyReducers).toHaveProperty('auth');
|
|
46
|
-
expect(oxyReducers).toHaveProperty('follow');
|
|
47
|
-
expect(oxyReducers.auth).toBe(authSlice.reducer);
|
|
48
|
-
expect(oxyReducers.follow).toBe(followSlice.reducer);
|
|
49
|
-
});
|
|
50
|
-
});
|