jazz-react-native 0.9.23 → 0.10.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.
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAa7C,gCAAgC;AAChC,MAAM,UAAU,YAAY,CAA0C,EACpE,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,OAAO,EACP,2BAA2B,GACJ;IACvB,YAAY,CAAC,OAAO,CAAC,CAAC;IAEtB,MAAM,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CACrC,GAAG,EAAE,CAAC,IAAI,yBAAyB,EAAO,CAC3C,CAAC;IAEF,MAAM,sCAAsC,GAAG,cAAc,CAC3D,2BAA2B,CAC5B,CAAC;IACF,MAAM,mBAAmB,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CACtC,KAAK,CAAC,WAAW,CACf,CAAC,QAAQ,EAAE,EAAE;QACX,MAAM,KAAK,GAAG;YACZ,aAAa;YACb,SAAS;YACT,IAAI;YACJ,OAAO;YACP,kBAAkB;YAClB,QAAQ,EAAE,mBAAmB;YAC7B,2BAA2B,EAAE,sCAAsC;SACpE,CAAC;QACF,IAAI,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,EACD,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAc,CAAC,CACzC,EACD,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,EACtC,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CACvC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;YAAE,OAAO;QAEnD,OAAO,GAAG,EAAE;YACV,cAAc,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CACjC;MAAA,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,CACrE;QAAA,CAAC,KAAK,IAAI,QAAQ,CACpB;MAAA,EAAE,eAAe,CAAC,QAAQ,CAC5B;IAAA,EAAE,WAAW,CAAC,QAAQ,CAAC,CACxB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAoC,QAAY;IACrE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3C,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC/B,OAAO,MAAM,CACX,CAAC,GAAG,IAAmB,EAAiB,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAC1E,CAAC,OAAO,CAAC;AACZ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jazz-react-native",
3
- "version": "0.9.23",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -27,11 +27,11 @@
27
27
  "dependencies": {
28
28
  "@scure/base": "1.2.1",
29
29
  "react-native-quick-crypto": "1.0.0-beta.9",
30
- "jazz-react-core": "0.9.22",
31
- "cojson": "0.9.23",
32
- "cojson-transport-ws": "0.9.23",
33
- "cojson-storage-rn-sqlite": "0.8.59",
34
- "jazz-tools": "0.9.23"
30
+ "cojson": "0.10.0",
31
+ "cojson-storage-rn-sqlite": "0.8.60",
32
+ "cojson-transport-ws": "0.10.0",
33
+ "jazz-react-core": "0.10.0",
34
+ "jazz-tools": "0.10.0"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "@react-native-community/netinfo": "*",
@@ -0,0 +1,70 @@
1
+ import {
2
+ Account,
3
+ AccountClass,
4
+ JazzContextManager,
5
+ KvStore,
6
+ SyncConfig,
7
+ } from "jazz-tools";
8
+ import { JazzContextManagerAuthProps } from "jazz-tools";
9
+ import {
10
+ BaseReactNativeContextOptions,
11
+ createJazzReactNativeContext,
12
+ createJazzReactNativeGuestContext,
13
+ } from "./platform.js";
14
+
15
+ export type JazzContextManagerProps<Acc extends Account> = {
16
+ guestMode?: boolean;
17
+ sync: SyncConfig;
18
+ onLogOut?: () => void;
19
+ storage?: BaseReactNativeContextOptions["storage"];
20
+ AccountSchema?: AccountClass<Acc>;
21
+ defaultProfileName?: string;
22
+ onAnonymousAccountDiscarded?: (anonymousAccount: Acc) => Promise<void>;
23
+ };
24
+
25
+ export class ReactNativeContextManager<
26
+ Acc extends Account,
27
+ > extends JazzContextManager<Acc, JazzContextManagerProps<Acc>> {
28
+ async createContext(
29
+ props: JazzContextManagerProps<Acc>,
30
+ authProps?: JazzContextManagerAuthProps,
31
+ ) {
32
+ let currentContext;
33
+
34
+ // We need to store the props here to block the double effect execution
35
+ // on React. Otherwise when calling propsChanged this.props is undefined.
36
+ this.props = props;
37
+
38
+ if (props.guestMode) {
39
+ currentContext = await createJazzReactNativeGuestContext({
40
+ sync: props.sync,
41
+ storage: props.storage,
42
+ authSecretStorage: this.authSecretStorage,
43
+ });
44
+ } else {
45
+ currentContext = await createJazzReactNativeContext<Acc>({
46
+ sync: props.sync,
47
+ storage: props.storage,
48
+ AccountSchema: props.AccountSchema,
49
+ credentials: authProps?.credentials,
50
+ newAccountProps: authProps?.newAccountProps,
51
+ defaultProfileName: props.defaultProfileName,
52
+ authSecretStorage: this.authSecretStorage,
53
+ });
54
+ }
55
+
56
+ this.updateContext(props, currentContext);
57
+ }
58
+
59
+ propsChanged(props: JazzContextManagerProps<Acc>) {
60
+ if (!this.props) {
61
+ return true;
62
+ }
63
+
64
+ return (
65
+ this.props.sync.when !== props.sync.when ||
66
+ this.props.sync.peer !== props.sync.peer ||
67
+ this.props.guestMode !== props.guestMode
68
+ );
69
+ }
70
+ }
@@ -1,6 +1,5 @@
1
- import { AgentSecret } from "cojson";
2
- import { Account, ID } from "jazz-tools";
3
- import React, { useMemo, useState, useEffect } from "react";
1
+ import { useDemoAuth } from "jazz-react-core";
2
+ import React, { useState } from "react";
4
3
  import {
5
4
  StyleSheet,
6
5
  Text,
@@ -9,101 +8,15 @@ import {
9
8
  View,
10
9
  useColorScheme,
11
10
  } from "react-native";
12
- import { KvStore } from "../storage/kv-store-context.js";
13
- import { RNDemoAuth } from "./DemoAuthMethod.js";
14
-
15
- type DemoAuthState = (
16
- | {
17
- state: "uninitialized";
18
- }
19
- | {
20
- state: "loading";
21
- }
22
- | {
23
- state: "ready";
24
- existingUsers: string[];
25
- signUp: (username: string) => void;
26
- logInAs: (existingUser: string) => void;
27
- }
28
- | {
29
- state: "signedIn";
30
- logOut: () => void;
31
- }
32
- ) & {
33
- errors: string[];
34
- };
35
-
36
- /** @category Auth Providers */
37
- export function useDemoAuth({
38
- seedAccounts,
39
- store,
40
- }: {
41
- seedAccounts?: {
42
- [name: string]: { accountID: ID<Account>; accountSecret: AgentSecret };
43
- };
44
- store?: KvStore;
45
- } = {}) {
46
- const [state, setState] = useState<DemoAuthState>({
47
- state: "loading",
48
- errors: [],
49
- });
50
-
51
- const [authMethod, setAuthMethod] = useState<RNDemoAuth | null>(null);
52
-
53
- const authMethodPromise = useMemo(() => {
54
- return RNDemoAuth.init(
55
- {
56
- onReady: async ({ signUp, getExistingUsers, logInAs }) => {
57
- const existingUsers = await getExistingUsers();
58
- setState((current) => ({
59
- state: "ready",
60
- signUp,
61
- existingUsers,
62
- logInAs,
63
- errors: current.errors,
64
- }));
65
- },
66
- onSignedIn: ({ logOut }) => {
67
- setState({ state: "signedIn", logOut, errors: [] });
68
- },
69
- onError: (error) => {
70
- setState((current) => ({
71
- ...current,
72
- errors: [error.toString()],
73
- }));
74
- },
75
- },
76
- seedAccounts,
77
- store,
78
- );
79
- }, [seedAccounts, state.errors]); // We reset the auth method when getting an error
80
-
81
- useEffect(() => {
82
- async function init() {
83
- try {
84
- const auth = await authMethodPromise;
85
- setAuthMethod(auth);
86
- } catch (e: unknown) {
87
- const err = e as Error;
88
- setState((current) => ({
89
- ...current,
90
- errors: [...current.errors, err.toString()],
91
- }));
92
- }
93
- }
94
- if (authMethod) return;
95
- void init();
96
- }, [seedAccounts]);
97
-
98
- return [authMethod, state] as const;
99
- }
100
11
 
101
12
  export const DemoAuthBasicUI = ({
102
13
  appName,
103
- state,
14
+ auth,
15
+ children,
104
16
  }: {
105
17
  appName: string;
106
- state: DemoAuthState;
18
+ auth: ReturnType<typeof useDemoAuth>;
19
+ children: React.ReactNode;
107
20
  }) => {
108
21
  const colorScheme = useColorScheme();
109
22
  const darkMode = colorScheme === "dark";
@@ -111,15 +24,25 @@ export const DemoAuthBasicUI = ({
111
24
  const [errorMessage, setErrorMessage] = useState<string | null>(null);
112
25
 
113
26
  const handleSignUp = () => {
114
- if (state.state !== "ready") return;
115
- if (username.trim() === "") {
116
- setErrorMessage("Display name is required");
117
- } else {
118
- setErrorMessage(null);
119
- state.signUp(username);
120
- }
27
+ setErrorMessage(null);
28
+
29
+ auth.signUp(username).catch((error) => {
30
+ setErrorMessage(error.message);
31
+ });
32
+ };
33
+
34
+ const handleLogIn = (username: string) => {
35
+ setErrorMessage(null);
36
+
37
+ auth.logIn(username).catch((error) => {
38
+ setErrorMessage(error.message);
39
+ });
121
40
  };
122
41
 
42
+ if (auth.state === "signedIn") {
43
+ return children;
44
+ }
45
+
123
46
  return (
124
47
  <View
125
48
  style={[
@@ -127,77 +50,60 @@ export const DemoAuthBasicUI = ({
127
50
  darkMode ? styles.darkBackground : styles.lightBackground,
128
51
  ]}
129
52
  >
130
- {state.state === "loading" ? (
131
- <>
132
- <Text style={styles.loadingText}>Loading...</Text>
133
- {state.errors.map((error, index) => (
134
- <Text key={index} style={styles.errorText}>
135
- {error}
136
- </Text>
137
- ))}
138
- </>
139
- ) : state.state === "ready" ? (
140
- <View style={styles.formContainer}>
141
- <Text
142
- style={[
143
- styles.headerText,
144
- darkMode ? styles.darkText : styles.lightText,
145
- ]}
146
- >
147
- {appName}
148
- </Text>
149
-
150
- {state.errors.map((error) => (
151
- <Text key={error} style={styles.errorText}>
152
- {error}
153
- </Text>
154
- ))}
53
+ <View style={styles.formContainer}>
54
+ <Text
55
+ style={[
56
+ styles.headerText,
57
+ darkMode ? styles.darkText : styles.lightText,
58
+ ]}
59
+ >
60
+ {appName}
61
+ </Text>
155
62
 
156
- {errorMessage && <Text style={styles.errorText}>{errorMessage}</Text>}
63
+ {errorMessage && <Text style={styles.errorText}>{errorMessage}</Text>}
157
64
 
158
- <TextInput
159
- placeholder="Display name"
160
- value={username}
161
- onChangeText={setUsername}
162
- placeholderTextColor={darkMode ? "#fff" : "#000"}
163
- style={[
164
- styles.textInput,
165
- darkMode ? styles.darkInput : styles.lightInput,
166
- ]}
167
- />
65
+ <TextInput
66
+ placeholder="Display name"
67
+ value={username}
68
+ onChangeText={setUsername}
69
+ placeholderTextColor={darkMode ? "#fff" : "#000"}
70
+ style={[
71
+ styles.textInput,
72
+ darkMode ? styles.darkInput : styles.lightInput,
73
+ ]}
74
+ />
168
75
 
169
- <TouchableOpacity
170
- onPress={handleSignUp}
171
- style={[
172
- styles.button,
173
- darkMode ? styles.darkButton : styles.lightButton,
174
- ]}
76
+ <TouchableOpacity
77
+ onPress={handleSignUp}
78
+ style={[
79
+ styles.button,
80
+ darkMode ? styles.darkButton : styles.lightButton,
81
+ ]}
82
+ >
83
+ <Text
84
+ style={darkMode ? styles.darkButtonText : styles.lightButtonText}
175
85
  >
176
- <Text
177
- style={darkMode ? styles.darkButtonText : styles.lightButtonText}
178
- >
179
- Sign Up as new account
180
- </Text>
181
- </TouchableOpacity>
86
+ Sign Up as new account
87
+ </Text>
88
+ </TouchableOpacity>
182
89
 
183
- <View style={styles.existingUsersContainer}>
184
- {state.existingUsers.map((user) => (
185
- <TouchableOpacity
186
- key={user}
187
- onPress={() => state.logInAs(user)}
188
- style={[
189
- styles.existingUserButton,
190
- darkMode ? styles.darkUserButton : styles.lightUserButton,
191
- ]}
192
- >
193
- <Text style={darkMode ? styles.darkText : styles.lightText}>
194
- Log In as "{user}"
195
- </Text>
196
- </TouchableOpacity>
197
- ))}
198
- </View>
90
+ <View style={styles.existingUsersContainer}>
91
+ {auth.existingUsers.map((user) => (
92
+ <TouchableOpacity
93
+ key={user}
94
+ onPress={() => handleLogIn(user)}
95
+ style={[
96
+ styles.existingUserButton,
97
+ darkMode ? styles.darkUserButton : styles.lightUserButton,
98
+ ]}
99
+ >
100
+ <Text style={darkMode ? styles.darkText : styles.lightText}>
101
+ Log In as "{user}"
102
+ </Text>
103
+ </TouchableOpacity>
104
+ ))}
199
105
  </View>
200
- ) : null}
106
+ </View>
201
107
  </View>
202
108
  );
203
109
  };
package/src/auth/auth.ts CHANGED
@@ -9,5 +9,6 @@ export function clearUserCredentials() {
9
9
  return Promise.all([
10
10
  kvStore.delete("demo-auth-logged-in-secret"),
11
11
  kvStore.delete("jazz-clerk-auth"),
12
+ kvStore.delete("jazz-logged-in-secret"),
12
13
  ]);
13
14
  }
package/src/hooks.tsx CHANGED
@@ -5,7 +5,15 @@ import { CoValue, CoValueClass, ID, parseInviteLink } from "jazz-tools";
5
5
  import { Linking } from "react-native";
6
6
  import { RegisteredAccount } from "./provider.js";
7
7
 
8
- export { useCoState, experimental_useInboxSender } from "jazz-react-core";
8
+ export {
9
+ useCoState,
10
+ experimental_useInboxSender,
11
+ useDemoAuth,
12
+ usePassphraseAuth,
13
+ useJazzContext,
14
+ useAuthSecretStorage,
15
+ useIsAuthenticated,
16
+ } from "jazz-react-core";
9
17
 
10
18
  export const { useAccount, useAccountOrGuest } =
11
19
  createUseAccountHooks<RegisteredAccount>();