jazz-react-native 0.8.8 → 0.8.12

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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # jazz-browser
2
2
 
3
+ ## 0.8.12
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [6ed75eb]
8
+ - cojson@0.8.12
9
+ - cojson-transport-ws@0.8.12
10
+ - jazz-tools@0.8.12
11
+
12
+ ## 0.8.11
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [1ed4ab5]
17
+ - cojson@0.8.11
18
+ - cojson-transport-ws@0.8.11
19
+ - jazz-tools@0.8.11
20
+
3
21
  ## 0.8.8
4
22
 
5
23
  ### Patch Changes
package/README.md CHANGED
@@ -1,10 +1,233 @@
1
- # `jazz-browser`
1
+ # 🎷 Jazz + React Native
2
2
 
3
- These are browser bindings for Jazz (see [jazz.tools](https://jazz.tools)), a framework for distributed state.
3
+ Jazz requires an [Expo development build](https://docs.expo.dev/develop/development-builds/introduction/) using [Expo Prebuild](https://docs.expo.dev/workflow/prebuild/) for native code. It is **not compatible** with Expo Go. Jazz also supports the [New Architecture](https://docs.expo.dev/guides/new-architecture/).
4
4
 
5
- Use this only if you want to write Jazz apps using plain JavaScript,
6
- or to build your framework bindings for Jazz.
5
+ Tested with:
7
6
 
8
- ## Higher-level framework bindings:
7
+ ```json
8
+ "expo": "~51.0.0",
9
+ "react-native": "~0.74.5",
10
+ "react": "^18.2.0",
11
+ ```
9
12
 
10
- - `jazz-react` - React bindings for Jazz
13
+ ## 🚀 Setup
14
+
15
+ ### Create a New Project
16
+
17
+ (skip this step if you already have one)
18
+
19
+ ```bash
20
+ npx create-expo-app -e with-router-tailwind my-jazz-app
21
+ cd my-jazz-app
22
+ npx expo prebuild
23
+ ```
24
+
25
+ ### Install dependencies
26
+
27
+ ```bash
28
+ npx expo install expo-linking expo-secure-store expo-file-system @react-native-community/netinfo @bam.tech/react-native-image-resizer
29
+
30
+ npm i -S react-native-polyfill-globals react-native-url-polyfill web-streams-polyfill base-64 text-encoding react-native-fetch-api react-native-get-random-values buffer
31
+
32
+ npm i -D @babel/plugin-transform-class-static-block
33
+
34
+ npm i -S jazz-tools jazz-react-native jazz-react-native-media-images
35
+
36
+ ```
37
+
38
+ ### Fix Incompatible Dependencies
39
+
40
+ ```bash
41
+ npx expo install --fix
42
+ ```
43
+
44
+ ### Install Pods
45
+
46
+ ```bash
47
+ npx pod-install
48
+ ```
49
+
50
+ ### Configure Metro
51
+
52
+ #### Regular Repositories
53
+
54
+ If you are not working within a monorepo, create a new file metro.config.js in the root of your project with the following content:
55
+
56
+ ```js
57
+ const { getDefaultConfig } = require("expo/metro-config");
58
+ const path = require("path");
59
+ const workspaceRoot = path.resolve(__dirname);
60
+ const config = getDefaultConfig(projectRoot);
61
+ config.resolver.unstable_enablePackageExports = true; // important setting
62
+ config.resolver.sourceExts = ["mjs", "js", "json", "ts", "tsx"];
63
+ config.resolver.requireCycleIgnorePatterns = [/(^|\/|\\)node_modules($|\/|\\)/];
64
+ module.exports = config;
65
+ ```
66
+
67
+ If you created the project using the command npx create-expo-app -e with-router-tailwind my-jazz-app, then metro.config.js is already present. In that case, simply add this setting to the existing file:
68
+
69
+ ```js
70
+ config.resolver.unstable_enablePackageExports = true
71
+ ```
72
+
73
+ #### Monorepos
74
+
75
+ For monorepos, use the following metro.config.js:
76
+
77
+ ```js
78
+ const { getDefaultConfig } = require("expo/metro-config");
79
+ const { FileStore } = require("metro-cache");
80
+ const path = require("path");
81
+
82
+ // eslint-disable-next-line no-undef
83
+ const projectRoot = __dirname;
84
+ const workspaceRoot = path.resolve(projectRoot, "../..");
85
+
86
+ const config = getDefaultConfig(projectRoot);
87
+
88
+ config.watchFolders = [workspaceRoot];
89
+ config.resolver.nodeModulesPaths = [
90
+ path.resolve(projectRoot, "node_modules"),
91
+ path.resolve(workspaceRoot, "node_modules"),
92
+ ];
93
+ config.resolver.sourceExts = ["mjs", "js", "json", "ts", "tsx"];
94
+ config.resolver.unstable_enablePackageExports = true;
95
+ config.resolver.requireCycleIgnorePatterns = [/(^|\/|\\)node_modules($|\/|\\)/];
96
+ config.cacheStores = [
97
+ new FileStore({
98
+ root: path.join(projectRoot, "node_modules", ".cache", "metro"),
99
+ }),
100
+ ];
101
+
102
+ module.exports = config;
103
+ ```
104
+
105
+ ### Additional Monorepo Configuration (for pnpm users)
106
+
107
+ - Add node-linker=hoisted to the root .npmrc (create this file if it doesn’t exist).
108
+ - Add the following to the root package.json:
109
+
110
+ ```json
111
+ "pnpm": {
112
+ "peerDependencyRules": {
113
+ "ignoreMissing": [
114
+ "@babel/*",
115
+ "expo-modules-*",
116
+ "typescript"
117
+ ]
118
+ }
119
+ }
120
+ ```
121
+
122
+ For more information, refer to [this](https://github.com/byCedric/expo-monorepo-example#pnpm-workarounds) Expo monorepo example.
123
+
124
+ ### Configure Babel
125
+
126
+ Add `@babel/plugin-transform-class-static-block` to the array of Babel plugins inside `babel.config.js`:
127
+
128
+ ```js
129
+ module.exports = function (api) {
130
+ api.cache(true);
131
+ return {
132
+ presets: ["babel-preset-expo"],
133
+ plugins: [
134
+ "nativewind/babel",
135
+ "@babel/plugin-transform-class-static-block",
136
+ ],
137
+ };
138
+ };
139
+ ```
140
+
141
+ ### Add Polyfills
142
+
143
+ Create a file `polyfills.js` at the project root with the following content:
144
+
145
+ ```js
146
+ import "react-native-polyfill-globals/auto";
147
+ import "@azure/core-asynciterator-polyfill";
148
+ import { ReadableStream } from "web-streams-polyfill/ponyfill/es6";
149
+ import { polyfillGlobal } from "react-native/Libraries/Utilities/PolyfillFunctions";
150
+ import { Buffer } from "buffer";
151
+
152
+ polyfillGlobal("Buffer", () => Buffer);
153
+ polyfillGlobal("ReadableStream", () => ReadableStream);
154
+ ```
155
+
156
+ Update `index.js` based on whether you are using expo-router or not:
157
+
158
+ #### If using `expo-router`
159
+
160
+ ```js
161
+ import "./polyfills";
162
+ import "expo-router/entry";
163
+ ```
164
+
165
+ #### Without `expo-router`
166
+
167
+ ```js
168
+ import "./polyfills";
169
+ import { registerRootComponent } from "expo";
170
+ import App from "./src/App";
171
+ registerRootComponent(App);
172
+ ```
173
+
174
+ Lastly, ensure that the `"main"` field in your `package.json` points to `index.js`:
175
+
176
+ ```js
177
+ "main": "index.js",
178
+ ```
179
+
180
+ ## 🎉 How to Use Jazz
181
+
182
+ ### `createJazzRNApp()`
183
+
184
+ Create a file `jazz.tsx` with the following contents:
185
+
186
+ ```js
187
+ import { createJazzRNApp } from "jazz-react-native";
188
+
189
+ export const Jazz = createJazzRNApp();
190
+ export const { useAccount, useCoState, useAcceptInvite } = Jazz;
191
+ ```
192
+
193
+ You can optionally pass a custom `kvStore` and `AccountSchema` to `createJazzRNApp()`, otherwise, it defaults to `ExpoSecureStoreAdapter` and `Account`.
194
+
195
+ ### Choosing an Auth Method
196
+
197
+ Refer to the Jazz + React Native demo projects for implementing authentication:
198
+
199
+ - [DemoAuth Example](https://github.com/gardencmp/jazz/tree/main/examples/chat-rn)
200
+ - [ClerkAuth Example](https://github.com/gardencmp/jazz/tree/main/examples/chat-rn-clerk)
201
+
202
+ In the demos, you'll find details on:
203
+
204
+ - Using Jazz.Provider with your chosen authentication method
205
+ - Defining a Jazz schema
206
+ - Creating and subscribing to covalues
207
+ - Handling invites
208
+
209
+ ### 🖼️ Working with Images
210
+
211
+ To work with images in Jazz, import the `createImage` function from [`jazz-react-native-media-images`](https://github.com/gardencmp/jazz/tree/main/packages/jazz-react-native-media-images).
212
+
213
+ ```js
214
+ import { createImage } from "jazz-react-native-media-images";
215
+
216
+ const base64ImageDataURI = "data:image/png;base64,...";
217
+
218
+ const image = await createImage(base64ImageDataURI, {
219
+ owner: newPetPost._owner,
220
+ maxSize: 2048, // optional: specify maximum image size
221
+ });
222
+
223
+ someCovalue.image = image;
224
+ ```
225
+
226
+ For a complete implementation, please refer to [this](https://github.com/gardencmp/jazz/blob/main/examples/pets/src/3_NewPetPostForm.tsx) demo.
227
+
228
+ ### 📱 Running Your App
229
+
230
+ ```bash
231
+ npx expo run:ios
232
+ npx expo run:android
233
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jazz-react-native",
3
- "version": "0.8.8",
3
+ "version": "0.8.12",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -17,9 +17,9 @@
17
17
  "dependencies": {
18
18
  "@scure/bip39": "^1.3.0",
19
19
  "typescript": "^5.3.3",
20
- "cojson": "0.8.5",
21
- "cojson-transport-ws": "0.8.7",
22
- "jazz-tools": "0.8.5"
20
+ "cojson": "0.8.12",
21
+ "cojson-transport-ws": "0.8.12",
22
+ "jazz-tools": "0.8.12"
23
23
  },
24
24
  "peerDependencies": {
25
25
  "@react-native-community/netinfo": "*",
@@ -1,8 +0,0 @@
1
-
2
- > jazz-react-native@0.8.5 build /Users/anselm/jazz/jazz/packages/jazz-react-native
3
- > npm run lint && rm -rf ./dist && tsc --sourceMap --outDir dist
4
-
5
-
6
- > jazz-react-native@0.8.5 lint
7
- > eslint . --ext ts,tsx
8
-