jazz-react-native 0.8.50 → 0.9.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +27 -0
- package/README.md +1 -1
- package/dist/auth/DemoAuthMethod.d.ts +1 -0
- package/dist/auth/DemoAuthMethod.js +17 -4
- package/dist/auth/DemoAuthMethod.js.map +1 -1
- package/dist/auth/DemoAuthUI.js +11 -6
- package/dist/auth/DemoAuthUI.js.map +1 -1
- package/dist/hooks.d.ts +10056 -0
- package/dist/hooks.js +36 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +2 -49
- package/dist/index.js +2 -128
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +51 -0
- package/dist/platform.js +100 -0
- package/dist/platform.js.map +1 -0
- package/dist/provider.d.ts +13 -45
- package/dist/provider.js +52 -122
- package/dist/provider.js.map +1 -1
- package/dist/storage/kv-store-context.d.ts +1 -0
- package/dist/storage/kv-store-context.js +3 -0
- package/dist/storage/kv-store-context.js.map +1 -1
- package/dist/testing.d.ts +1 -0
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +1 -0
- package/dist/tests/DemoAuthMethod.test.js +28 -7
- package/dist/tests/DemoAuthMethod.test.js.map +1 -1
- package/package.json +10 -5
- package/src/auth/DemoAuthMethod.ts +24 -4
- package/src/auth/DemoAuthUI.tsx +13 -6
- package/src/hooks.tsx +60 -0
- package/src/index.ts +3 -240
- package/src/platform.ts +205 -0
- package/src/provider.tsx +77 -282
- package/src/storage/kv-store-context.ts +4 -0
- package/src/testing.tsx +1 -0
- package/src/tests/DemoAuthMethod.test.ts +34 -7
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAA4B,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAEL,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAevB,gCAAgC;AAChC,MAAM,UAAU,YAAY,CAA0C,EACpE,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,aAAa,GAAG,OAAuC,EACvD,cAAc,GACS;IACvB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,EAAoC,CAAC;IAEnE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,iFAAiF;QACjF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC3C,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAE9B,2EAA2E;YAC3E,0EAA0E;YAC1E,EAAE;YACF,qDAAqD;YACrD,MAAM,eAAe,GAAG,GAAG,CAAC;YAE5B,IAAI,eAAe,EAAE,CAAC;gBACpB,eAAe,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,KAAK,UAAU,aAAa;YAC1B,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAC9C,IAAI,KAAK,OAAO;gBACd,CAAC,CAAC;oBACE,IAAI;oBACJ,cAAc;iBACf;gBACH,CAAC,CAAC;oBACE,aAAa;oBACb,IAAI,EAAE,IAAI;oBACV,IAAI;oBACJ,cAAc;iBACf,CACN,CAAC;YAEF,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,cAAc,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,CAAC,SAAS,CAAC,CAAC;gBAClB,eAAe,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;gBAElC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;oBAC3C,yDAAyD;oBACzD,uCAAuC;oBACvC,cAAc,CAAC,IAAI,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,CAAC;gBACL,GAAG,cAAc;gBACjB,aAAa;gBACb,MAAM;aACP,CAAC,CAAC;YAEH,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAEhC,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,OAAO,GAAG,EAAE;YACV,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IAE9C,OAAO,CACL,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAC3E,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv-store-context.js","sourceRoot":"","sources":["../../src/storage/kv-store-context.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,CAAiB;IAChC,eAAe,GAAmB,IAAI,CAAC;IAE/C,gBAAuB,CAAC;IAEjB,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,cAAc,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAEM,UAAU,CAAC,KAAc;QAC9B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"kv-store-context.js","sourceRoot":"","sources":["../../src/storage/kv-store-context.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,CAAiB;IAChC,eAAe,GAAmB,IAAI,CAAC;IAE/C,gBAAuB,CAAC;IAEjB,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,cAAc,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC;IACvC,CAAC;IAEM,UAAU,CAAC,KAAc;QAC9B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "jazz-react-core/testing";
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.tsx"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { RNDemoAuth } from "../auth/DemoAuthMethod";
|
|
2
|
+
import { RNDemoAuth, encodeUsername } from "../auth/DemoAuthMethod";
|
|
3
3
|
import { KvStoreContext } from "../storage/kv-store-context";
|
|
4
4
|
// Initialize mock storage
|
|
5
5
|
const mockStorage = {};
|
|
6
|
+
function validateKey(key) {
|
|
7
|
+
if (key.includes("+") || key.includes("/") || key.includes("=")) {
|
|
8
|
+
throw new Error("Invalid key");
|
|
9
|
+
}
|
|
10
|
+
}
|
|
6
11
|
// Mock KvStore implementation
|
|
7
12
|
const mockKvStore = {
|
|
8
|
-
get: vi.fn(async (key) =>
|
|
13
|
+
get: vi.fn(async (key) => {
|
|
14
|
+
validateKey(key);
|
|
15
|
+
return mockStorage[key] || null;
|
|
16
|
+
}),
|
|
9
17
|
set: vi.fn(async (key, value) => {
|
|
18
|
+
validateKey(key);
|
|
10
19
|
mockStorage[key] = value;
|
|
11
20
|
}),
|
|
12
21
|
delete: vi.fn(async (key) => {
|
|
22
|
+
validateKey(key);
|
|
13
23
|
delete mockStorage[key];
|
|
14
24
|
}),
|
|
15
25
|
clearAll: vi.fn(async () => {
|
|
@@ -45,7 +55,7 @@ describe("RNDemoAuth", () => {
|
|
|
45
55
|
};
|
|
46
56
|
await RNDemoAuth.init(mockDriver, seedAccounts);
|
|
47
57
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users", "testUser");
|
|
48
|
-
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" +
|
|
58
|
+
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" + encodeUsername("testUser"), expect.any(String));
|
|
49
59
|
});
|
|
50
60
|
});
|
|
51
61
|
describe("authentication", () => {
|
|
@@ -60,6 +70,17 @@ describe("RNDemoAuth", () => {
|
|
|
60
70
|
expect(result.type).toBe("new");
|
|
61
71
|
expect(result.saveCredentials).toBeDefined();
|
|
62
72
|
});
|
|
73
|
+
it("should convert unsupported chars from base64 to a valid key", async () => {
|
|
74
|
+
const { mockDriver } = setup();
|
|
75
|
+
mockDriver.onReady = vi.fn(({ signUp }) => {
|
|
76
|
+
signUp(atob("+/=="));
|
|
77
|
+
});
|
|
78
|
+
const auth = await RNDemoAuth.init(mockDriver);
|
|
79
|
+
const result = await auth.start();
|
|
80
|
+
expect(mockDriver.onReady).toHaveBeenCalled();
|
|
81
|
+
expect(result.type).toBe("new");
|
|
82
|
+
expect(result.saveCredentials).toBeDefined();
|
|
83
|
+
});
|
|
63
84
|
it("should handle existing user login", async () => {
|
|
64
85
|
const { mockStorage, mockDriver } = setup();
|
|
65
86
|
// Set up existing user in storage
|
|
@@ -105,7 +126,7 @@ describe("RNDemoAuth", () => {
|
|
|
105
126
|
accountID: "test-account-id",
|
|
106
127
|
secret: "test-secret",
|
|
107
128
|
});
|
|
108
|
-
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" +
|
|
129
|
+
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" + encodeUsername("testUser"), expect.any(String));
|
|
109
130
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users", "testUser");
|
|
110
131
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-logged-in-secret", expect.any(String));
|
|
111
132
|
});
|
|
@@ -115,7 +136,7 @@ describe("RNDemoAuth", () => {
|
|
|
115
136
|
accountID: "test-account-id",
|
|
116
137
|
accountSecret: "test-secret",
|
|
117
138
|
};
|
|
118
|
-
mockStorage["demo-auth-existing-users-" +
|
|
139
|
+
mockStorage["demo-auth-existing-users-" + encodeUsername("testUser")] =
|
|
119
140
|
JSON.stringify(credentials);
|
|
120
141
|
mockDriver.onReady = vi.fn(({ logInAs }) => {
|
|
121
142
|
return logInAs("testUser");
|
|
@@ -146,7 +167,7 @@ describe("RNDemoAuth", () => {
|
|
|
146
167
|
accountID: "test-account-id",
|
|
147
168
|
secret: "test-secret",
|
|
148
169
|
});
|
|
149
|
-
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" +
|
|
170
|
+
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" + encodeUsername("testUser-2"), expect.any(String));
|
|
150
171
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users", "testUser,testUser-2");
|
|
151
172
|
});
|
|
152
173
|
it("should retrieve existing users", async () => {
|
|
@@ -177,7 +198,7 @@ describe("RNDemoAuth", () => {
|
|
|
177
198
|
mockStorage["demo-auth-existing-users"] = "testUser";
|
|
178
199
|
mockStorage["demo-auth-existing-users-testUser"] = value;
|
|
179
200
|
await RNDemoAuth.init(mockDriver);
|
|
180
|
-
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" +
|
|
201
|
+
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" + encodeUsername("testUser"), value);
|
|
181
202
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-storage-version", "2");
|
|
182
203
|
expect(mockKvStore.delete).toHaveBeenCalledWith("demo-auth-existing-users-testUser");
|
|
183
204
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DemoAuthMethod.test.js","sourceRoot":"","sources":["../../src/tests/DemoAuthMethod.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"DemoAuthMethod.test.js","sourceRoot":"","sources":["../../src/tests/DemoAuthMethod.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jazz-react-native",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -16,16 +16,21 @@
|
|
|
16
16
|
"react-native": "./dist/crypto/index.js",
|
|
17
17
|
"types": "./dist/crypto/index.d.ts",
|
|
18
18
|
"default": "./dist/crypto/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./testing": {
|
|
21
|
+
"react-native": "./dist/testing.js",
|
|
22
|
+
"types": "./dist/testing.d.ts",
|
|
23
|
+
"default": "./dist/testing.js"
|
|
19
24
|
}
|
|
20
25
|
},
|
|
21
26
|
"license": "MIT",
|
|
22
27
|
"dependencies": {
|
|
23
28
|
"@scure/base": "1.2.1",
|
|
24
|
-
"@scure/bip39": "^1.3.0",
|
|
25
29
|
"react-native-quick-crypto": "1.0.0-beta.9",
|
|
26
|
-
"
|
|
27
|
-
"cojson
|
|
28
|
-
"
|
|
30
|
+
"jazz-react-core": "0.8.46",
|
|
31
|
+
"cojson": "0.9.0",
|
|
32
|
+
"cojson-transport-ws": "0.9.0",
|
|
33
|
+
"jazz-tools": "0.9.0"
|
|
29
34
|
},
|
|
30
35
|
"peerDependencies": {
|
|
31
36
|
"@react-native-community/netinfo": "*",
|
|
@@ -23,8 +23,15 @@ export namespace RNDemoAuth {
|
|
|
23
23
|
|
|
24
24
|
const localStorageKey = "demo-auth-logged-in-secret";
|
|
25
25
|
|
|
26
|
+
export function encodeUsername(username: string) {
|
|
27
|
+
return btoa(username)
|
|
28
|
+
.replace(/=/g, "-")
|
|
29
|
+
.replace(/\+/g, "_")
|
|
30
|
+
.replace(/\//g, ".");
|
|
31
|
+
}
|
|
32
|
+
|
|
26
33
|
function getUserStorageKey(username: string) {
|
|
27
|
-
return `demo-auth-existing-users-${
|
|
34
|
+
return `demo-auth-existing-users-${encodeUsername(username)}`;
|
|
28
35
|
}
|
|
29
36
|
|
|
30
37
|
function getLegacyUserStorageKey(username: string) {
|
|
@@ -102,7 +109,21 @@ export class RNDemoAuth implements AuthMethod {
|
|
|
102
109
|
},
|
|
103
110
|
store?: KvStore | undefined,
|
|
104
111
|
) {
|
|
105
|
-
|
|
112
|
+
let kvStore = store;
|
|
113
|
+
|
|
114
|
+
if (!kvStore) {
|
|
115
|
+
const kvStoreContext = KvStoreContext.getInstance();
|
|
116
|
+
|
|
117
|
+
if (!kvStoreContext.isInitialized()) {
|
|
118
|
+
const { ExpoSecureStoreAdapter } = await import(
|
|
119
|
+
"../storage/expo-secure-store-adapter.js"
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
kvStoreContext.initialize(new ExpoSecureStoreAdapter());
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
kvStore = kvStoreContext.getStorage();
|
|
126
|
+
}
|
|
106
127
|
|
|
107
128
|
await migrateExistingUsersKeys(kvStore);
|
|
108
129
|
|
|
@@ -133,6 +154,7 @@ export class RNDemoAuth implements AuthMethod {
|
|
|
133
154
|
this.driver.onSignedIn({ logOut });
|
|
134
155
|
},
|
|
135
156
|
onError: (error: string | Error) => {
|
|
157
|
+
this.kvStore.delete(localStorageKey);
|
|
136
158
|
this.driver.onError(error);
|
|
137
159
|
},
|
|
138
160
|
logOut: async () => {
|
|
@@ -181,8 +203,6 @@ export class RNDemoAuth implements AuthMethod {
|
|
|
181
203
|
this.driver.onSignedIn({ logOut });
|
|
182
204
|
},
|
|
183
205
|
onError: (error: string | Error) => {
|
|
184
|
-
// @ts-expect-error asd
|
|
185
|
-
console.error("onError", error.cause);
|
|
186
206
|
this.driver.onError(error);
|
|
187
207
|
},
|
|
188
208
|
logOut: async () => {
|
package/src/auth/DemoAuthUI.tsx
CHANGED
|
@@ -54,13 +54,13 @@ export function useDemoAuth({
|
|
|
54
54
|
{
|
|
55
55
|
onReady: async ({ signUp, getExistingUsers, logInAs }) => {
|
|
56
56
|
const existingUsers = await getExistingUsers();
|
|
57
|
-
setState({
|
|
57
|
+
setState((current) => ({
|
|
58
58
|
state: "ready",
|
|
59
59
|
signUp,
|
|
60
60
|
existingUsers,
|
|
61
61
|
logInAs,
|
|
62
|
-
errors:
|
|
63
|
-
});
|
|
62
|
+
errors: current.errors,
|
|
63
|
+
}));
|
|
64
64
|
},
|
|
65
65
|
onSignedIn: ({ logOut }) => {
|
|
66
66
|
setState({ state: "signedIn", logOut, errors: [] });
|
|
@@ -68,14 +68,14 @@ export function useDemoAuth({
|
|
|
68
68
|
onError: (error) => {
|
|
69
69
|
setState((current) => ({
|
|
70
70
|
...current,
|
|
71
|
-
errors: [
|
|
71
|
+
errors: [error.toString()],
|
|
72
72
|
}));
|
|
73
73
|
},
|
|
74
74
|
},
|
|
75
75
|
seedAccounts,
|
|
76
76
|
store,
|
|
77
77
|
);
|
|
78
|
-
}, [seedAccounts]);
|
|
78
|
+
}, [seedAccounts, state.errors]); // We reset the auth method when getting an error
|
|
79
79
|
|
|
80
80
|
useEffect(() => {
|
|
81
81
|
async function init() {
|
|
@@ -126,7 +126,14 @@ export const DemoAuthBasicUI = ({
|
|
|
126
126
|
]}
|
|
127
127
|
>
|
|
128
128
|
{state.state === "loading" ? (
|
|
129
|
-
|
|
129
|
+
<>
|
|
130
|
+
<Text style={styles.loadingText}>Loading...</Text>
|
|
131
|
+
{state.errors.map((error, index) => (
|
|
132
|
+
<Text key={index} style={styles.errorText}>
|
|
133
|
+
{error}
|
|
134
|
+
</Text>
|
|
135
|
+
))}
|
|
136
|
+
</>
|
|
130
137
|
) : state.state === "ready" ? (
|
|
131
138
|
<View style={styles.formContainer}>
|
|
132
139
|
<Text
|
package/src/hooks.tsx
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
import { createUseAccountHooks, useJazzContext } from "jazz-react-core";
|
|
4
|
+
import { CoValue, CoValueClass, ID } from "jazz-tools";
|
|
5
|
+
import { Linking } from "react-native";
|
|
6
|
+
import { parseInviteLink } from "./platform.js";
|
|
7
|
+
import { RegisteredAccount } from "./provider.js";
|
|
8
|
+
|
|
9
|
+
export { useCoState, experimental_useInboxSender } from "jazz-react-core";
|
|
10
|
+
|
|
11
|
+
export const { useAccount, useAccountOrGuest } =
|
|
12
|
+
createUseAccountHooks<RegisteredAccount>();
|
|
13
|
+
|
|
14
|
+
export function useAcceptInvite<V extends CoValue>({
|
|
15
|
+
invitedObjectSchema,
|
|
16
|
+
onAccept,
|
|
17
|
+
forValueHint,
|
|
18
|
+
}: {
|
|
19
|
+
invitedObjectSchema: CoValueClass<V>;
|
|
20
|
+
onAccept: (projectID: ID<V>) => void;
|
|
21
|
+
forValueHint?: string;
|
|
22
|
+
}): void {
|
|
23
|
+
const context = useJazzContext();
|
|
24
|
+
|
|
25
|
+
if (!("me" in context)) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
"useAcceptInvite can't be used in a JazzProvider with auth === 'guest'.",
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const handleDeepLink = ({ url }: { url: string }) => {
|
|
33
|
+
const result = parseInviteLink<V>(url);
|
|
34
|
+
if (result && result.valueHint === forValueHint) {
|
|
35
|
+
context.me
|
|
36
|
+
.acceptInvite(
|
|
37
|
+
result.valueID,
|
|
38
|
+
result.inviteSecret,
|
|
39
|
+
invitedObjectSchema,
|
|
40
|
+
)
|
|
41
|
+
.then(() => {
|
|
42
|
+
onAccept(result.valueID);
|
|
43
|
+
})
|
|
44
|
+
.catch((e) => {
|
|
45
|
+
console.error("Failed to accept invite", e);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const linkingListener = Linking.addEventListener("url", handleDeepLink);
|
|
51
|
+
|
|
52
|
+
void Linking.getInitialURL().then((url) => {
|
|
53
|
+
if (url) handleDeepLink({ url });
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
return () => {
|
|
57
|
+
linkingListener.remove();
|
|
58
|
+
};
|
|
59
|
+
}, [context, onAccept, invitedObjectSchema, forValueHint]);
|
|
60
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,243 +1,6 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
3
|
-
import {
|
|
4
|
-
Account,
|
|
5
|
-
AgentID,
|
|
6
|
-
AnonymousJazzAgent,
|
|
7
|
-
AuthMethod,
|
|
8
|
-
CoValue,
|
|
9
|
-
CoValueClass,
|
|
10
|
-
CryptoProvider,
|
|
11
|
-
ID,
|
|
12
|
-
InviteSecret,
|
|
13
|
-
SessionID,
|
|
14
|
-
cojsonInternals,
|
|
15
|
-
createJazzContext,
|
|
16
|
-
} from "jazz-tools";
|
|
17
|
-
|
|
18
|
-
import { RawAccountID } from "cojson";
|
|
19
|
-
|
|
20
|
-
export { RNDemoAuth } from "./auth/DemoAuthMethod.js";
|
|
21
|
-
|
|
22
|
-
import { PureJSCrypto } from "cojson/native";
|
|
23
|
-
import { createWebSocketPeerWithReconnection } from "./createWebSocketPeerWithReconnection.js";
|
|
24
|
-
import type { RNQuickCrypto } from "./crypto/RNQuickCrypto.js";
|
|
25
|
-
import { KvStoreContext } from "./storage/kv-store-context.js";
|
|
26
|
-
|
|
27
|
-
/** @category Context Creation */
|
|
28
|
-
export type ReactNativeContext<Acc extends Account> = {
|
|
29
|
-
me: Acc;
|
|
30
|
-
logOut: () => void;
|
|
31
|
-
// TODO: Symbol.dispose?
|
|
32
|
-
done: () => void;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export type ReactNativeGuestContext = {
|
|
36
|
-
guest: AnonymousJazzAgent;
|
|
37
|
-
logOut: () => void;
|
|
38
|
-
done: () => void;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export type ReactNativeContextOptions<Acc extends Account> = {
|
|
42
|
-
auth: AuthMethod;
|
|
43
|
-
AccountSchema: CoValueClass<Acc> & {
|
|
44
|
-
fromNode: (typeof Account)["fromNode"];
|
|
45
|
-
};
|
|
46
|
-
} & BaseReactNativeContextOptions;
|
|
47
|
-
|
|
48
|
-
export type BaseReactNativeContextOptions = {
|
|
49
|
-
peer: `wss://${string}` | `ws://${string}`;
|
|
50
|
-
reconnectionTimeout?: number;
|
|
51
|
-
storage?: "indexedDB" | "singleTabOPFS";
|
|
52
|
-
CryptoProvider?: typeof PureJSCrypto | typeof RNQuickCrypto;
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
/** @category Context Creation */
|
|
56
|
-
export async function createJazzRNContext<Acc extends Account>(
|
|
57
|
-
options: ReactNativeContextOptions<Acc>,
|
|
58
|
-
): Promise<ReactNativeContext<Acc>>;
|
|
59
|
-
export async function createJazzRNContext(
|
|
60
|
-
options: BaseReactNativeContextOptions,
|
|
61
|
-
): Promise<ReactNativeGuestContext>;
|
|
62
|
-
export async function createJazzRNContext<Acc extends Account>(
|
|
63
|
-
options: ReactNativeContextOptions<Acc> | BaseReactNativeContextOptions,
|
|
64
|
-
): Promise<ReactNativeContext<Acc> | ReactNativeGuestContext>;
|
|
65
|
-
export async function createJazzRNContext<Acc extends Account>(
|
|
66
|
-
options: ReactNativeContextOptions<Acc> | BaseReactNativeContextOptions,
|
|
67
|
-
): Promise<ReactNativeContext<Acc> | ReactNativeGuestContext> {
|
|
68
|
-
const websocketPeer = createWebSocketPeerWithReconnection(
|
|
69
|
-
options.peer,
|
|
70
|
-
options.reconnectionTimeout,
|
|
71
|
-
(peer) => {
|
|
72
|
-
node.syncManager.addPeer(peer);
|
|
73
|
-
},
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
const CryptoProvider = options.CryptoProvider || PureJSCrypto;
|
|
77
|
-
|
|
78
|
-
const context =
|
|
79
|
-
"auth" in options
|
|
80
|
-
? await createJazzContext({
|
|
81
|
-
AccountSchema: options.AccountSchema,
|
|
82
|
-
auth: options.auth,
|
|
83
|
-
crypto: await CryptoProvider.create(),
|
|
84
|
-
peersToLoadFrom: [websocketPeer.peer],
|
|
85
|
-
sessionProvider: provideLockSession,
|
|
86
|
-
})
|
|
87
|
-
: await createJazzContext({
|
|
88
|
-
crypto: await CryptoProvider.create(),
|
|
89
|
-
peersToLoadFrom: [websocketPeer.peer],
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
const node =
|
|
93
|
-
"account" in context ? context.account._raw.core.node : context.agent.node;
|
|
94
|
-
|
|
95
|
-
return "account" in context
|
|
96
|
-
? {
|
|
97
|
-
me: context.account,
|
|
98
|
-
done: () => {
|
|
99
|
-
websocketPeer.done();
|
|
100
|
-
context.done();
|
|
101
|
-
},
|
|
102
|
-
logOut: () => {
|
|
103
|
-
context.logOut();
|
|
104
|
-
},
|
|
105
|
-
}
|
|
106
|
-
: {
|
|
107
|
-
guest: context.agent,
|
|
108
|
-
done: () => {
|
|
109
|
-
websocketPeer.done();
|
|
110
|
-
context.done();
|
|
111
|
-
},
|
|
112
|
-
logOut: () => {
|
|
113
|
-
context.logOut();
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/** @category Auth Providers */
|
|
119
|
-
export type SessionProvider = (
|
|
120
|
-
accountID: ID<Account> | AgentID,
|
|
121
|
-
) => Promise<SessionID>;
|
|
122
|
-
|
|
123
|
-
export async function provideLockSession(
|
|
124
|
-
accountID: ID<Account> | AgentID,
|
|
125
|
-
crypto: CryptoProvider,
|
|
126
|
-
) {
|
|
127
|
-
const sessionDone = () => {};
|
|
128
|
-
|
|
129
|
-
const kvStore = KvStoreContext.getInstance().getStorage();
|
|
130
|
-
|
|
131
|
-
const sessionID =
|
|
132
|
-
((await kvStore.get(accountID)) as SessionID) ||
|
|
133
|
-
crypto.newRandomSessionID(accountID as RawAccountID | AgentID);
|
|
134
|
-
await kvStore.set(accountID, sessionID);
|
|
135
|
-
|
|
136
|
-
return Promise.resolve({
|
|
137
|
-
sessionID,
|
|
138
|
-
sessionDone,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/** @category Invite Links */
|
|
143
|
-
export function createInviteLink<C extends CoValue>(
|
|
144
|
-
value: C,
|
|
145
|
-
role: "reader" | "writer" | "admin",
|
|
146
|
-
{ baseURL, valueHint }: { baseURL?: string; valueHint?: string } = {},
|
|
147
|
-
): string {
|
|
148
|
-
const coValueCore = value._raw.core;
|
|
149
|
-
let currentCoValue = coValueCore;
|
|
150
|
-
|
|
151
|
-
while (currentCoValue.header.ruleset.type === "ownedByGroup") {
|
|
152
|
-
currentCoValue = currentCoValue.getGroup().core;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
if (currentCoValue.header.ruleset.type !== "group") {
|
|
156
|
-
throw new Error("Can't create invite link for object without group");
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const group = cojsonInternals.expectGroup(currentCoValue.getCurrentContent());
|
|
160
|
-
const inviteSecret = group.createInvite(role);
|
|
161
|
-
|
|
162
|
-
return `${baseURL}/invite/${valueHint ? valueHint + "/" : ""}${
|
|
163
|
-
value.id
|
|
164
|
-
}/${inviteSecret}`;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/** @category Invite Links */
|
|
168
|
-
// TODO: copied from jazz-browser, should be shared
|
|
169
|
-
export function parseInviteLink<C extends CoValue>(
|
|
170
|
-
inviteURL: string,
|
|
171
|
-
):
|
|
172
|
-
| {
|
|
173
|
-
valueID: ID<C>;
|
|
174
|
-
valueHint?: string;
|
|
175
|
-
inviteSecret: InviteSecret;
|
|
176
|
-
}
|
|
177
|
-
| undefined {
|
|
178
|
-
const url = new URL(inviteURL);
|
|
179
|
-
const parts = url.hash.split("/");
|
|
180
|
-
|
|
181
|
-
let valueHint: string | undefined;
|
|
182
|
-
let valueID: ID<C> | undefined;
|
|
183
|
-
let inviteSecret: InviteSecret | undefined;
|
|
184
|
-
|
|
185
|
-
if (parts[0] === "#" && parts[1] === "invite") {
|
|
186
|
-
if (parts.length === 5) {
|
|
187
|
-
valueHint = parts[2];
|
|
188
|
-
valueID = parts[3] as ID<C>;
|
|
189
|
-
inviteSecret = parts[4] as InviteSecret;
|
|
190
|
-
} else if (parts.length === 4) {
|
|
191
|
-
valueID = parts[2] as ID<C>;
|
|
192
|
-
inviteSecret = parts[3] as InviteSecret;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if (!valueID || !inviteSecret) {
|
|
196
|
-
return undefined;
|
|
197
|
-
}
|
|
198
|
-
return { valueID, inviteSecret, valueHint };
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// getting out of the `expo` business 🤞
|
|
203
|
-
// export function parseInviteLink<C extends CoValue>(
|
|
204
|
-
// inviteURL: string,
|
|
205
|
-
// ):
|
|
206
|
-
// | {
|
|
207
|
-
// valueID: ID<C>;
|
|
208
|
-
// valueHint?: string;
|
|
209
|
-
// inviteSecret: InviteSecret;
|
|
210
|
-
// }
|
|
211
|
-
// | undefined {
|
|
212
|
-
// const url = Linking.parse(inviteURL);
|
|
213
|
-
// const parts = url.path?.split("/");
|
|
214
|
-
|
|
215
|
-
// if (!parts || parts[0] !== "invite") {
|
|
216
|
-
// return undefined;
|
|
217
|
-
// }
|
|
218
|
-
|
|
219
|
-
// let valueHint: string | undefined;
|
|
220
|
-
// let valueID: ID<C> | undefined;
|
|
221
|
-
// let inviteSecret: InviteSecret | undefined;
|
|
222
|
-
|
|
223
|
-
// if (parts.length === 4) {
|
|
224
|
-
// valueHint = parts[1];
|
|
225
|
-
// valueID = parts[2] as ID<C>;
|
|
226
|
-
// inviteSecret = parts[3] as InviteSecret;
|
|
227
|
-
// } else if (parts.length === 3) {
|
|
228
|
-
// valueID = parts[1] as ID<C>;
|
|
229
|
-
// inviteSecret = parts[2] as InviteSecret;
|
|
230
|
-
// }
|
|
231
|
-
|
|
232
|
-
// if (!valueID || !inviteSecret) {
|
|
233
|
-
// return undefined;
|
|
234
|
-
// }
|
|
235
|
-
|
|
236
|
-
// return { valueID, inviteSecret, valueHint };
|
|
237
|
-
// }
|
|
238
|
-
|
|
239
|
-
/////////
|
|
240
|
-
|
|
241
1
|
export * from "./provider.js";
|
|
242
2
|
export * from "./auth/auth.js";
|
|
243
3
|
export * from "./storage/kv-store-context.js";
|
|
4
|
+
export * from "./hooks.js";
|
|
5
|
+
|
|
6
|
+
export { parseInviteLink, createInviteLink, setupKvStore } from "./platform.js";
|