@oxy.so/services 13.6.0 → 13.8.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/android/build.gradle +1 -0
- package/android/src/main/java/so/oxy/assets/OxyAssetFilesModule.kt +49 -0
- package/android/src/main/java/so/oxy/assets/StreamSha256.kt +23 -0
- package/android/src/test/java/so/oxy/assets/StreamSha256Test.kt +45 -0
- package/expo-module.config.json +3 -2
- package/ios/OxyAssetFilesModule.swift +72 -0
- package/lib/commonjs/ui/components/AccountLanguageBoundary.js +35 -0
- package/lib/commonjs/ui/components/AccountLanguageBoundary.js.map +1 -0
- package/lib/commonjs/ui/components/LanguageBridge.js +37 -34
- package/lib/commonjs/ui/components/LanguageBridge.js.map +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +19 -26
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/signIn/OxySignUpPanel.js +8 -2
- package/lib/commonjs/ui/components/signIn/OxySignUpPanel.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +23 -2
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/hooks/useEntryLink.js +97 -0
- package/lib/commonjs/ui/hooks/useEntryLink.js.map +1 -0
- package/lib/commonjs/ui/hooks/useLanguageManagement.js +45 -14
- package/lib/commonjs/ui/hooks/useLanguageManagement.js.map +1 -1
- package/lib/commonjs/ui/utils/entryLink.js +54 -0
- package/lib/commonjs/ui/utils/entryLink.js.map +1 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.js +11 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.js.map +1 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.macos.js +11 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.macos.js.map +1 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.native.js +202 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.native.js.map +1 -0
- package/lib/module/ui/components/AccountLanguageBoundary.js +32 -0
- package/lib/module/ui/components/AccountLanguageBoundary.js.map +1 -0
- package/lib/module/ui/components/LanguageBridge.js +38 -35
- package/lib/module/ui/components/LanguageBridge.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +18 -27
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/signIn/OxySignUpPanel.js +8 -2
- package/lib/module/ui/components/signIn/OxySignUpPanel.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +24 -3
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/hooks/useEntryLink.js +94 -0
- package/lib/module/ui/hooks/useEntryLink.js.map +1 -0
- package/lib/module/ui/hooks/useLanguageManagement.js +45 -14
- package/lib/module/ui/hooks/useLanguageManagement.js.map +1 -1
- package/lib/module/ui/utils/entryLink.js +49 -0
- package/lib/module/ui/utils/entryLink.js.map +1 -0
- package/lib/module/ui/utils/nativeAssetFiles.js +7 -0
- package/lib/module/ui/utils/nativeAssetFiles.js.map +1 -0
- package/lib/module/ui/utils/nativeAssetFiles.macos.js +7 -0
- package/lib/module/ui/utils/nativeAssetFiles.macos.js.map +1 -0
- package/lib/module/ui/utils/nativeAssetFiles.native.js +197 -0
- package/lib/module/ui/utils/nativeAssetFiles.native.js.map +1 -0
- package/lib/typescript/commonjs/ui/components/AccountLanguageBoundary.d.ts +8 -0
- package/lib/typescript/commonjs/ui/components/AccountLanguageBoundary.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/LanguageBridge.d.ts +7 -17
- package/lib/typescript/commonjs/ui/components/LanguageBridge.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/signIn/OxySignUpPanel.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +5 -0
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useEntryLink.d.ts +15 -0
- package/lib/typescript/commonjs/ui/hooks/useEntryLink.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hooks/useLanguageManagement.d.ts +5 -1
- package/lib/typescript/commonjs/ui/hooks/useLanguageManagement.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/types/navigation.d.ts +4 -0
- package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/entryLink.d.ts +8 -0
- package/lib/typescript/commonjs/ui/utils/entryLink.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.d.ts +4 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.macos.d.ts +4 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.macos.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.native.d.ts +4 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.native.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/AccountLanguageBoundary.d.ts +8 -0
- package/lib/typescript/module/ui/components/AccountLanguageBoundary.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/LanguageBridge.d.ts +7 -17
- package/lib/typescript/module/ui/components/LanguageBridge.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/signIn/OxySignUpPanel.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +5 -0
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useEntryLink.d.ts +15 -0
- package/lib/typescript/module/ui/hooks/useEntryLink.d.ts.map +1 -0
- package/lib/typescript/module/ui/hooks/useLanguageManagement.d.ts +5 -1
- package/lib/typescript/module/ui/hooks/useLanguageManagement.d.ts.map +1 -1
- package/lib/typescript/module/ui/types/navigation.d.ts +4 -0
- package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/entryLink.d.ts +8 -0
- package/lib/typescript/module/ui/utils/entryLink.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.d.ts +4 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.macos.d.ts +4 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.macos.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.native.d.ts +4 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.native.d.ts.map +1 -0
- package/package.json +6 -5
- package/src/ui/components/AccountLanguageBoundary.tsx +35 -0
- package/src/ui/components/LanguageBridge.tsx +43 -39
- package/src/ui/components/OxyProvider.tsx +18 -24
- package/src/ui/components/__tests__/AccountLanguageBoundary.test.tsx +87 -0
- package/src/ui/components/__tests__/LanguageBridge.test.tsx +80 -60
- package/src/ui/components/signIn/OxySignUpPanel.tsx +9 -1
- package/src/ui/context/OxyContext.tsx +34 -2
- package/src/ui/context/oxyContextTypes.ts +5 -0
- package/src/ui/hooks/useEntryLink.ts +103 -0
- package/src/ui/hooks/useLanguageManagement.ts +53 -18
- package/src/ui/types/navigation.ts +4 -0
- package/src/ui/utils/__tests__/entryLink.test.ts +30 -0
- package/src/ui/utils/__tests__/nativeAssetFiles.test.ts +270 -0
- package/src/ui/utils/entryLink.ts +61 -0
- package/src/ui/utils/nativeAssetFiles.macos.ts +6 -0
- package/src/ui/utils/nativeAssetFiles.native.ts +212 -0
- package/src/ui/utils/nativeAssetFiles.ts +6 -0
|
@@ -1,19 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
1
2
|
import type { OxyLanguageConfig } from '../types/navigation.js';
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* catalogs.
|
|
9
|
-
*
|
|
10
|
-
* `currentLanguage` may name a locale the host app never shipped a catalog
|
|
11
|
-
* for — {@link coerceToSupportedLocale} narrows it to the closest one the app
|
|
12
|
-
* actually has (exact match, then same base language, then `fallbackLocale`).
|
|
13
|
-
*
|
|
14
|
-
* Renders nothing. Mounted by `OxyProvider` INSIDE `OxyRuntimeProvider` only
|
|
15
|
-
* when this config is supplied, so an app with no i18n of its own pays
|
|
16
|
-
* nothing.
|
|
17
|
-
*/
|
|
18
|
-
export declare function LanguageBridge({ supportedLocales, fallbackLocale, onChange, onError, }: OxyLanguageConfig): null;
|
|
3
|
+
/** The SDK resolves the entry/account locale before exposing translated app content. */
|
|
4
|
+
export declare function LanguageBridge({ config, accountReady, children, }: {
|
|
5
|
+
config?: OxyLanguageConfig;
|
|
6
|
+
accountReady?: boolean;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}): ReactNode;
|
|
19
9
|
//# sourceMappingURL=LanguageBridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LanguageBridge.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/LanguageBridge.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LanguageBridge.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/LanguageBridge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAE7D,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,YAAmB,EACnB,QAAQ,GACT,EAAE;IACD,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC;CACrB,aAsCA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OxyProvider.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxyProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwC,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAGtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"OxyProvider.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxyProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwC,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAGtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAqB,CAAC;AA8B5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CA6NrC,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OxySignUpPanel.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/components/signIn/OxySignUpPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA8B/B,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC1B;AAUD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"OxySignUpPanel.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/components/signIn/OxySignUpPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA8B/B,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC1B;AAUD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAkNxD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA6G/B,OAAO,KAAK,EAAmB,uBAAuB,EAAe,MAAM,sBAAmB,CAAC;AAQ/F,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAmB,CAAC;AAOhG,OAAO,EACL,iBAAiB,EACjB,MAAM,EACN,cAAc,EACd,uBAAuB,GACxB,MAAM,wBAAqB,CAAC;AAE7B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAuvDhE,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CampaignAttribution } from '@oxy.so/contracts';
|
|
1
2
|
import type { StartNativeOAuthSignInOptions, NativeOAuthSignInResult } from '../oauth/nativeAuthTransport.js';
|
|
2
3
|
import type { ReactNode } from 'react';
|
|
3
4
|
import type { LoginSessionResult } from '@oxy.so/contracts';
|
|
@@ -72,6 +73,8 @@ export interface OxyContextState {
|
|
|
72
73
|
error: string | null;
|
|
73
74
|
/** Active UI locale (`language-REGION`): the account's primary locale when signed in, else the guest/device locale. */
|
|
74
75
|
currentLanguage: string;
|
|
76
|
+
isLanguageReady: boolean;
|
|
77
|
+
campaignAttribution?: CampaignAttribution;
|
|
75
78
|
/** Ordered account locales (primary first) when signed in, or the single guest override when signed out. */
|
|
76
79
|
currentLanguages: string[];
|
|
77
80
|
currentLanguageMetadata: ReturnType<typeof useLanguageManagement>['metadata'];
|
|
@@ -154,6 +157,8 @@ export interface OxyContextState {
|
|
|
154
157
|
createAccount: (data: CreateAccountInput) => Promise<AccountNode>;
|
|
155
158
|
}
|
|
156
159
|
export interface OxyRuntimeProviderProps {
|
|
160
|
+
legacyLanguageKeys?: readonly string[];
|
|
161
|
+
captureCampaignAttribution?: boolean;
|
|
157
162
|
children: ReactNode;
|
|
158
163
|
oxyServices?: OxyServices;
|
|
159
164
|
baseURL?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CampaignAttribution } from '@oxy.so/contracts';
|
|
2
|
+
import type { StorageInterface } from '../utils/storageHelpers.js';
|
|
3
|
+
/** One receiver for initial and warm native links and web entry parameters. */
|
|
4
|
+
export declare function useEntryLink({ storage, storageKey, captureCampaign, onError, }: {
|
|
5
|
+
storage: StorageInterface | null;
|
|
6
|
+
storageKey: string;
|
|
7
|
+
captureCampaign: boolean;
|
|
8
|
+
onError: (message: string, error?: unknown) => void;
|
|
9
|
+
}): {
|
|
10
|
+
url: string | null | undefined;
|
|
11
|
+
ready: boolean;
|
|
12
|
+
campaignAttribution: CampaignAttribution | undefined;
|
|
13
|
+
campaignReady: boolean;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=useEntryLink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEntryLink.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useEntryLink.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAAyB,CAAC;AAGhE,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,UAAU,EACV,eAAe,EACf,OAAO,GACR,EAAE;IACD,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;;;;;EAqFA"}
|
|
@@ -3,6 +3,9 @@ import type { StorageInterface } from '../utils/storageHelpers.js';
|
|
|
3
3
|
export interface UseLanguageManagementOptions {
|
|
4
4
|
storage: StorageInterface | null;
|
|
5
5
|
languageKey: string;
|
|
6
|
+
entryUrl?: string | null;
|
|
7
|
+
entryLinkReady?: boolean;
|
|
8
|
+
legacyLanguageKeys?: readonly string[];
|
|
6
9
|
/**
|
|
7
10
|
* The active account, when signed in. When present, the account's primary
|
|
8
11
|
* locale (`languages[0]`) is authoritative for the app's UI locale; when
|
|
@@ -19,6 +22,7 @@ export interface UseLanguageManagementResult {
|
|
|
19
22
|
* locally-chosen guest override, otherwise the device locale.
|
|
20
23
|
*/
|
|
21
24
|
currentLanguage: string;
|
|
25
|
+
isLanguageReady: boolean;
|
|
22
26
|
/**
|
|
23
27
|
* The ordered account locales (primary first) when signed in, or the locally
|
|
24
28
|
* persisted selection when signed out. Empty only before the guest override loads
|
|
@@ -67,5 +71,5 @@ export declare function setPrimaryLocale(languages: readonly string[], locale: s
|
|
|
67
71
|
* The only external system this hook synchronizes with is local storage (the
|
|
68
72
|
* guest override), which is loaded once on mount.
|
|
69
73
|
*/
|
|
70
|
-
export declare const useLanguageManagement: ({ storage, languageKey, user, onError, logger, }: UseLanguageManagementOptions) => UseLanguageManagementResult;
|
|
74
|
+
export declare const useLanguageManagement: ({ storage, languageKey, entryUrl, entryLinkReady, legacyLanguageKeys, user, onError, logger, }: UseLanguageManagementOptions) => UseLanguageManagementResult;
|
|
71
75
|
//# sourceMappingURL=useLanguageManagement.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLanguageManagement.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useLanguageManagement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAYtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"useLanguageManagement.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useLanguageManagement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAYtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAAyB,CAAC;AAIhE,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC;;;;OAIG;IACH,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,yDAAyD;IACzD,YAAY,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAKhF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAInF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAIvF;AA6CD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,GAAI,gGASnC,4BAA4B,KAAG,2BA2JjC,CAAC"}
|
|
@@ -161,8 +161,12 @@ export interface OxyProviderProps {
|
|
|
161
161
|
* manages it independently of the account/device locale.
|
|
162
162
|
*/
|
|
163
163
|
language?: OxyLanguageConfig;
|
|
164
|
+
/** Persist bounded first-touch link labels and attach them only to a new account. */
|
|
165
|
+
campaignAttribution?: boolean;
|
|
164
166
|
}
|
|
165
167
|
export interface OxyLanguageConfig {
|
|
168
|
+
/** Previous app-owned storage keys, migrated once without replacing a current SDK choice. */
|
|
169
|
+
legacyStorageKeys?: readonly string[];
|
|
166
170
|
/** The exact locales this app ships a translation catalog for. */
|
|
167
171
|
supportedLocales: readonly string[];
|
|
168
172
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../../../src/ui/types/navigation.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../../../src/ui/types/navigation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type CampaignAttribution } from '@oxy.so/contracts/client';
|
|
2
|
+
export declare function readCampaignAttribution(value: unknown): CampaignAttribution | undefined;
|
|
3
|
+
/** Consumes only explicit locale/campaign parameters, never the URL or referrer itself. */
|
|
4
|
+
export declare function readEntryLink(url: string | null): {
|
|
5
|
+
language?: string;
|
|
6
|
+
campaignAttribution?: CampaignAttribution;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=entryLink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entryLink.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/entryLink.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAWlC,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,SAAS,CAavF;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C,CAuBA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeAssetFiles.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/nativeAssetFiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,CAEpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeAssetFiles.macos.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/nativeAssetFiles.macos.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,CAEpE"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { OxyServices } from '@oxy.so/core';
|
|
2
|
+
/** One provider-owned adapter; no native filesystem module loads before an upload. */
|
|
3
|
+
export declare function installNativeAssetFiles(oxy: OxyServices): () => void;
|
|
4
|
+
//# sourceMappingURL=nativeAssetFiles.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeAssetFiles.native.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/nativeAssetFiles.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyC,WAAW,EAAE,MAAM,cAAc,CAAC;AAgNvF,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,IAAI,CAEpE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxy.so/services",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.8.0",
|
|
4
4
|
"description": "OxyHQ Expo/React Native SDK — UI components, screens, and native features",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -107,6 +107,7 @@
|
|
|
107
107
|
"android/build.gradle",
|
|
108
108
|
"android/src",
|
|
109
109
|
"ios/OxyIdentityModule.swift",
|
|
110
|
+
"ios/OxyAssetFilesModule.swift",
|
|
110
111
|
"ios/OxyIdentity.podspec",
|
|
111
112
|
"plugins",
|
|
112
113
|
"expo-module.config.json"
|
|
@@ -151,7 +152,7 @@
|
|
|
151
152
|
"delete-dts.js": "find ./lib/commonjs -name '*.d.js*' -delete && find ./lib/module -name '*.d.js*' -delete"
|
|
152
153
|
},
|
|
153
154
|
"dependencies": {
|
|
154
|
-
"@oxy.so/contracts": "^6.
|
|
155
|
+
"@oxy.so/contracts": "^6.1.0",
|
|
155
156
|
"color": "^5.0.3",
|
|
156
157
|
"@peable.to/sdk": "0.4.1"
|
|
157
158
|
},
|
|
@@ -160,7 +161,7 @@
|
|
|
160
161
|
"@commitlint/config-conventional": "^21.2.0",
|
|
161
162
|
"@expo/app-integrity": "~58.0.2",
|
|
162
163
|
"@expo/vector-icons": "^15.0.3",
|
|
163
|
-
"@oxy.so/core": "7.
|
|
164
|
+
"@oxy.so/core": "7.7.0",
|
|
164
165
|
"@react-native-async-storage/async-storage": "^2.0.0",
|
|
165
166
|
"@react-native-community/netinfo": "^12.0.1",
|
|
166
167
|
"@react-native/babel-preset": "^0.88.0",
|
|
@@ -210,13 +211,13 @@
|
|
|
210
211
|
"expo-video": "~58.0.12"
|
|
211
212
|
},
|
|
212
213
|
"//@oxy.so/bloom": "Bloom 11.1.0 adds the shared grouped sections, usage card, subscription plans, frame appearance and overlay navigation APIs used by this SDK. First-party Bloom peers remain open above this tested minimum.",
|
|
213
|
-
"//@oxy.so/core": "Core 7.3.0 supplies `users.lookupMany`, with which the account members screen fails (and retries) a profile read whose chunk failed instead of caching those members as handle-less; 7.2.0 supplies `assets.cachedUrl`, with which `useFileDownloadUrl` answers an already-resolved URL in its first render; 6.16.0 supplies `requireServerVerdict` and `onHolderRejected`, with which the cold boot checks a session it painted from the cache; 6.13.0 supplies the `accounts.settings.*` strings (picture, categories) the account settings speak in every language; 6.12.0 supplies `fileManagement.contentLost` and the `lost` file status a lost file is listed with; 6.11.0 supplies the `follow.errors.*` strings the follow error codes are worded with; 6.4.0 the `follow.*` strings the follow buttons read for every verb and language; 6.1.0 the `oxy.auth.email.{startChange,change,remove}` and `oxy.auth.password.remove` the sign-in & security panels call. Keep one Core instance per app; raise this floor with the root catalogue when new runtime APIs are required.",
|
|
214
|
+
"//@oxy.so/core": "Core 7.7.0 supplies the bounded native asset file adapter and phase progress installed by OxyProvider; 7.6.0 forwards guest locale and first-touch campaign metadata through signup; 7.3.0 supplies `users.lookupMany`, with which the account members screen fails (and retries) a profile read whose chunk failed instead of caching those members as handle-less; 7.2.0 supplies `assets.cachedUrl`, with which `useFileDownloadUrl` answers an already-resolved URL in its first render; 6.16.0 supplies `requireServerVerdict` and `onHolderRejected`, with which the cold boot checks a session it painted from the cache; 6.13.0 supplies the `accounts.settings.*` strings (picture, categories) the account settings speak in every language; 6.12.0 supplies `fileManagement.contentLost` and the `lost` file status a lost file is listed with; 6.11.0 supplies the `follow.errors.*` strings the follow error codes are worded with; 6.4.0 the `follow.*` strings the follow buttons read for every verb and language; 6.1.0 the `oxy.auth.email.{startChange,change,remove}` and `oxy.auth.password.remove` the sign-in & security panels call. Keep one Core instance per app; raise this floor with the root catalogue when new runtime APIs are required.",
|
|
214
215
|
"//react-native": "React Native 0.81 to 0.88, React 19.1+ and Expo SDK 54 to 58. The floors are the Expo SDK 54 stack (react-native 0.81.6, react 19.1.4, react-native-web 0.21.4, expo 54.0.38 and the module versions its bundledNativeModules.json pins), which compat/expo-54 installs as an external consumer and checks on every CI run (`bun check.mjs`): every peer here admits that stack, services' published src typechecks against its types, and <OxyProvider> mounts and settles its cold boot on iOS (React Native 0.81), web (react-native-web 0.21) and react-native-macos 0.81 with the native modules macOS lacks absent. Astro, Oxy's browser, runs react-native-macos 0.81 (0.83 is its latest release), which is why the floor is not 0.85. The SDK 56 floors these replaced were the versions current when the ranges were first written, not measurements.",
|
|
215
216
|
"peerDependencies": {
|
|
216
217
|
"@expo/app-integrity": ">=0.1.10 <59.0.0",
|
|
217
218
|
"@expo/vector-icons": "^15.0.3",
|
|
218
219
|
"@oxy.so/bloom": ">=11.1.0",
|
|
219
|
-
"@oxy.so/core": "^7.
|
|
220
|
+
"@oxy.so/core": "^7.7.0",
|
|
220
221
|
"@react-native-async-storage/async-storage": "^2.0.0",
|
|
221
222
|
"@react-native-community/netinfo": ">=11.4.1 <13.0.0",
|
|
222
223
|
"@tanstack/query-async-storage-persister": "^5.101",
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { FALLBACK_LOCALE, getPrimaryLanguage } from '@oxy.so/core';
|
|
3
|
+
import { useOxy } from '../context/oxyRuntimeContext';
|
|
4
|
+
import { useCurrentUser } from '../hooks/queries/useAccountQueries';
|
|
5
|
+
import type { OxyLanguageConfig } from '../types/navigation';
|
|
6
|
+
import { LanguageBridge } from './LanguageBridge';
|
|
7
|
+
|
|
8
|
+
/** Owner preferences are not part of the public device/account summary. */
|
|
9
|
+
export function AccountLanguageBoundary({
|
|
10
|
+
language,
|
|
11
|
+
children,
|
|
12
|
+
}: {
|
|
13
|
+
language?: OxyLanguageConfig;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}) {
|
|
16
|
+
const { canUsePrivateApi, user, currentLanguage } = useOxy();
|
|
17
|
+
const profile = useCurrentUser({ enabled: canUsePrivateApi });
|
|
18
|
+
// The query mirrors its result into the account runtime in an effect. Wait for
|
|
19
|
+
// that projection as well as the request, so the bridge never publishes the
|
|
20
|
+
// compact session's fallback locale in the frame before its real preference.
|
|
21
|
+
const accountReady =
|
|
22
|
+
!user ||
|
|
23
|
+
!canUsePrivateApi ||
|
|
24
|
+
profile.fetchStatus === 'paused' ||
|
|
25
|
+
user.languages !== undefined ||
|
|
26
|
+
profile.isError ||
|
|
27
|
+
(profile.dataUpdatedAt > 0 &&
|
|
28
|
+
profile.data?.id === user.id &&
|
|
29
|
+
currentLanguage === (getPrimaryLanguage(profile.data) ?? FALLBACK_LOCALE));
|
|
30
|
+
return (
|
|
31
|
+
<LanguageBridge config={language} accountReady={accountReady}>
|
|
32
|
+
{children}
|
|
33
|
+
</LanguageBridge>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -1,49 +1,53 @@
|
|
|
1
|
-
import { useEffect,
|
|
1
|
+
import { useEffect, useRef, useState, type ReactNode } from 'react';
|
|
2
2
|
import { coerceToSupportedLocale } from '@oxy.so/core';
|
|
3
3
|
import { useOxy } from '../context/oxyRuntimeContext';
|
|
4
4
|
import type { OxyLanguageConfig } from '../types/navigation';
|
|
5
5
|
|
|
6
|
-
/**
|
|
7
|
-
* `OxyProvider`'s language config prop, realized. Oxy decides which
|
|
8
|
-
* language an account (or, signed out, the device/guest locale) should see;
|
|
9
|
-
* this is the ONE place that decision reaches the host app's own i18n library
|
|
10
|
-
* — so an app never re-derives or imperatively tracks a language of its own,
|
|
11
|
-
* and never mounts anything extra to get it. It owns only its translation
|
|
12
|
-
* catalogs.
|
|
13
|
-
*
|
|
14
|
-
* `currentLanguage` may name a locale the host app never shipped a catalog
|
|
15
|
-
* for — {@link coerceToSupportedLocale} narrows it to the closest one the app
|
|
16
|
-
* actually has (exact match, then same base language, then `fallbackLocale`).
|
|
17
|
-
*
|
|
18
|
-
* Renders nothing. Mounted by `OxyProvider` INSIDE `OxyRuntimeProvider` only
|
|
19
|
-
* when this config is supplied, so an app with no i18n of its own pays
|
|
20
|
-
* nothing.
|
|
21
|
-
*/
|
|
6
|
+
/** The SDK resolves the entry/account locale before exposing translated app content. */
|
|
22
7
|
export function LanguageBridge({
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
const onErrorRef = useRef(onError);
|
|
40
|
-
onErrorRef.current = onError;
|
|
8
|
+
config,
|
|
9
|
+
accountReady = true,
|
|
10
|
+
children,
|
|
11
|
+
}: {
|
|
12
|
+
config?: OxyLanguageConfig;
|
|
13
|
+
accountReady?: boolean;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}) {
|
|
16
|
+
const { currentLanguage, isLanguageReady, isAuthResolved } = useOxy();
|
|
17
|
+
const resolvedLocale = config
|
|
18
|
+
? coerceToSupportedLocale(currentLanguage, config.supportedLocales, config.fallbackLocale)
|
|
19
|
+
: currentLanguage;
|
|
20
|
+
const configRef = useRef(config);
|
|
21
|
+
configRef.current = config;
|
|
22
|
+
const pendingChange = useRef(Promise.resolve());
|
|
23
|
+
const [prepared, setPrepared] = useState(false);
|
|
41
24
|
|
|
42
25
|
useEffect(() => {
|
|
43
|
-
|
|
44
|
-
|
|
26
|
+
if (!isLanguageReady || !isAuthResolved || !accountReady) return;
|
|
27
|
+
let active = true;
|
|
28
|
+
// A slow earlier catalog must finish before a later locale is committed.
|
|
29
|
+
// Children stay mounted after boot: changing language never destroys route state.
|
|
30
|
+
pendingChange.current = pendingChange.current.then(async () => {
|
|
31
|
+
if (!active) return;
|
|
32
|
+
const current = configRef.current;
|
|
33
|
+
try {
|
|
34
|
+
await current?.onChange(resolvedLocale);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
current?.onError?.(error, resolvedLocale);
|
|
37
|
+
if (current && resolvedLocale !== current.fallbackLocale) {
|
|
38
|
+
try {
|
|
39
|
+
await current.onChange(current.fallbackLocale);
|
|
40
|
+
} catch (fallbackError) {
|
|
41
|
+
current.onError?.(fallbackError, current.fallbackLocale);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (active) setPrepared(true);
|
|
45
46
|
});
|
|
46
|
-
|
|
47
|
+
return () => {
|
|
48
|
+
active = false;
|
|
49
|
+
};
|
|
50
|
+
}, [accountReady, isAuthResolved, isLanguageReady, resolvedLocale]);
|
|
47
51
|
|
|
48
|
-
return null;
|
|
52
|
+
return !config || prepared ? children : null;
|
|
49
53
|
}
|
|
@@ -20,19 +20,10 @@ import { isNetConnectivityOnline } from '../utils/netConnectivity';
|
|
|
20
20
|
import { KeyboardBoundary } from './KeyboardBoundary';
|
|
21
21
|
import { SafeAreaRoot } from './SafeAreaRoot';
|
|
22
22
|
import { ProductAnalyticsObserver } from '../analytics/productAnalytics';
|
|
23
|
-
import {
|
|
23
|
+
import { AccountLanguageBoundary } from './AccountLanguageBoundary';
|
|
24
24
|
import { BloomLocaleBridge } from './BloomLocaleBridge';
|
|
25
|
-
import { useOxy } from '../context/oxyRuntimeContext';
|
|
26
|
-
import { useCurrentUser } from '../hooks/queries/useAccountQueries';
|
|
27
25
|
import { SupervisionStateObserver } from '../hooks/queries/useSupervision';
|
|
28
26
|
|
|
29
|
-
/** Hydrate owner preferences after the bearer is ready, including on cold boot. */
|
|
30
|
-
function AccountProfileObserver() {
|
|
31
|
-
const { canUsePrivateApi } = useOxy();
|
|
32
|
-
useCurrentUser({ enabled: canUsePrivateApi });
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
27
|
const bootStyles = StyleSheet.create({
|
|
37
28
|
providerRoot: {
|
|
38
29
|
flex: 1,
|
|
@@ -114,6 +105,7 @@ const OxyProvider: FC<OxyProviderProps> = ({
|
|
|
114
105
|
requireAuth = 'off',
|
|
115
106
|
backgroundSession = false,
|
|
116
107
|
language,
|
|
108
|
+
campaignAttribution = false,
|
|
117
109
|
}) => {
|
|
118
110
|
const support = useMemo(
|
|
119
111
|
() => ({ onAskAlia, documentationUrl, aliaAvatar, oxyOneArtwork }),
|
|
@@ -279,26 +271,28 @@ const OxyProvider: FC<OxyProviderProps> = ({
|
|
|
279
271
|
sessionMode={sessionMode}
|
|
280
272
|
webAuthMode={webAuthMode}
|
|
281
273
|
backgroundSession={backgroundSession}
|
|
274
|
+
legacyLanguageKeys={language?.legacyStorageKeys}
|
|
275
|
+
captureCampaignAttribution={campaignAttribution}
|
|
282
276
|
platformStorage={platformStorage}
|
|
283
277
|
accountQueries={accountQueries}
|
|
284
278
|
onAuthStateChange={onAuthStateChange as OxyRuntimeProviderProps['onAuthStateChange']}
|
|
285
279
|
>
|
|
286
|
-
<AccountProfileObserver />
|
|
287
280
|
<SupervisionStateObserver />
|
|
288
281
|
{productAnalytics ? <ProductAnalyticsObserver analytics={productAnalytics} /> : null}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
282
|
+
<AccountLanguageBoundary language={language}>
|
|
283
|
+
<BloomLocaleBridge>
|
|
284
|
+
<OxySupportContext.Provider value={support}>
|
|
285
|
+
<SurfaceProvider>
|
|
286
|
+
{requireAuth === 'off' ? (
|
|
287
|
+
children
|
|
288
|
+
) : (
|
|
289
|
+
<RequireOxyAuth prompt={requireAuth}>{children}</RequireOxyAuth>
|
|
290
|
+
)}
|
|
291
|
+
</SurfaceProvider>
|
|
292
|
+
</OxySupportContext.Provider>
|
|
293
|
+
<ToastOutlet />
|
|
294
|
+
</BloomLocaleBridge>
|
|
295
|
+
</AccountLanguageBoundary>
|
|
302
296
|
</OxyRuntimeProvider>
|
|
303
297
|
</QueryClientProvider>
|
|
304
298
|
);
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, waitFor } from '@testing-library/react';
|
|
3
|
+
import { AccountLanguageBoundary } from '../AccountLanguageBoundary';
|
|
4
|
+
|
|
5
|
+
let mockCurrentLanguage = 'en-US';
|
|
6
|
+
let mockCanUsePrivateApi = true;
|
|
7
|
+
const mockUser = { id: 'account', publicKey: '', username: 'ada', name: {} };
|
|
8
|
+
let mockQuery: {
|
|
9
|
+
data?: typeof mockUser & { languages?: string[] };
|
|
10
|
+
dataUpdatedAt: number;
|
|
11
|
+
isError: boolean;
|
|
12
|
+
fetchStatus?: 'fetching' | 'paused' | 'idle';
|
|
13
|
+
};
|
|
14
|
+
jest.mock('../../context/oxyRuntimeContext', () => ({
|
|
15
|
+
useOxy: () => ({
|
|
16
|
+
canUsePrivateApi: mockCanUsePrivateApi,
|
|
17
|
+
user: mockUser,
|
|
18
|
+
currentLanguage: mockCurrentLanguage,
|
|
19
|
+
isLanguageReady: true,
|
|
20
|
+
isAuthResolved: true,
|
|
21
|
+
}),
|
|
22
|
+
}));
|
|
23
|
+
jest.mock('../../hooks/queries/useAccountQueries', () => ({ useCurrentUser: () => mockQuery }));
|
|
24
|
+
|
|
25
|
+
it('waits for the owner preference query and its runtime projection before painting the account app', async () => {
|
|
26
|
+
mockQuery = { data: mockUser, dataUpdatedAt: 0, isError: false };
|
|
27
|
+
const onChange = jest.fn();
|
|
28
|
+
const config = { supportedLocales: ['en-US', 'es-ES'], fallbackLocale: 'en-US', onChange };
|
|
29
|
+
const screen = render(
|
|
30
|
+
<AccountLanguageBoundary language={config}>
|
|
31
|
+
<span>App</span>
|
|
32
|
+
</AccountLanguageBoundary>,
|
|
33
|
+
);
|
|
34
|
+
expect(screen.queryByText('App')).toBeNull();
|
|
35
|
+
mockQuery = { data: { ...mockUser, languages: ['es-ES'] }, dataUpdatedAt: 123, isError: false };
|
|
36
|
+
screen.rerender(
|
|
37
|
+
<AccountLanguageBoundary language={config}>
|
|
38
|
+
<span>App</span>
|
|
39
|
+
</AccountLanguageBoundary>,
|
|
40
|
+
);
|
|
41
|
+
expect(screen.queryByText('App')).toBeNull();
|
|
42
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
43
|
+
mockCurrentLanguage = 'es-ES';
|
|
44
|
+
screen.rerender(
|
|
45
|
+
<AccountLanguageBoundary language={config}>
|
|
46
|
+
<span>App</span>
|
|
47
|
+
</AccountLanguageBoundary>,
|
|
48
|
+
);
|
|
49
|
+
await waitFor(() => expect(screen.getByText('App')).toBeTruthy());
|
|
50
|
+
expect(onChange.mock.calls).toEqual([['es-ES']]);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it.each(['paused', 'disabled', 'error'] as const)(
|
|
54
|
+
'renders the resolved fallback when the account query is %s, then adopts its preference without remounting',
|
|
55
|
+
async (unavailable) => {
|
|
56
|
+
mockCurrentLanguage = 'en-US';
|
|
57
|
+
mockCanUsePrivateApi = unavailable !== 'disabled';
|
|
58
|
+
mockQuery = {
|
|
59
|
+
data: mockUser,
|
|
60
|
+
dataUpdatedAt: 0,
|
|
61
|
+
isError: unavailable === 'error',
|
|
62
|
+
fetchStatus: unavailable === 'paused' ? 'paused' : 'idle',
|
|
63
|
+
};
|
|
64
|
+
const onChange = jest.fn();
|
|
65
|
+
const config = { supportedLocales: ['en-US', 'es-ES'], fallbackLocale: 'en-US', onChange };
|
|
66
|
+
const view = () => (
|
|
67
|
+
<AccountLanguageBoundary language={config}>
|
|
68
|
+
<input aria-label="Draft" defaultValue="Kept" />
|
|
69
|
+
</AccountLanguageBoundary>
|
|
70
|
+
);
|
|
71
|
+
const screen = render(view());
|
|
72
|
+
await waitFor(() => expect(screen.getByLabelText('Draft')).toBeTruthy());
|
|
73
|
+
const draft = screen.getByLabelText('Draft');
|
|
74
|
+
expect(onChange.mock.calls).toEqual([['en-US']]);
|
|
75
|
+
mockCanUsePrivateApi = true;
|
|
76
|
+
mockQuery = {
|
|
77
|
+
data: { ...mockUser, languages: ['es-ES'] },
|
|
78
|
+
dataUpdatedAt: 123,
|
|
79
|
+
isError: false,
|
|
80
|
+
fetchStatus: 'idle',
|
|
81
|
+
};
|
|
82
|
+
mockCurrentLanguage = 'es-ES';
|
|
83
|
+
screen.rerender(view());
|
|
84
|
+
await waitFor(() => expect(onChange.mock.calls).toEqual([['en-US'], ['es-ES']]));
|
|
85
|
+
expect(screen.getByLabelText('Draft')).toBe(draft);
|
|
86
|
+
},
|
|
87
|
+
);
|