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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +22 -0
- package/dist/ReactNativeContextManager.js +38 -0
- package/dist/ReactNativeContextManager.js.map +1 -0
- package/dist/auth/DemoAuthUI.js +45 -101
- package/dist/auth/DemoAuthUI.js.map +1 -1
- package/dist/auth/auth.js +1 -0
- package/dist/auth/auth.js.map +1 -1
- package/dist/hooks.js +1 -1
- package/dist/hooks.js.map +1 -1
- package/dist/platform.js +120 -40
- package/dist/platform.js.map +1 -1
- package/dist/provider.js +39 -64
- package/dist/provider.js.map +1 -1
- package/package.json +6 -6
- package/src/ReactNativeContextManager.ts +70 -0
- package/src/auth/DemoAuthUI.tsx +71 -165
- package/src/auth/auth.ts +1 -0
- package/src/hooks.tsx +9 -1
- package/src/platform.ts +161 -86
- package/src/provider.tsx +66 -89
- package/dist/auth/DemoAuthMethod.js +0 -182
- package/dist/auth/DemoAuthMethod.js.map +0 -1
- package/dist/createWebSocketPeerWithReconnection.js +0 -58
- package/dist/createWebSocketPeerWithReconnection.js.map +0 -1
- package/dist/tests/DemoAuthMethod.test.js +0 -207
- package/dist/tests/DemoAuthMethod.test.js.map +0 -1
- package/dist/tests/createWebSocketPeerWithReconnection.test.js +0 -106
- package/dist/tests/createWebSocketPeerWithReconnection.test.js.map +0 -1
- package/src/auth/DemoAuthMethod.ts +0 -259
- package/src/createWebSocketPeerWithReconnection.ts +0 -79
- package/src/tests/DemoAuthMethod.test.ts +0 -309
- package/src/tests/createWebSocketPeerWithReconnection.test.ts +0 -163
package/dist/provider.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
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.
|
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
|
-
"
|
31
|
-
"cojson": "0.
|
32
|
-
"cojson-transport-ws": "0.
|
33
|
-
"
|
34
|
-
"jazz-tools": "0.
|
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
|
+
}
|
package/src/auth/DemoAuthUI.tsx
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
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
|
-
|
14
|
+
auth,
|
15
|
+
children,
|
104
16
|
}: {
|
105
17
|
appName: string;
|
106
|
-
|
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
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
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
|
-
{
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
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
|
-
|
63
|
+
{errorMessage && <Text style={styles.errorText}>{errorMessage}</Text>}
|
157
64
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
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
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
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
|
-
|
177
|
-
|
178
|
-
|
179
|
-
Sign Up as new account
|
180
|
-
</Text>
|
181
|
-
</TouchableOpacity>
|
86
|
+
Sign Up as new account
|
87
|
+
</Text>
|
88
|
+
</TouchableOpacity>
|
182
89
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
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
|
-
|
106
|
+
</View>
|
201
107
|
</View>
|
202
108
|
);
|
203
109
|
};
|
package/src/auth/auth.ts
CHANGED
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 {
|
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>();
|