@oxyhq/services 19.1.1 → 19.1.2

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.
Files changed (50) hide show
  1. package/lib/commonjs/ui/boot/runProviderColdBoot.js +4 -0
  2. package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
  3. package/lib/commonjs/ui/components/OxyOAuthCallback.js +3 -4
  4. package/lib/commonjs/ui/components/OxyOAuthCallback.js.map +1 -1
  5. package/lib/commonjs/ui/context/OxyContext.js +0 -2
  6. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  7. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +1 -2
  8. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  9. package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
  10. package/lib/commonjs/ui/screens/CreateAccountScreen.js +53 -2
  11. package/lib/commonjs/ui/screens/CreateAccountScreen.js.map +1 -1
  12. package/lib/commonjs/ui/utils/oauthReturn.js +27 -0
  13. package/lib/commonjs/ui/utils/oauthReturn.js.map +1 -1
  14. package/lib/module/ui/boot/runProviderColdBoot.js +5 -1
  15. package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
  16. package/lib/module/ui/components/OxyOAuthCallback.js +3 -4
  17. package/lib/module/ui/components/OxyOAuthCallback.js.map +1 -1
  18. package/lib/module/ui/context/OxyContext.js +0 -2
  19. package/lib/module/ui/context/OxyContext.js.map +1 -1
  20. package/lib/module/ui/context/hooks/useAuthOperations.js +1 -2
  21. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  22. package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
  23. package/lib/module/ui/screens/CreateAccountScreen.js +53 -2
  24. package/lib/module/ui/screens/CreateAccountScreen.js.map +1 -1
  25. package/lib/module/ui/utils/oauthReturn.js +26 -0
  26. package/lib/module/ui/utils/oauthReturn.js.map +1 -1
  27. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  28. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  29. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  30. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts +3 -2
  31. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  32. package/lib/typescript/commonjs/ui/screens/CreateAccountScreen.d.ts.map +1 -1
  33. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts +6 -0
  34. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts.map +1 -1
  35. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  36. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  37. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  38. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts +3 -2
  39. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  40. package/lib/typescript/module/ui/screens/CreateAccountScreen.d.ts.map +1 -1
  41. package/lib/typescript/module/ui/utils/oauthReturn.d.ts +6 -0
  42. package/lib/typescript/module/ui/utils/oauthReturn.d.ts.map +1 -1
  43. package/package.json +1 -1
  44. package/src/ui/boot/runProviderColdBoot.ts +5 -1
  45. package/src/ui/components/OxyOAuthCallback.tsx +3 -3
  46. package/src/ui/context/OxyContext.tsx +1 -3
  47. package/src/ui/context/hooks/useAuthOperations.ts +2 -3
  48. package/src/ui/context/useOxyAccountGraph.ts +1 -1
  49. package/src/ui/screens/CreateAccountScreen.tsx +59 -2
  50. package/src/ui/utils/oauthReturn.ts +29 -0
@@ -22,4 +22,10 @@ export declare function tryCompleteOAuthReturn(opts: {
22
22
  authRedirectUri?: string;
23
23
  commitSession: (input: OAuthReturnCommitInput) => Promise<void>;
24
24
  }): Promise<boolean>;
25
+ /**
26
+ * When auth.oxy.so hub-sync redeem fails, the IdP redirects back with
27
+ * `?hub_sync=failed`. Strip the param and log so cold boot can continue
28
+ * without leaving a stale query string.
29
+ */
30
+ export declare function consumeHubSyncFailure(): boolean;
25
31
  //# sourceMappingURL=oauthReturn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauthReturn.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/oauthReturn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE,GAAG,OAAO,CAAC,OAAO,CAAC,CA8DnB"}
1
+ {"version":3,"file":"oauthReturn.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/oauthReturn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE,GAAG,OAAO,CAAC,OAAO,CAAC,CA8DnB;AAeD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAmB/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"runProviderColdBoot.d.ts","sourceRoot":"","sources":["../../../../../src/ui/boot/runProviderColdBoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA4B,CAAC;AAE9D,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,aAAa,EAAE,CACb,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAC9C,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA0GzF"}
1
+ {"version":3,"file":"runProviderColdBoot.d.ts","sourceRoot":"","sources":["../../../../../src/ui/boot/runProviderColdBoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA4B,CAAC;AAE9D,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,aAAa,EAAE,CACb,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAC9C,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA8GzF"}
@@ -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;AA2D/B,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,uBAAuB,EAE7B,MAAM,sBAAmB,CAAC;AAI3B,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAmB,CAAC;AAIxG,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA83BzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,mCAAc,CAAC;AA+D9C,eAAO,MAAM,MAAM,QAAO,eAMzB,CAAC"}
1
+ {"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA2D/B,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,uBAAuB,EAE7B,MAAM,sBAAmB,CAAC;AAI3B,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAmB,CAAC;AAIxG,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA43BzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,mCAAc,CAAC;AA+D9C,eAAO,MAAM,MAAM,QAAO,eAMzB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthOperations.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/context/hooks/useAuthOperations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,aAAa,CAAC;AAIvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC;;;;;;OAMG;IACH,KAAK,EAAE,cAAc,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,cAAc,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,0JAA0J;IAC1J,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD;;;;;OAKG;IACH,aAAa,EAAE,aAAa,CAAC;IAC7B,+MAA+M;IAC/M,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,uBAAuB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IAClD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,uBAAuB;IACtC,uCAAuC;IACvC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,kCAAkC;IAClC,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,+BAA+B;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAMD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,GAClD,IAAI,CAIN;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,wRAmB/B,wBAAwB,KAAG,uBAqR7B,CAAC"}
1
+ {"version":3,"file":"useAuthOperations.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/context/hooks/useAuthOperations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,aAAa,CAAC;AAIvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC;;;;;;OAMG;IACH,KAAK,EAAE,cAAc,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,cAAc,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,0JAA0J;IAC1J,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD;;;;;OAKG;IACH,aAAa,EAAE,aAAa,CAAC;IAC7B,+MAA+M;IAC/M,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,uBAAuB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IAClD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,uBAAuB;IACtC,uCAAuC;IACvC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,kCAAkC;IAClC,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,+BAA+B;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAMD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,GAClD,IAAI,CAIN;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,wRAmB/B,wBAAwB,KAAG,uBAoR7B,CAAC"}
@@ -32,14 +32,14 @@ export declare const useUpdateProfile: () => import("@tanstack/react-query").Use
32
32
  id: import("zod").ZodOptional<import("zod").ZodString>;
33
33
  }, "strip", import("zod").ZodTypeAny, {
34
34
  url: string;
35
- id?: string | undefined;
36
35
  description?: string | undefined;
36
+ id?: string | undefined;
37
37
  title?: string | undefined;
38
38
  image?: string | undefined;
39
39
  }, {
40
40
  url: string;
41
- id?: string | undefined;
42
41
  description?: string | undefined;
42
+ id?: string | undefined;
43
43
  title?: string | undefined;
44
44
  image?: string | undefined;
45
45
  }>, "many">>;
@@ -202,6 +202,7 @@ export declare const useUpdateAccountSettings: () => {
202
202
  };
203
203
  isManagedAccount?: boolean;
204
204
  managedBy?: string;
205
+ organizationCategory?: import("@oxyhq/contracts").OrganizationCategory;
205
206
  notificationPreferences?: NotificationPreferences;
206
207
  userPreferences?: UserPreferences;
207
208
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useAccountMutations.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/hooks/mutations/useAccountMutations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAccountMutations.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/hooks/mutations/useAccountMutations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CreateAccountScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/CreateAccountScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAqB,CAAC;AA8D3D;;;;;GAKG;AACH,QAAA,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAgSlD,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"CreateAccountScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/CreateAccountScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAqB,CAAC;AAgF3D;;;;;GAKG;AACH,QAAA,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAsUlD,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -22,4 +22,10 @@ export declare function tryCompleteOAuthReturn(opts: {
22
22
  authRedirectUri?: string;
23
23
  commitSession: (input: OAuthReturnCommitInput) => Promise<void>;
24
24
  }): Promise<boolean>;
25
+ /**
26
+ * When auth.oxy.so hub-sync redeem fails, the IdP redirects back with
27
+ * `?hub_sync=failed`. Strip the param and log so cold boot can continue
28
+ * without leaving a stale query string.
29
+ */
30
+ export declare function consumeHubSyncFailure(): boolean;
25
31
  //# sourceMappingURL=oauthReturn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauthReturn.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/oauthReturn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE,GAAG,OAAO,CAAC,OAAO,CAAC,CA8DnB"}
1
+ {"version":3,"file":"oauthReturn.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/oauthReturn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE,GAAG,OAAO,CAAC,OAAO,CAAC,CA8DnB;AAeD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAmB/C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/services",
3
- "version": "19.1.1",
3
+ "version": "19.1.2",
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",
@@ -10,7 +10,7 @@ import {
10
10
  consumeSilentOAuthError,
11
11
  maybeStartSilentOAuthRestore,
12
12
  } from '../utils/crossOriginRestore';
13
- import { tryCompleteOAuthReturn } from '../utils/oauthReturn';
13
+ import { tryCompleteOAuthReturn, consumeHubSyncFailure } from '../utils/oauthReturn';
14
14
  import { isWebBrowser } from '../utils/isWebBrowser';
15
15
  import type { CommitInput } from '../context/oxyContextTypes';
16
16
 
@@ -57,6 +57,7 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
57
57
 
58
58
  try {
59
59
  consumeSilentOAuthError();
60
+ consumeHubSyncFailure();
60
61
 
61
62
  const oauthCompleted = await tryCompleteOAuthReturn({
62
63
  oxyServices,
@@ -75,6 +76,9 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
75
76
  store: authStore,
76
77
  platform: { isWeb: isWebBrowser(), isNative: !isWebBrowser() },
77
78
  onSession: async (session) => {
79
+ // Mint already persisted `{deviceId, deviceSecret}` to the store; sync the
80
+ // in-memory SessionClient host so sockets + tab-focus re-mint can use it.
81
+ await syncDeviceCredentialToHost();
78
82
  const handoff = commitSession(
79
83
  {
80
84
  sessionId: session.sessionId,
@@ -14,7 +14,7 @@ export interface OxyOAuthCallbackProps {
14
14
  * callback path for a Clerk-style loading shell while auth resolves.
15
15
  */
16
16
  export function OxyOAuthCallback({ redirectTo = '/' }: OxyOAuthCallbackProps) {
17
- const { isAuthResolved, isAuthenticated } = useAuth();
17
+ const { isAuthResolved } = useAuth();
18
18
 
19
19
  useEffect(() => {
20
20
  if (!isAuthResolved) return;
@@ -24,11 +24,11 @@ export function OxyOAuthCallback({ redirectTo = '/' }: OxyOAuthCallbackProps) {
24
24
  const params = new URLSearchParams(location.search);
25
25
  if (!params.has('code') && !params.has('error')) return;
26
26
 
27
- const target = isAuthenticated ? redirectTo : redirectTo;
27
+ const target = redirectTo;
28
28
  if (location.pathname + location.search !== target) {
29
29
  window.location.replace(target);
30
30
  }
31
- }, [isAuthResolved, isAuthenticated, redirectTo]);
31
+ }, [isAuthResolved, redirectTo]);
32
32
 
33
33
  return (
34
34
  <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
@@ -598,9 +598,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
598
598
  {
599
599
  sessionId: session.sessionId,
600
600
  accessToken: session.accessToken,
601
- // deviceFlow threads the rotating deviceSecret on the runtime object
602
- // even though `SessionLoginResponse` does not type it.
603
- deviceSecret: (session as { deviceSecret?: string }).deviceSecret,
601
+ deviceSecret: session.deviceSecret,
604
602
  deviceId: session.deviceId,
605
603
  expiresAt: session.expiresAt,
606
604
  userId: session.user.id,
@@ -140,9 +140,8 @@ export const useAuthOperations = ({
140
140
  // internally; when the response also carries the zero-cookie device
141
141
  // credential (`deviceId` + `deviceSecret`), persist the durable blob so the
142
142
  // next cold boot re-mints an access token from it. Best-effort — a failed
143
- // persist never fails the sign-in. `SessionLoginResponse` does not type
144
- // `deviceSecret`; read it defensively from the runtime payload.
145
- const deviceSecret = (sessionResponse as { deviceSecret?: string }).deviceSecret;
143
+ // persist never fails the sign-in.
144
+ const deviceSecret = sessionResponse.deviceSecret;
146
145
  if (sessionResponse.deviceId && deviceSecret) {
147
146
  try {
148
147
  await store.save({
@@ -83,7 +83,7 @@ export function useOxyAccountGraph({
83
83
  {
84
84
  sessionId: result.sessionId,
85
85
  accessToken: result.accessToken,
86
- deviceSecret: (result as { deviceSecret?: string }).deviceSecret,
86
+ deviceSecret: result.deviceSecret,
87
87
  deviceId: result.deviceId,
88
88
  expiresAt: result.expiresAt,
89
89
  userId: result.user.id,
@@ -9,7 +9,8 @@ import {
9
9
  TouchableOpacity,
10
10
  } from 'react-native';
11
11
  import { Ionicons } from '@expo/vector-icons';
12
- import type { AccountKind, CreateAccountInput } from '@oxyhq/core';
12
+ import type { AccountKind, CreateAccountInput, OrganizationCategory } from '@oxyhq/core';
13
+ import { ORGANIZATION_CATEGORIES } from '@oxyhq/core';
13
14
  import type { BaseScreenProps } from '../types/navigation';
14
15
  import Header from '../components/Header';
15
16
  import { useI18n } from '../hooks/useI18n';
@@ -72,6 +73,24 @@ const kindDescription = (
72
73
  }
73
74
  };
74
75
 
76
+ const organizationCategoryLabel = (
77
+ t: (key: string, vars?: Record<string, string | number>) => string,
78
+ category: OrganizationCategory,
79
+ ): string => {
80
+ switch (category) {
81
+ case 'agency':
82
+ return t('accounts.organizationCategory.agency') || 'Real estate agency';
83
+ case 'cooperative':
84
+ return t('accounts.organizationCategory.cooperative') || 'Housing cooperative';
85
+ case 'landlord':
86
+ return t('accounts.organizationCategory.landlord') || 'Landlord / property manager';
87
+ default:
88
+ return t('accounts.organizationCategory.other') || 'Other organization';
89
+ }
90
+ };
91
+
92
+ const ORGANIZATION_CATEGORY_OPTIONS: OrganizationCategory[] = [...ORGANIZATION_CATEGORIES];
93
+
75
94
  /**
76
95
  * Create a new account in the unified account graph (an organization, project,
77
96
  * or bot). The caller becomes its owner. Optionally nested under a parent
@@ -90,6 +109,7 @@ const CreateAccountScreen: React.FC<BaseScreenProps> = ({
90
109
  const parentId = typeof parentAccountId === 'string' ? parentAccountId : undefined;
91
110
 
92
111
  const [kind, setKind] = useState<CreatableAccountKind>('project');
112
+ const [organizationCategory, setOrganizationCategory] = useState<OrganizationCategory>('agency');
93
113
  const [username, setUsername] = useState('');
94
114
  const [displayName, setDisplayName] = useState('');
95
115
  const [bio, setBio] = useState('');
@@ -175,6 +195,7 @@ const CreateAccountScreen: React.FC<BaseScreenProps> = ({
175
195
  username,
176
196
  name: { first: firstName, last: lastName },
177
197
  bio: bio.trim() || undefined,
198
+ ...(kind === 'organization' ? { organizationCategory } : null),
178
199
  ...(parentId ? { parentAccountId: parentId } : null),
179
200
  };
180
201
  const account = await createAccount(input);
@@ -197,7 +218,7 @@ const CreateAccountScreen: React.FC<BaseScreenProps> = ({
197
218
  } finally {
198
219
  setIsCreating(false);
199
220
  }
200
- }, [canCreate, kind, username, displayName, bio, parentId, createAccount, switchToAccount, onClose, t]);
221
+ }, [canCreate, kind, organizationCategory, username, displayName, bio, parentId, createAccount, switchToAccount, onClose, t]);
201
222
 
202
223
  // Status icon + color shown alongside the username field message
203
224
  const usernameIsInvalid = usernameStatus === 'taken' || usernameStatus === 'invalid';
@@ -285,6 +306,42 @@ const CreateAccountScreen: React.FC<BaseScreenProps> = ({
285
306
  })}
286
307
  </View>
287
308
 
309
+ {kind === 'organization' ? (
310
+ <View className="gap-space-8">
311
+ <Text className="text-body font-bodyBold text-text">
312
+ {t('accounts.create.organizationCategory.label') || 'Organization type'}
313
+ </Text>
314
+ <View className="flex-row flex-wrap gap-space-8">
315
+ {ORGANIZATION_CATEGORY_OPTIONS.map((option) => {
316
+ const selected = option === organizationCategory;
317
+ return (
318
+ <TouchableOpacity
319
+ key={option}
320
+ accessibilityRole="radio"
321
+ accessibilityState={{ selected }}
322
+ accessibilityLabel={organizationCategoryLabel(t, option)}
323
+ onPress={() => setOrganizationCategory(option)}
324
+ activeOpacity={0.7}
325
+ className="px-space-12 py-space-8 rounded-radius-full"
326
+ style={{
327
+ backgroundColor: selected ? bloomTheme.colors.primarySubtle : bloomTheme.colors.card,
328
+ borderWidth: 1,
329
+ borderColor: selected ? bloomTheme.colors.primary : bloomTheme.colors.border,
330
+ }}
331
+ >
332
+ <Text
333
+ className="text-caption font-captionBold"
334
+ style={{ color: selected ? bloomTheme.colors.primary : bloomTheme.colors.text }}
335
+ >
336
+ {organizationCategoryLabel(t, option)}
337
+ </Text>
338
+ </TouchableOpacity>
339
+ );
340
+ })}
341
+ </View>
342
+ </View>
343
+ ) : null}
344
+
288
345
  {/* Form Content */}
289
346
  <View className="gap-space-16 p-space-16 rounded-radius-20 bg-fill">
290
347
  {/* Username */}
@@ -97,5 +97,34 @@ function stripOAuthParamsFromUrl(): void {
97
97
  const url = new URL(location.href);
98
98
  url.searchParams.delete('code');
99
99
  url.searchParams.delete('state');
100
+ url.searchParams.delete('error');
101
+ url.searchParams.delete('error_description');
102
+ url.searchParams.delete('hub_sync');
100
103
  history.replaceState(history.state, '', `${url.pathname}${url.search}${url.hash}`);
101
104
  }
105
+
106
+ /**
107
+ * When auth.oxy.so hub-sync redeem fails, the IdP redirects back with
108
+ * `?hub_sync=failed`. Strip the param and log so cold boot can continue
109
+ * without leaving a stale query string.
110
+ */
111
+ export function consumeHubSyncFailure(): boolean {
112
+ if (!isWebBrowser()) return false;
113
+ const location = (globalThis as { location?: Location; history?: History }).location;
114
+ const history = (globalThis as { history?: History }).history;
115
+ if (!location) return false;
116
+
117
+ const params = new URLSearchParams(location.search);
118
+ if (params.get('hub_sync') !== 'failed') return false;
119
+
120
+ logger.warn('Hub sync failed — IdP device session may be out of sync', {
121
+ component: 'hubSync',
122
+ });
123
+
124
+ if (history?.replaceState) {
125
+ const url = new URL(location.href);
126
+ url.searchParams.delete('hub_sync');
127
+ history.replaceState(history.state, '', `${url.pathname}${url.search}${url.hash}`);
128
+ }
129
+ return true;
130
+ }