jazz-tools 0.18.16 → 0.18.18

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 (112) hide show
  1. package/.svelte-kit/__package__/jazz.class.svelte.d.ts +14 -0
  2. package/.svelte-kit/__package__/jazz.class.svelte.d.ts.map +1 -1
  3. package/.svelte-kit/__package__/jazz.class.svelte.js +37 -0
  4. package/.svelte-kit/__package__/media/image.svelte +104 -98
  5. package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
  6. package/.svelte-kit/__package__/testing.d.ts +1 -1
  7. package/.svelte-kit/__package__/testing.d.ts.map +1 -1
  8. package/.svelte-kit/__package__/testing.js +1 -1
  9. package/.svelte-kit/__package__/tests/TestConnectionStatus.svelte +8 -0
  10. package/.svelte-kit/__package__/tests/TestConnectionStatus.svelte.d.ts +27 -0
  11. package/.svelte-kit/__package__/tests/TestConnectionStatus.svelte.d.ts.map +1 -0
  12. package/.svelte-kit/__package__/tests/media/image.svelte.test.js +16 -2
  13. package/.svelte-kit/__package__/tests/sync-connection-status.svelte.test.d.ts +2 -0
  14. package/.svelte-kit/__package__/tests/sync-connection-status.svelte.test.d.ts.map +1 -0
  15. package/.svelte-kit/__package__/tests/sync-connection-status.svelte.test.js +47 -0
  16. package/.turbo/turbo-build.log +52 -52
  17. package/CHANGELOG.md +27 -0
  18. package/dist/browser/BrowserContextManager.d.ts +4 -0
  19. package/dist/browser/BrowserContextManager.d.ts.map +1 -1
  20. package/dist/browser/createBrowserContext.d.ts +4 -0
  21. package/dist/browser/createBrowserContext.d.ts.map +1 -1
  22. package/dist/browser/index.js +36 -4
  23. package/dist/browser/index.js.map +1 -1
  24. package/dist/{chunk-GRN6OAUX.js → chunk-FHRKDKDY.js} +80 -6
  25. package/dist/chunk-FHRKDKDY.js.map +1 -0
  26. package/dist/index.js +1 -1
  27. package/dist/react/hooks.d.ts +1 -1
  28. package/dist/react/hooks.d.ts.map +1 -1
  29. package/dist/react/index.d.ts +1 -1
  30. package/dist/react/index.d.ts.map +1 -1
  31. package/dist/react/index.js +6 -2
  32. package/dist/react/index.js.map +1 -1
  33. package/dist/react/media/image.d.ts.map +1 -1
  34. package/dist/react-core/hooks.d.ts +26 -0
  35. package/dist/react-core/hooks.d.ts.map +1 -1
  36. package/dist/react-core/index.js +16 -1
  37. package/dist/react-core/index.js.map +1 -1
  38. package/dist/react-core/testing.d.ts +1 -1
  39. package/dist/react-core/testing.d.ts.map +1 -1
  40. package/dist/react-core/testing.js +3 -1
  41. package/dist/react-core/testing.js.map +1 -1
  42. package/dist/react-core/tests/useSyncConnectionStatus.test.d.ts +2 -0
  43. package/dist/react-core/tests/useSyncConnectionStatus.test.d.ts.map +1 -0
  44. package/dist/react-native-core/ReactNativeContextManager.d.ts +4 -0
  45. package/dist/react-native-core/ReactNativeContextManager.d.ts.map +1 -1
  46. package/dist/react-native-core/hooks.d.ts +1 -1
  47. package/dist/react-native-core/hooks.d.ts.map +1 -1
  48. package/dist/react-native-core/index.js +41 -7
  49. package/dist/react-native-core/index.js.map +1 -1
  50. package/dist/react-native-core/media/image.d.ts.map +1 -1
  51. package/dist/react-native-core/platform.d.ts +4 -0
  52. package/dist/react-native-core/platform.d.ts.map +1 -1
  53. package/dist/svelte/jazz.class.svelte.d.ts +14 -0
  54. package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
  55. package/dist/svelte/jazz.class.svelte.js +37 -0
  56. package/dist/svelte/media/image.svelte +104 -98
  57. package/dist/svelte/media/image.svelte.d.ts.map +1 -1
  58. package/dist/svelte/testing.d.ts +1 -1
  59. package/dist/svelte/testing.d.ts.map +1 -1
  60. package/dist/svelte/testing.js +1 -1
  61. package/dist/svelte/tests/TestConnectionStatus.svelte +8 -0
  62. package/dist/svelte/tests/TestConnectionStatus.svelte.d.ts +27 -0
  63. package/dist/svelte/tests/TestConnectionStatus.svelte.d.ts.map +1 -0
  64. package/dist/svelte/tests/media/image.svelte.test.js +16 -2
  65. package/dist/svelte/tests/sync-connection-status.svelte.test.d.ts +2 -0
  66. package/dist/svelte/tests/sync-connection-status.svelte.test.d.ts.map +1 -0
  67. package/dist/svelte/tests/sync-connection-status.svelte.test.js +47 -0
  68. package/dist/testing.js +34 -4
  69. package/dist/testing.js.map +1 -1
  70. package/dist/tools/implementation/ContextManager.d.ts +4 -0
  71. package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
  72. package/dist/tools/implementation/refs.d.ts +1 -1
  73. package/dist/tools/implementation/refs.d.ts.map +1 -1
  74. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +4 -0
  75. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
  76. package/dist/tools/subscribe/SubscriptionScope.d.ts +7 -0
  77. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  78. package/dist/tools/subscribe/index.d.ts.map +1 -1
  79. package/dist/tools/testing.d.ts +8 -0
  80. package/dist/tools/testing.d.ts.map +1 -1
  81. package/dist/tools/types.d.ts +4 -0
  82. package/dist/tools/types.d.ts.map +1 -1
  83. package/package.json +4 -4
  84. package/src/browser/createBrowserContext.ts +34 -4
  85. package/src/react/hooks.tsx +1 -0
  86. package/src/react/index.ts +1 -0
  87. package/src/react/media/image.tsx +2 -0
  88. package/src/react/tests/media/image.test.tsx +20 -2
  89. package/src/react-core/hooks.ts +42 -0
  90. package/src/react-core/testing.tsx +1 -0
  91. package/src/react-core/tests/useAccountWithSelector.test.ts +98 -2
  92. package/src/react-core/tests/useSyncConnectionStatus.test.ts +48 -0
  93. package/src/react-native-core/hooks.tsx +1 -0
  94. package/src/react-native-core/media/image.tsx +4 -1
  95. package/src/react-native-core/platform.ts +32 -4
  96. package/src/svelte/jazz.class.svelte.ts +44 -0
  97. package/src/svelte/media/image.svelte +104 -98
  98. package/src/svelte/testing.ts +1 -0
  99. package/src/svelte/tests/TestConnectionStatus.svelte +8 -0
  100. package/src/svelte/tests/media/image.svelte.test.ts +18 -2
  101. package/src/svelte/tests/sync-connection-status.svelte.test.ts +61 -0
  102. package/src/tools/implementation/ContextManager.ts +8 -0
  103. package/src/tools/implementation/refs.ts +27 -3
  104. package/src/tools/subscribe/CoValueCoreSubscription.ts +14 -0
  105. package/src/tools/subscribe/SubscriptionScope.ts +67 -2
  106. package/src/tools/subscribe/index.ts +8 -0
  107. package/src/tools/testing.ts +29 -0
  108. package/src/tools/tests/ContextManager.test.ts +2 -2
  109. package/src/tools/tests/coMap.test.ts +42 -0
  110. package/src/tools/tests/subscribe.test.ts +1 -4
  111. package/src/tools/types.ts +4 -0
  112. package/dist/chunk-GRN6OAUX.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ContextManager.d.ts","sourceRoot":"","sources":["../../../src/tools/implementation/ContextManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ContextManager.d.ts","sourceRoot":"","sources":["../../../src/tools/implementation/ContextManager.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type Account } from "../coValues/account.js";
2
- import type { AnonymousJazzAgent, CoValue, ID, RefEncoded } from "../internal.js";
2
+ import { AnonymousJazzAgent, CoValue, ID, RefEncoded } from "../internal.js";
3
3
  export declare class Ref<out V extends CoValue> {
4
4
  readonly id: ID<V>;
5
5
  readonly controlledAccount: Account | AnonymousJazzAgent;
@@ -1 +1 @@
1
- {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../../src/tools/implementation/refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EACV,kBAAkB,EAClB,OAAO,EACP,EAAE,EACF,UAAU,EACX,MAAM,gBAAgB,CAAC;AAOxB,qBAAa,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,OAAO;IAElC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAClB,QAAQ,CAAC,iBAAiB,EAAE,OAAO,GAAG,kBAAkB;IACxD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO;gBAHf,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EACT,iBAAiB,EAAE,OAAO,GAAG,kBAAkB,EAC/C,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,MAAM,EAAE,OAAO;IAOpB,IAAI,IAAI,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAiC/B,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAEhC;CACF;AAED,wBAAgB,QAAQ,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EACnD,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,SAAS,EACnD,cAAc,EAAE,MAAM,IAAI,EAAE,EAC5B,iBAAiB,EAAE,OAAO,GAAG,kBAAkB,EAC/C,eAAe,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,UAAU,CAAC,OAAO,CAAC,GAClD;KAAG,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;CAAE,GAAG;IACjC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;CAChB,CAgDA;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,OAAO,GACxD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACnB,KAAK,CAAC"}
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../../src/tools/implementation/refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACL,kBAAkB,EAClB,OAAO,EACP,EAAE,EACF,UAAU,EAEX,MAAM,gBAAgB,CAAC;AAOxB,qBAAa,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,OAAO;IAElC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAClB,QAAQ,CAAC,iBAAiB,EAAE,OAAO,GAAG,kBAAkB;IACxD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO;gBAHf,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EACT,iBAAiB,EAAE,OAAO,GAAG,kBAAkB,EAC/C,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,MAAM,EAAE,OAAO;IAOpB,IAAI,IAAI,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAwD/B,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAEhC;CACF;AAED,wBAAgB,QAAQ,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EACnD,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,SAAS,EACnD,cAAc,EAAE,MAAM,IAAI,EAAE,EAC5B,iBAAiB,EAAE,OAAO,GAAG,kBAAkB,EAC/C,eAAe,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,UAAU,CAAC,OAAO,CAAC,GAClD;KAAG,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;CAAE,GAAG;IACjC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;CAChB,CAgDA;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,OAAO,GACxD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACnB,KAAK,CAAC"}
@@ -16,6 +16,10 @@ export declare class CoValueCoreSubscription {
16
16
  private listener;
17
17
  private skipRetry?;
18
18
  constructor(localNode: LocalNode, id: string, listener: (value: RawCoValue | "unavailable") => void, skipRetry?: boolean, branch?: BranchDefinition);
19
+ /**
20
+ * Rehydrates the subscription by resetting the unsubscribed flag and initializing the subscription again
21
+ */
22
+ pullValue(): void;
19
23
  /**
20
24
  * Main entry point for subscription initialization.
21
25
  * Determines the subscription strategy based on current availability and branch requirements.
@@ -1 +1 @@
1
- {"version":3,"file":"CoValueCoreSubscription.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/CoValueCoreSubscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EAET,UAAU,EACX,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;GAKG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,aAAa,CAAC,CAAU;IAChC,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,SAAS,CAAC,CAAU;gBAG1B,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,KAAK,IAAI,EACrD,SAAS,CAAC,EAAE,OAAO,EACnB,MAAM,CAAC,EAAE,gBAAgB;IAY3B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAsBnB;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA6BpC;;;OAGG;IACH,OAAO,CAAC,SAAS;IASjB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAM7C;;;OAGG;IACH,WAAW,IAAI,IAAI;CAKpB"}
1
+ {"version":3,"file":"CoValueCoreSubscription.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/CoValueCoreSubscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EAET,UAAU,EACX,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;GAKG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,aAAa,CAAC,CAAU;IAChC,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,SAAS,CAAC,CAAU;gBAG1B,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,KAAK,IAAI,EACrD,SAAS,CAAC,EAAE,OAAO,EACnB,MAAM,CAAC,EAAE,gBAAgB;IAY3B;;OAEG;IACH,SAAS;IAWT;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAsBnB;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA6BpC;;;OAGG;IACH,OAAO,CAAC,SAAS;IASjB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAM7C;;;OAGG;IACH,WAAW,IAAI,IAAI;CAKpB"}
@@ -34,6 +34,7 @@ export declare class SubscriptionScope<D extends CoValue> {
34
34
  totalValidTransactions: number;
35
35
  migrated: boolean;
36
36
  migrating: boolean;
37
+ closed: boolean;
37
38
  silenceUpdates: boolean;
38
39
  constructor(node: LocalNode, resolve: RefsToResolve<D>, id: ID<D>, schema: RefEncoded<D>, skipRetry?: boolean, bestEffortResolution?: boolean, unstable_branch?: BranchDefinition | undefined);
39
40
  updateValue(value: SubscriptionValue<D, any>): void;
@@ -50,6 +51,12 @@ export declare class SubscriptionScope<D extends CoValue> {
50
51
  setListener(listener: (value: SubscriptionValue<D, any>) => void): void;
51
52
  subscribeToKey(key: string): void;
52
53
  isSubscribedToId(id: string): boolean;
54
+ /**
55
+ * Checks if the currently unloaded value has got some updates
56
+ *
57
+ * Used to make the autoload work on closed subscription scopes
58
+ */
59
+ pullValue(listener: (value: SubscriptionValue<D, any>) => void): void;
53
60
  subscribeToId(id: string, descriptor: RefEncoded<any>): void;
54
61
  loadChildren(): boolean;
55
62
  loadCoMapKey(map: CoMap, key: string, depth: Record<string, any> | true): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriptionScope.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/SubscriptionScope.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SubscriptionScope.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/SubscriptionScope.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAgB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,CAAC,qDAwB/D;AAED,yBAAyB;AAEzB;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,OAeZ;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,OAAO,EAC/C,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,OAa5B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAgB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,CAAC,qDA0B/D;AAED,yBAAyB;AAEzB;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,OAqBZ;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,OAAO,EAC/C,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,OAa5B"}
@@ -25,6 +25,12 @@ export declare function runWithoutActiveAccount<Result>(callback: () => Result):
25
25
  export declare function createJazzTestGuest(): Promise<{
26
26
  guest: AnonymousJazzAgent;
27
27
  }>;
28
+ export declare class MockConnectionStatus {
29
+ static connected: boolean;
30
+ static connectionListeners: Set<(isConnected: boolean) => void>;
31
+ static setIsConnected(isConnected: boolean): void;
32
+ static addConnectionListener(listener: (isConnected: boolean) => void): () => void;
33
+ }
28
34
  export type TestJazzContextManagerProps<Acc extends Account> = JazzContextManagerBaseProps<Acc> & {
29
35
  defaultProfileName?: string;
30
36
  AccountSchema?: AccountClass<Acc> & CoValueFromRaw<Acc>;
@@ -47,6 +53,8 @@ export declare class TestJazzContextManager<Acc extends Account> extends JazzCon
47
53
  node: LocalNode;
48
54
  done: () => void;
49
55
  logOut: () => Promise<void>;
56
+ addConnectionListener: (listener: (isConnected: boolean) => void) => () => void;
57
+ connected: () => boolean;
50
58
  }>;
51
59
  }
52
60
  export declare function linkAccounts(a: Account, b: Account, aRole?: "server" | "client", bRole?: "server" | "client"): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/tools/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,kBAAkB,EAEvB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAM5B,MAAM,eAAe,CAAC;AAOvB,qBAAa,YAAa,SAAQ,YAAY;WAC/B,MAAM;CAoBpB;AAED,wBAAgB,gCAAgC,0BAiC/C;AAKD,wBAAsB,qBAAqB,CACzC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,iBAAiB,EACrB,OAAO,CAAC,EAAE;IACV,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAuD/B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,QAEhD;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAC5C,QAAQ,EAAE,MAAM,MAAM,GACrB,MAAM,CAcR;AAED,wBAAsB,mBAAmB;;GASxC;AAED,MAAM,MAAM,2BAA2B,CAAC,GAAG,SAAS,OAAO,IACzD,2BAA2B,CAAC,GAAG,CAAC,GAAG;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEJ,qBAAa,sBAAsB,CACjC,GAAG,SAAS,OAAO,CACnB,SAAQ,kBAAkB,CAAC,GAAG,EAAE,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,CAAC,kBAAkB,CAAC,GAAG,SAAS,OAAO,EAC3C,OAAO,CAAC,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,EAC7C,KAAK,CAAC,EAAE,2BAA2B,CAAC,GAAG,CAAC;IAS1C,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS,OAAO,EACpC,OAAO,EAAE,GAAG,EACZ,KAAK,CAAC,EAAE,2BAA2B,CAAC,GAAG,CAAC;IA0C1C,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,OAAO,EAClC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,EACxC,KAAK,GAAE,2BAA2B,CAAC,GAAG,CAAM;IAmBxC,aAAa,CACjB,KAAK,EAAE,2BAA2B,CAAC,GAAG,CAAC,EACvC,SAAS,CAAC,EAAE,2BAA2B;;uBA2EqpO,cAAc;;;;;;;;CA7C7sO;AAED,wBAAsB,YAAY,CAChC,CAAC,EAAE,OAAO,EACV,CAAC,EAAE,OAAO,EACV,KAAK,GAAE,QAAQ,GAAG,QAAmB,EACrC,KAAK,GAAE,QAAQ,GAAG,QAAmB,iBAgBtC;AAED,wBAAsB,iBAAiB,CAAC,EACtC,UAAkB,GACnB,GAAE;IACD,UAAU,CAAC,EAAE,OAAO,CAAC;CACjB,oBAgBL"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/tools/testing.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,8 @@ export type JazzAuthContext<Acc extends Account> = {
19
19
  logOut: () => Promise<void>;
20
20
  done: () => void;
21
21
  isAuthenticated?: boolean;
22
+ addConnectionListener: (listener: (connected: boolean) => void) => () => void;
23
+ connected: () => boolean;
22
24
  };
23
25
  export type JazzGuestContext = {
24
26
  guest: AnonymousJazzAgent;
@@ -28,6 +30,8 @@ export type JazzGuestContext = {
28
30
  logOut: () => void;
29
31
  done: () => void;
30
32
  isAuthenticated?: boolean;
33
+ addConnectionListener: (listener: (connected: boolean) => void) => () => void;
34
+ connected: () => boolean;
31
35
  };
32
36
  export type JazzContextType<Acc extends Account> = JazzAuthContext<Acc> | JazzGuestContext;
33
37
  export type NewAccountProps = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,MAAM,CAAC;CAC/E,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,CACxC,WAAW,EAAE,eAAe,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,uBAAuB,GAAG,CACpC,aAAa,EAAE,WAAW,EAC1B,aAAa,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAE1B,iCAAiC;AACjC,MAAM,MAAM,eAAe,CAAC,GAAG,SAAS,OAAO,IAAI;IACjD,EAAE,EAAE,GAAG,CAAC;IACR,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,2BAA2B,CAAC;IAC1C,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,2BAA2B,CAAC;IAC1C,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,GAAG,SAAS,OAAO,IAC3C,eAAe,CAAC,GAAG,CAAC,GACpB,gBAAgB,CAAC;AAErB,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,MAAM,EAAE,CAAC;IAC3C,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC9B,GACD;IACE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,MAAM,EAAE,CAAC;IAC5C,IAAI,EAAE,OAAO,CAAC;CACf,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,MAAM,CAAC;CAC/E,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,CACxC,WAAW,EAAE,eAAe,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,uBAAuB,GAAG,CACpC,aAAa,EAAE,WAAW,EAC1B,aAAa,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAE1B,iCAAiC;AACjC,MAAM,MAAM,eAAe,CAAC,GAAG,SAAS,OAAO,IAAI;IACjD,EAAE,EAAE,GAAG,CAAC;IACR,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,2BAA2B,CAAC;IAC1C,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAC9E,SAAS,EAAE,MAAM,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,2BAA2B,CAAC;IAC1C,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAC9E,SAAS,EAAE,MAAM,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,GAAG,SAAS,OAAO,IAC3C,eAAe,CAAC,GAAG,CAAC,GACpB,gBAAgB,CAAC;AAErB,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,MAAM,EAAE,CAAC;IAC3C,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC9B,GACD;IACE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,MAAM,EAAE,CAAC;IAC5C,IAAI,EAAE,OAAO,CAAC;CACf,CAAC"}
package/package.json CHANGED
@@ -177,7 +177,7 @@
177
177
  },
178
178
  "type": "module",
179
179
  "license": "MIT",
180
- "version": "0.18.16",
180
+ "version": "0.18.18",
181
181
  "dependencies": {
182
182
  "@manuscripts/prosemirror-recreate-steps": "^0.1.4",
183
183
  "@scure/base": "1.2.1",
@@ -194,9 +194,9 @@
194
194
  "prosemirror-transform": "^1.9.0",
195
195
  "use-sync-external-store": "^1.5.0",
196
196
  "zod": "3.25.76",
197
- "cojson": "0.18.16",
198
- "cojson-storage-indexeddb": "0.18.16",
199
- "cojson-transport-ws": "0.18.16"
197
+ "cojson": "0.18.18",
198
+ "cojson-storage-indexeddb": "0.18.18",
199
+ "cojson-transport-ws": "0.18.18"
200
200
  },
201
201
  "devDependencies": {
202
202
  "@scure/bip39": "^1.3.0",
@@ -59,6 +59,8 @@ async function setupPeers(options: BaseBrowserContextOptions) {
59
59
 
60
60
  if (options.sync.when === "never") {
61
61
  return {
62
+ addConnectionListener: () => () => {},
63
+ connected: () => false,
62
64
  toggleNetwork: () => {},
63
65
  peersToLoadFrom,
64
66
  storage,
@@ -100,6 +102,16 @@ async function setupPeers(options: BaseBrowserContextOptions) {
100
102
 
101
103
  return {
102
104
  toggleNetwork,
105
+ addConnectionListener(listener: (connected: boolean) => void) {
106
+ wsPeer.subscribe(listener);
107
+
108
+ return () => {
109
+ wsPeer.unsubscribe(listener);
110
+ };
111
+ },
112
+ connected() {
113
+ return wsPeer.connected;
114
+ },
103
115
  peersToLoadFrom,
104
116
  storage,
105
117
  setNode,
@@ -110,8 +122,15 @@ async function setupPeers(options: BaseBrowserContextOptions) {
110
122
  export async function createJazzBrowserGuestContext(
111
123
  options: BaseBrowserContextOptions,
112
124
  ) {
113
- const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =
114
- await setupPeers(options);
125
+ const {
126
+ toggleNetwork,
127
+ peersToLoadFrom,
128
+ setNode,
129
+ crypto,
130
+ storage,
131
+ addConnectionListener,
132
+ connected,
133
+ } = await setupPeers(options);
115
134
 
116
135
  const context = await createAnonymousJazzContext({
117
136
  crypto,
@@ -134,6 +153,8 @@ export async function createJazzBrowserGuestContext(
134
153
  logOut: () => {
135
154
  return context.logOut();
136
155
  },
156
+ addConnectionListener,
157
+ connected,
137
158
  };
138
159
  }
139
160
 
@@ -153,8 +174,15 @@ export async function createJazzBrowserContext<
153
174
  | (AccountClass<Account> & CoValueFromRaw<Account>)
154
175
  | AnyAccountSchema,
155
176
  >(options: BrowserContextOptions<S>) {
156
- const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =
157
- await setupPeers(options);
177
+ const {
178
+ toggleNetwork,
179
+ peersToLoadFrom,
180
+ setNode,
181
+ crypto,
182
+ storage,
183
+ addConnectionListener,
184
+ connected,
185
+ } = await setupPeers(options);
158
186
 
159
187
  let unsubscribeAuthUpdate = () => {};
160
188
 
@@ -202,6 +230,8 @@ export async function createJazzBrowserContext<
202
230
  unsubscribeAuthUpdate();
203
231
  return context.logOut();
204
232
  },
233
+ addConnectionListener,
234
+ connected,
205
235
  };
206
236
  }
207
237
 
@@ -52,4 +52,5 @@ export {
52
52
  useAccount,
53
53
  useCoStateWithSelector,
54
54
  useAccountWithSelector,
55
+ useSyncConnectionStatus,
55
56
  } from "jazz-tools/react-core";
@@ -9,6 +9,7 @@ export {
9
9
  useAuthSecretStorage,
10
10
  useCoStateWithSelector,
11
11
  useAccountWithSelector,
12
+ useSyncConnectionStatus,
12
13
  } from "./hooks.js";
13
14
 
14
15
  export { createInviteLink, parseInviteLink } from "jazz-tools/browser";
@@ -140,6 +140,8 @@ export const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(
140
140
  return lazyPlaceholder;
141
141
  }
142
142
 
143
+ if (image === undefined)
144
+ return "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
143
145
  if (!image) return undefined;
144
146
 
145
147
  const bestImage = highestResAvailable(
@@ -13,17 +13,35 @@ describe("Image", async () => {
13
13
  vi.spyOn(Account, "getMe").mockReturnValue(account);
14
14
 
15
15
  describe("initial rendering", () => {
16
- it("should render nothing if coValue is not found", async () => {
16
+ it("should render a blank placeholder while waiting for the coValue to load", async () => {
17
17
  const { container } = render(
18
18
  <Image imageId="co_zMTubMby3QiKDYnW9e2BEXW7Xaq" alt="test" />,
19
19
  { account },
20
20
  );
21
+
21
22
  const img = container.querySelector("img");
22
23
  expect(img).toBeDefined();
23
24
  expect(img!.getAttribute("width")).toBe(null);
24
25
  expect(img!.getAttribute("height")).toBe(null);
25
26
  expect(img!.alt).toBe("test");
26
- expect(img!.src).toBe("");
27
+ expect(img!.src).toBe(
28
+ "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",
29
+ );
30
+ });
31
+
32
+ it("should render nothing if coValue is not found", async () => {
33
+ const { container } = render(
34
+ <Image imageId="co_zMTubMby3QiKDYnW9e2BEXW7Xaq" alt="test" />,
35
+ { account },
36
+ );
37
+ await waitFor(() => {
38
+ const img = container.querySelector("img");
39
+ expect(img).toBeDefined();
40
+ expect(img!.getAttribute("width")).toBe(null);
41
+ expect(img!.getAttribute("height")).toBe(null);
42
+ expect(img!.alt).toBe("test");
43
+ expect(img!.src).toBe("");
44
+ });
27
45
  });
28
46
 
29
47
  it("should render an empty image if the image is not loaded yet", async () => {
@@ -719,6 +719,22 @@ export function useAccountWithSelector<
719
719
  select: (account: Loaded<A, R> | undefined | null) => TSelectorReturn;
720
720
  /** Equality function to determine if the selected value has changed, defaults to `Object.is` */
721
721
  equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;
722
+ /**
723
+ * Create or load a branch for isolated editing.
724
+ *
725
+ * Branching lets you take a snapshot of the current state and start modifying it without affecting the canonical/shared version.
726
+ * It's a fork of your data graph: the same schema, but with diverging values.
727
+ *
728
+ * The checkout of the branch is applied on all the resolved values.
729
+ *
730
+ * @param name - A unique name for the branch. This identifies the branch
731
+ * and can be used to switch between different branches of the same CoValue.
732
+ * @param owner - The owner of the branch. Determines who can access and modify
733
+ * the branch. If not provided, the branch is owned by the current user.
734
+ *
735
+ * For more info see the [branching](https://jazz.tools/docs/react/using-covalues/version-control) documentation.
736
+ */
737
+ unstable_branch?: BranchDefinition;
722
738
  },
723
739
  ): TSelectorReturn {
724
740
  const subscription = useAccountSubscription(AccountSchema, options);
@@ -783,3 +799,29 @@ export function experimental_useInboxSender<
783
799
 
784
800
  return sendMessage;
785
801
  }
802
+
803
+ /**
804
+ * Hook that returns the current connection status to the Jazz sync server.
805
+ *
806
+ * @returns `true` when connected to the server, `false` when disconnected
807
+ *
808
+ * @remarks
809
+ * On connection drop, this hook will return `false` only when Jazz detects the disconnection
810
+ * after 5 seconds of not receiving a ping from the server.
811
+ */
812
+ export function useSyncConnectionStatus() {
813
+ const context = useJazzContext();
814
+
815
+ const connected = useSyncExternalStore(
816
+ useCallback(
817
+ (callback) => {
818
+ return context.addConnectionListener(callback);
819
+ },
820
+ [context],
821
+ ),
822
+ () => context.connected(),
823
+ () => context.connected(),
824
+ );
825
+
826
+ return connected;
827
+ }
@@ -39,4 +39,5 @@ export {
39
39
  linkAccounts,
40
40
  setActiveAccount,
41
41
  setupJazzTestSync,
42
+ MockConnectionStatus,
42
43
  } from "jazz-tools/testing";
@@ -1,7 +1,7 @@
1
1
  // @vitest-environment happy-dom
2
2
 
3
- import { Account, RefsToResolve, co, z } from "jazz-tools";
4
- import { beforeEach, describe, expect, it } from "vitest";
3
+ import { Account, RefsToResolve, co, z, Group } from "jazz-tools";
4
+ import { assert, beforeEach, describe, expect, it } from "vitest";
5
5
  import { useAccountWithSelector, useJazzContextManager } from "../hooks.js";
6
6
  import { useIsAuthenticated } from "../index.js";
7
7
  import {
@@ -408,4 +408,100 @@ describe("useAccountWithSelector", () => {
408
408
 
409
409
  expect(result.current.result).toEqual("initial-suffix2");
410
410
  });
411
+
412
+ it("should work with branches - create branch, edit and merge", async () => {
413
+ const AccountRoot = co.map({
414
+ name: z.string(),
415
+ age: z.number(),
416
+ email: z.string(),
417
+ });
418
+
419
+ const AccountSchema = co
420
+ .account({
421
+ root: AccountRoot,
422
+ profile: co.profile(),
423
+ })
424
+ .withMigration((account, creationProps) => {
425
+ if (!account.$jazz.refs.root) {
426
+ account.$jazz.set("root", {
427
+ name: "John Doe",
428
+ age: 30,
429
+ email: "john@example.com",
430
+ });
431
+ }
432
+ });
433
+
434
+ const account = await createJazzTestAccount({
435
+ AccountSchema,
436
+ isCurrentActiveAccount: true,
437
+ });
438
+
439
+ const group = Group.create();
440
+ group.addMember("everyone", "writer");
441
+ const { result } = renderHook(
442
+ () => {
443
+ const branchAccountRoot = useAccountWithSelector(AccountSchema, {
444
+ resolve: {
445
+ root: true,
446
+ },
447
+ select: (account) => account?.root,
448
+ unstable_branch: { name: "feature-branch" },
449
+ });
450
+
451
+ const mainAccountRoot = useAccountWithSelector(AccountSchema, {
452
+ resolve: {
453
+ root: true,
454
+ },
455
+ select: (account) => account?.root,
456
+ });
457
+
458
+ return {
459
+ branchAccountRoot,
460
+ mainAccountRoot,
461
+ };
462
+ },
463
+ {
464
+ account,
465
+ },
466
+ );
467
+
468
+ await act(async () => {
469
+ // Wait for the account to be loaded
470
+ await new Promise((resolve) => setTimeout(resolve, 10));
471
+ });
472
+
473
+ expect(result.current).not.toBeNull();
474
+
475
+ const branchAccountRoot = result.current.branchAccountRoot;
476
+ const mainAccountRoot = result.current.mainAccountRoot;
477
+
478
+ assert(branchAccountRoot);
479
+ assert(mainAccountRoot);
480
+
481
+ act(() => {
482
+ branchAccountRoot.$jazz.applyDiff({
483
+ name: "John Smith",
484
+ age: 31,
485
+ email: "john.smith@example.com",
486
+ });
487
+ });
488
+
489
+ // Verify the branch has the changes
490
+ expect(branchAccountRoot.name).toBe("John Smith");
491
+ expect(branchAccountRoot.age).toBe(31);
492
+ expect(branchAccountRoot.email).toBe("john.smith@example.com");
493
+
494
+ // Verify the original is unchanged
495
+ expect(mainAccountRoot.name).toBe("John Doe");
496
+ expect(mainAccountRoot.age).toBe(30);
497
+ expect(mainAccountRoot.email).toBe("john@example.com");
498
+
499
+ // Merge the branch back
500
+ branchAccountRoot.$jazz.unstable_merge();
501
+
502
+ // Verify the original now has the merged changes
503
+ expect(mainAccountRoot.name).toBe("John Smith");
504
+ expect(mainAccountRoot.age).toBe(31);
505
+ expect(mainAccountRoot.email).toBe("john.smith@example.com");
506
+ });
411
507
  });
@@ -0,0 +1,48 @@
1
+ // @vitest-environment happy-dom
2
+
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { useSyncConnectionStatus } from "../hooks";
5
+ import {
6
+ createJazzTestAccount,
7
+ setupJazzTestSync,
8
+ MockConnectionStatus,
9
+ } from "../testing";
10
+ import { act, cleanup, renderHook } from "./testUtils";
11
+
12
+ describe("useSyncConnectionStatus", () => {
13
+ beforeEach(async () => {
14
+ await setupJazzTestSync();
15
+ await createJazzTestAccount({
16
+ isCurrentActiveAccount: true,
17
+ });
18
+ });
19
+
20
+ afterEach(() => {
21
+ vi.clearAllMocks();
22
+ cleanup();
23
+ });
24
+
25
+ it("should return true by default in the test environment", () => {
26
+ const { result } = renderHook(() => useSyncConnectionStatus());
27
+
28
+ expect(result.current).toBe(true);
29
+ });
30
+
31
+ it("should handle updates", async () => {
32
+ const { result } = renderHook(() => useSyncConnectionStatus());
33
+
34
+ expect(result.current).toBe(true);
35
+
36
+ act(() => {
37
+ MockConnectionStatus.setIsConnected(false);
38
+ });
39
+
40
+ expect(result.current).toBe(false);
41
+
42
+ act(() => {
43
+ MockConnectionStatus.setIsConnected(true);
44
+ });
45
+
46
+ expect(result.current).toBe(true);
47
+ });
48
+ });
@@ -15,6 +15,7 @@ export {
15
15
  useAccount,
16
16
  useCoStateWithSelector,
17
17
  useAccountWithSelector,
18
+ useSyncConnectionStatus,
18
19
  } from "jazz-tools/react-core";
19
20
 
20
21
  export function useAcceptInviteNative<S extends CoValueClassOrSchema>({
@@ -69,7 +69,10 @@ export const Image = forwardRef<RNImage, ImageProps>(function Image(
69
69
  ref,
70
70
  ) {
71
71
  const image = useCoState(ImageDefinition, imageId);
72
- const [src, setSrc] = useState<string | undefined>(image?.placeholderDataURL);
72
+ const [src, setSrc] = useState<string | undefined>(
73
+ image?.placeholderDataURL ??
74
+ "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",
75
+ );
73
76
 
74
77
  const dimensions: { width: number | undefined; height: number | undefined } =
75
78
  useMemo(() => {
@@ -56,6 +56,8 @@ async function setupPeers(options: BaseReactNativeContextOptions) {
56
56
  if (options.sync.when === "never") {
57
57
  return {
58
58
  toggleNetwork: () => {},
59
+ addConnectionListener: () => () => {},
60
+ connected: () => false,
59
61
  peersToLoadFrom,
60
62
  setNode: () => {},
61
63
  crypto,
@@ -96,6 +98,14 @@ async function setupPeers(options: BaseReactNativeContextOptions) {
96
98
 
97
99
  return {
98
100
  toggleNetwork,
101
+ addConnectionListener(listener: (connected: boolean) => void) {
102
+ wsPeer.subscribe(listener);
103
+
104
+ return () => {
105
+ wsPeer.unsubscribe(listener);
106
+ };
107
+ },
108
+ connected: () => wsPeer.connected,
99
109
  peersToLoadFrom,
100
110
  setNode,
101
111
  crypto,
@@ -106,8 +116,15 @@ async function setupPeers(options: BaseReactNativeContextOptions) {
106
116
  export async function createJazzReactNativeGuestContext(
107
117
  options: BaseReactNativeContextOptions,
108
118
  ) {
109
- const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =
110
- await setupPeers(options);
119
+ const {
120
+ toggleNetwork,
121
+ peersToLoadFrom,
122
+ setNode,
123
+ crypto,
124
+ storage,
125
+ addConnectionListener,
126
+ connected,
127
+ } = await setupPeers(options);
111
128
 
112
129
  const context = createAnonymousJazzContext({
113
130
  crypto,
@@ -130,6 +147,8 @@ export async function createJazzReactNativeGuestContext(
130
147
  logOut: () => {
131
148
  return context.logOut();
132
149
  },
150
+ addConnectionListener,
151
+ connected,
133
152
  };
134
153
  }
135
154
 
@@ -149,8 +168,15 @@ export async function createJazzReactNativeContext<
149
168
  | (AccountClass<Account> & CoValueFromRaw<Account>)
150
169
  | AnyAccountSchema,
151
170
  >(options: ReactNativeContextOptions<S>) {
152
- const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =
153
- await setupPeers(options);
171
+ const {
172
+ toggleNetwork,
173
+ peersToLoadFrom,
174
+ setNode,
175
+ crypto,
176
+ storage,
177
+ addConnectionListener,
178
+ connected,
179
+ } = await setupPeers(options);
154
180
 
155
181
  let unsubscribeAuthUpdate = () => {};
156
182
 
@@ -201,6 +227,8 @@ export async function createJazzReactNativeContext<
201
227
  unsubscribeAuthUpdate();
202
228
  return context.logOut();
203
229
  },
230
+ addConnectionListener,
231
+ connected,
204
232
  };
205
233
  }
206
234