@oxy.so/services 1.2.0 → 2.1.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 +11 -1
- package/lib/commonjs/ui/components/BenefitList.js +93 -0
- package/lib/commonjs/ui/components/BenefitList.js.map +1 -0
- package/lib/commonjs/ui/components/FollowTargetButton.js +1 -1
- package/lib/commonjs/ui/components/FollowTargetButton.js.map +1 -1
- package/lib/commonjs/ui/components/OxySignInButton.js +36 -35
- package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +1 -17
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/passkeyFlow.js +2 -28
- package/lib/commonjs/ui/context/passkeyFlow.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountVerificationScreen.js +10 -10
- package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +6 -6
- package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +5 -5
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js +13 -13
- package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js.map +1 -1
- package/lib/module/ui/components/BenefitList.js +89 -0
- package/lib/module/ui/components/BenefitList.js.map +1 -0
- package/lib/module/ui/components/FollowTargetButton.js +1 -1
- package/lib/module/ui/components/FollowTargetButton.js.map +1 -1
- package/lib/module/ui/components/OxySignInButton.js +36 -35
- package/lib/module/ui/components/OxySignInButton.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +2 -18
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/passkeyFlow.js +2 -27
- package/lib/module/ui/context/passkeyFlow.js.map +1 -1
- package/lib/module/ui/screens/AccountVerificationScreen.js +6 -6
- package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
- package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +6 -6
- package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js +1 -1
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/module/ui/screens/trust/TrustAboutScreen.js +7 -7
- package/lib/module/ui/screens/trust/TrustAboutScreen.js.map +1 -1
- package/lib/typescript/commonjs/ui/components/BenefitList.d.ts +25 -0
- package/lib/typescript/commonjs/ui/components/BenefitList.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts +31 -12
- package/lib/typescript/commonjs/ui/components/OxySignInButton.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 +0 -8
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/passkeyFlow.d.ts +2 -21
- package/lib/typescript/commonjs/ui/context/passkeyFlow.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/BenefitList.d.ts +25 -0
- package/lib/typescript/module/ui/components/BenefitList.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/OxySignInButton.d.ts +31 -12
- package/lib/typescript/module/ui/components/OxySignInButton.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 +0 -8
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/passkeyFlow.d.ts +2 -21
- package/lib/typescript/module/ui/context/passkeyFlow.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/ui/components/BenefitList.tsx +111 -0
- package/src/ui/components/FollowTargetButton.tsx +1 -1
- package/src/ui/components/OxySignInButton.tsx +73 -41
- package/src/ui/context/OxyContext.tsx +1 -19
- package/src/ui/context/__tests__/passkeyFlow.test.ts +2 -65
- package/src/ui/context/oxyContextTypes.ts +0 -6
- package/src/ui/context/passkeyFlow.ts +2 -39
- package/src/ui/screens/AccountVerificationScreen.tsx +6 -6
- package/src/ui/screens/LearnMoreUsernamesScreen.tsx +6 -6
- package/src/ui/screens/PremiumSubscriptionScreen.tsx +1 -1
- package/src/ui/screens/trust/TrustAboutScreen.tsx +7 -7
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Extracted from `OxyContext` so the fixed `options → ceremony → verify → commit`
|
|
5
5
|
* ordering is unit-testable with injected deps — the exact pattern
|
|
6
6
|
* `commitSessionFlow.ts` (`commitDeviceSetAndResolve`) uses. The context methods
|
|
7
|
-
* (`signInWithPasskey` / `
|
|
7
|
+
* (`signInWithPasskey` / `addPasskey`) are thin wrappers
|
|
8
8
|
* that supply the real deps: the core `webauthn*` methods, the platform ceremony
|
|
9
9
|
* client (`webauthn/passkeyClient`), and the internal `commitSession` funnel.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* Both GATE on `isSupported()` first (the platform client returns `false`
|
|
12
12
|
* off the web) so an unsupported surface fails loudly before touching a ceremony.
|
|
13
13
|
*/
|
|
14
14
|
import type { LoginResult } from '@oxy.so/contracts';
|
|
@@ -56,25 +56,6 @@ export interface RunPasskeyLoginDeps {
|
|
|
56
56
|
* resolves to a completed session.
|
|
57
57
|
*/
|
|
58
58
|
export declare function runPasskeyLogin(deps: RunPasskeyLoginDeps): Promise<void>;
|
|
59
|
-
/** Injected dependencies for {@link runPasskeyRegister}. */
|
|
60
|
-
export interface RunPasskeyRegisterDeps {
|
|
61
|
-
isSupported: () => boolean;
|
|
62
|
-
getRegisterOptions: (username: string) => Promise<unknown>;
|
|
63
|
-
runCeremony: (optionsJSON: unknown) => Promise<unknown>;
|
|
64
|
-
registerVerify: (response: unknown, envelope: {
|
|
65
|
-
username: string;
|
|
66
|
-
deviceName?: string;
|
|
67
|
-
}) => Promise<PasskeyRegisterVerifyResult>;
|
|
68
|
-
commit: (input: CommitInput) => Promise<void>;
|
|
69
|
-
username: string;
|
|
70
|
-
deviceName?: string;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Passkey SIGNUP: create a brand-new account whose first auth method is a
|
|
74
|
-
* passkey. The verify signup branch mints a session (a {@link LoginSessionResult}
|
|
75
|
-
* carrying `sessionId`), which is committed exactly like a password signup.
|
|
76
|
-
*/
|
|
77
|
-
export declare function runPasskeyRegister(deps: RunPasskeyRegisterDeps): Promise<void>;
|
|
78
59
|
/** Injected dependencies for {@link runPasskeyAdd}. */
|
|
79
60
|
export interface RunPasskeyAddDeps {
|
|
80
61
|
isSupported: () => boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkeyFlow.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/passkeyFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC;AAE3F,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,gFACuC,CAAC;AAehF,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,EAAE,CACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7E,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E;AAED,
|
|
1
|
+
{"version":3,"file":"passkeyFlow.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/passkeyFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC;AAE3F,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,gFACuC,CAAC;AAehF,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,EAAE,CACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7E,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,cAAc,EAAE,CACd,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAC9B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import { type StyleProp, type TextStyle, type ViewStyle } from 'react-native';
|
|
3
|
+
export interface BenefitRowProps {
|
|
4
|
+
/** Leading icon element, rendered inside a rounded tertiary-fill square. */
|
|
5
|
+
icon: React.ReactNode;
|
|
6
|
+
/** Caption text. Provide either `label` or `children`. */
|
|
7
|
+
label?: string;
|
|
8
|
+
/** Caption content as children (alternative to `label`). */
|
|
9
|
+
children?: React.ReactNode;
|
|
10
|
+
/** Accessibility label for the row (defaults to string content). */
|
|
11
|
+
accessibilityLabel?: string;
|
|
12
|
+
className?: string;
|
|
13
|
+
style?: StyleProp<ViewStyle>;
|
|
14
|
+
textStyle?: StyleProp<TextStyle>;
|
|
15
|
+
}
|
|
16
|
+
export declare const BenefitRow: React.FC<BenefitRowProps>;
|
|
17
|
+
export interface BenefitListProps {
|
|
18
|
+
/** `BenefitRow`s (or any nodes) stacked with consistent spacing. */
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
accessibilityLabel?: string;
|
|
21
|
+
className?: string;
|
|
22
|
+
style?: StyleProp<ViewStyle>;
|
|
23
|
+
}
|
|
24
|
+
export declare const BenefitList: React.FC<BenefitListProps>;
|
|
25
|
+
//# sourceMappingURL=BenefitList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BenefitList.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/BenefitList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBpF,MAAM,WAAW,eAAe;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAkDhD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC7B,oEAAoE;IACpE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAiBlD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
import { type ViewStyle, type TextStyle, type StyleProp } from 'react-native';
|
|
3
|
+
import { type SocialButtonAction, type SocialButtonAppearance, type SocialButtonSize } from '@oxy.so/bloom/social-button';
|
|
3
4
|
/**
|
|
4
5
|
* The OAuth handshake surfaced to a NATIVE third-party RP via
|
|
5
6
|
* {@link OxySignInButtonProps.onOAuthResult} so it can finish the code exchange
|
|
@@ -14,12 +15,33 @@ export interface OxyOAuthResult {
|
|
|
14
15
|
/** The PKCE `code_verifier` to replay on the token exchange. */
|
|
15
16
|
codeVerifier: string;
|
|
16
17
|
}
|
|
18
|
+
/** The label's verb: "Sign in with Oxy", "Continue with Oxy" or "Sign up with Oxy". */
|
|
19
|
+
export type OxySignInButtonAction = SocialButtonAction;
|
|
17
20
|
export interface OxySignInButtonProps {
|
|
18
21
|
/**
|
|
19
|
-
*
|
|
22
|
+
* Shorthand for {@link OxySignInButtonProps.appearance}: `contained` is the
|
|
23
|
+
* filled button in the theme accent (`colorful`); `default` and `outline`
|
|
24
|
+
* are the outlined button with the Oxy mark (`white`).
|
|
20
25
|
* @default 'default'
|
|
21
26
|
*/
|
|
22
27
|
variant?: 'default' | 'outline' | 'contained';
|
|
28
|
+
/**
|
|
29
|
+
* Bloom `SocialButton` appearance — `colorful`, `white` or `black`. Wins
|
|
30
|
+
* over `variant` when both are given.
|
|
31
|
+
*/
|
|
32
|
+
appearance?: SocialButtonAppearance;
|
|
33
|
+
/**
|
|
34
|
+
* The label's verb, localized: `signIn` — "Sign in with Oxy", `continue` —
|
|
35
|
+
* "Continue with Oxy", `signUp` — "Sign up with Oxy".
|
|
36
|
+
* @default 'signIn'
|
|
37
|
+
*/
|
|
38
|
+
action?: OxySignInButtonAction;
|
|
39
|
+
/** `medium` (36 tall, 300 wide) or `small` (32 × 250). @default 'medium' */
|
|
40
|
+
size?: SocialButtonSize;
|
|
41
|
+
/** Fill the container's width instead of the fixed 300 / 250. */
|
|
42
|
+
fullWidth?: boolean;
|
|
43
|
+
/** A circular button showing only the Oxy mark; the label becomes its accessible name. */
|
|
44
|
+
iconOnly?: boolean;
|
|
23
45
|
/**
|
|
24
46
|
* Optional function to handle button press
|
|
25
47
|
* If not provided, the button will use the showBottomSheet method from OxyContext
|
|
@@ -34,12 +56,10 @@ export interface OxySignInButtonProps {
|
|
|
34
56
|
*/
|
|
35
57
|
textStyle?: StyleProp<TextStyle>;
|
|
36
58
|
/**
|
|
37
|
-
* Overrides the button label. When omitted the
|
|
38
|
-
*
|
|
39
|
-
* ("Continue with Oxy" in English). "Sign in with Oxy" remains the name of
|
|
40
|
-
* the MECHANISM — only this surface's label is "Continue with Oxy".
|
|
59
|
+
* Overrides the button label. When omitted the label is the localized
|
|
60
|
+
* {@link OxySignInButtonProps.action} phrase.
|
|
41
61
|
*
|
|
42
|
-
* @default localized
|
|
62
|
+
* @default localized "Sign in with Oxy"
|
|
43
63
|
*/
|
|
44
64
|
text?: string;
|
|
45
65
|
/**
|
|
@@ -95,12 +115,11 @@ export interface OxySignInButtonProps {
|
|
|
95
115
|
* // Basic usage
|
|
96
116
|
* <OxySignInButton />
|
|
97
117
|
*
|
|
98
|
-
* //
|
|
99
|
-
* <OxySignInButton
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* />
|
|
118
|
+
* // The filled button, full width
|
|
119
|
+
* <OxySignInButton variant="contained" fullWidth />
|
|
120
|
+
*
|
|
121
|
+
* // "Sign up with Oxy" on a registration screen
|
|
122
|
+
* <OxySignInButton action="signUp" />
|
|
104
123
|
*
|
|
105
124
|
* // Custom handler
|
|
106
125
|
* <OxySignInButton onPress={() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OxySignInButton.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxySignInButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAY,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"OxySignInButton.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxySignInButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAY,MAAM,cAAc,CAAC;AAUxF,OAAO,EAGH,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACxB,MAAM,6BAA6B,CAAC;AASrC;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC3B,sGAAsG;IACtG,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,uFAAuF;AACvF,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACjC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAE9C;;;OAGG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;IAEpC;;;;OAIG;IACH,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAE/B,4EAA4E;IAC5E,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAExB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEjC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CACpD;AAQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAqR1D,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsF/B,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EAExB,MAAM,sBAAmB,CAAC;AAgB3B,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAmB,CAAC;AAIhG,KAAK,0BAA0B,GAAG,IAAI,CACpC,eAAe,EACb,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,iBAAiB,GACjB,aAAa,GACb,iBAAiB,GACjB,aAAa,GACb,cAAc,GACd,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,CACtB,CAAC;AAIF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsF/B,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EAExB,MAAM,sBAAmB,CAAC;AAgB3B,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAmB,CAAC;AAIhG,KAAK,0BAA0B,GAAG,IAAI,CACpC,eAAe,EACb,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,iBAAiB,GACjB,aAAa,GACb,iBAAiB,GACjB,aAAa,GACb,cAAc,GACd,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,CACtB,CAAC;AAIF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA4tChE,CAAC;AAMF,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,0BAA0B;;CAMxC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,MAAM,QAAO,eAMzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAO,eAAe,GAAG,IAAqC,CAAC;AAE1F,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,QAAO,0BAMpC,CAAC"}
|
|
@@ -84,14 +84,6 @@ export interface OxyContextState {
|
|
|
84
84
|
deviceName?: string;
|
|
85
85
|
deviceFingerprint?: string;
|
|
86
86
|
}) => Promise<void>;
|
|
87
|
-
/**
|
|
88
|
-
* Create a brand-new account whose first authentication method is a passkey.
|
|
89
|
-
* WEB-ONLY — throws on native or an unsupported browser.
|
|
90
|
-
*/
|
|
91
|
-
registerWithPasskey: (params: {
|
|
92
|
-
username: string;
|
|
93
|
-
deviceName?: string;
|
|
94
|
-
}) => Promise<void>;
|
|
95
87
|
/**
|
|
96
88
|
* Add a passkey to the already-signed-in account (bearer present). Does NOT
|
|
97
89
|
* commit a new session; refreshes the linked auth-methods list on success.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9M,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAgC,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAA+B,CAAC;AAChF,OAAO,KAAK,EACV,kBAAkB,EAClB,0BAA0B,EAC3B,MAAM,kCAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAAyB,CAAC;AAEhE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B;;;;;;;;;OASG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;;;;;OASG;IACH,WAAW,EAAE,WAAW,CAAC;IACzB,wFAAwF;IACxF,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uHAAuH;IACvH,eAAe,EAAE,MAAM,CAAC;IACxB,4GAA4G;IAC5G,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,uBAAuB,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB,EAAE,MAAM,CAAC;IAElC,WAAW,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE3C,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAElE;;;;;;;;OAQG;IACH,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAE;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpB
|
|
1
|
+
{"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Extracted from `OxyContext` so the fixed `options → ceremony → verify → commit`
|
|
5
5
|
* ordering is unit-testable with injected deps — the exact pattern
|
|
6
6
|
* `commitSessionFlow.ts` (`commitDeviceSetAndResolve`) uses. The context methods
|
|
7
|
-
* (`signInWithPasskey` / `
|
|
7
|
+
* (`signInWithPasskey` / `addPasskey`) are thin wrappers
|
|
8
8
|
* that supply the real deps: the core `webauthn*` methods, the platform ceremony
|
|
9
9
|
* client (`webauthn/passkeyClient`), and the internal `commitSession` funnel.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* Both GATE on `isSupported()` first (the platform client returns `false`
|
|
12
12
|
* off the web) so an unsupported surface fails loudly before touching a ceremony.
|
|
13
13
|
*/
|
|
14
14
|
import type { LoginResult } from '@oxy.so/contracts';
|
|
@@ -56,25 +56,6 @@ export interface RunPasskeyLoginDeps {
|
|
|
56
56
|
* resolves to a completed session.
|
|
57
57
|
*/
|
|
58
58
|
export declare function runPasskeyLogin(deps: RunPasskeyLoginDeps): Promise<void>;
|
|
59
|
-
/** Injected dependencies for {@link runPasskeyRegister}. */
|
|
60
|
-
export interface RunPasskeyRegisterDeps {
|
|
61
|
-
isSupported: () => boolean;
|
|
62
|
-
getRegisterOptions: (username: string) => Promise<unknown>;
|
|
63
|
-
runCeremony: (optionsJSON: unknown) => Promise<unknown>;
|
|
64
|
-
registerVerify: (response: unknown, envelope: {
|
|
65
|
-
username: string;
|
|
66
|
-
deviceName?: string;
|
|
67
|
-
}) => Promise<PasskeyRegisterVerifyResult>;
|
|
68
|
-
commit: (input: CommitInput) => Promise<void>;
|
|
69
|
-
username: string;
|
|
70
|
-
deviceName?: string;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Passkey SIGNUP: create a brand-new account whose first auth method is a
|
|
74
|
-
* passkey. The verify signup branch mints a session (a {@link LoginSessionResult}
|
|
75
|
-
* carrying `sessionId`), which is committed exactly like a password signup.
|
|
76
|
-
*/
|
|
77
|
-
export declare function runPasskeyRegister(deps: RunPasskeyRegisterDeps): Promise<void>;
|
|
78
59
|
/** Injected dependencies for {@link runPasskeyAdd}. */
|
|
79
60
|
export interface RunPasskeyAddDeps {
|
|
80
61
|
isSupported: () => boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkeyFlow.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/passkeyFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC;AAE3F,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,gFACuC,CAAC;AAehF,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,EAAE,CACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7E,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E;AAED,
|
|
1
|
+
{"version":3,"file":"passkeyFlow.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/passkeyFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC;AAE3F,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,gFACuC,CAAC;AAehF,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,EAAE,CACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7E,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,cAAc,EAAE,CACd,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAC9B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxy.so/services",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.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",
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
"@types/jest": "^30.0.0",
|
|
180
180
|
"@types/node": "^20.19.43",
|
|
181
181
|
"@types/react": "*",
|
|
182
|
-
"@oxy.so/bloom": "^1.0
|
|
182
|
+
"@oxy.so/bloom": "^2.1.0",
|
|
183
183
|
"copyfiles": "^2.4.1",
|
|
184
184
|
"expo-constants": "~57.0.5",
|
|
185
185
|
"expo-file-system": "~57.0.1",
|
|
@@ -212,10 +212,10 @@
|
|
|
212
212
|
"typescript": "^5.9.2",
|
|
213
213
|
"zustand": "^5.0.14"
|
|
214
214
|
},
|
|
215
|
-
"//@oxy.so/bloom": "RE-RAISE THIS FLOOR ON EVERY BREAKING BLOOM RELEASE, in the same commit as the root package.json catalog entry and the code that requires it. Bloom is now at or above
|
|
215
|
+
"//@oxy.so/bloom": "RE-RAISE THIS FLOOR ON EVERY BREAKING BLOOM RELEASE, in the same commit as the root package.json catalog entry and the code that requires it. Bloom is now at or above 2.0.0, so the breaking position is the MAJOR and `^2.1.0` means `>=2.1.0 <3.0.0` (the floor is 2.1.0 because `OxySignInButton` renders `SocialButton brand=\"oxy\"`, which 2.1.0 added): 2.x minors are admitted on semver's additive promise, and Bloom 3.0.0 is refused until someone raises this deliberately. The floor was raised from `^1.0.0` for Bloom 2.0.0, which removed every hand-drawn icon (now Remix `Ri*` names) and the `benefit-list` and `profile-card` subpaths this package imported. The CAP is the part that is load-bearing. An earlier revision of this key recorded the opposite trade -- an uncapped `>=` floor, accepted so that intentionally-breaking Bloom 0.x minors would not be blocked -- and that trade is now closed by evidence rather than by preference: an unbounded range is exactly what let `bun install` pair this package with Bloom 1.0.0 and emit no warning at all, and 1.0.0 broke it four ways (a deleted provider, a renamed confirm option, a renamed Chip fill, and two REMOVED SUBPATHS that fail at bundle time, before any typecheck runs). A floor is a claim about what was measured; a cap is the claim that nothing beyond it was.",
|
|
216
216
|
"peerDependencies": {
|
|
217
217
|
"@expo/vector-icons": "^15.0.3",
|
|
218
|
-
"@oxy.so/bloom": "^1.0
|
|
218
|
+
"@oxy.so/bloom": "^2.1.0",
|
|
219
219
|
"@oxy.so/core": "^1.0.1",
|
|
220
220
|
"@react-native-async-storage/async-storage": "^2.0.0",
|
|
221
221
|
"@react-native-community/netinfo": ">=11.4.1",
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import { View, type StyleProp, type TextStyle, type ViewStyle } from 'react-native';
|
|
3
|
+
import { Card } from '@oxy.so/bloom/card';
|
|
4
|
+
import { RADIUS, SPACING, TYPOGRAPHY } from '@oxy.so/bloom/design-tokens';
|
|
5
|
+
import { useTheme } from '@oxy.so/bloom/theme';
|
|
6
|
+
import { Text } from '@oxy.so/bloom/typography';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* BenefitList / BenefitRow — a bordered card stacking "icon + caption" rows,
|
|
10
|
+
* used by the verification, trust and premium screens.
|
|
11
|
+
*
|
|
12
|
+
* Bloom 2.0 removed its `benefit-list` family with no replacement, so the SDK
|
|
13
|
+
* keeps this small local copy built from Bloom primitives (`Card`, `Text`,
|
|
14
|
+
* design tokens) with the same props its call sites already use.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** Side of the rounded icon square. */
|
|
18
|
+
const ICON_SQUARE_SIZE = 36;
|
|
19
|
+
|
|
20
|
+
export interface BenefitRowProps {
|
|
21
|
+
/** Leading icon element, rendered inside a rounded tertiary-fill square. */
|
|
22
|
+
icon: React.ReactNode;
|
|
23
|
+
/** Caption text. Provide either `label` or `children`. */
|
|
24
|
+
label?: string;
|
|
25
|
+
/** Caption content as children (alternative to `label`). */
|
|
26
|
+
children?: React.ReactNode;
|
|
27
|
+
/** Accessibility label for the row (defaults to string content). */
|
|
28
|
+
accessibilityLabel?: string;
|
|
29
|
+
className?: string;
|
|
30
|
+
style?: StyleProp<ViewStyle>;
|
|
31
|
+
textStyle?: StyleProp<TextStyle>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const BenefitRow: React.FC<BenefitRowProps> = ({
|
|
35
|
+
icon,
|
|
36
|
+
label,
|
|
37
|
+
children,
|
|
38
|
+
accessibilityLabel,
|
|
39
|
+
className,
|
|
40
|
+
style,
|
|
41
|
+
textStyle,
|
|
42
|
+
}) => {
|
|
43
|
+
const { colors } = useTheme();
|
|
44
|
+
const content = children ?? label;
|
|
45
|
+
const a11y = accessibilityLabel ?? (typeof content === 'string' ? content : undefined);
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<View
|
|
49
|
+
className={className}
|
|
50
|
+
style={[{ flexDirection: 'row', alignItems: 'center', gap: SPACING['space-12'] }, style]}
|
|
51
|
+
accessibilityLabel={a11y}
|
|
52
|
+
{...(a11y ? { accessibilityRole: 'text' as const } : {})}
|
|
53
|
+
>
|
|
54
|
+
<View
|
|
55
|
+
style={{
|
|
56
|
+
width: ICON_SQUARE_SIZE,
|
|
57
|
+
height: ICON_SQUARE_SIZE,
|
|
58
|
+
borderRadius: RADIUS['radius-12'],
|
|
59
|
+
alignItems: 'center',
|
|
60
|
+
justifyContent: 'center',
|
|
61
|
+
backgroundColor: colors.backgroundTertiary,
|
|
62
|
+
}}
|
|
63
|
+
accessibilityElementsHidden
|
|
64
|
+
aria-hidden
|
|
65
|
+
>
|
|
66
|
+
{icon}
|
|
67
|
+
</View>
|
|
68
|
+
<Text
|
|
69
|
+
style={[
|
|
70
|
+
{
|
|
71
|
+
flex: 1,
|
|
72
|
+
fontSize: TYPOGRAPHY.caption.size,
|
|
73
|
+
lineHeight: TYPOGRAPHY.caption.lineHeight,
|
|
74
|
+
fontWeight: TYPOGRAPHY.caption.weight,
|
|
75
|
+
color: colors.textSecondary,
|
|
76
|
+
},
|
|
77
|
+
textStyle,
|
|
78
|
+
]}
|
|
79
|
+
>
|
|
80
|
+
{content}
|
|
81
|
+
</Text>
|
|
82
|
+
</View>
|
|
83
|
+
);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export interface BenefitListProps {
|
|
87
|
+
/** `BenefitRow`s (or any nodes) stacked with consistent spacing. */
|
|
88
|
+
children: React.ReactNode;
|
|
89
|
+
accessibilityLabel?: string;
|
|
90
|
+
className?: string;
|
|
91
|
+
style?: StyleProp<ViewStyle>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export const BenefitList: React.FC<BenefitListProps> = ({
|
|
95
|
+
children,
|
|
96
|
+
accessibilityLabel,
|
|
97
|
+
className,
|
|
98
|
+
style,
|
|
99
|
+
}) => (
|
|
100
|
+
<Card
|
|
101
|
+
variant="outlined"
|
|
102
|
+
radius="radius-20"
|
|
103
|
+
border="hairline"
|
|
104
|
+
elevation="s"
|
|
105
|
+
className={className}
|
|
106
|
+
style={[{ padding: SPACING['space-16'], gap: SPACING['space-16'], overflow: 'visible' }, style]}
|
|
107
|
+
accessibilityLabel={accessibilityLabel}
|
|
108
|
+
>
|
|
109
|
+
{children}
|
|
110
|
+
</Card>
|
|
111
|
+
);
|
|
@@ -36,7 +36,7 @@ import type { FollowApplicationMode, FollowStatus } from '@oxy.so/contracts';
|
|
|
36
36
|
import type { StyleProp, ViewStyle } from 'react-native';
|
|
37
37
|
import { View } from 'react-native';
|
|
38
38
|
import { Button } from '@oxy.so/bloom/button';
|
|
39
|
-
import {
|
|
39
|
+
import { RiArrowDownSLine as ChevronDown } from '@oxy.so/bloom/icons';
|
|
40
40
|
import {
|
|
41
41
|
DropdownMenu,
|
|
42
42
|
DropdownMenuContent,
|
|
@@ -10,12 +10,16 @@ import {
|
|
|
10
10
|
} from '@oxy.so/core';
|
|
11
11
|
import { useAuthStore } from '../stores/authStore';
|
|
12
12
|
import { useShallow } from 'zustand/react/shallow';
|
|
13
|
-
import {
|
|
14
|
-
|
|
13
|
+
import {
|
|
14
|
+
SocialButton,
|
|
15
|
+
socialButtonLabel,
|
|
16
|
+
type SocialButtonAction,
|
|
17
|
+
type SocialButtonAppearance,
|
|
18
|
+
type SocialButtonSize,
|
|
19
|
+
} from '@oxy.so/bloom/social-button';
|
|
15
20
|
import { toast } from '@oxy.so/bloom/toast';
|
|
16
21
|
import { useOxy } from '../context/OxyContext';
|
|
17
22
|
import { useI18n } from '../hooks/useI18n';
|
|
18
|
-
import { LogoIcon } from './logo/LogoIcon';
|
|
19
23
|
import { subscribeToAccountDialog } from '../navigation/accountDialogManager';
|
|
20
24
|
import { openAuthorizeUrlNative } from './oauthNavigation';
|
|
21
25
|
import { closeOAuthPopup, openOAuthPopup } from '../oauth/oauthPopup';
|
|
@@ -36,13 +40,40 @@ export interface OxyOAuthResult {
|
|
|
36
40
|
codeVerifier: string;
|
|
37
41
|
}
|
|
38
42
|
|
|
43
|
+
/** The label's verb: "Sign in with Oxy", "Continue with Oxy" or "Sign up with Oxy". */
|
|
44
|
+
export type OxySignInButtonAction = SocialButtonAction;
|
|
45
|
+
|
|
39
46
|
export interface OxySignInButtonProps {
|
|
40
47
|
/**
|
|
41
|
-
*
|
|
48
|
+
* Shorthand for {@link OxySignInButtonProps.appearance}: `contained` is the
|
|
49
|
+
* filled button in the theme accent (`colorful`); `default` and `outline`
|
|
50
|
+
* are the outlined button with the Oxy mark (`white`).
|
|
42
51
|
* @default 'default'
|
|
43
52
|
*/
|
|
44
53
|
variant?: 'default' | 'outline' | 'contained';
|
|
45
54
|
|
|
55
|
+
/**
|
|
56
|
+
* Bloom `SocialButton` appearance — `colorful`, `white` or `black`. Wins
|
|
57
|
+
* over `variant` when both are given.
|
|
58
|
+
*/
|
|
59
|
+
appearance?: SocialButtonAppearance;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The label's verb, localized: `signIn` — "Sign in with Oxy", `continue` —
|
|
63
|
+
* "Continue with Oxy", `signUp` — "Sign up with Oxy".
|
|
64
|
+
* @default 'signIn'
|
|
65
|
+
*/
|
|
66
|
+
action?: OxySignInButtonAction;
|
|
67
|
+
|
|
68
|
+
/** `medium` (36 tall, 300 wide) or `small` (32 × 250). @default 'medium' */
|
|
69
|
+
size?: SocialButtonSize;
|
|
70
|
+
|
|
71
|
+
/** Fill the container's width instead of the fixed 300 / 250. */
|
|
72
|
+
fullWidth?: boolean;
|
|
73
|
+
|
|
74
|
+
/** A circular button showing only the Oxy mark; the label becomes its accessible name. */
|
|
75
|
+
iconOnly?: boolean;
|
|
76
|
+
|
|
46
77
|
/**
|
|
47
78
|
* Optional function to handle button press
|
|
48
79
|
* If not provided, the button will use the showBottomSheet method from OxyContext
|
|
@@ -60,12 +91,10 @@ export interface OxySignInButtonProps {
|
|
|
60
91
|
textStyle?: StyleProp<TextStyle>;
|
|
61
92
|
|
|
62
93
|
/**
|
|
63
|
-
* Overrides the button label. When omitted the
|
|
64
|
-
*
|
|
65
|
-
* ("Continue with Oxy" in English). "Sign in with Oxy" remains the name of
|
|
66
|
-
* the MECHANISM — only this surface's label is "Continue with Oxy".
|
|
94
|
+
* Overrides the button label. When omitted the label is the localized
|
|
95
|
+
* {@link OxySignInButtonProps.action} phrase.
|
|
67
96
|
*
|
|
68
|
-
* @default localized
|
|
97
|
+
* @default localized "Sign in with Oxy"
|
|
69
98
|
*/
|
|
70
99
|
text?: string;
|
|
71
100
|
|
|
@@ -115,6 +144,12 @@ export interface OxySignInButtonProps {
|
|
|
115
144
|
onOAuthResult?: (result: OxyOAuthResult) => void;
|
|
116
145
|
}
|
|
117
146
|
|
|
147
|
+
const ACTION_KEYS: Record<OxySignInButtonAction, string> = {
|
|
148
|
+
signIn: 'accountSwitcher.signInWithOxy',
|
|
149
|
+
continue: 'accountSwitcher.continueWithOxy',
|
|
150
|
+
signUp: 'accountSwitcher.signUpWithOxy',
|
|
151
|
+
};
|
|
152
|
+
|
|
118
153
|
/**
|
|
119
154
|
* A pre-styled button component for signing in with Oxy identity
|
|
120
155
|
*
|
|
@@ -126,12 +161,11 @@ export interface OxySignInButtonProps {
|
|
|
126
161
|
* // Basic usage
|
|
127
162
|
* <OxySignInButton />
|
|
128
163
|
*
|
|
129
|
-
* //
|
|
130
|
-
* <OxySignInButton
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* />
|
|
164
|
+
* // The filled button, full width
|
|
165
|
+
* <OxySignInButton variant="contained" fullWidth />
|
|
166
|
+
*
|
|
167
|
+
* // "Sign up with Oxy" on a registration screen
|
|
168
|
+
* <OxySignInButton action="signUp" />
|
|
135
169
|
*
|
|
136
170
|
* // Custom handler
|
|
137
171
|
* <OxySignInButton onPress={() => {
|
|
@@ -141,6 +175,11 @@ export interface OxySignInButtonProps {
|
|
|
141
175
|
*/
|
|
142
176
|
export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
|
|
143
177
|
variant = 'default',
|
|
178
|
+
appearance,
|
|
179
|
+
action = 'signIn',
|
|
180
|
+
size = 'medium',
|
|
181
|
+
fullWidth = false,
|
|
182
|
+
iconOnly = false,
|
|
144
183
|
onPress,
|
|
145
184
|
style,
|
|
146
185
|
textStyle,
|
|
@@ -150,7 +189,6 @@ export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
|
|
|
150
189
|
oauthRedirectUri,
|
|
151
190
|
onOAuthResult,
|
|
152
191
|
}) => {
|
|
153
|
-
const theme = useTheme();
|
|
154
192
|
const { t } = useI18n();
|
|
155
193
|
const { openAccountDialog, oxyServices, clientId, webAuthMode, startWebOAuthSignIn } = useOxy();
|
|
156
194
|
const { isAuthenticated, isLoading } = useAuthStore(
|
|
@@ -384,39 +422,33 @@ export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
|
|
|
384
422
|
|
|
385
423
|
const isButtonDisabled = disabled || isLoading || isModalOpen;
|
|
386
424
|
|
|
387
|
-
//
|
|
388
|
-
//
|
|
389
|
-
const
|
|
390
|
-
|
|
425
|
+
// `contained` is the filled button in the theme accent; `default` and
|
|
426
|
+
// `outline` are the outlined button carrying the Oxy mark.
|
|
427
|
+
const resolvedAppearance: SocialButtonAppearance =
|
|
428
|
+
appearance ?? (variant === 'contained' ? 'colorful' : 'white');
|
|
391
429
|
|
|
392
|
-
//
|
|
393
|
-
//
|
|
394
|
-
const
|
|
395
|
-
const
|
|
396
|
-
const
|
|
397
|
-
|
|
398
|
-
// The relying party surfaces exactly ONE primary action, and it reads
|
|
399
|
-
// "Continue with Oxy" (issue #691). A caller-supplied `text` still wins.
|
|
400
|
-
const label = text ?? t('accountSwitcher.continueWithOxy');
|
|
430
|
+
// A key missing from every dictionary comes back as the key itself; fall
|
|
431
|
+
// back to Bloom's English phrase rather than render a dotted path.
|
|
432
|
+
const actionKey = ACTION_KEYS[action];
|
|
433
|
+
const translated = t(actionKey);
|
|
434
|
+
const label = text ?? (translated === actionKey ? socialButtonLabel('Oxy', action) : translated);
|
|
401
435
|
|
|
402
436
|
return (
|
|
403
|
-
<
|
|
404
|
-
|
|
437
|
+
<SocialButton
|
|
438
|
+
brand="oxy"
|
|
439
|
+
action={action}
|
|
440
|
+
appearance={resolvedAppearance}
|
|
441
|
+
size={size}
|
|
442
|
+
fullWidth={fullWidth}
|
|
443
|
+
iconOnly={iconOnly}
|
|
405
444
|
onPress={handlePress}
|
|
406
445
|
disabled={isButtonDisabled}
|
|
407
446
|
style={style}
|
|
408
|
-
textStyle={
|
|
409
|
-
|
|
410
|
-
<LogoIcon
|
|
411
|
-
height={20}
|
|
412
|
-
color={logoColor}
|
|
413
|
-
letterColor={logoLetterColor}
|
|
414
|
-
style={{ marginRight: 10 }}
|
|
415
|
-
/>
|
|
416
|
-
}
|
|
447
|
+
textStyle={textStyle}
|
|
448
|
+
accessibilityLabel={iconOnly ? label : undefined}
|
|
417
449
|
>
|
|
418
450
|
{isLoading || isModalOpen ? t('signin.status.signingIn') : label}
|
|
419
|
-
</
|
|
451
|
+
</SocialButton>
|
|
420
452
|
);
|
|
421
453
|
};
|
|
422
454
|
|