jazz-react-auth-clerk 0.10.6 → 0.10.7

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.
@@ -1,4 +1,4 @@
1
1
 
2
- > jazz-react-auth-clerk@0.10.6 build /home/runner/_work/jazz/jazz/packages/jazz-react-auth-clerk
2
+ > jazz-react-auth-clerk@0.10.7 build /home/runner/_work/jazz/jazz/packages/jazz-react-auth-clerk
3
3
  > rm -rf ./dist && tsc --sourceMap --outDir dist
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # jazz-browser-media-images
2
2
 
3
+ ## 0.10.7
4
+
5
+ ### Patch Changes
6
+
7
+ - 1136d9b: Fixed isAuthenticated out-of-sync with the account state during the logOut and authenticate flows
8
+ - 0eed228: Fixes clerk auth flow
9
+ - Updated dependencies [0f83320]
10
+ - Updated dependencies [012022d]
11
+ - Updated dependencies [1136d9b]
12
+ - Updated dependencies [bf76d79]
13
+ - Updated dependencies [0eed228]
14
+ - cojson@0.10.7
15
+ - jazz-auth-clerk@0.10.7
16
+ - jazz-browser@0.10.7
17
+ - jazz-react@0.10.7
18
+ - jazz-tools@0.10.7
19
+
3
20
  ## 0.10.6
4
21
 
5
22
  ### Patch Changes
package/dist/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { JazzClerkAuth } from "jazz-auth-clerk";
2
+ import { JazzClerkAuth, isClerkCredentials, } from "jazz-auth-clerk";
3
+ import { LocalStorageKVStore } from "jazz-browser";
3
4
  import { JazzProvider, useAuthSecretStorage, useJazzContext, } from "jazz-react";
4
- import { useEffect, useMemo } from "react";
5
+ import { AuthSecretStorage, InMemoryKVStore, KvStoreContext } from "jazz-tools";
6
+ import { useEffect, useMemo, useState } from "react";
5
7
  function useJazzClerkAuth(clerk) {
6
8
  const context = useJazzContext();
7
9
  const authSecretStorage = useAuthSecretStorage();
@@ -23,6 +25,26 @@ function RegisterClerkAuth(props) {
23
25
  return props.children;
24
26
  }
25
27
  export const JazzProviderWithClerk = (props) => {
28
+ const [isLoaded, setIsLoaded] = useState(false);
29
+ setupKvStore();
30
+ const secretStorage = new AuthSecretStorage();
31
+ useEffect(() => {
32
+ if (!isClerkCredentials(props.clerk.user?.unsafeMetadata)) {
33
+ setIsLoaded(true);
34
+ return;
35
+ }
36
+ JazzClerkAuth.loadClerkAuthData(props.clerk.user.unsafeMetadata, secretStorage).then(() => {
37
+ setIsLoaded(true);
38
+ });
39
+ }, []);
40
+ if (!isLoaded) {
41
+ return null;
42
+ }
26
43
  return (_jsx(JazzProvider, { ...props, onLogOut: props.clerk.signOut, children: _jsx(RegisterClerkAuth, { clerk: props.clerk, children: props.children }) }));
27
44
  };
45
+ function setupKvStore() {
46
+ KvStoreContext.getInstance().initialize(typeof window === "undefined"
47
+ ? new InMemoryKVStore()
48
+ : new LocalStorageKVStore());
49
+ }
28
50
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAA2B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,YAAY,EAEZ,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE3C,SAAS,gBAAgB,CAAC,KAAyB;IACjD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IAEjD,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACpE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,6FAA6F;QAC7F,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE;YACjC,UAAU,CAAC,iBAAiB,CAAC,KAAyC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,iBAAiB,CAAC,KAG1B;IACC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE9B,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAwD,EACxD,EAAE;IACF,OAAO,CACL,KAAC,YAAY,OAAK,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,YACpD,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAClC,KAAK,CAAC,QAAQ,GACG,GACP,CAChB,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EAEb,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,YAAY,EAEZ,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErD,SAAS,gBAAgB,CAAC,KAAyB;IACjD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IAEjD,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACpE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,6FAA6F;QAC7F,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE;YACjC,UAAU,CAAC,iBAAiB,CAAC,KAAyC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,iBAAiB,CAAC,KAG1B;IACC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE9B,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAwD,EACxD,EAAE;IACF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,YAAY,EAAE,CAAC;IACf,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;YAC1D,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QAED,aAAa,CAAC,iBAAiB,CAC7B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAC/B,aAAa,CACd,CAAC,IAAI,CAAC,GAAG,EAAE;YACV,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,KAAC,YAAY,OAAK,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,YACpD,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAClC,KAAK,CAAC,QAAQ,GACG,GACP,CAChB,CAAC;AACJ,CAAC,CAAC;AAEF,SAAS,YAAY;IACnB,cAAc,CAAC,WAAW,EAAE,CAAC,UAAU,CACrC,OAAO,MAAM,KAAK,WAAW;QAC3B,CAAC,CAAC,IAAI,eAAe,EAAE;QACvB,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAC9B,CAAC;AACJ,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  // @vitest-environment happy-dom
3
3
  import { act, render } from "@testing-library/react";
4
+ import { JazzClerkAuth } from "jazz-auth-clerk";
4
5
  import { AuthSecretStorage, InMemoryKVStore, KvStoreContext } from "jazz-tools";
5
6
  import { beforeEach, describe, expect, it, vi } from "vitest";
6
7
  import { JazzProviderWithClerk } from "../index";
@@ -17,11 +18,20 @@ vi.mock("jazz-react", async (importOriginal) => {
17
18
  JazzProvider,
18
19
  };
19
20
  });
21
+ vi.mock("jazz-auth-clerk", async (importOriginal) => {
22
+ const { JazzClerkAuth } = await import("jazz-auth-clerk");
23
+ JazzClerkAuth.loadClerkAuthData = vi.fn().mockResolvedValue(undefined);
24
+ return {
25
+ ...(await importOriginal()),
26
+ JazzClerkAuth,
27
+ };
28
+ });
20
29
  const authSecretStorage = new AuthSecretStorage();
21
30
  KvStoreContext.getInstance().initialize(new InMemoryKVStore());
22
31
  describe("JazzProviderWithClerk", () => {
23
32
  beforeEach(async () => {
24
33
  await authSecretStorage.clear();
34
+ vi.clearAllMocks();
25
35
  });
26
36
  const setup = (children = _jsx("div", { "data-testid": "test-child", children: "Test Content" })) => {
27
37
  let callbacks = new Set();
@@ -63,5 +73,40 @@ describe("JazzProviderWithClerk", () => {
63
73
  },
64
74
  });
65
75
  });
76
+ it("should load the clerk credentials when the user is authenticated", async () => {
77
+ render(_jsx(JazzProviderWithClerk, { clerk: {
78
+ addListener: vi.fn(),
79
+ signOut: vi.fn(),
80
+ user: {
81
+ update: vi.fn(),
82
+ unsafeMetadata: {
83
+ jazzAccountID: "test",
84
+ jazzAccountSecret: "test",
85
+ jazzAccountSeed: "test",
86
+ },
87
+ firstName: "Test",
88
+ lastName: "User",
89
+ username: "test",
90
+ fullName: "Test User",
91
+ id: "test",
92
+ primaryEmailAddress: {
93
+ emailAddress: "test@test.com",
94
+ },
95
+ },
96
+ }, sync: { peer: "wss://test.jazz.tools" }, children: _jsx("div", { "data-testid": "test-child", children: "Test Content" }) }));
97
+ expect(JazzClerkAuth.loadClerkAuthData).toHaveBeenCalledWith({
98
+ jazzAccountID: "test",
99
+ jazzAccountSecret: "test",
100
+ jazzAccountSeed: "test",
101
+ }, authSecretStorage);
102
+ });
103
+ it("should not load the clerk credentials when the user is not authenticated", async () => {
104
+ render(_jsx(JazzProviderWithClerk, { clerk: {
105
+ addListener: vi.fn(),
106
+ signOut: vi.fn(),
107
+ user: null,
108
+ }, sync: { peer: "wss://test.jazz.tools" }, children: _jsx("div", { "data-testid": "test-child", children: "Test Content" }) }));
109
+ expect(JazzClerkAuth.loadClerkAuthData).not.toHaveBeenCalledWith();
110
+ });
66
111
  });
67
112
  //# sourceMappingURL=JazzProviderWithClerk.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JazzProviderWithClerk.test.js","sourceRoot":"","sources":["../../src/tests/JazzProviderWithClerk.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JazzProviderWithClerk.test.js","sourceRoot":"","sources":["../../src/tests/JazzProviderWithClerk.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAEhC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAW,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAA2B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAgB,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC7C,MAAM,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAC9D,oBAAoB,CACrB,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC;QAC1C,sBAAsB,EAAE,IAAI;KAC7B,CAAC,CAAC;IAEH,SAAS,YAAY,CAAC,KAAoC;QACxD,OAAO,CACL,KAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,YAAG,KAAK,CAAC,QAAQ,GAAoB,CACxE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,CAAC,MAAM,cAAc,EAA+B,CAAC;QACxD,YAAY;KACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAClD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE1D,aAAa,CAAC,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO;QACL,GAAG,CAAC,MAAM,cAAc,EAAoC,CAAC;QAC7D,aAAa;KACd,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAClD,cAAc,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;AAE/D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAChC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,CACZ,QAAQ,GAAG,6BAAiB,YAAY,6BAAmB,EAC3D,EAAE;QACF,IAAI,SAAS,GAAG,IAAI,GAAG,EAAuC,CAAC;QAE/D,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE;gBACJ,QAAQ,EAAE,WAAW;gBACrB,cAAc,EAAE,EAAE;gBAClB,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;aAChB;YACD,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE;gBACvC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC;YACF,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAExB,OAAO,GAAG,EAAE;oBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC7B,CAAC,CAAC;YACJ,CAAC,CAAC;SAC8B,CAAC;QAEnC,MAAM,KAAK,GAAG,MAAM,CAClB,KAAC,qBAAqB,IACpB,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,YAEtC,QAAQ,GACa,CACzB,CAAC;QAEF,OAAO;YACL,GAAG,KAAK;YACR,SAAS;YACT,SAAS;SACV,CAAC;IACJ,CAAC,CAAC;IAEF,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,CAAC;QAEzC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEtD,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAC7D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,oBAAoB,CAAC;YAClD,cAAc,EAAE;gBACd,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBACjC,iBAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBACrC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;aACnC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,CACJ,KAAC,qBAAqB,IACpB,KAAK,EAAE;gBACL,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;gBACpB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;gBAChB,IAAI,EAAE;oBACJ,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;oBACf,cAAc,EAAE;wBACd,aAAa,EAAE,MAAM;wBACrB,iBAAiB,EAAE,MAAM;wBACzB,eAAe,EAAE,MAAM;qBACxB;oBACD,SAAS,EAAE,MAAM;oBACjB,QAAQ,EAAE,MAAM;oBAChB,QAAQ,EAAE,MAAM;oBAChB,QAAQ,EAAE,WAAW;oBACrB,EAAE,EAAE,MAAM;oBACV,mBAAmB,EAAE;wBACnB,YAAY,EAAE,eAAe;qBAC9B;iBACF;aACF,EACD,IAAI,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,YAEvC,6BAAiB,YAAY,6BAAmB,GAC1B,CACzB,CAAC;QAEF,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAC1D;YACE,aAAa,EAAE,MAAM;YACrB,iBAAiB,EAAE,MAAM;YACzB,eAAe,EAAE,MAAM;SACxB,EACD,iBAAiB,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,CACJ,KAAC,qBAAqB,IACpB,KAAK,EAAE;gBACL,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;gBACpB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;gBAChB,IAAI,EAAE,IAAI;aACX,EACD,IAAI,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,YAEvC,6BAAiB,YAAY,6BAAmB,GAC1B,CACzB,CAAC;QAEF,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "jazz-react-auth-clerk",
3
- "version": "0.10.6",
3
+ "version": "0.10.7",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "src/index.tsx",
7
7
  "license": "MIT",
8
8
  "dependencies": {
9
- "cojson": "0.10.6",
10
- "jazz-auth-clerk": "0.10.6",
11
- "jazz-react": "0.10.6",
12
- "jazz-tools": "0.10.6"
9
+ "cojson": "0.10.7",
10
+ "jazz-auth-clerk": "0.10.7",
11
+ "jazz-browser": "0.10.7",
12
+ "jazz-react": "0.10.7",
13
+ "jazz-tools": "0.10.7"
13
14
  },
14
15
  "peerDependencies": {
15
16
  "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
package/src/index.tsx CHANGED
@@ -1,11 +1,17 @@
1
- import { JazzClerkAuth, type MinimalClerkClient } from "jazz-auth-clerk";
1
+ import {
2
+ JazzClerkAuth,
3
+ type MinimalClerkClient,
4
+ isClerkCredentials,
5
+ } from "jazz-auth-clerk";
6
+ import { LocalStorageKVStore } from "jazz-browser";
2
7
  import {
3
8
  JazzProvider,
4
9
  JazzProviderProps,
5
10
  useAuthSecretStorage,
6
11
  useJazzContext,
7
12
  } from "jazz-react";
8
- import { useEffect, useMemo } from "react";
13
+ import { AuthSecretStorage, InMemoryKVStore, KvStoreContext } from "jazz-tools";
14
+ import { useEffect, useMemo, useState } from "react";
9
15
 
10
16
  function useJazzClerkAuth(clerk: MinimalClerkClient) {
11
17
  const context = useJazzContext();
@@ -39,6 +45,28 @@ function RegisterClerkAuth(props: {
39
45
  export const JazzProviderWithClerk = (
40
46
  props: { clerk: MinimalClerkClient } & JazzProviderProps,
41
47
  ) => {
48
+ const [isLoaded, setIsLoaded] = useState(false);
49
+ setupKvStore();
50
+ const secretStorage = new AuthSecretStorage();
51
+
52
+ useEffect(() => {
53
+ if (!isClerkCredentials(props.clerk.user?.unsafeMetadata)) {
54
+ setIsLoaded(true);
55
+ return;
56
+ }
57
+
58
+ JazzClerkAuth.loadClerkAuthData(
59
+ props.clerk.user.unsafeMetadata,
60
+ secretStorage,
61
+ ).then(() => {
62
+ setIsLoaded(true);
63
+ });
64
+ }, []);
65
+
66
+ if (!isLoaded) {
67
+ return null;
68
+ }
69
+
42
70
  return (
43
71
  <JazzProvider {...props} onLogOut={props.clerk.signOut}>
44
72
  <RegisterClerkAuth clerk={props.clerk}>
@@ -47,3 +75,11 @@ export const JazzProviderWithClerk = (
47
75
  </JazzProvider>
48
76
  );
49
77
  };
78
+
79
+ function setupKvStore() {
80
+ KvStoreContext.getInstance().initialize(
81
+ typeof window === "undefined"
82
+ ? new InMemoryKVStore()
83
+ : new LocalStorageKVStore(),
84
+ );
85
+ }
@@ -1,9 +1,9 @@
1
1
  // @vitest-environment happy-dom
2
2
 
3
3
  import { act, render, waitFor } from "@testing-library/react";
4
- import type { MinimalClerkClient } from "jazz-auth-clerk";
4
+ import { JazzClerkAuth, type MinimalClerkClient } from "jazz-auth-clerk";
5
5
  import { AuthSecretStorage, InMemoryKVStore, KvStoreContext } from "jazz-tools";
6
- import { beforeEach, describe, expect, it, vi } from "vitest";
6
+ import { MockInstance, beforeEach, describe, expect, it, vi } from "vitest";
7
7
  import { JazzProviderWithClerk } from "../index";
8
8
 
9
9
  vi.mock("jazz-react", async (importOriginal) => {
@@ -27,12 +27,24 @@ vi.mock("jazz-react", async (importOriginal) => {
27
27
  };
28
28
  });
29
29
 
30
+ vi.mock("jazz-auth-clerk", async (importOriginal) => {
31
+ const { JazzClerkAuth } = await import("jazz-auth-clerk");
32
+
33
+ JazzClerkAuth.loadClerkAuthData = vi.fn().mockResolvedValue(undefined);
34
+
35
+ return {
36
+ ...(await importOriginal<typeof import("jazz-auth-clerk")>()),
37
+ JazzClerkAuth,
38
+ };
39
+ });
40
+
30
41
  const authSecretStorage = new AuthSecretStorage();
31
42
  KvStoreContext.getInstance().initialize(new InMemoryKVStore());
32
43
 
33
44
  describe("JazzProviderWithClerk", () => {
34
45
  beforeEach(async () => {
35
46
  await authSecretStorage.clear();
47
+ vi.clearAllMocks();
36
48
  });
37
49
 
38
50
  const setup = (
@@ -94,4 +106,60 @@ describe("JazzProviderWithClerk", () => {
94
106
  },
95
107
  });
96
108
  });
109
+
110
+ it("should load the clerk credentials when the user is authenticated", async () => {
111
+ render(
112
+ <JazzProviderWithClerk
113
+ clerk={{
114
+ addListener: vi.fn(),
115
+ signOut: vi.fn(),
116
+ user: {
117
+ update: vi.fn(),
118
+ unsafeMetadata: {
119
+ jazzAccountID: "test",
120
+ jazzAccountSecret: "test",
121
+ jazzAccountSeed: "test",
122
+ },
123
+ firstName: "Test",
124
+ lastName: "User",
125
+ username: "test",
126
+ fullName: "Test User",
127
+ id: "test",
128
+ primaryEmailAddress: {
129
+ emailAddress: "test@test.com",
130
+ },
131
+ },
132
+ }}
133
+ sync={{ peer: "wss://test.jazz.tools" }}
134
+ >
135
+ <div data-testid="test-child">Test Content</div>
136
+ </JazzProviderWithClerk>,
137
+ );
138
+
139
+ expect(JazzClerkAuth.loadClerkAuthData).toHaveBeenCalledWith(
140
+ {
141
+ jazzAccountID: "test",
142
+ jazzAccountSecret: "test",
143
+ jazzAccountSeed: "test",
144
+ },
145
+ authSecretStorage,
146
+ );
147
+ });
148
+
149
+ it("should not load the clerk credentials when the user is not authenticated", async () => {
150
+ render(
151
+ <JazzProviderWithClerk
152
+ clerk={{
153
+ addListener: vi.fn(),
154
+ signOut: vi.fn(),
155
+ user: null,
156
+ }}
157
+ sync={{ peer: "wss://test.jazz.tools" }}
158
+ >
159
+ <div data-testid="test-child">Test Content</div>
160
+ </JazzProviderWithClerk>,
161
+ );
162
+
163
+ expect(JazzClerkAuth.loadClerkAuthData).not.toHaveBeenCalledWith();
164
+ });
97
165
  });