Compare commits

..

681 Commits

Author SHA1 Message Date
Anselm Eickhoff
749a424cf1 Merge pull request #862 from garden-co/changeset-release/main
Version Packages
2024-11-22 16:54:32 +00:00
github-actions[bot]
33c4ef902d Version Packages 2024-11-22 16:52:40 +00:00
Anselm Eickhoff
e2e3751172 Merge pull request #858 from garden-co/fix/improve-peers-close
fix: reduce noise on Peer close and increase load timeout
2024-11-22 16:50:30 +00:00
Anselm Eickhoff
6c62f4be5d Merge pull request #861 from garden-co/optimize-known-state
Optimize known state
2024-11-22 16:50:16 +00:00
Anselm
0a2fae3830 Add changeset 2024-11-22 16:44:16 +00:00
Anselm
4ab533af6b More optimised way to get knownState 2024-11-22 16:44:03 +00:00
Guido D'Orsi
99cda2f33d fix: reduce noise on Peer close and increase load timeout 2024-11-22 17:23:31 +01:00
Anselm Eickhoff
e4fcafd576 Merge pull request #857 from garden-co/changeset-release/main
Version Packages
2024-11-22 15:46:42 +00:00
github-actions[bot]
a9cff03bcb Version Packages 2024-11-22 15:35:56 +00:00
Anselm Eickhoff
26324d4b1e Merge pull request #853 from garden-co/fix/improve-peers-close
fix: clean the queues on peers close
2024-11-22 15:32:43 +00:00
Anselm Eickhoff
bd022ffd5e Merge pull request #854 from garden-co/fix/offline-support-and-faster-load
fix: restore offline support and faster load when storage is active
2024-11-22 15:32:31 +00:00
Guido D'Orsi
dcc9c2e376 chore: changeset 2024-11-22 15:53:14 +01:00
Guido D'Orsi
48edcaff37 fix: clean the queues on peers close 2024-11-22 15:49:42 +01:00
Guido D'Orsi
7780346208 fix(jazz-browser): fix unitialized variable when loading offline 2024-11-22 15:36:02 +01:00
Guido D'Orsi
699553fe9f chore: changeset 2024-11-22 10:11:30 +01:00
Guido D'Orsi
bdd5ad7eb1 fix: restore offline support and faster load when storage is active 2024-11-22 10:09:56 +01:00
Guido D'Orsi
a6942030d4 Merge pull request #848 from garden-co/benjamin-jazz-528
Chore: Bump turbo to v2
2024-11-21 18:21:05 +01:00
Benjamin S. Leveritt
905c6b312b Chore: Bump turbo to v2 2024-11-21 17:00:10 +00:00
Trisha Lim
fc845cc930 Fix url for sharing in chat demo 2024-11-20 21:39:26 +00:00
Trisha Lim
0e6ea3f762 Fix chat demo opens 2 different chat rooms 2024-11-20 21:20:09 +00:00
Anselm Eickhoff
f0060e0355 Merge pull request #836 from garden-co/changeset-release/main
Version Packages
2024-11-20 18:42:06 +00:00
github-actions[bot]
9e9788395c Version Packages 2024-11-20 18:41:39 +00:00
Anselm Eickhoff
6371c7689f Merge pull request #835 from garden-co/covalue-state-fix
Send empty known state on all states except available
2024-11-20 18:40:16 +00:00
Anselm
605734c71c Add changeset 2024-11-20 18:39:40 +00:00
Anselm
db5227b463 Send empty known state on all states except available 2024-11-20 18:39:28 +00:00
Anselm Eickhoff
7ed748a0f6 Merge pull request #828 from garden-co/changeset-release/main
Version Packages
2024-11-20 15:55:22 +00:00
github-actions[bot]
8492dd9501 Version Packages 2024-11-20 15:54:55 +00:00
Anselm Eickhoff
b957085e02 Merge pull request #827 from garden-co/gudorsi-jazz-519
fix(coValueState): once a coValue is loaded send the known state to the rest of the peers
2024-11-20 15:53:43 +00:00
Guido D'Orsi
75fdff431a chore: changeset 2024-11-20 16:40:17 +01:00
Guido D'Orsi
a5559529ae fix(coValueState): once a coValue is loaded send the known state to the rest of the peers 2024-11-20 16:39:16 +01:00
Anselm Eickhoff
2c74fdaa71 Merge pull request #824 from garden-co/changeset-release/main
Version Packages
2024-11-20 15:03:53 +00:00
github-actions[bot]
2b16a97f7a Version Packages 2024-11-20 14:10:12 +00:00
Anselm Eickhoff
e5f135b82a Merge pull request #748 from garden-co/trishalim-jazz-193
Show two chat demos side by side
2024-11-20 14:09:00 +00:00
Anselm Eickhoff
0fa0cb2338 Merge pull request #822 from garden-co/changeset-release/main
Version Packages
2024-11-20 14:01:40 +00:00
github-actions[bot]
7e7b6b981a Version Packages 2024-11-20 13:59:34 +00:00
Anselm Eickhoff
f762afd361 Merge pull request #821 from garden-co/fix-sqlite-new-piece
fix(sqlite): reference piece.new instead of piece
2024-11-20 13:58:27 +00:00
pax-k
63d46c985c chore: changeset 2024-11-20 15:57:43 +02:00
pax-k
e5b89e2f96 fix(sqlite): reference piece.new instead of piece 2024-11-20 15:52:45 +02:00
Trisha Lim
eae724a9f3 Build fix 2024-11-20 12:48:59 +00:00
Trisha Lim
b14eb2106a Add chat url with copy button 2024-11-20 12:33:37 +00:00
Trisha Lim
379e56efe9 Fix missing key 2024-11-20 12:33:19 +00:00
Trisha Lim
caf682fecd Move testimonial out of chat demo section 2024-11-20 12:33:19 +00:00
Anselm
2f6d3ac8e6 Better approach to hide logout button in demo 2024-11-20 12:33:19 +00:00
Trisha Lim
ed80b52ad3 Cover log out button with a div 2024-11-20 12:33:19 +00:00
Trisha Lim
a64690e5f3 dont hide logout 2024-11-20 12:33:19 +00:00
Trisha Lim
3bcacecbad Revert "return username to DemoAuthState"
This reverts commit 71a49763b0c4ad4209ce224822d31960fbbaa8df.
2024-11-20 12:33:19 +00:00
Trisha Lim
01e3e8a954 Revert "DemoAuth: logout if logged in user doesnt match user param"
This reverts commit 3966d58197557aa3834da7caafb6e63cf792e078.
2024-11-20 12:33:19 +00:00
Trisha Lim
9adcfc2cd9 DemoAuth: logout if logged in user doesnt match user param 2024-11-20 12:33:19 +00:00
Trisha Lim
738bf3a1bb return username to DemoAuthState 2024-11-20 12:33:19 +00:00
Trisha Lim
59d37df8a2 add changeset 2024-11-20 12:33:19 +00:00
Trisha Lim
8b63994048 hide demo-specific logic in chat example 2024-11-20 12:33:18 +00:00
Trisha Lim
f1a7478331 increase font size in chat app 2024-11-20 12:33:18 +00:00
Trisha Lim
a713d4ad51 Move retrieving of user from url into DemoAuthBasicUI 2024-11-20 12:33:18 +00:00
Trisha Lim
f33aa5c28a Hide log out button 2024-11-20 12:33:18 +00:00
Trisha Lim
2ec7e5f287 Set different color on message bubble for sender 2024-11-20 12:33:18 +00:00
Trisha Lim
e7d96c9c76 Name chat users Alice and Bob 2024-11-20 12:33:18 +00:00
Trisha Lim
c1e49fe727 Remove renderCodeSamples.mjs 2024-11-20 12:33:18 +00:00
Trisha Lim
812b13ecbd Clean up 2024-11-20 12:33:18 +00:00
Trisha Lim
0e6eb7a592 Rename component 2024-11-20 12:33:18 +00:00
Trisha Lim
9f8506fe76 Styling for chat demo section 2024-11-20 12:33:18 +00:00
Guido D'Orsi
f62f227e14 fix: remove async 2024-11-20 12:33:18 +00:00
Guido D'Orsi
3e17c0e221 fix: improve chat loading 2024-11-20 12:33:18 +00:00
Trisha Lim
1af61c8895 add logs 2024-11-20 12:33:18 +00:00
Trisha Lim
0c781d28f7 fix window is undefined 2024-11-20 12:33:18 +00:00
Trisha Lim
a93db84530 rename component 2024-11-20 12:33:18 +00:00
Guido D'Orsi
b529ae3c55 fix: hack a solution for the chat rooms sync 2024-11-20 12:33:18 +00:00
Trisha Lim
a6780401b5 pass user 2024-11-20 12:33:18 +00:00
Trisha Lim
b7ef6db1f6 simplify 2024-11-20 12:33:18 +00:00
Trisha Lim
9d089ab94f remove listener 2024-11-20 12:33:18 +00:00
Anselm Eickhoff
3b7a5c0e9d Merge pull request #820 from garden-co/changeset-release/main
Version Packages
2024-11-20 12:28:37 +00:00
github-actions[bot]
7dc2a2828e Version Packages 2024-11-20 12:15:10 +00:00
Anselm Eickhoff
ea93cacd45 Merge pull request #819 from garden-co/fuzzyobject-jazz-501
fix: 'ErrorLoadingCoValueCore',  IndexedDB peer doesn't deliver dependencies
2024-11-20 12:13:48 +00:00
Anselm Eickhoff
162da453ca Update .changeset/cool-readers-share.md 2024-11-20 12:13:35 +00:00
Marina Orlova
e17e959307 Add changeset 2024-11-20 13:08:39 +01:00
Marina Orlova
0d43b2edbc Fix Error - 'ErrorLoadingCoValueCore' 2024-11-20 12:44:19 +01:00
pax-k
9b220b17de fix(docs): updated docs for SchemaUnion 2024-11-20 13:43:10 +02:00
Anselm Eickhoff
d4a1aab5d5 Merge pull request #797 from garden-co/benjamin-jazz-503
Add minimal PasskeyAuth example
2024-11-20 11:28:50 +00:00
Benjamin S. Leveritt
32b258a966 Remove MinimalAccount for ultra-minimalism 2024-11-20 11:19:08 +00:00
Benjamin S. Leveritt
6846f74bc5 Chore: Update pnpm lock 2024-11-20 11:11:19 +00:00
Benjamin S. Leveritt
5fc3e7b700 Add biome formatter 2024-11-20 11:08:42 +00:00
Benjamin S. Leveritt
6a799b0d65 Update readme 2024-11-20 11:08:42 +00:00
Benjamin S. Leveritt
0a88aeb5a9 Finish really minimal example 2024-11-20 11:08:42 +00:00
Benjamin S. Leveritt
28ae36391b Add new minimal passkey auth example 2024-11-20 11:08:42 +00:00
Anselm Eickhoff
cf5c636fdd Merge pull request #795 from garden-co/changeset-release/main
Version Packages
2024-11-20 10:56:19 +00:00
github-actions[bot]
3f04b75418 Version Packages 2024-11-20 10:55:28 +00:00
Anselm Eickhoff
6a7047f862 Merge pull request #814 from garden-co/benjamin-jazz-506
Add minimal Clerk example
2024-11-20 10:54:29 +00:00
Benjamin S. Leveritt
640559c56f Chore: update pnpm lock 2024-11-20 10:35:22 +00:00
Anselm Eickhoff
9ef6264ff3 Merge pull request #798 from garden-co/JAZZ-498-schema-union-of
SchemaUnion.Of() implementation
2024-11-20 10:31:06 +00:00
Benjamin S. Leveritt
2ac09180a5 Add formatter/linter 2024-11-20 10:07:49 +00:00
Benjamin S. Leveritt
588129b311 Update readme 2024-11-20 09:19:13 +00:00
Benjamin S. Leveritt
0c95d4af0b Add clerk integration 2024-11-20 09:17:20 +00:00
Benjamin S. Leveritt
807846ae79 Add initial minimal app 2024-11-20 08:09:51 +00:00
Anselm
b92b17340e Export SchemaUnion from package 2024-11-19 14:48:11 +00:00
Anselm Eickhoff
0f3d239500 Merge pull request #804 from gardencmp/trishalim-jazz-453
Use sentence case for headings
2024-11-19 12:33:03 +00:00
pax-k
eec30fbcdf fix: SchemaUnion docs 2024-11-19 13:49:27 +02:00
Anselm Eickhoff
f382656d77 Merge pull request #780 from gardencmp/fix/peer-state-delete-on-close
fix(SyncManager): add flag to delete peers on close
2024-11-19 11:45:35 +00:00
Anselm Eickhoff
4d8a6400e0 Merge pull request #759 from gardencmp/gudorsi-jazz-418
feat: retry unavailable coValues
2024-11-19 11:43:12 +00:00
pax
cf5bd53dbb Update .changeset/warm-readers-invite.md
Co-authored-by: Guido D'Orsi <gu.dorsi@gmail.com>
2024-11-19 13:05:19 +02:00
Anselm Eickhoff
66a30e8041 Merge pull request #801 from gardencmp/fuzzyobject-jazz-504
Rename BinaryCoStream to FileStream
2024-11-19 11:02:32 +00:00
Anselm Eickhoff
a4d2f2dd26 Merge pull request #800 from gardencmp/trishalim-jazz-490
Move API reference to top level menu
2024-11-19 10:59:52 +00:00
Guido D'Orsi
5724735a95 chore(sync): improve comment on the unavailable logic 2024-11-19 10:30:07 +01:00
Trisha Lim
5f9c018106 Use sentence case in Jazz Cloud 2024-11-18 20:07:21 +00:00
Trisha Lim
24c018f1f2 Use sentence case in docs 2024-11-18 20:02:38 +00:00
Guido D'Orsi
6f745be39a chore: changeset 2024-11-18 20:53:58 +01:00
Guido D'Orsi
29703797cf chore(retry): remove the retryUnavailableCoValues flag 2024-11-18 20:53:00 +01:00
Marina Orlova
2241ad4089 rename folder back to e2e/BinaryCoStream 2024-11-18 20:07:39 +01:00
Trisha Lim
aed769f7b3 Update Marina's links 2024-11-18 18:47:51 +00:00
Marina Orlova
d348c2d021 Add changeset 2024-11-18 19:05:57 +01:00
Marina Orlova
e5f68904ed Rename BinaryCoStream to FileStream 2024-11-18 19:03:42 +01:00
Trisha Lim
0aebbdc2fc Fix placement of sticky bar 2024-11-18 17:07:58 +00:00
Trisha Lim
665a099013 Fix TOC placement 2024-11-18 17:07:58 +00:00
Trisha Lim
c70131aece Change references to api reference route 2024-11-18 17:07:56 +00:00
Trisha Lim
d78f590712 Reuse docs layout 2024-11-18 17:07:39 +00:00
Trisha Lim
7033ae968f Move API reference to top level menu 2024-11-18 17:07:39 +00:00
Guido D'Orsi
124bf670a2 chore: changeset 2024-11-18 17:52:15 +01:00
pax-k
f4acb91d51 fix: ignore type error 2024-11-18 18:52:05 +02:00
pax-k
47a5047ec8 chore: pnpm lock 2024-11-18 18:51:51 +02:00
pax-k
877596f389 chore: added typedoc for SchemaUnion 2024-11-18 18:44:34 +02:00
Marina Orlova
6902b5bb91 Add changeset for Rename CoStream to CoFeed 2024-11-18 17:38:17 +01:00
pax-k
e914f11d9e fix: export schemaUnion 2024-11-18 18:37:54 +02:00
pax-k
1a0cd3df7f chore: changeset 2024-11-18 18:33:58 +02:00
pax-k
d9a78739a5 feat: implemented SchemaUnion.Of() 2024-11-18 18:33:29 +02:00
Anselm Eickhoff
756528e18e Merge pull request #790 from gardencmp/trishalim-jazz-474
Fix: page reloads when clicking a link inside mdx
2024-11-18 15:12:11 +00:00
Anselm Eickhoff
466e587fba Merge pull request #794 from gardencmp/benjamin-jazz-502
PassphraseAuth - Move saving credentials into `saveCredentials`
2024-11-18 15:11:35 +00:00
Anselm Eickhoff
22caae870d Merge pull request #789 from gardencmp/docs/getting-started
Rewrite docs introduction
2024-11-18 15:10:59 +00:00
Anselm Eickhoff
435fc0c917 Merge pull request #768 from gardencmp/fuzzyobject-jazz-491
Enhance onboarding test - add page context
2024-11-18 15:05:52 +00:00
Anselm Eickhoff
3dfce294d4 Merge pull request #777 from gardencmp/benjamin-jazz-481
Fix readme for jazz-react-auth-clerk
2024-11-18 15:05:18 +00:00
Anselm Eickhoff
90be185094 Merge pull request #784 from gardencmp/vscode-settings
chore: remove .vscode/settings.json and add it to .gitignore
2024-11-18 15:04:46 +00:00
Anselm Eickhoff
9eac8633b5 Merge pull request #792 from gardencmp/benjamin-jazz-495
Fix PasskeyAuth forgetting authentication on reload
2024-11-18 15:04:30 +00:00
Anselm Eickhoff
007c462362 Merge pull request #783 from gardencmp/benjamin-jazz-497
Tweak 'Docs coming soon' copy
2024-11-18 15:03:41 +00:00
Benjamin S. Leveritt
e442bb820b Add changeset 2024-11-18 14:35:58 +00:00
Benjamin S. Leveritt
3f7235c6f7 Moves saving credentials into saveCredentials
To match other implementations
2024-11-18 14:21:43 +00:00
Benjamin S. Leveritt
56d94bd8cd Add saveCredentials on successful login 2024-11-18 13:55:29 +00:00
Anselm Eickhoff
cb937c4335 Merge pull request #757 from gardencmp/fuzzyobject-jazz-460
Rename CoStream to CoFeed
2024-11-18 13:45:14 +00:00
Trisha Lim
b4e31657a0 Fix typo 2024-11-18 12:36:39 +00:00
Trisha Lim
f6bf75890a fix: page reloads when clicking a link inside mdx 2024-11-18 12:16:37 +00:00
Trisha Lim
5bb1ad4c42 Move vue up the nav 2024-11-18 12:05:45 +00:00
Trisha Lim
3ed74b6b1d Write intro in react guide 2024-11-18 12:00:34 +00:00
Trisha Lim
823a343fe1 Rewrite docs intro page 2024-11-18 11:56:29 +00:00
Guido D'Orsi
5b3c3fff7b chore: remove .vscode/settings.json and add it to .gitignore 2024-11-18 11:46:43 +01:00
Benjamin S. Leveritt
e3f1c49fdd Tweak copy 2024-11-18 10:10:50 +00:00
Guido D'Orsi
42765020e5 fix(SyncManager): add flag to delete peers on close 2024-11-18 10:35:38 +01:00
Benjamin S. Leveritt
6cc7a905f8 Fix readme 2024-11-18 09:06:42 +00:00
Guido D'Orsi
75753f1d37 chore(CoValueState): simplify the dispatch action 2024-11-18 01:22:46 +01:00
Guido D'Orsi
6c113e7bf0 chore(CoValueState): improve comments 2024-11-18 01:12:22 +01:00
Guido D'Orsi
53a74e1b7d Merge pull request #775 from gardencmp/feature/-co-value-store
chore(LocalNode): move the coValues states management in a CoValueStore
2024-11-18 00:35:26 +01:00
Guido D'Orsi
c63b538251 chore(LocalNode): move the coValues states management in a CoValueStore 2024-11-18 00:34:44 +01:00
Guido D'Orsi
f8c3b495e0 chore(CoValueState): improve the internal state transition management 2024-11-18 00:19:31 +01:00
Guido D'Orsi
a05d90dc6b chore(CoValueState): remove resolution property because unused 2024-11-18 00:02:13 +01:00
Guido D'Orsi
307e7fcd3c fix(coValueState): keep the value consistent with the current state 2024-11-17 23:57:40 +01:00
Guido D'Orsi
d0ff589447 fix(found-in-peer): always set the state to available 2024-11-17 16:01:20 +01:00
Guido D'Orsi
f6cb4f1225 chore(sync): improve the noElegiblePeers handling in handleKnownState 2024-11-17 15:28:18 +01:00
Guido D'Orsi
1141a23a37 chore(CoValueState): move all the state updates in the dispatch function 2024-11-17 15:01:17 +01:00
Guido D'Orsi
05497d5f77 perf(loadFromPeers): exit early if the value is resolved in between retries 2024-11-16 20:43:28 +01:00
Guido D'Orsi
bb126009c8 fix(coValueState): check if the coValue has become available in between of the retries 2024-11-16 19:28:57 +01:00
Guido D'Orsi
cee7beb02a chore(sync): add a comment on the not-found logic 2024-11-16 15:11:16 +01:00
Guido D'Orsi
5f12e31a80 test(onboarding): increase the waiting to 3s 2024-11-16 14:52:38 +01:00
Guido D'Orsi
5f96a6fef2 choe(onboarding): remove the local sync logic from the playwright config and support peer override in the app 2024-11-16 14:39:52 +01:00
Guido D'Orsi
08db39ef2f test(onboarding): move the timeout waiting before the invite navigation 2024-11-16 14:38:53 +01:00
Guido D'Orsi
67029e00c7 test: add the unavailable retry e2e test 2024-11-16 13:19:06 +01:00
Marina Orlova
2b520e938e Take out acceptInvite 2024-11-16 13:16:31 +01:00
Marina Orlova
63568273db Take out acceptInvite 2024-11-16 13:12:29 +01:00
Marina Orlova
16702702c8 fix onboarding test - add context 2024-11-16 13:12:29 +01:00
Guido D'Orsi
cab4f1f89c chore: remove the waitForCoValue workaround from the example apps 2024-11-16 12:51:05 +01:00
Guido D'Orsi
45df82ed16 feat: retry unavailable coValues 2024-11-16 12:46:40 +01:00
Guido D'Orsi
6610aea708 Merge pull request #761 from gardencmp/changeset-release/main
Version Packages
2024-11-15 20:30:51 +01:00
github-actions[bot]
f6b6c01852 Version Packages 2024-11-15 18:40:37 +00:00
Trisha Lim
63f9aa6b97 fix: active route styling on docs 2024-11-15 18:39:20 +00:00
pax-k
822eb22da6 fix(docs): fix github URL reference 2024-11-15 20:22:46 +02:00
Anselm Eickhoff
fdf3c6e93d Merge pull request #742 from gardencmp/vue-docs
Vue docs
2024-11-15 18:06:41 +00:00
Guido D'Orsi
de38161023 Merge pull request #770 from gardencmp/gudorsi-jazz-492
fix(useAcceptInvite): trigger the onAccept callback on hashchange
2024-11-15 18:50:15 +01:00
Guido D'Orsi
59cc64d697 fix(useAcceptInvite): trigger the onAccept callback on hashchange 2024-11-15 18:33:27 +01:00
pax-k
55c249834a chore(docs): cleanup 2024-11-15 19:26:16 +02:00
pax-k
dd189abd4a chore: pnpm lock 2024-11-15 19:16:32 +02:00
pax-k
df1a8e9c99 feat: vue docs 2024-11-15 19:13:19 +02:00
pax-k
259467ac3f Merge branch 'main' into vue-docs 2024-11-15 19:09:34 +02:00
Anselm Eickhoff
9a93ab2476 Merge pull request #767 from gardencmp/aeplay-jazz-447
Implement dynamic tables of content
2024-11-15 17:02:39 +00:00
Anselm
337272bbdc Merge branch 'main' into aeplay-jazz-447 2024-11-15 16:56:36 +00:00
pax-k
464ef7d9c3 chore: cleanup 2024-11-15 18:50:27 +02:00
pax-k
8727089654 Merge branch 'aeplay-jazz-447' of https://github.com/gardencmp/jazz into aeplay-jazz-447 2024-11-15 18:45:57 +02:00
pax-k
753bceddb3 fix: SSG for docs 2024-11-15 18:44:47 +02:00
Trisha Lim
8202996108 fix: TOC grows too wide if text is long 2024-11-15 16:31:21 +00:00
Trisha Lim
1385c8a66f Remove custom IDs on headings in mdx files 2024-11-15 15:48:02 +00:00
Anselm
2a72942f8e Implement dynamic ToCs 2024-11-15 15:34:35 +00:00
Anselm Eickhoff
e16836becc Merge pull request #765 from gardencmp/trishalim-jazz-480
Move examples page outside of docs
2024-11-15 15:21:06 +00:00
Trisha Lim
134a101a52 Center align book app thumbnail 2024-11-15 14:11:12 +00:00
Trisha Lim
3fc6030776 Update music player thumbnail 2024-11-15 14:08:40 +00:00
Anselm Eickhoff
8aebe61bf9 Merge pull request #762 from gardencmp/trishalim-jazz-440
Put social icons back to nav
2024-11-15 13:58:08 +00:00
Trisha Lim
8c9e807c19 Move examples page outside of docs 2024-11-15 12:07:42 +00:00
Trisha Lim
e25e4080c7 Reduce large prose font size 2024-11-15 12:04:17 +00:00
Trisha Lim
70a8353fe6 Remove roadmap link from footer 2024-11-15 11:53:54 +00:00
Trisha Lim
185b0d866a Replace Twitter with X 2024-11-15 11:53:41 +00:00
Trisha Lim
717667ac4c Fix color of garden logo 2024-11-15 11:51:24 +00:00
Trisha Lim
a0151caf02 Put social icons back to nav 2024-11-15 11:48:19 +00:00
Guido D'Orsi
c259331f57 Merge pull request #752 from gardencmp/reuse-crypto
fix: reuse the crypto instance when creating the browser context
2024-11-15 12:33:35 +01:00
Guido D'Orsi
f6bc8afa06 chore: changeset 2024-11-15 12:21:47 +01:00
Anselm Eickhoff
cee0aea5e6 Merge pull request #713 from gardencmp/trishalim-jazz-440
Redesign main nav on desktop
2024-11-15 11:20:28 +00:00
Anselm Eickhoff
c0e11f543d Merge pull request #741 from gardencmp/marina-onboarding-example
Onboarding example
2024-11-15 10:57:51 +00:00
Marina Orlova
b38f902d70 Add backward-compatible aliases for CoFeed* 2024-11-14 22:30:58 +01:00
Marina Orlova
a6085094a7 Rename CoStream -> CoFeed in jazz-tools 2024-11-14 18:57:44 +01:00
pax
df359ab6dd Update selfish-wolves-shout.md 2024-11-14 17:01:28 +02:00
Anselm Eickhoff
d89da07d42 Merge pull request #753 from gardencmp/bensleveritt-patch-1
Fix mesh reference
2024-11-14 11:37:46 +00:00
pax
94098c1f1f Merge pull request #755 from gardencmp/JAZZ-485-docs-pin-react-native-deps
Updated react-native docs and removed babel config section
2024-11-14 12:07:25 +02:00
pax-k
e71e83a217 Merge branch 'main' into JAZZ-485-docs-pin-react-native-deps 2024-11-14 11:58:30 +02:00
pax-k
df0b21caed chore: pnpm lock 2024-11-14 11:58:06 +02:00
Anselm Eickhoff
6921e621d7 Merge pull request #749 from gardencmp/changeset-release/main
Version Packages
2024-11-14 09:41:28 +00:00
pax-k
ec9e03c266 fix: updated react-native docs and removed babel config section 2024-11-14 11:40:27 +02:00
github-actions[bot]
1b0ef401fb Version Packages 2024-11-14 09:29:38 +00:00
pax
1833983b8d Merge pull request #754 from gardencmp/jazz-tools-ts-target
Change jazz-tools TS target to ES2021
2024-11-14 11:28:21 +02:00
pax-k
149ca97c48 chore: changeset 2024-11-14 11:15:25 +02:00
pax-k
f01a7621b0 fix: change jazz-tools TS target to ES2021 2024-11-14 11:13:13 +02:00
Benjamin S. Leveritt
e6a1e2f169 Fix mesh reference 2024-11-14 06:32:10 +00:00
Guido D'Orsi
6413059709 fix: assign a unique name to the IndexedDB storage peer 2024-11-13 20:14:22 +01:00
Guido D'Orsi
3c6fd37aba fix: reuse the crypto instance when creating the browser context 2024-11-13 18:39:49 +01:00
Marina Orlova
8dc90a3554 Fixed Jazz workspace versions 2024-11-13 18:26:15 +01:00
Marina Orlova
51b1818de6 Fix group creation 2024-11-13 16:19:48 +01:00
Anselm Eickhoff
ec7c416097 Merge pull request #744 from gardencmp/better-known-state
fix: dispatch more updates to knownState
2024-11-13 14:16:50 +00:00
Guido D'Orsi
0f30eeaec6 chore: changeset 2024-11-13 15:12:18 +01:00
Guido D'Orsi
5a3cf04ba7 fix: dispatch more updates to knownState 2024-11-13 12:32:24 +01:00
pax-k
1fe74be8af fix(jazz-vue): useCoState accepts id as either a ref or a plain value 2024-11-13 12:47:05 +02:00
pax-k
376032f54c chore: cleanup 2024-11-13 11:39:23 +02:00
Anselm Eickhoff
d6e744d948 Merge pull request #738 from gardencmp/changeset-release/main 2024-11-12 22:11:31 +00:00
github-actions[bot]
23b3acb58c Version Packages 2024-11-12 22:10:32 +00:00
Anselm Eickhoff
f32d0c1fad Merge pull request #743 from gardencmp/fix/react-provider-multiple-storage
fix: fixes the react provider intialization when multiple storage options are provided
2024-11-12 22:09:16 +00:00
Guido D'Orsi
a69ed0b7cd chore: changeset 2024-11-12 22:43:19 +01:00
Guido D'Orsi
b4d7024b98 fix: fixes the react provider intialization when multiple storage options are provided 2024-11-12 22:42:27 +01:00
Marina Orlova
222a2ce2e6 Fixed test 2024-11-12 20:41:26 +01:00
Marina Orlova
34a50a9173 Adds the app into Playwright Tests job 2024-11-12 20:28:15 +01:00
Marina Orlova
72c6198ef7 Adds tests 2024-11-12 20:28:15 +01:00
Marina Orlova
e4df1048c8 pnpm-lock 2024-11-12 20:28:15 +01:00
Marina Orlova
e8abd06406 Fix schema 2024-11-12 20:28:15 +01:00
Marina Orlova
968c2bd699 Onboarding app: Make tests run 2024-11-12 20:28:15 +01:00
Marina Orlova
12b6a3b291 Add path alias 2024-11-12 20:28:15 +01:00
Marina Orlova
c9f89e9c32 Adds onboarding example 2024-11-12 20:28:15 +01:00
pax-k
d27cff5c67 feat(docs): added VueJS docs 2024-11-12 20:41:53 +02:00
pax-k
a734530cc3 chore: added changeset 2024-11-12 19:55:58 +02:00
pax-k
cc51926d14 chore: biome fix 2024-11-12 19:53:52 +02:00
Guido D'Orsi
c0395dd0a3 Merge pull request #723 from gardencmp/feature/typescript-as-dev
fix: set up typescript as dev dependency
2024-11-12 18:48:28 +01:00
Guido D'Orsi
51d7ca09d9 Merge remote-tracking branch 'origin/main' into feature/typescript-as-dev 2024-11-12 18:41:56 +01:00
pax-k
fce808cc48 fix(chat-vue): pass computed(id) to useCoState 2024-11-12 19:37:49 +02:00
pax-k
4a9217eb25 fix(jazz-vue): useCoState reactive to id 2024-11-12 19:36:46 +02:00
pax-k
69df98f4fa feat(todo-vue): implemented a Todo demo app for jazz-vue 2024-11-12 19:35:59 +02:00
Anselm Eickhoff
cf0a38d6bf Merge pull request #739 from gardencmp/fix/autologin
Move auto login check to useEffect
2024-11-12 10:56:35 +00:00
Trisha Lim
dd9b13fbaa Add changeset 2024-11-11 20:37:22 +00:00
Trisha Lim
6a982a29cb Move auto login check to useEffect 2024-11-11 20:35:41 +00:00
Anselm Eickhoff
ebc1b03158 Merge pull request #737 from gardencmp/feat/demo-auth-user-prop 2024-11-11 19:41:24 +00:00
Trisha Lim
adaf01f7fa Add bg blur effect on popover 2024-11-11 19:37:41 +00:00
Trisha Lim
c048f4eda9 Increase spacing in popover 2024-11-11 19:37:41 +00:00
Trisha Lim
b06272ff17 Layout fix 2024-11-11 19:37:40 +00:00
Trisha Lim
ac37bfab2d Close popover on click of link 2024-11-11 19:37:40 +00:00
Trisha Lim
d8e50824cb Add description and icon to mega menu items 2024-11-11 19:37:40 +00:00
Trisha Lim
29b27291a3 Links placement in desktop nav 2024-11-11 19:37:40 +00:00
Trisha Lim
efa1b60585 Add mobile nav 2024-11-11 19:37:39 +00:00
Trisha Lim
9d0b39c5cb Add popover menu to main nav using headless 2024-11-11 19:37:18 +00:00
Trisha Lim
2a02a5b212 Remove unused shadcn configs 2024-11-11 19:37:18 +00:00
Trisha Lim
c6931b82a0 Add changeset 2024-11-11 18:58:22 +00:00
Anselm Eickhoff
279e2202ba Merge pull request #710 from gardencmp/trishalim-jazz-455 2024-11-11 18:40:32 +00:00
Anselm Eickhoff
ec2324519e Merge pull request #735 from gardencmp/feat/demo-auth-user-prop 2024-11-11 18:38:46 +00:00
Anselm Eickhoff
5932f50c68 Merge pull request #699 from gardencmp/trishalim-jazz-458 2024-11-11 18:36:30 +00:00
Anselm Eickhoff
00906e5d08 Merge pull request #732 from gardencmp/fix/todo-demo-link 2024-11-11 18:35:59 +00:00
Trisha Lim
7bc5fca440 Add user prop to demo auth to skip login on demos 2024-11-11 16:35:55 +00:00
Trisha Lim
e30eb224ae Update demo links 2024-11-11 16:20:09 +00:00
Trisha Lim
983ea7cf03 Fix link to demo for pets example 2024-11-11 16:15:12 +00:00
Trisha Lim
ad2d453e33 Thumbnail fixes for mobile/tablet 2024-11-11 16:13:40 +00:00
Trisha Lim
15d711f6de Formatting fixes 2024-11-11 16:13:40 +00:00
Trisha Lim
7441a7d3d8 Formatting fixes 2024-11-11 16:13:40 +00:00
Trisha Lim
0d756209e9 Layout for mobile 2024-11-11 16:13:40 +00:00
Trisha Lim
b20c2ca173 Add images, description to examples 2024-11-11 16:13:40 +00:00
Trisha Lim
987a186db3 Add tech and features to example apps 2024-11-11 16:13:40 +00:00
Trisha Lim
f4e0b59fa1 Indicate active page on side nav 2024-11-11 16:13:31 +00:00
Trisha Lim
0d2112d8d0 Fix link to demo for todo example 2024-11-11 12:40:31 +00:00
Anselm Eickhoff
6fdab780a9 Merge pull request #730 from gardencmp/changeset-release/main
Version Packages
2024-11-10 13:17:22 +00:00
github-actions[bot]
159e2eb7f6 Version Packages 2024-11-10 13:16:08 +00:00
Anselm Eickhoff
9daa50dd7d Merge pull request #729 from gardencmp/aeplay-jazz-479
Set a CoValue as errored per peer after first error
2024-11-10 13:14:49 +00:00
Anselm
9c2aadb7d5 Add changeset 2024-11-10 13:09:57 +00:00
Anselm
7d0d81b16e Set a CoValue as errored per peer after first error 2024-11-10 13:09:36 +00:00
Guido D'Orsi
760a1c10c5 chore(sync): add a comment about syncing after sending an ack 2024-11-08 16:46:29 +00:00
Anselm Eickhoff
fac73f0e44 Merge pull request #726 from gardencmp/changeset-release/main
Version Packages
2024-11-08 16:42:11 +00:00
github-actions[bot]
80b04e78c9 Version Packages 2024-11-08 16:39:19 +00:00
Anselm Eickhoff
b23c0d75fe Merge pull request #725 from gardencmp/aeplay-jazz-477
Immediately ack new content before syncing it upstream
2024-11-08 16:38:03 +00:00
Anselm
d4319d8a0e Add changeset 2024-11-08 16:32:29 +00:00
Anselm
52cd4a9a0f Immediately ack new content before syncing it upstream 2024-11-08 16:31:52 +00:00
Guido D'Orsi
3ef3ff3db9 chore: changeset 2024-11-08 12:22:34 +00:00
Guido D'Orsi
549ec2047f fix: set up typescript as dev dependency 2024-11-08 12:21:50 +00:00
Anselm Eickhoff
ac241981f6 Merge pull request #722 from gardencmp/changeset-release/main
Version Packages
2024-11-08 12:09:49 +00:00
github-actions[bot]
b3504dce9c Version Packages 2024-11-08 12:07:47 +00:00
Anselm Eickhoff
f859d9f1c5 Merge pull request #711 from gardencmp/feature/non-optimistic-sync-state
feat: add a sync state subscription manager
2024-11-08 12:06:34 +00:00
Guido D'Orsi
d433cf473f chore: changeset 2024-11-08 12:03:25 +00:00
Guido D'Orsi
c6cd6cba20 Merge remote-tracking branch 'origin/main' into feature/non-optimistic-sync-state 2024-11-08 12:01:05 +00:00
Guido D'Orsi
9c7333d4f0 fix(createWorkerAccount): use the new sync wait API 2024-11-08 12:00:55 +00:00
Anselm Eickhoff
970f870245 Merge pull request #720 from gardencmp/aeplay-jazz-475
Less noisy logs if clients send empty WebSocket messages
2024-11-08 11:42:30 +00:00
Anselm
a2dbaf86d2 Fix unused var 2024-11-08 11:38:24 +00:00
Anselm
b6162f0fc4 Add changeset 2024-11-08 11:34:52 +00:00
Anselm
91cfa6aa8f Less noisy logs if clients send empty WebSocket messages 2024-11-08 11:34:28 +00:00
Anselm Eickhoff
cd152b83ae Merge pull request #697 from gardencmp/changeset-release/main
Version Packages
2024-11-08 10:36:27 +00:00
github-actions[bot]
bac3ddddf5 Version Packages 2024-11-08 10:30:47 +00:00
Anselm
b934fab89e Add changeset 2024-11-08 10:29:18 +00:00
Anselm
dc4ea86819 More graceful handling of potentially multiple agents 2024-11-08 10:28:43 +00:00
Guido D'Orsi
4fd6bbd41d Merge remote-tracking branch 'origin/main' into feature/non-optimistic-sync-state 2024-11-08 09:57:46 +00:00
Anselm Eickhoff
e4c1f0eefd Merge pull request #717 from gardencmp/feature/git-hooks-and-build-optimizations 2024-11-08 07:49:00 +00:00
Guido D'Orsi
e8a509e41c Merge remote-tracking branch 'origin/main' into feature/git-hooks-and-build-optimizations 2024-11-07 23:14:56 +00:00
Guido D'Orsi
53560b7ce1 Merge pull request #718 from gardencmp/feature/improve-jazz-run-tests
fix: add a timeout on the create account command
2024-11-07 23:10:03 +00:00
Guido D'Orsi
2aa2304d4d chore: removed console.log 2024-11-07 23:09:31 +00:00
Guido D'Orsi
d4c8443c4a chore: changeset 2024-11-07 23:08:18 +00:00
Guido D'Orsi
f9faf719d4 chore: improve the createWorkerAccount tests to let them fail earlier when the cloud is stuck 2024-11-07 22:36:16 +00:00
Guido D'Orsi
1a32e0c73f chore: add git hooks for formatting and linting fixes 2024-11-07 22:24:26 +00:00
Guido D'Orsi
0ea3ef31ac chore(PeerState): explain the difference between knownState and optimisticKnownState 2024-11-07 10:11:32 +00:00
Guido D'Orsi
d02613e2ec chore: add jazz-tools.json to the biome ignore 2024-11-07 09:21:42 +00:00
Guido D'Orsi
8ff036e5ff test: cover the content acknowledgment flow 2024-11-07 09:15:09 +00:00
Guido D'Orsi
d0733e2a3b chore: revert jazz-run changes 2024-11-07 00:25:31 +00:00
Guido D'Orsi
ad4f1b74f6 chore: fix type error 2024-11-07 00:20:26 +00:00
Guido D'Orsi
04d97e4a2d chore: format 2024-11-07 00:17:03 +00:00
Guido D'Orsi
3f9e749122 Merge remote-tracking branch 'origin/main' into feature/non-optimistic-sync-state 2024-11-07 00:12:56 +00:00
Guido D'Orsi
aa1dd3e10a feat: add a sync state subscription manager 2024-11-07 00:06:30 +00:00
Anselm Eickhoff
9f0deeb31c Merge pull request #701 from gardencmp/home/e2e-styling
Make background more visible in e2e section on mobile
2024-11-06 16:46:49 +00:00
Anselm Eickhoff
4f21ba9a5f Merge pull request #708 from gardencmp/docs/small-copy-changes
Docs: minor copy changes
2024-11-06 16:46:29 +00:00
Anselm Eickhoff
bdc541e35f Merge pull request #707 from gardencmp/benjamin-jazz-438
Fix coList header docs
2024-11-06 16:45:50 +00:00
Trisha Lim
7350915006 Docs: minor copy changes 2024-11-06 16:44:01 +00:00
Benjamin S. Leveritt
d678ddbe11 Fix coList header docs 2024-11-06 16:39:34 +00:00
Anselm Eickhoff
7e92f85117 Merge pull request #704 from gardencmp/benjamin-jazz-461
Nix dev environment + Node version spec
2024-11-06 16:29:39 +00:00
Anselm
ffbeb0af43 Merge branch 'main' into benjamin-jazz-461 2024-11-06 16:29:08 +00:00
Anselm Eickhoff
1eba2a66af Merge pull request #706 from gardencmp/benjamin-jazz-470
Add folders to git ignore (and Biome)
2024-11-06 16:27:42 +00:00
Benjamin S. Leveritt
854ade8c06 Add folders to git ignore (and Biome)
- .next/
- dist/
- test-results/

Resolves #705
2024-11-06 16:25:51 +00:00
Anselm Eickhoff
ccb060262f Fix vue changeset 2024-11-06 16:16:49 +00:00
Trisha Lim
981ad88fa1 Make background more visible in e2e section on mobile 2024-11-06 16:09:32 +00:00
Anselm Eickhoff
8caaca1267 Merge pull request #698 from tobiaslins/implement-multi-storage-forwarding-react
Allow to define multiple storage options
2024-11-06 16:07:49 +00:00
Anselm
2af107c676 Add changeset 2024-11-06 15:52:12 +00:00
Anselm
751a7394ff Apply formatting 2024-11-06 15:51:48 +00:00
Anselm
b1c0937bd2 Merge branch 'main' into implement-multi-storage-forwarding-react 2024-11-06 15:50:29 +00:00
Anselm Eickhoff
d5f9c57ed3 Merge pull request #694 from gardencmp/benjamin-jazz-405
Enforce coding standards
2024-11-06 15:40:49 +00:00
Benjamin S. Leveritt
f689a5871b Update readme tagline 2024-11-06 11:14:00 +00:00
Benjamin S. Leveritt
092359f37f Update readme with contribution guide link
Resolves #360
2024-11-06 10:33:38 +00:00
Benjamin S. Leveritt
0fb71c1938 Add tool versions to contribution guide 2024-11-06 10:26:14 +00:00
Benjamin S. Leveritt
60d150c8d0 Add nix flake for dev env
Resolves #684
2024-11-06 10:20:00 +00:00
Benjamin S. Leveritt
2dbfaf3ee0 Add git-blame-ignore 2024-11-06 09:43:03 +00:00
Benjamin S. Leveritt
a48f357928 Remove root format script 2024-11-06 09:36:56 +00:00
Benjamin S. Leveritt
a6e264d37b Remove monorepo-linting github action 2024-11-06 09:36:56 +00:00
Benjamin S. Leveritt
be0a09a222 Format workspace
Fix formatting on packages/jazz-run

Fix formatting on packages/jazz-react-native-media-images

Fix formatting on packages/jazz-react-native

Fix formatting on packages/jazz-react-auth-clerk

Fix formatting on packages/jazz-react

Fix formatting on packages/jazz-node

Fix formatting on packages/jazz-browser-media-images

Fix formatting on packages/jazz-browser-auth-clerk

Fix formatting on packages/jazz-browser

Fix formatting on packages/hash-slash

Fix formatting on packages/cojson-transport-ws

Fix formatting on packages/cojson-storage-sqlite

Fix formatting on packages/cojson-storage-indexeddb

Fix formatting on packages/cojson

Fix formatting on e2e/CoValues

Fix formatting in e2e/BinaryCoStream

Fix imports across workspace

Exclude homepage from formatting for now

Chore: Update pnpm lock

Fix formatting on workspace root files

Format examples

Fix formatting on examples/chat

Fix formatting on examples/chat-clerk

Fix formatting on examples/chat-rn

Fix formatting on examples/chat-rn-clerk

Fix formatting on examples/inspector

Fix formatting on examples/music-player

Fix formatting on examples/password-manager

Fix formatting on examples/pets

Fix formatting on examples/todo

Remove prettier from workspace deps

Include examples in formatting

Fix formatting in homepage/design-system

Fix formatting in homepage/gcmp

Fix formatting in homepage/homepage

Organise imports across workspace

Fix formatting for examples/chat-vue

Fix formatting for jazz-vue

Include homepage/* for formatting checks

Fix build script for jazz-vue
2024-11-06 09:36:56 +00:00
Benjamin S. Leveritt
4230cbf957 Rename github action 2024-11-06 09:32:09 +00:00
Tobias Lins
12ae46d10a Pull out logic into function and add tests 2024-11-05 21:11:37 +01:00
Tobias Lins
4e6a65de9d Allow to define multiple storage options 2024-11-05 19:51:33 +01:00
Anselm Eickhoff
4006544d11 Merge pull request #578 from gardencmp/jazz-vue
Support for Vue
2024-11-05 14:41:06 +00:00
pax-k
67c311b458 Merge branch 'main' into jazz-vue 2024-11-05 14:06:56 +02:00
pax-k
e796a6f2ba fix(vue): fixed logout and context re-creation 2024-11-05 14:06:10 +02:00
Benjamin S. Leveritt
f6cecfaaf9 Disable import sorting and linting for now 2024-11-05 11:47:44 +00:00
Benjamin S. Leveritt
572007139b Add github action for enforcing biome
Excluding examples for now
2024-11-05 11:26:06 +00:00
Benjamin S. Leveritt
47f3b72977 Fixed turbo commands for Biome 2024-11-05 11:08:51 +00:00
Anselm Eickhoff
4d9c5331d8 Merge pull request #671 from gardencmp/home/features-section
Rearrange feature sections
2024-11-05 09:58:16 +00:00
Anselm Eickhoff
d5482a32db Fix permission examples 2024-11-05 09:47:45 +00:00
Anselm Eickhoff
61b346a948 Merge pull request #691 from gardencmp/changeset-release/main
Version Packages
2024-11-05 09:38:34 +00:00
github-actions[bot]
c2dfe6a0dd Version Packages 2024-11-05 09:35:46 +00:00
Anselm Eickhoff
81e8910519 Merge pull request #676 from gardencmp/benjamin-jazz-452
Store clerk authentication locally
2024-11-05 09:34:29 +00:00
Anselm Eickhoff
577d5c2066 More specific testimonial credit 2024-11-05 09:33:18 +00:00
Benjamin S. Leveritt
cce679b031 Split changesets 2024-11-05 09:32:29 +00:00
Anselm Eickhoff
c2dbf45f26 Merge pull request #689 from gardencmp/changeset-release/main 2024-11-05 09:13:32 +00:00
Benjamin S. Leveritt
d9036bc47b Add editorconfig 2024-11-05 09:11:34 +00:00
github-actions[bot]
04d3a8c677 Version Packages 2024-11-05 09:05:45 +00:00
Anselm Eickhoff
91019f3f85 Merge pull request #687 from gardencmp/optimize-account-load-2
perf: optimize _loadedAs in CoList and CoValueBase
2024-11-05 09:04:20 +00:00
Benjamin S. Leveritt
4f61da553e Add root biome config 2024-11-05 09:02:35 +00:00
Benjamin S. Leveritt
ae11cbfded Add Biome dep 2024-11-05 15:19:22 +00:00
Benjamin S. Leveritt
06278c3d97 Update saveCredentials mock 2024-11-05 06:53:32 +00:00
Guido D'Orsi
36273b3114 chore: changeset 2024-11-04 23:09:34 +01:00
Guido D'Orsi
51a0a9f23f perf: optimize _loadedAs in CoList and CoValueBase 2024-11-04 23:07:51 +01:00
Anselm Eickhoff
fc24a65264 Merge pull request #685 from gardencmp/changeset-release/main
Version Packages
2024-11-04 20:10:10 +00:00
github-actions[bot]
fa0b9003dc Version Packages 2024-11-04 20:05:27 +00:00
Anselm Eickhoff
8a0da655e8 Merge pull request #686 from gardencmp/optimize-account-loadas
perf: cache the account refs resolution
2024-11-04 20:04:15 +00:00
Guido D'Orsi
fff11daca7 test: add tests for cache 2024-11-04 20:41:36 +01:00
pax-k
ef83947eb5 Merge branch 'main' into jazz-vue 2024-11-04 21:30:40 +02:00
pax-k
750cfa1b82 chore: cleanup 2024-11-04 21:29:43 +02:00
Guido D'Orsi
fd011d76f4 chore: changeset 2024-11-04 20:21:32 +01:00
Guido D'Orsi
0681a8301e perf: cache the account refs resolution 2024-11-04 20:09:34 +01:00
Benjamin S. Leveritt
221c58f1f7 Add changeset 2024-11-04 18:51:03 +00:00
pax-k
244e5ee582 chore: changeset 2024-11-04 20:48:44 +02:00
Benjamin S. Leveritt
ebca75bf70 Add check for existance and await 2024-11-04 18:43:01 +00:00
Trisha Lim
ea5bd59528 Make e2e icon smaller 2024-11-04 18:25:07 +00:00
Trisha Lim
5977fa3244 Copy changes 2024-11-04 17:56:21 +00:00
Trisha Lim
81179a4c34 Change e2e icon 2024-11-04 17:46:13 +00:00
Benjamin S. Leveritt
b5e516f974 Add tests
Particularly covering log out and checking for storing creds
2024-11-04 17:37:47 +00:00
Benjamin S. Leveritt
8fc5a49ca8 Refactor setItem into fn 2024-11-04 17:37:40 +00:00
Benjamin S. Leveritt
00054aa9a5 Export Credential type from jazz-tools 2024-11-04 17:11:05 +00:00
Benjamin S. Leveritt
6f3c98f704 Make saveCredentials optional 2024-11-04 17:00:28 +00:00
Anselm Eickhoff
8823957c6e Merge pull request #677 from gardencmp/feature/websocker-unique-name
feat(browser): refactor the WebSocket reconnection to assign the peer as id
2024-11-04 16:58:17 +00:00
Benjamin S. Leveritt
47ec0cd8fe Rename type 2024-11-04 16:53:42 +00:00
Benjamin S. Leveritt
685031c39c Remove check for user before passing to BrowserClerkAuth 2024-11-04 16:53:22 +00:00
Benjamin S. Leveritt
e4fd89dbbb Add saveCredentials to existing Clerk accounts authentications 2024-11-04 16:32:37 +00:00
pax-k
4968e194dc chore: sherif deps 2024-11-04 16:54:36 +02:00
pax-k
36e53ee462 chore: pnpm lock 2024-11-04 16:49:15 +02:00
pax-k
7e2e89be6d fix(vue): toRaw 2024-11-04 16:48:45 +02:00
pax-k
232801efdc fix(vue): Progressive image + DemoAuth UI 2024-11-04 16:47:21 +02:00
Guido D'Orsi
e0dd0065fb chore: changeset 2024-11-04 15:06:33 +01:00
Guido D'Orsi
98d7d402eb feat(browser): refactor the WebSocket reconnection to assign the peer as id 2024-11-04 14:28:11 +01:00
Trisha Lim
ba5dfd34f2 Dark mode for server workers illustration 2024-11-04 11:45:36 +00:00
Trisha Lim
2701cd7e4c 4-col layout for local-first section 2024-11-04 11:33:36 +00:00
Trisha Lim
5429590797 Mobile view for e2e 2024-11-04 11:04:06 +00:00
Trisha Lim
c1dfda1321 Dark mode styling 2024-11-04 10:51:15 +00:00
Benjamin S. Leveritt
57deec451a Check for local credentials before Clerk checks 2024-11-04 10:47:42 +00:00
Trisha Lim
a7f38c946d Fix build 2024-11-04 10:42:38 +00:00
Trisha Lim
8a4204e262 Clean up features section 2024-11-04 10:26:19 +00:00
Trisha Lim
77090f4368 Remove "coming soon" badges under coming soon section 2024-11-04 10:13:29 +00:00
Trisha Lim
d655bb5638 Move home page sections to separate components 2024-11-04 10:09:24 +00:00
Benjamin S. Leveritt
bc8ea23e6d Store clerk authentication locally
Introduce LocallyStoredCredentials for storing and validating local storage values
2024-11-04 09:39:46 +00:00
Trisha Lim
0a30b719f1 Move encryption letters around 2024-11-01 20:17:58 +00:00
Trisha Lim
82c7b5ff85 Delete datastructure section, move rich text to "coming soon" section 2024-11-01 20:15:38 +00:00
Trisha Lim
faab6c02df Delete unused mdx files 2024-11-01 20:12:40 +00:00
Trisha Lim
de7631c5b3 Update heading 2024-11-01 20:00:37 +00:00
Trisha Lim
3cdf823f74 Add testimonial from SA1 2024-11-01 18:43:43 +00:00
Trisha Lim
ec91b6b3c2 Add "offline-first" feature and redesign layout for local-first section 2024-11-01 18:43:34 +00:00
Trisha Lim
a725119e0f Refactor random chars 2024-11-01 17:12:22 +00:00
Trisha Lim
520a8e736f Use random letters for illustration in e2e section 2024-11-01 16:54:04 +00:00
Trisha Lim
a1a0b203f0 Fix duplicate h3 2024-11-01 15:33:36 +00:00
Trisha Lim
7059196ca2 Add illustration for server worker feature 2024-11-01 15:21:17 +00:00
Anselm
d2ad2db930 Fix anselm's bluesky 2024-11-01 15:17:55 +00:00
Trisha Lim
b53d40dad8 Make e2ee section HUGE 2024-11-01 15:12:09 +00:00
Trisha Lim
84ca2f7af1 Explain e2ee 2024-11-01 15:04:15 +00:00
Trisha Lim
61655d3b53 Replace state management with server workers 2024-11-01 14:51:42 +00:00
Trisha Lim
b1263b85e9 Make e2e more prominent 2024-11-01 14:00:25 +00:00
Trisha Lim
49a7fa2d9a Illustration for auth feature 2024-11-01 13:38:11 +00:00
Trisha Lim
f1b0abc377 Illustration for "image loading" feature 2024-11-01 13:20:18 +00:00
Trisha Lim
a62f0bf852 Illustration for "file uploads" feature 2024-11-01 13:05:38 +00:00
Trisha Lim
17165523f4 Illustration placeholders 2024-11-01 12:51:16 +00:00
Trisha Lim
5395f0bb69 Mobile layout for features section 2024-11-01 11:06:48 +00:00
Trisha Lim
3bb5421a37 Fix build error 2024-11-01 11:02:02 +00:00
Trisha Lim
dd48e52a75 Add margin between heading and content 2024-11-01 10:57:50 +00:00
Trisha Lim
e18537eb67 Styling for Jazz Cloud section 2024-11-01 10:44:25 +00:00
pax-k
82d81975d3 Merge branch 'main' into jazz-vue 2024-11-01 12:27:31 +02:00
Anselm Eickhoff
44497fd058 Merge pull request #668 from gardencmp/changeset-release/main
Version Packages
2024-11-01 10:20:07 +00:00
Trisha Lim
ff2b5ce0a0 Styling for collaboration section 2024-11-01 10:11:52 +00:00
github-actions[bot]
a18c187818 Version Packages 2024-11-01 10:04:27 +00:00
Anselm Eickhoff
f49949cc25 Merge pull request #653 from gardencmp/feature/react-provider-dev-mode
fix: ensure that the react provider doesn't run twice on dev
2024-11-01 10:03:09 +00:00
Trisha Lim
cbc723f129 Add kicker to collaboration section 2024-11-01 09:56:24 +00:00
Anselm
3cc6aee7e6 Add changeset 2024-11-01 09:54:11 +00:00
Trisha Lim
624442b1c1 Move e2e to collaboration section 2024-11-01 09:52:24 +00:00
Trisha Lim
74e672b38b Remove old sections 2024-11-01 09:50:55 +00:00
Trisha Lim
a0d169fea8 Divide features into 3 sections: local-first, collaboration, everything else 2024-11-01 09:50:40 +00:00
Anselm Eickhoff
c80763100e Merge pull request #651 from gardencmp/gudorsi-jazz-248-storage-peer
feat: introduce the storage peer role
2024-11-01 09:50:14 +00:00
Anselm
6ed75ebb35 Add changeset 2024-11-01 09:49:30 +00:00
Anselm Eickhoff
30d7734124 Merge pull request #663 from gardencmp/trishalim-jazz-443
Close mobile nav after clicking a link
2024-11-01 09:41:10 +00:00
Anselm Eickhoff
bca8b44189 Merge pull request #664 from gardencmp/trishalim-jazz-445
Docs: create separate pages for nextjs and react native
2024-11-01 09:31:11 +00:00
Anselm Eickhoff
36a069c90f Merge pull request #666 from gardencmp/feature/jazz-run-integration-test
chore(jazz-run): extract commands business logic and add tests
2024-11-01 09:29:12 +00:00
Guido D'Orsi
757b37e8ed feat: introduce the storage peer role 2024-10-31 23:18:47 +01:00
Guido D'Orsi
46b1163058 chore(jazz-run): split commands and core logic and add tests 2024-10-31 23:09:42 +01:00
Trisha Lim
8c261b0409 Create separate pages for nextjs and react native 2024-10-31 19:36:19 +00:00
Trisha Lim
fdacde57dd Lint fix 2024-10-31 19:10:38 +00:00
Trisha Lim
817dd7dde1 Close mobile nav after clicking a link 2024-10-31 19:07:11 +00:00
Anselm Eickhoff
6279dd1467 Merge pull request #662 from gardencmp/trishalim-jazz-446
Add yellow dot as legend for docs that are WIP
2024-10-31 17:30:18 +00:00
Trisha Lim
abd4b94392 Add legend in side nav to indicate WIP docs 2024-10-31 17:24:03 +00:00
Trisha Lim
68c6ee77c0 Remove % progress in docs, add '/coming-soon' page 2024-10-31 17:18:33 +00:00
Anselm Eickhoff
d2b2812428 Merge pull request #658 from gardencmp/fix/sticky-nav
Fix nav is not sticking to top
2024-10-31 16:29:52 +00:00
Anselm Eickhoff
fe214cc3c2 Merge pull request #657 from gardencmp/fix/h4-style
Fix styling for h4 in prose
2024-10-31 16:29:39 +00:00
Anselm Eickhoff
2cca9506ad Merge pull request #656 from gardencmp/react-native-docs
React native docs
2024-10-31 16:29:06 +00:00
Trisha Lim
17e69aff8f Add space between main content and footer 2024-10-31 14:22:33 +00:00
Trisha Lim
c45331e645 Fix nav is not sticking to top 2024-10-31 14:21:13 +00:00
Trisha Lim
4337001526 Fix styling for h4 in prose 2024-10-31 13:52:23 +00:00
pax-k
9eef1ec031 fix(docs): layout centering 2024-10-31 15:33:54 +02:00
pax-k
9d31bbc3aa chore(docs): added react native docs 2024-10-31 15:20:01 +02:00
Guido D'Orsi
911add3dea fix: ensure that the react provider doesn't run twice on dev 2024-10-31 11:19:48 +01:00
Anselm Eickhoff
eed9ad99d8 Merge pull request #652 from gardencmp/changeset-release/main 2024-10-30 20:20:51 +00:00
github-actions[bot]
a1d0793e95 Version Packages 2024-10-30 20:06:28 +00:00
Anselm Eickhoff
ac9aad2ff5 Merge pull request #646 from gardencmp/gudorsi-jazz-248
Improve the jazz-run create command and make it possible to subscribe to the peer sync state
2024-10-30 20:05:19 +00:00
Guido D'Orsi
1ed4ab5a8e chore: changeset 2024-10-30 19:50:24 +01:00
Anselm Eickhoff
b03aed69b6 Merge pull request #558 from gardencmp/trishalim-jazz-388
Docs outline, move guide pages to right side nav
2024-10-30 17:53:28 +00:00
Anselm
1120d84c89 Merge branch 'main' into trishalim-jazz-388 2024-10-30 17:32:03 +00:00
Anselm Eickhoff
4e4671cba2 Merge pull request #623 from gardencmp/aeplay-jazz-146 2024-10-30 16:40:29 +00:00
Anselm
cdca330f1e Remove Roadmap 2024-10-30 15:15:55 +00:00
Anselm
bf8840cfbc Write introduction 2024-10-30 15:15:23 +00:00
Anselm
89d4da8d50 Make unfinshed docs unclickable & fix mobile docs nav 2024-10-30 14:42:35 +00:00
Anselm Eickhoff
74e441d233 Merge pull request #645 from gardencmp/trishalim-jazz-358
Add dark/light theme toggler
2024-10-30 13:36:50 +00:00
Anselm Eickhoff
58e5682e3d Merge pull request #634 from gardencmp/trishalim-jazz-430
Redesign diagrams section
2024-10-30 13:34:47 +00:00
Trisha Lim
4915422646 Don't set border colors 2024-10-30 11:32:17 +00:00
Trisha Lim
2337d66ec5 Fix nav disappears 2024-10-30 11:31:05 +00:00
Trisha Lim
e2c73d3c3d Rename localSrc to localsrc due to react error 2024-10-30 11:11:15 +00:00
Trisha Lim
e4c0314368 Redesign problem section 2024-10-30 11:08:13 +00:00
Trisha Lim
228cd42b23 Fix console errors 2024-10-30 10:53:57 +00:00
Trisha Lim
1c80492482 Theme toggle button styling 2024-10-30 10:51:38 +00:00
Guido D'Orsi
bfbd5c514b chore(ci): fix the jazz-tools action 2024-10-29 22:34:30 +01:00
Anselm
520bcfd72a Public shaming for missing docs 2024-10-29 21:26:26 +00:00
Guido D'Orsi
566fde6ecc chore(jazz-run): chore extract the accountCreate command 2024-10-29 21:56:03 +01:00
Guido D'Orsi
c44b5db09a test: add a github action to test account create 2024-10-29 21:52:43 +01:00
Guido D'Orsi
477d0aa899 fix(jazz-run): replace the sleep with a sync status check on create account 2024-10-29 21:42:28 +01:00
Guido D'Orsi
60171b477f feat: move all the optimisticKnownStates update operation inside PeerKnownStates 2024-10-29 21:40:26 +01:00
Trisha Lim
9d4fb4d32b Layout fix 2024-10-29 19:24:44 +00:00
Trisha Lim
d5b9544f6b Move next-themes installation to design system 2024-10-29 19:14:10 +00:00
Trisha Lim
357e6ba59f Add theme toggle to footer for gcmp 2024-10-29 19:09:42 +00:00
Trisha Lim
0aca58af1e Move theme toggle to footer 2024-10-29 19:09:41 +00:00
Trisha Lim
790caf6f0d Delete themeProvider 2024-10-29 19:09:07 +00:00
Trisha Lim
d4fbae2bf3 Add dark/light theme toggler 2024-10-29 19:09:07 +00:00
Guido D'Orsi
da3bc74fe5 Merge pull request #620 from gardencmp/feature/sync-state-resume-repro
test: add an E2E test to test the sync resumability
2024-10-29 19:15:25 +01:00
Anselm Eickhoff
a1bd53100b Merge pull request #643 from gardencmp/trishalim-jazz-437
Set default border color for dark mode
2024-10-29 17:36:52 +00:00
Trisha Lim
46d8b19918 Fix bold text color 2024-10-29 16:44:25 +00:00
Trisha Lim
8ed31452b9 Fix heading font sizes in home page 2024-10-29 16:37:01 +00:00
Trisha Lim
dfb8c3f329 Remove unnecessary border color styling 2024-10-29 16:28:26 +00:00
Trisha Lim
de0045e2ee Set default border color for dark mode 2024-10-29 15:48:59 +00:00
Anselm Eickhoff
7dfb485558 Merge pull request #641 from gardencmp/trishalim-jazz-435
Typography: styling, refactor defaults
2024-10-29 15:02:17 +00:00
Anselm Eickhoff
81ac9d0dfd Merge pull request #595 from gardencmp/trishalim-jazz-415
Add team members to team page
2024-10-29 15:02:06 +00:00
Anselm Eickhoff
1430ef6158 Merge pull request #640 from gardencmp/changeset-release/main
Version Packages
2024-10-29 14:53:58 +00:00
Trisha Lim
8759bccc02 Increase h2 font size 2024-10-29 14:40:33 +00:00
Trisha Lim
5dd0e31e2a Add text-reset util for resetting link styles 2024-10-29 14:32:50 +00:00
Trisha Lim
a2c1586d26 Use prose in hero description 2024-10-29 14:27:49 +00:00
Trisha Lim
7000698629 Move strong styling to tailwind config 2024-10-29 14:09:37 +00:00
Trisha Lim
f52511721e Use prose to style bold text 2024-10-29 13:57:57 +00:00
Trisha Lim
94e84dd5bd Dark mode styling for prose 2024-10-29 13:49:16 +00:00
Trisha Lim
ee0b1695fd Move CodeGroup component to design system 2024-10-29 12:14:42 +00:00
Trisha Lim
e338e9005b Move prose text styling into tailwind config 2024-10-29 12:08:34 +00:00
github-actions[bot]
00f2dea6ab Version Packages 2024-10-29 12:06:41 +00:00
Anselm
4fe3ae89da No-frozen-lockfile after versioning 2024-10-29 12:05:28 +00:00
Anselm
195d703e1f Use proper changeset-version script 2024-10-29 12:01:57 +00:00
Anselm
a49e3492ec Reinstall after changeset version 2024-10-29 11:57:18 +00:00
Anselm
a81846241c Add changeset for account create fix 2024-10-29 11:49:42 +00:00
Anselm
e0d62096af Add corepack to release action 2024-10-29 11:47:46 +00:00
Anselm
77ee9bc529 Add changesets release action 2024-10-29 11:46:45 +00:00
Trisha Lim
e20c4a2d76 Update Anselm's links 2024-10-29 11:18:41 +00:00
Anselm
675e72aec3 Tiny code sample fix 2024-10-29 11:12:46 +00:00
Anselm Eickhoff
8a45e6d642 Merge pull request #631 from gardencmp/feature/fix-account-create
fix(jazz-run): fix error on account create
2024-10-29 11:07:50 +00:00
Anselm Eickhoff
171565a88c Merge pull request #635 from gardencmp/trishalim-jazz-433
Change "jazz" to "Jazz"
2024-10-29 11:02:13 +00:00
Guido D'Orsi
f8945e99a9 test: add an E2E test to test the sync resumability 2024-10-28 21:52:39 +01:00
Trisha Lim
830a007a08 Add Marina's links, photos 2024-10-28 19:57:40 +00:00
Trisha Lim
3072072c60 Update home page title 2024-10-28 17:04:47 +00:00
Trisha Lim
2bb672ea20 Change "jazz" to "Jazz" 2024-10-28 16:52:29 +00:00
Trisha Lim
b6f7c61445 Add placeholder for empty image 2024-10-28 16:08:54 +00:00
Guido D'Orsi
a9af4fa0ff fix(jazz-run): fix error on account create 2024-10-28 00:04:41 +01:00
Anselm
e37369027e Fix prose 2024-10-25 13:20:55 -07:00
Anselm
47eedc4433 Merge branch 'main' into aeplay-jazz-146 2024-10-25 13:20:06 -07:00
Anselm Eickhoff
3d4c151260 Merge pull request #629 from gardencmp/hero-cleanup
pixel-level adjustments
2024-10-25 13:07:09 -07:00
Anselm
eadbb2b8e5 pixel-level adjustments 2024-10-25 13:06:22 -07:00
Anselm Eickhoff
12ab0b9ac1 Merge pull request #628 from gardencmp/hero-cleanup
Hero cleanup
2024-10-25 12:50:54 -07:00
Anselm
a723ad5e92 Better hero heading breaking 2024-10-25 12:26:22 -07:00
Anselm
a459193bbd Better hero breaking 2024-10-25 12:24:52 -07:00
Anselm
65c0eecc62 Less extreme negative margin on after diagram on mobile 2024-10-25 12:23:23 -07:00
Anselm
7f63675ee5 Fix horizontal overscroll on mobile 2024-10-25 12:20:54 -07:00
Anselm
35f236f17e Copy improvements 2024-10-25 12:07:38 -07:00
Anselm
4131754c32 Changes to hero diagram 2024-10-25 11:19:04 -07:00
Anselm Eickhoff
8ead3a7ce5 Merge pull request #625 from gardencmp/home/diagrams
Redesign diagrams
2024-10-25 08:27:54 -07:00
Trisha Lim
2aa055e164 Move "hard things.." to separate component 2024-10-25 11:48:12 +01:00
Trisha Lim
2e2e0b8dce New diagram for right side 2024-10-25 11:43:35 +01:00
Trisha Lim
42897dc211 Dark mode styling 2024-10-24 17:07:58 +01:00
Trisha Lim
d80a8f35ec Remove unused file 2024-10-24 12:48:41 +01:00
Trisha Lim
7a6dcc28b2 Redesign diagrams section 2024-10-24 12:26:06 +01:00
Anselm
3f78c011df Start sketching out CoValue schema section 2024-10-23 22:36:05 +01:00
Anselm Eickhoff
55aa159b56 Merge pull request #626 from gardencmp/home/features
Quick fix for features section being squished
2024-10-23 21:48:38 +01:00
Trisha Lim
6225427363 Rename "Sync" to "Real-time sync" 2024-10-23 21:24:45 +01:00
Trisha Lim
81d922d490 Rename "E2EE" to "E2E encryption" 2024-10-23 21:24:24 +01:00
Trisha Lim
0ba357dab7 Move auth into features section 2024-10-23 21:23:46 +01:00
Anselm Eickhoff
03b4c3cd12 new slogan 2024-10-23 21:14:10 +01:00
Anselm Eickhoff
265b2aaf83 Merge pull request #622 from gardencmp/copy/local-first-hero
Rewrite hero copy
2024-10-23 20:09:46 +01:00
Anselm
fbb22f1e9d Small fixes 2024-10-23 19:55:00 +01:00
Anselm
280e1e25e3 Minimal server-side explanation 2024-10-23 19:52:15 +01:00
Anselm
c7306a0c57 React & Next setup section (with TODOs) 2024-10-23 19:21:16 +01:00
Trisha Lim
4af29dd034 Address feedback 2024-10-23 18:37:19 +01:00
Trisha Lim
4d70862344 Address feedback 2024-10-23 18:13:15 +01:00
Anselm
d40ef934e8 Add sync-and-storage page 2024-10-23 16:52:39 +01:00
Trisha Lim
7af0b2b938 Rewrite hero copy 2024-10-23 12:15:51 +01:00
Anselm Eickhoff
49ee543b5e Merge pull request #613 from gardencmp/bsl-branch-2
Community Contribution Docs
2024-10-22 14:46:38 +01:00
Benjamin S. Leveritt
f68be96d86 Add contact address 2024-10-22 13:26:39 +01:00
Anselm Eickhoff
99721a2e56 Merge pull request #612 from gardencmp/trishalim-jazz-421
Move code samples from hero section to its own section
2024-10-22 11:22:12 +01:00
Trisha Lim
e4b6678538 Mobile adjustments, address feedback 2024-10-22 10:24:45 +01:00
Trisha Lim
bb443269c3 Remove handwritten font 2024-10-22 09:56:31 +01:00
Anselm Eickhoff
2e97deb894 Merge pull request #615 from gardencmp/gcmp/favicon
Update favicon for gcmp
2024-10-22 09:25:48 +01:00
Guido D'Orsi
cabec79dde Merge pull request #604 from gardencmp/feature/music-player-tests
test: add E2E tests on the Music Player example
2024-10-21 22:06:52 +02:00
Trisha Lim
6f9afdc2d3 Update favicon for gcmp 2024-10-21 21:00:02 +01:00
Trisha Lim
3e8d4fdd53 Update team members info 2024-10-21 20:54:11 +01:00
Trisha Lim
35d5e4b39e Add jazz cloud step 2024-10-21 18:07:25 +01:00
Benjamin S. Leveritt
aeb521e6d9 Add note about code standard tools 2024-10-21 17:45:07 +01:00
Trisha Lim
5228dc43c9 Move testimonial to design system 2024-10-21 17:16:41 +01:00
Benjamin S. Leveritt
4ba7731dce Add code of conduct 2024-10-21 17:16:25 +01:00
Trisha Lim
1afe45d2f2 Mobile view 2024-10-21 17:11:06 +01:00
Benjamin S. Leveritt
7e574191eb Add contributing guide 2024-10-21 17:08:26 +01:00
Anselm
4ac35b5b6d Hide test post 2024-10-21 17:03:16 +01:00
Trisha Lim
88a6cc132f Redesign testimonial 2024-10-21 16:42:16 +01:00
Trisha Lim
574509e83a Increase padding on diagram 2024-10-21 16:30:47 +01:00
Trisha Lim
f9ce03113e Decrease font size under "hard things.." 2024-10-21 16:20:25 +01:00
Trisha Lim
b0eda8350a Add step descriptions, testimonial 2024-10-21 15:53:39 +01:00
Trisha Lim
9cb5ea332a Move code samples to a separate section 2024-10-21 14:27:39 +01:00
Anselm Eickhoff
1f409493de Merge pull request #608 from hamirmahal/fix/usage-of-a-deprecated-nodejs-version-in-unit-test
fix: usage of `a deprecated Node.js version` in CI
2024-10-21 11:53:09 +01:00
Hamir Mahal
5ac310ff9f fix: usage of a deprecated Node.js version in CI 2024-10-20 09:44:05 -07:00
Anselm Eickhoff
9a96203f8d Merge pull request #602 from gardencmp/trishalim-jazz-419
Add blog to gcmp
2024-10-20 15:58:02 +01:00
Guido D'Orsi
5239a05734 chore: extract MusicTrackTitleInput component 2024-10-18 23:04:13 +02:00
Guido D'Orsi
4bed591002 test: add E2E tests on the Music Player example 2024-10-18 22:39:45 +02:00
Trisha Lim
aede27f986 Move meta into mdx file 2024-10-18 19:22:59 +01:00
Trisha Lim
8aeb89e878 Add jsonld to blog post 2024-10-18 19:09:31 +01:00
Trisha Lim
31cec1986b Add blog posts feed 2024-10-18 19:09:31 +01:00
Trisha Lim
d7ae755ce4 Blog post page styling 2024-10-18 19:09:31 +01:00
Trisha Lim
d425c18b9a Add blog to gcmp 2024-10-18 19:09:31 +01:00
Anselm Eickhoff
91d94abaf2 Merge pull request #599 from gardencmp/styling/input
Add Input component and prettier to design system
2024-10-18 13:15:01 +01:00
Trisha Lim
5730c933ee Add prettier to design-system project 2024-10-18 11:09:50 +01:00
Trisha Lim
68be1274bf Add input component to design system 2024-10-18 11:06:39 +01:00
Trisha Lim
e4180308ea Dark mode 2024-10-18 10:41:13 +01:00
Anselm Eickhoff
14fec451ec Merge pull request #596 from gardencmp/feature/covalue-state
chore: refactor CoValueState to manage the availability logic
2024-10-18 10:15:37 +01:00
Guido D'Orsi
916073ee2a chore: refactor CoValueState to manage the availability logic 2024-10-18 00:28:44 +02:00
Trisha Lim
2b48954693 Add team members to team page 2024-10-17 21:17:11 +01:00
Anselm Eickhoff
d789ee031f Merge pull request #594 from gardencmp/trishalim-jazz-416 2024-10-17 19:09:09 +01:00
Trisha Lim
a58a73b9f2 Fix env var possibly undefined 2024-10-17 18:16:54 +01:00
Trisha Lim
4172e9f160 Add social image 2024-10-17 18:14:53 +01:00
Trisha Lim
04baa537b9 Add newsletter subscription form using Resend 2024-10-17 18:08:14 +01:00
Anselm
4a2649c2d1 Fix homepages workspace 2024-10-17 16:10:46 +01:00
Anselm Eickhoff
0845853e42 Merge pull request #593 from gardencmp/trishalim-jazz-414
Add gcmp project
2024-10-17 15:42:58 +01:00
Trisha Lim
933be40123 Dark mode styling 2024-10-17 14:37:13 +01:00
Trisha Lim
c385b9a501 Delete files 2024-10-17 14:33:17 +01:00
Trisha Lim
2c1774dc46 Add content for blog and team pages 2024-10-17 14:27:49 +01:00
Trisha Lim
77d7b4b99d Add navigation 2024-10-17 14:20:02 +01:00
Trisha Lim
3c6dca4779 Add home page content 2024-10-17 14:01:02 +01:00
Trisha Lim
1eba3a3e92 Initialize gcmp project 2024-10-17 13:34:33 +01:00
Trisha Lim
ef30e47b4b Move logos to design system 2024-10-17 12:59:20 +01:00
Trisha Lim
384e6dd3be Move Button component to design system 2024-10-17 12:52:09 +01:00
Anselm Eickhoff
5b61efc2cc Merge pull request #587 from gardencmp/trishalim-jazz-412
Add links to live demo in readme
2024-10-17 12:14:34 +01:00
Anselm Eickhoff
2623fa465c Merge pull request #584 from gardencmp/refactor/illustration
Convert hero illustration to code instead of image
2024-10-17 11:25:54 +01:00
Anselm Eickhoff
b5c8ea8e1c Merge pull request #575 from gardencmp/Rename-Jazz-Mesh-to-Jazz-Cloud
Rename Jazz Mesh to Jazz Cloud
2024-10-17 11:24:08 +01:00
Trisha Lim
352026e8ab Move highlight to another line 2024-10-17 10:17:57 +01:00
Trisha Lim
4a56365495 Add links to live demo in readme 2024-10-17 10:13:09 +01:00
Benjamin S. Leveritt
dfed6883f8 Fix leftovers 2024-10-17 07:50:44 +01:00
Trisha Lim
4473463f4a Change "Jazz Mesh" to "Jazz Cloud" in diagram 2024-10-17 07:47:00 +01:00
Benjamin S. Leveritt
b79619dcb3 Rename Global Cloud -> Jazz Cloud 2024-10-17 07:46:21 +01:00
Benjamin S. Leveritt
fe54274ac1 Update cojson docs 2024-10-17 07:46:21 +01:00
Benjamin S. Leveritt
61c1a38ba4 Update homepage cloud section 2024-10-17 07:46:18 +01:00
Benjamin S. Leveritt
76c1341549 Update homepage urls 2024-10-17 07:45:32 +01:00
Benjamin S. Leveritt
9d1bd08b77 Rename mesh page -> cloud page 2024-10-17 07:45:29 +01:00
Benjamin S. Leveritt
6cf7b974c1 Update job templates 2024-10-17 07:44:56 +01:00
Benjamin S. Leveritt
edb030e348 Update cloud blocks in mesh docs 2024-10-17 07:44:52 +01:00
Benjamin S. Leveritt
f644fc6610 Update example readmes 2024-10-17 07:28:40 +01:00
Benjamin S. Leveritt
8c7b721903 Update wss:// urls to cloud.jazz.tools 2024-10-17 07:28:40 +01:00
Trisha Lim
6b16f7a0c3 Highlight important lines 2024-10-16 21:47:20 +01:00
Trisha Lim
f3a6c752b4 Add description 2024-10-16 21:18:48 +01:00
Trisha Lim
0e053b2d47 Install handwritten font Sriracha 2024-10-16 21:04:59 +01:00
Trisha Lim
f462139327 Convert illustration to code 2024-10-16 21:01:07 +01:00
Anselm
8e32fd8688 Release 2024-10-16 19:30:35 +01:00
Anselm Eickhoff
2066543754 Merge pull request #583 from gardencmp/aeplay-jazz-410
Fix internal imports in jazz-nodejs
2024-10-16 19:29:18 +01:00
Anselm
a251aaabea Add changeset 2024-10-16 19:23:09 +01:00
Anselm
da95d6de08 Fix internal imports in jazz-nodejs 2024-10-16 19:21:17 +01:00
Anselm Eickhoff
cb367c38c8 Merge pull request #579 from gardencmp/styling/secondary-button
Styling for secondary button
2024-10-16 16:14:37 +01:00
Anselm Eickhoff
4acefe350c Merge pull request #580 from gardencmp/trishalim-jazz-349
Set meta title, description, and image
2024-10-16 16:13:34 +01:00
Trisha Lim
db8fa169d9 Set meta title, description, and image 2024-10-16 14:09:21 +01:00
pax-k
d998fdf6f6 fix: lint 2024-10-16 15:33:23 +03:00
pax-k
6cdedd63d9 fix(vue): reactivity 2024-10-16 15:30:58 +03:00
Trisha Lim
1703bc6c74 Styling for secondary button 2024-10-16 13:29:58 +01:00
Anselm
49d8287b24 Anselm's proposed structure 2024-10-16 11:41:22 +01:00
Trisha Lim
b6af85c91e Add simple public sharing 2024-10-16 11:28:34 +01:00
Trisha Lim
308ab80736 Rearrange outline 2024-10-16 11:27:51 +01:00
pax-k
73630b4d94 Merge branch 'main' into jazz-vue 2024-10-16 13:22:08 +03:00
pax-k
cb8dfcadbc feat: jazz-vue and chat-vue implementation (wip) 2024-10-16 13:21:36 +03:00
Trisha Lim
b759f29ab8 Increase docs body width 2024-10-16 11:09:22 +01:00
Trisha Lim
b826adabbf Show proposed outline 2024-10-16 11:00:52 +01:00
Anselm Eickhoff
7dd3d57800 Merge pull request #532 from gardencmp/anselm-jazz-378
Simplify pricing
2024-10-16 10:44:15 +01:00
Anselm
e0670a8742 Move CTA texts back under the button 2024-10-16 10:39:23 +01:00
Anselm
61f62660ca Address Trisha's feedback 2024-10-16 10:25:09 +01:00
Anselm Eickhoff
acca37fc4b Merge pull request #538 from gardencmp/trishalim-jazz-379
Redesign landing page hero
2024-10-16 10:11:15 +01:00
Anselm
88b01a14a6 Format 2024-10-16 10:09:03 +01:00
Anselm
30917c9b2e Wider gaps for tier logos 2024-10-16 10:08:50 +01:00
Anselm
4c22c75b45 Fix lockfile 2024-10-16 09:55:40 +01:00
Anselm
e9baca6781 Apply feedback 2024-10-16 09:46:39 +01:00
Anselm
46983ca49b Add missing icon 2024-10-15 17:40:49 +01:00
Anselm
c3e9790436 New iteration 2024-10-15 17:35:54 +01:00
Trisha Lim
2b4e839926 Remove empty pages from nav 2024-10-15 09:44:41 +01:00
Trisha Lim
c7aae14e03 Fix layout 2024-10-15 09:37:43 +01:00
Anselm Eickhoff
2444344929 Merge pull request #561 from gardencmp/fix-docs-typo 2024-10-15 09:21:11 +01:00
Anselm Eickhoff
d247183892 Merge pull request #472 from gardencmp/feature/react-adapter 2024-10-15 09:19:37 +01:00
pax-k
a81fe66e8f chore: docs 2024-10-14 23:28:13 +03:00
pax-k
6d43977b12 chore: docs 2024-10-14 23:24:38 +03:00
pax-k
14c00e5dd4 chore: react-native docs 2024-10-14 23:21:21 +03:00
Trisha Lim
263fe7a4b3 Increase container width 2024-10-14 18:44:12 +01:00
Trisha Lim
8049f1d972 Lint fix 2024-10-14 18:26:48 +01:00
Trisha Lim
f3263e60ff Add table of contents to left hand side 2024-10-14 18:24:48 +01:00
Benjamin S. Leveritt
79dd3eecb6 Fix typo, improve copy 2024-10-14 17:47:21 +01:00
Trisha Lim
6d6849707e Move guide down 2024-10-14 16:24:58 +01:00
Trisha Lim
11ac24e3f4 Update lock file 2024-10-14 16:13:55 +01:00
Trisha Lim
7a30f3c025 Set docs intro as /docs 2024-10-14 16:13:12 +01:00
Trisha Lim
c84f96c436 Fix guide URLs 2024-10-14 16:13:12 +01:00
Trisha Lim
0ecf666c9f Refactor components 2024-10-14 16:13:12 +01:00
Trisha Lim
42e4969f92 Define new outline 2024-10-14 16:13:12 +01:00
Trisha Lim
1ad823b52e Fix duplicate code 2024-10-11 16:49:09 +01:00
Trisha Lim
7dd958e920 Icon styling for dark mode 2024-10-11 16:38:44 +01:00
Trisha Lim
41d977d3b0 Illustration for dark mode 2024-10-11 16:36:58 +01:00
Trisha Lim
a9a3ad6e67 Mobile view 2024-10-11 16:17:12 +01:00
Trisha Lim
ca2bde4748 Illustration changes 2024-10-11 15:59:57 +01:00
Trisha Lim
9c3945b82a Add code samples to hero 2024-10-11 14:58:25 +01:00
Trisha Lim
86b2d98ba8 Add code snippet to the right of hero 2024-10-11 11:07:31 +01:00
Trisha Lim
bd8efcdb4d Redesign landing page hero 2024-10-11 10:27:57 +01:00
Trisha Lim
fe279ea94c Update copy 2024-10-10 19:42:51 +01:00
Trisha Lim
8481b3bf16 Styling for pricing section (#533) 2024-10-10 18:35:52 +01:00
Anselm
3311828432 Address some wording feedback 2024-10-10 17:37:28 +01:00
Anselm
f03f8dfeaa Better CTA subtext 2024-10-10 16:35:43 +01:00
Anselm
05e0b3d795 Less cringe CTA 2024-10-10 16:33:24 +01:00
Anselm
7ce08753f1 Simplify pricing 2024-10-10 16:27:33 +01:00
827 changed files with 59288 additions and 42592 deletions

View File

@@ -1,30 +1,30 @@
{
"$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [
[
"cojson",
"jazz-tools",
"jazz-browser",
"jazz-browser-media-images",
"jazz-browser-auth-clerk",
"jazz-react-auth-clerk",
"jazz-react",
"jazz-react-native",
"jazz-nodejs",
"jazz-run",
"cojson-transport-ws",
"cojson-storage-indexeddb",
"cojson-storage-sqlite"
]
],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": [],
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"onlyUpdatePeerDependentsWhenOutOfRange": true
}
"$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [
[
"cojson",
"jazz-tools",
"jazz-browser",
"jazz-browser-media-images",
"jazz-browser-auth-clerk",
"jazz-react-auth-clerk",
"jazz-react",
"jazz-react-native",
"jazz-nodejs",
"jazz-run",
"cojson-transport-ws",
"cojson-storage-indexeddb",
"cojson-storage-sqlite"
]
],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": [],
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"onlyUpdatePeerDependentsWhenOutOfRange": true
}
}

11
.editorconfig Normal file
View File

@@ -0,0 +1,11 @@
# EditorConfig is awesome: https://editorconfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2

1
.envrc Normal file
View File

@@ -0,0 +1 @@
use flake

2
.git-blame-ignore-revs Normal file
View File

@@ -0,0 +1,2 @@
# Formatted workspace with biome
be0a09a22295cd5d2ee3ef323e2d999da8a14110

View File

@@ -17,6 +17,7 @@ jobs:
"password-manager",
"pets",
"todo",
"onboarding",
]
steps:
@@ -55,4 +56,4 @@ jobs:
run: |
pnpm install
pnpm turbo build;
working-directory: ./examples/${{ matrix.example }}
working-directory: ./examples/${{ matrix.example }}

18
.github/workflows/code-quality.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Code quality
on:
push:
pull_request:
jobs:
quality:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Biome
uses: biomejs/setup-biome@v2
with:
version: latest
- name: Run Biome
run: biome ci .

51
.github/workflows/jazz-run.yml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: Jazz Run Tests
on:
push:
branches: ["main"]
pull_request:
types: [opened, synchronize, reopened]
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v3
with:
submodules: true
- name: Enable corepack
run: corepack enable
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build jazz-run
run: pnpm exec turbo build && chmod +x dist/index.js;
working-directory: ./packages/jazz-run
- name: Run create account
run: ./dist/index.js account create --name "Jazz Run CI test"
working-directory: ./packages/jazz-run

View File

@@ -1,21 +0,0 @@
name: Monorepo linting
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
monorepo-linting:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version-file: '.node-version'
- name: Run sherif
run: npx sherif@1.0.0

View File

@@ -13,7 +13,7 @@ jobs:
continue-on-error: true
strategy:
matrix:
project: ["e2e/BinaryCoStream", "e2e/CoValues", "examples/chat", "examples/pets"]
project: ["e2e/BinaryCoStream", "e2e/CoValues", "examples/chat", "examples/music-player", "examples/pets", "examples/onboarding"]
steps:
- uses: actions/checkout@v3

51
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: Release
on:
push:
branches:
- main
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@v3
- name: Enable corepack
run: corepack enable
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Create Release Pull Request or Publish to npm
id: changesets
uses: changesets/action@v1
with:
version: pnpm changeset-version
publish: pnpm release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -13,13 +13,13 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Enable corepack
run: corepack enable
- name: Install Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
cache: 'pnpm'
@@ -29,7 +29,7 @@ jobs:
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v3
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}

15
.gitignore vendored
View File

@@ -4,4 +4,17 @@ lerna-debug.log
docsTmp
.DS_Store
.turbo
coverage
coverage
# Next.js
**/.next
# Vite output
**/dist
# Playwright
test-results
.husky
.vscode/settings.json

View File

@@ -1,9 +0,0 @@
/** @type {import("prettier").Config} */
const config = {
trailingComma: "all",
tabWidth: 4,
semi: true,
singleQuote: false,
};
export default config;

131
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,131 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or advances of
any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address,
without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official email address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to [the community leaders responsible for enforcement](mailto:hello@gcmp.io).
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

81
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,81 @@
# Contribution Guide
Thank you for considering contributing to Jazz! Jazz is an open-source framework for building local-first apps. We value your time and effort and are excited to collaborate with you. This guide will help you get started with contributing.
## How to Contribute
### 1. Reporting Bugs
If you find a bug, please [open an issue with as much detail as possible](https://github.com/gardencmp/jazz/issues). Include:
- A clear and descriptive title.
- Steps to reproduce the issue.
- What you expected to happen.
- What actually happened.
### 2. Suggesting Enhancements
We welcome all ideas! If you have suggestions, feel free to open an issue marked with the "enhancement" label. Please provide context on why the enhancement would be beneficial and how it could be implemented.
### 3. Pull Requests
1. **Fork the repository** and create your feature branch (see [GitHub's guide on forking a repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo) if you're unfamiliar with the process):
2. **Make your changes**, ensuring that you follow our coding standards (`pnpm format` (prettier) and `pnpm lint` (eslint) will automatically let you know there are issues).
3. **Commit your changes** with a descriptive commit message.
4. **Push to your fork** and submit a pull request.
5. **Describe your pull request**, explaining the problem it solves or the enhancement it adds.
### 4. Code Style Guidelines
- We use [Prettier](https://prettier.io/) for formatting. Please ensure your code is formatted before submitting.
- Write descriptive comments where necessary.
### 5. Local Setup
You'll need Node.js 20.x or 22.x installed (we're working on support for 23.x), and pnpm 9.x installed. If you're using nix, run `nix develop` to get a shell with the correct versions of everything installed.
1. **Clone the repository**:
```bash
git clone https://github.com/gardencmp/jazz.git
```
2. **Install dependencies**:
```bash
pnpm install
```
3. **Run tests** to verify everything is working:
```bash
pnpm test
```
### 6. Testing
Please write tests for any new features or bug fixes. We use Vitest for unit tests, and Playwright for e2e tests. Make sure all tests pass before submitting a pull request.
```bash
pnpm test
```
NB: You'll need to run `pnpm exec playwright install` to install the Playwright browsers before first run.
### 7. Communication
- If you're unsure about anything, feel free to ask questions by opening a discussion, reaching out via issues, or on our [Discord](https://discord.gg/utDMjHYg42).
- Be respectful and constructive, this is a welcoming community for everyone.
- Please be mindful of GitHubs [Community Guidelines](https://docs.github.com/en/site-policy/github-terms/github-community-guidelines), which include being kind, avoiding disruptive behavior, and respecting others.
## Code of Conduct
Please read and adhere to our [Code of Conduct](./CODE_OF_CONDUCT.md) to ensure a positive experience for all contributors.
---
Thank you again for your interest in contributing to Jazz. Your help makes this project better for everyone!
If you have any questions, don't hesitate to reach out. Let's make something great together!

View File

@@ -1,12 +1,20 @@
# Jazz - Instant sync
# Jazz - Build local-first apps
**Jazz is an open-source toolkit for building apps with *distributed state.***
## Getting started
We recommend reading the [homepage](https://jazz.tools) and [docs](https://jazz.tools/docs) to get an overview of what Jazz is and how it works.
If you're interested in contributing, please read [CONTRIBUTING.md](./CONTRIBUTING.md).
For community and support, please join our [Discord](https://discord.gg/utDMjHYg42).
---
- Homepage: [jazz.tools](https://jazz.tools)
- Docs: [jazz.tools/docs](https://jazz.tools/docs)
- Community & support: [Discord](https://discord.gg/utDMjHYg42)
- Updates: [Twitter](https://twitter.com/jazz_tools) & [Email](https://gcmp.io/news)
- Updates: [X](https://x.com/jazz_tools) & [Email](https://gcmp.io/news)
Copyright 2024 &mdash; Garden Computing, Inc.
Copyright 2024 &mdash; Garden Computing, Inc.

25
biome.json Normal file
View File

@@ -0,0 +1,25 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"files": {
"ignoreUnknown": false,
"ignore": ["jazz-tools.json", "**/ios/**", "**/android/**"]
},
"formatter": {
"enabled": true,
"indentStyle": "space"
},
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": false,
"rules": {
"recommended": true
}
}
}

View File

@@ -1,55 +1,226 @@
# @jazz-e2e/binarycostream
## 0.0.107
### Patch Changes
- Updated dependencies [0a2fae3]
- Updated dependencies [99cda2f]
- cojson@0.8.30
- jazz-react@0.8.30
- jazz-tools@0.8.30
## 0.0.106
### Patch Changes
- Updated dependencies [dcc9c2e]
- Updated dependencies [699553f]
- cojson@0.8.29
- jazz-react@0.8.29
- jazz-tools@0.8.29
## 0.0.105
### Patch Changes
- Updated dependencies [605734c]
- cojson@0.8.28
- jazz-react@0.8.28
- jazz-tools@0.8.28
## 0.0.104
### Patch Changes
- Updated dependencies [75fdff4]
- cojson@0.8.27
- jazz-react@0.8.27
- jazz-tools@0.8.27
## 0.0.103
### Patch Changes
- Updated dependencies [59d37df]
- jazz-react@0.8.26
## 0.0.102
### Patch Changes
- jazz-react@0.8.24
## 0.0.101
### Patch Changes
- Updated dependencies [6f745be]
- Updated dependencies [d348c2d]
- Updated dependencies [124bf67]
- Updated dependencies [6902b5b]
- Updated dependencies [1a0cd3d]
- cojson@0.8.23
- jazz-tools@0.8.23
- jazz-react@0.8.23
## 0.0.100
### Patch Changes
- Updated dependencies [59cc64d]
- jazz-react@0.8.22
## 0.0.99
### Patch Changes
- Updated dependencies [0f30eea]
- Updated dependencies [149ca97]
- cojson@0.8.21
- jazz-tools@0.8.21
- jazz-react@0.8.21
## 0.0.98
### Patch Changes
- Updated dependencies [dd9b13f]
- Updated dependencies [a69ed0b]
- Updated dependencies [3ef3ff3]
- Updated dependencies [c6931b8]
- jazz-react@0.8.20
## 0.0.97
### Patch Changes
- Updated dependencies [9c2aadb]
- cojson@0.8.19
- jazz-react@0.8.19
- jazz-tools@0.8.19
## 0.0.96
### Patch Changes
- Updated dependencies [d4319d8]
- cojson@0.8.18
- jazz-react@0.8.18
- jazz-tools@0.8.18
## 0.0.95
### Patch Changes
- Updated dependencies [d433cf4]
- cojson@0.8.17
- jazz-react@0.8.17
- jazz-tools@0.8.17
## 0.0.94
### Patch Changes
- Updated dependencies [2af107c]
- Updated dependencies [b934fab]
- jazz-react@0.8.16
- cojson@0.8.16
- jazz-tools@0.8.16
## 0.0.93
### Patch Changes
- Updated dependencies [cce679b]
- jazz-tools@0.8.15
- jazz-react@0.8.15
## 0.0.92
### Patch Changes
- Updated dependencies [36273b3]
- jazz-tools@0.8.14
- jazz-react@0.8.14
## 0.0.91
### Patch Changes
- Updated dependencies [fd011d7]
- jazz-tools@0.8.13
- jazz-react@0.8.13
## 0.0.90
### Patch Changes
- Updated dependencies [6ed75eb]
- Updated dependencies [3cc6aee]
- cojson@0.8.12
- jazz-react@0.8.12
- jazz-tools@0.8.12
## 0.0.89
### Patch Changes
- Updated dependencies [1ed4ab5]
- cojson@0.8.11
- jazz-react@0.8.11
- jazz-tools@0.8.11
## 0.0.88
### Patch Changes
- jazz-react@0.8.7
- jazz-react@0.8.7
## 0.0.87
### Patch Changes
- jazz-react@0.8.6
- jazz-react@0.8.6
## 0.0.86
### Patch Changes
- Updated dependencies [c3f4e6b]
- Updated dependencies [d9152ed]
- jazz-tools@0.8.5
- cojson@0.8.5
- jazz-react@0.8.5
- Updated dependencies [c3f4e6b]
- Updated dependencies [d9152ed]
- jazz-tools@0.8.5
- cojson@0.8.5
- jazz-react@0.8.5
## 0.0.85
### Patch Changes
- Updated dependencies
- hash-slash@0.2.1
- Updated dependencies
- hash-slash@0.2.1
## 0.0.84
### Patch Changes
- Updated dependencies
- cojson@0.8.3
- jazz-react@0.8.3
- jazz-tools@0.8.3
- Updated dependencies
- cojson@0.8.3
- jazz-react@0.8.3
- jazz-tools@0.8.3
## 0.0.83
### Patch Changes
- Updated dependencies [a075f90]
- jazz-tools@0.8.2
- jazz-react@0.8.2
- Updated dependencies [a075f90]
- jazz-tools@0.8.2
- jazz-react@0.8.2
## 0.0.82
### Patch Changes
- Updated dependencies
- jazz-tools@0.8.1
- jazz-react@0.8.1
- Updated dependencies
- jazz-tools@0.8.1
- jazz-react@0.8.1

View File

@@ -5,7 +5,7 @@
<link rel="icon" type="image/png" href="/jazz-logo.png" />
<link rel="stylesheet" href="/src/index.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Jazz BinaryCoStream Tests</title>
<title>Jazz FileStream Tests</title>
</head>
<body>
<div id="root"></div>

View File

@@ -1,24 +1,23 @@
{
"name": "@jazz-e2e/binarycostream",
"name": "@jazz-e2e/filestream",
"private": true,
"version": "0.0.88",
"version": "0.0.107",
"type": "module",
"scripts": {
"dev": "vite",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",
"build": "tsc && vite build",
"preview": "vite preview",
"test": "playwright test",
"test:ui": "playwright test --ui"
},
"lint-staged": {
"*.{js,jsx,mdx,json}": "prettier --write"
},
"dependencies": {
"cojson": "workspace:0.8.5",
"cojson": "workspace:0.8.30",
"hash-slash": "workspace:0.2.1",
"is-ci": "^3.0.1",
"jazz-react": "workspace:0.8.7",
"jazz-tools": "workspace:0.8.5",
"jazz-react": "workspace:0.8.30",
"jazz-tools": "workspace:0.8.30",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},

View File

@@ -12,38 +12,42 @@ import isCI from "is-ci";
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
testDir: "./tests",
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: isCI,
/* Retry on CI only */
retries: isCI ? 2 : 0,
/* Opt out of parallel tests on CI. */
workers: isCI ? 1 : undefined,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: "html",
testDir: "./tests",
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: isCI,
/* Retry on CI only */
retries: isCI ? 2 : 0,
/* Opt out of parallel tests on CI. */
workers: isCI ? 1 : undefined,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: "html",
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL: isCI ? "http://localhost:4173/" : "http://localhost:5173",
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL: "http://localhost:5173/",
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: "on-first-retry",
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: "on-first-retry",
permissions: ["clipboard-read", "clipboard-write"],
},
/* Configure projects for major browsers */
projects: [
{
name: "chromium",
use: { ...devices["Desktop Chrome"] },
},
],
/* Configure projects for major browsers */
projects: [
{
name: "chromium",
use: { ...devices["Desktop Chrome"] },
},
],
/* Run your local dev server before starting the tests */
webServer: isCI ? {
command: "pnpm preview",
url: "http://localhost:4173/",
} : undefined,
/* Run your local dev server before starting the tests */
webServer: [
{
command: "pnpm preview --port 5173",
url: "http://localhost:5173/",
reuseExistingServer: !isCI,
},
],
});

View File

@@ -1,17 +1,18 @@
import { Account, BinaryCoStream, ID } from "jazz-tools";
import { Account, FileStream, ID } from "jazz-tools";
import { useEffect } from "react";
import { useAccount, useCoState } from "./jazz";
import { UploadedFile } from "./schema";
import { waitForCoValue } from "./lib/waitForCoValue";
async function getUploadedFile(
me: Account,
uploadedFileId: ID<UploadedFile>) {
const uploadedFile = await waitForCoValue(UploadedFile, uploadedFileId, me, Boolean, {})
async function getUploadedFile(me: Account, uploadedFileId: ID<UploadedFile>) {
const uploadedFile = await UploadedFile.load(uploadedFileId, me, {});
if (!uploadedFile) {
throw new Error("Uploaded file not found");
}
uploadedFile.coMapDownloaded = true;
await BinaryCoStream.loadAsBlob(uploadedFile._refs.file.id, me);
await FileStream.loadAsBlob(uploadedFile._refs.file.id, me);
return uploadedFile;
}
@@ -21,7 +22,7 @@ export function DownloaderPeer(props: { testCoMapId: ID<UploadedFile> }) {
const testCoMap = useCoState(UploadedFile, props.testCoMapId, {});
useEffect(() => {
getUploadedFile(account.me, props.testCoMapId).then(value => {
getUploadedFile(account.me, props.testCoMapId).then((value) => {
value.syncCompleted = true;
});
}, []);

View File

@@ -1,13 +1,13 @@
import { ID } from "jazz-tools";
import { useEffect, useState } from "react";
import { useAccount, useCoState } from "./jazz";
import { BytesRadioGroup } from "./lib/BytesRadioGroup";
import { createCredentiallessIframe } from "./lib/createCredentiallessIframe";
import { generateTestFile } from "./lib/generateTestFile";
import { getDownloaderPeerUrl } from "./lib/getDownloaderPeerUrl";
import { UploadedFile } from "./schema";
import { waitForCoValue } from "./lib/waitForCoValue";
import { getDefaultFileSize, getIsAutoUpload } from "./lib/searchParams";
import { BytesRadioGroup } from "./lib/BytesRadioGroup";
import { waitForCoValue } from "./lib/waitForCoValue";
import { UploadedFile } from "./schema";
export function UploaderPeer() {
const account = useAccount();
@@ -41,7 +41,7 @@ export function UploaderPeer() {
file.id,
account.me,
(value) => value.syncCompleted,
{}
{},
);
iframe.remove();
@@ -75,12 +75,8 @@ export function UploaderPeer() {
</div>
)}
{testFile?.coMapDownloaded && (
<div data-testid="co-map-downloaded">
CoMap synced!
</div>
<div data-testid="co-map-downloaded">CoMap synced!</div>
)}
</>
);
}

View File

@@ -2,8 +2,8 @@ import React from "react";
import ReactDOM from "react-dom/client";
import { DownloaderPeer } from "./DownloaderPeer";
import { UploaderPeer } from "./UploaderPeer";
import { getValueId } from "./lib/searchParams";
import { AuthAndJazz } from "./jazz";
import { getValueId } from "./lib/searchParams";
function Main() {
const valueId = getValueId();
@@ -17,8 +17,8 @@ function Main() {
ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
<AuthAndJazz>
<Main />
</AuthAndJazz>
<AuthAndJazz>
<Main />
</AuthAndJazz>
</React.StrictMode>,
);

View File

@@ -1,6 +1,6 @@
import { createJazzReactApp, useDemoAuth } from "jazz-react";
import { getValueId } from "./lib/searchParams";
import { useEffect, useRef } from "react";
import { getValueId } from "./lib/searchParams";
const key = getValueId()
? `downloader-e2e@jazz.tools`
@@ -19,17 +19,20 @@ export function AuthAndJazz({ children }: { children: React.ReactNode }) {
useEffect(() => {
if (state.state === "ready" && !signedUp.current) {
state.signUp('Mister X');
state.signUp("Mister X");
signedUp.current = true;
}
}, [state.state])
}, [state.state]);
return (
<Jazz.Provider auth={auth} peer={
localSync
? `ws://localhost:4200?key=${key}`
: `wss://mesh.jazz.tools/?key=${key}`
}>
<Jazz.Provider
auth={auth}
peer={
localSync
? `ws://localhost:4200?key=${key}`
: `wss://cloud.jazz.tools/?key=${key}`
}
>
{children}
</Jazz.Provider>
);

View File

@@ -4,46 +4,54 @@ export function BytesRadioGroup(props: {
}) {
return (
<p>
<BytesRadioInput
label="1KB"
value={1e3}
selectedValue={props.selectedValue}
onChange={props.onChange} />
<BytesRadioInput
label="10KB"
value={1e4}
selectedValue={props.selectedValue}
onChange={props.onChange} />
<BytesRadioInput
label="1KB"
value={1e3}
selectedValue={props.selectedValue}
onChange={props.onChange}
/>
<BytesRadioInput
label="10KB"
value={1e4}
selectedValue={props.selectedValue}
onChange={props.onChange}
/>
<BytesRadioInput
label="100KB"
value={1e5}
selectedValue={props.selectedValue}
onChange={props.onChange} />
onChange={props.onChange}
/>
<BytesRadioInput
label="150KB"
value={1e5 + 5e4}
selectedValue={props.selectedValue}
onChange={props.onChange} />
onChange={props.onChange}
/>
<BytesRadioInput
label="200KB"
value={2e6}
selectedValue={props.selectedValue}
onChange={props.onChange} />
onChange={props.onChange}
/>
<BytesRadioInput
label="500KB"
value={5e6}
selectedValue={props.selectedValue}
onChange={props.onChange} />
onChange={props.onChange}
/>
<BytesRadioInput
label="1MB"
value={1e6}
selectedValue={props.selectedValue}
onChange={props.onChange} />
onChange={props.onChange}
/>
<BytesRadioInput
label="10MB"
value={1e7}
selectedValue={props.selectedValue}
onChange={props.onChange} />
onChange={props.onChange}
/>
</p>
);
}
@@ -60,7 +68,8 @@ function BytesRadioInput(props: {
name="bytes"
value={props.value}
checked={props.value === props.selectedValue}
onChange={() => props.onChange(props.value)} />
onChange={() => props.onChange(props.value)}
/>
{props.label}
</label>
);

View File

@@ -1,4 +1,4 @@
import { Account, Group, BinaryCoStream } from "jazz-tools";
import { Account, FileStream, Group } from "jazz-tools";
import { UploadedFile } from "../schema";
export async function generateTestFile(me: Account, bytes: number) {
@@ -8,14 +8,14 @@ export async function generateTestFile(me: Account, bytes: number) {
const ownership = { owner: group };
const testFile = UploadedFile.create(
{
file: await BinaryCoStream.createFromBlob(
new Blob(['1'.repeat(bytes)], { type: 'image/png' }),
ownership
file: await FileStream.createFromBlob(
new Blob(["1".repeat(bytes)], { type: "image/png" }),
ownership,
),
syncCompleted: false,
coMapDownloaded: false,
},
ownership
ownership,
);
const url = new URL(window.location.href);
@@ -24,4 +24,3 @@ export async function generateTestFile(me: Account, bytes: number) {
return testFile;
}

View File

@@ -1,6 +1,5 @@
import { UploadedFile } from "src/schema";
export function getDownloaderPeerUrl(value: UploadedFile) {
const url = new URL(window.location.href);
url.searchParams.set("valueId", value.id);

View File

@@ -2,13 +2,19 @@ import { ID } from "jazz-tools";
import { UploadedFile } from "../schema";
export function getValueId() {
return new URLSearchParams(location.search).get("valueId") as ID<UploadedFile> | undefined ?? undefined;
return (
(new URLSearchParams(location.search).get("valueId") as
| ID<UploadedFile>
| undefined) ?? undefined
);
}
export function getIsAutoUpload() {
return new URLSearchParams(location.search).has("auto");
return new URLSearchParams(location.search).has("auto");
}
export function getDefaultFileSize() {
return parseInt(new URLSearchParams(location.search).get("fileSize") ?? 1e3.toString());
}
return parseInt(
new URLSearchParams(location.search).get("fileSize") ?? (1e3).toString(),
);
}

View File

@@ -12,7 +12,7 @@ export function waitForCoValue<T extends CoValue>(
valueId: ID<T>,
account: Account,
predicate: (value: T) => boolean,
depth: DepthsIn<T>
depth: DepthsIn<T>,
) {
return new Promise<T>((resolve) => {
function subscribe() {
@@ -30,7 +30,7 @@ export function waitForCoValue<T extends CoValue>(
() => {
unsubscribe();
setTimeout(subscribe, 100);
}
},
);
}

View File

@@ -1,7 +1,7 @@
import { BinaryCoStream, co, CoMap } from "jazz-tools";
import { CoMap, FileStream, co } from "jazz-tools";
export class UploadedFile extends CoMap {
file = co.ref(BinaryCoStream);
file = co.ref(FileStream);
syncCompleted = co.boolean;
coMapDownloaded = co.boolean;
}

View File

@@ -1,5 +1,5 @@
import { test, expect } from "@playwright/test";
import { setTimeout } from "node:timers/promises";
import { expect, test } from "@playwright/test";
test.describe("BinaryCoStream - Sync", () => {
test("should sync a file between the two peers", async ({ page }) => {

View File

@@ -21,5 +21,5 @@
"noFallthroughCasesInSwitch": true,
"baseUrl": "."
},
"include": ["src"],
"include": ["src"]
}

View File

@@ -1,10 +1,10 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import react from "@vitejs/plugin-react-swc";
import { defineConfig } from "vite";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
build: {
minify: false
}
})
minify: false,
},
});

View File

@@ -1,47 +1,218 @@
# @jazz-e2e/covalues
## 0.0.106
### Patch Changes
- Updated dependencies [0a2fae3]
- Updated dependencies [99cda2f]
- cojson@0.8.30
- jazz-react@0.8.30
- jazz-tools@0.8.30
## 0.0.105
### Patch Changes
- Updated dependencies [dcc9c2e]
- Updated dependencies [699553f]
- cojson@0.8.29
- jazz-react@0.8.29
- jazz-tools@0.8.29
## 0.0.104
### Patch Changes
- Updated dependencies [605734c]
- cojson@0.8.28
- jazz-react@0.8.28
- jazz-tools@0.8.28
## 0.0.103
### Patch Changes
- Updated dependencies [75fdff4]
- cojson@0.8.27
- jazz-react@0.8.27
- jazz-tools@0.8.27
## 0.0.102
### Patch Changes
- Updated dependencies [59d37df]
- jazz-react@0.8.26
## 0.0.101
### Patch Changes
- jazz-react@0.8.24
## 0.0.100
### Patch Changes
- Updated dependencies [6f745be]
- Updated dependencies [d348c2d]
- Updated dependencies [124bf67]
- Updated dependencies [6902b5b]
- Updated dependencies [1a0cd3d]
- cojson@0.8.23
- jazz-tools@0.8.23
- jazz-react@0.8.23
## 0.0.99
### Patch Changes
- Updated dependencies [59cc64d]
- jazz-react@0.8.22
## 0.0.98
### Patch Changes
- Updated dependencies [0f30eea]
- Updated dependencies [149ca97]
- cojson@0.8.21
- jazz-tools@0.8.21
- jazz-react@0.8.21
## 0.0.97
### Patch Changes
- Updated dependencies [dd9b13f]
- Updated dependencies [a69ed0b]
- Updated dependencies [3ef3ff3]
- Updated dependencies [c6931b8]
- jazz-react@0.8.20
## 0.0.96
### Patch Changes
- Updated dependencies [9c2aadb]
- cojson@0.8.19
- jazz-react@0.8.19
- jazz-tools@0.8.19
## 0.0.95
### Patch Changes
- Updated dependencies [d4319d8]
- cojson@0.8.18
- jazz-react@0.8.18
- jazz-tools@0.8.18
## 0.0.94
### Patch Changes
- Updated dependencies [d433cf4]
- cojson@0.8.17
- jazz-react@0.8.17
- jazz-tools@0.8.17
## 0.0.93
### Patch Changes
- Updated dependencies [2af107c]
- Updated dependencies [b934fab]
- jazz-react@0.8.16
- cojson@0.8.16
- jazz-tools@0.8.16
## 0.0.92
### Patch Changes
- Updated dependencies [cce679b]
- jazz-tools@0.8.15
- jazz-react@0.8.15
## 0.0.91
### Patch Changes
- Updated dependencies [36273b3]
- jazz-tools@0.8.14
- jazz-react@0.8.14
## 0.0.90
### Patch Changes
- Updated dependencies [fd011d7]
- jazz-tools@0.8.13
- jazz-react@0.8.13
## 0.0.89
### Patch Changes
- Updated dependencies [6ed75eb]
- Updated dependencies [3cc6aee]
- cojson@0.8.12
- jazz-react@0.8.12
- jazz-tools@0.8.12
## 0.0.88
### Patch Changes
- Updated dependencies [1ed4ab5]
- cojson@0.8.11
- jazz-react@0.8.11
- jazz-tools@0.8.11
## 0.0.87
### Patch Changes
- jazz-react@0.8.7
- jazz-react@0.8.7
## 0.0.86
### Patch Changes
- jazz-react@0.8.6
- jazz-react@0.8.6
## 0.0.85
### Patch Changes
- Updated dependencies [c3f4e6b]
- Updated dependencies [d9152ed]
- jazz-tools@0.8.5
- cojson@0.8.5
- jazz-react@0.8.5
- Updated dependencies [c3f4e6b]
- Updated dependencies [d9152ed]
- jazz-tools@0.8.5
- cojson@0.8.5
- jazz-react@0.8.5
## 0.0.84
### Patch Changes
- Updated dependencies
- hash-slash@0.2.1
- Updated dependencies
- hash-slash@0.2.1
## 0.0.83
### Patch Changes
- Updated dependencies
- cojson@0.8.3
- jazz-react@0.8.3
- jazz-tools@0.8.3
- Updated dependencies
- cojson@0.8.3
- jazz-react@0.8.3
- jazz-tools@0.8.3
## 0.0.82
### Patch Changes
- Updated dependencies [a075f90]
- jazz-tools@0.8.2
- jazz-react@0.8.2
- Updated dependencies [a075f90]
- jazz-tools@0.8.2
- jazz-react@0.8.2

View File

@@ -1,18 +1,17 @@
{
"name": "@jazz-e2e/covalues",
"private": true,
"version": "0.0.87",
"version": "0.0.106",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",
"test": "playwright test",
"test:ui": "playwright test --ui"
},
"lint-staged": {
"*.{js,jsx,mdx,json}": "prettier --write"
},
"dependencies": {
"cojson": "workspace:*",
"hash-slash": "workspace:*",

View File

@@ -12,38 +12,42 @@ import isCI from "is-ci";
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
testDir: "./tests",
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: isCI,
/* Retry on CI only */
retries: isCI ? 2 : 0,
/* Opt out of parallel tests on CI. */
workers: isCI ? 1 : undefined,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: "html",
testDir: "./tests",
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: isCI,
/* Retry on CI only */
retries: isCI ? 2 : 0,
/* Opt out of parallel tests on CI. */
workers: isCI ? 1 : undefined,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: "html",
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL: isCI ? "http://localhost:4173/" : "http://localhost:5173",
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL: "http://localhost:5173/",
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: "on-first-retry",
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: "on-first-retry",
permissions: ["clipboard-read", "clipboard-write"],
},
/* Configure projects for major browsers */
projects: [
{
name: "chromium",
use: { ...devices["Desktop Chrome"] },
},
],
/* Configure projects for major browsers */
projects: [
{
name: "chromium",
use: { ...devices["Desktop Chrome"] },
},
],
/* Run your local dev server before starting the tests */
webServer: isCI ? {
command: "pnpm preview",
url: "http://localhost:4173/",
} : undefined,
/* Run your local dev server before starting the tests */
webServer: [
{
command: "pnpm preview --port 5173",
url: "http://localhost:5173/",
reuseExistingServer: !isCI,
},
],
});

View File

@@ -1,25 +1,34 @@
import React from "react";
import ReactDOM from "react-dom/client";
import { RouterProvider, createBrowserRouter } from "react-router-dom";
import { AuthAndJazz } from "./jazz";
import { ResumeSyncState } from "./pages/ResumeSyncState";
import { RetryUnavailable } from "./pages/RetryUnavailable";
import { TestInput } from "./pages/TestInput";
import { RouterProvider, createHashRouter } from "react-router-dom";
const router = createHashRouter([
const router = createBrowserRouter([
{
path: "/",
element: <TestInput />,
path: "/test-input",
element: <TestInput />,
},
{
path: "/test-input",
element: <TestInput />,
path: "/resume-sync",
element: <ResumeSyncState />,
},
{
path: "/retry-unavailable",
element: <RetryUnavailable />,
},
{
path: "/",
element: <TestInput />,
},
]);
ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
<AuthAndJazz>
<RouterProvider router={router} />
</AuthAndJazz>
<AuthAndJazz>
<RouterProvider router={router} />
</AuthAndJazz>
</React.StrictMode>,
);

View File

@@ -1,24 +1,42 @@
import { createJazzReactApp } from "jazz-react";
import { ephemeralCredentialsAuth } from "jazz-tools";
import { useState } from "react";
import { createJazzReactApp, useDemoAuth } from "jazz-react";
import { useEffect, useRef } from "react";
const key = `test-comap@jazz.tools`;
const localSync = new URLSearchParams(location.search).has("localSync");
const url = new URL(window.location.href);
const peer =
(url.searchParams.get("peer") as `ws://${string}`) ??
`wss://cloud.jazz.tools/`;
const Jazz = createJazzReactApp();
export const { useAccount, useCoState } = Jazz;
function getUserInfo() {
return url.searchParams.get("userName") ?? "Mister X";
}
export function AuthAndJazz({ children }: { children: React.ReactNode }) {
const [ephemeralAuth] = useState(ephemeralCredentialsAuth())
const [auth, state] = useDemoAuth();
const signedUp = useRef(false);
useEffect(() => {
if (state.state === "ready" && !signedUp.current) {
const userName = getUserInfo();
if (state.existingUsers.includes(userName)) {
state.logInAs(userName);
} else {
state.signUp(userName);
}
signedUp.current = true;
}
}, [state.state]);
return (
<Jazz.Provider auth={ephemeralAuth} peer={
localSync
? `ws://localhost:4200?key=${key}`
: `wss://mesh.jazz.tools/?key=${key}`
}>
<Jazz.Provider auth={auth} peer={`${peer}?key=${key}`}>
{children}
</Jazz.Provider>
);

View File

@@ -0,0 +1,53 @@
import { CoMap, Group, ID, co } from "jazz-tools";
import { useEffect, useState } from "react";
import { useAccount, useCoState } from "../jazz";
export class ResumeSyncCoMap extends CoMap {
value = co.string;
}
function getIdParam() {
const url = new URL(window.location.href);
return (url.searchParams.get("id") as ID<ResumeSyncCoMap>) ?? undefined;
}
export function ResumeSyncState() {
const [id, setId] = useState(getIdParam);
const coMap = useCoState(ResumeSyncCoMap, id);
const { me } = useAccount();
useEffect(() => {
if (id) {
const url = new URL(window.location.href);
url.searchParams.set("id", id);
history.pushState({}, "", url.toString());
}
}, [id]);
useEffect(() => {
if (!me || id) return;
const group = Group.create({ owner: me });
group.addMember("everyone", "writer");
setId(ResumeSyncCoMap.create({ value: "" }, { owner: group }).id);
}, [me]);
if (!coMap) return null;
return (
<div>
<h1>Resume Sync State</h1>
<p data-testid="id">{coMap.id}</p>
<label htmlFor="value">Value</label>
<input
id="value"
value={coMap.value ?? ""}
onChange={(e) => {
coMap.value = e.target.value;
}}
/>
</div>
);
}

View File

@@ -0,0 +1,46 @@
import { CoMap, Group, ID, co } from "jazz-tools";
import { useEffect, useState } from "react";
import { useAccount, useCoState } from "../jazz";
export class RetryUnavailableCoMap extends CoMap {
value = co.string;
}
function getIdParam() {
const url = new URL(window.location.href);
return (url.searchParams.get("id") as ID<RetryUnavailableCoMap>) ?? undefined;
}
export function RetryUnavailable() {
const [id, setId] = useState(getIdParam);
const coMap = useCoState(RetryUnavailableCoMap, id);
const { me } = useAccount();
useEffect(() => {
if (id) {
const url = new URL(window.location.href);
url.searchParams.set("id", id);
history.pushState({}, "", url.toString());
}
}, [id]);
const createCoMap = () => {
if (!me || id) return;
const group = Group.create({ owner: me });
group.addMember("everyone", "writer");
setId(
RetryUnavailableCoMap.create({ value: "Hello!" }, { owner: group }).id,
);
};
return (
<div>
<h1>Retry Unavailable</h1>
<p data-testid="id">{coMap?.id}</p>
<button onClick={createCoMap}>Create a new value!</button>
</div>
);
}

View File

@@ -1,6 +1,6 @@
import { co, CoMap, Group, ID } from "jazz-tools";
import { useAccount, useCoState } from "../jazz";
import { CoMap, Group, ID, co } from "jazz-tools";
import { useEffect, useState } from "react";
import { useAccount, useCoState } from "../jazz";
export class InputTestCoMap extends CoMap {
title = co.string;

View File

@@ -0,0 +1,52 @@
import { setTimeout } from "node:timers/promises";
import { expect, test } from "@playwright/test";
test.describe("ResumeSyncState", () => {
test.skip("should resume the sync even after a page reload", async ({
page,
browser,
}) => {
const context = page.context();
await page.goto("/resume-sync?userName=SuperMario");
const id = await page.getByTestId("id").textContent();
// Sync an initial value
await page.getByRole("textbox", { name: "Value" }).fill("Let's go!");
await setTimeout(1000);
await context.setOffline(true);
// Change the value while offline
await page.getByRole("textbox", { name: "Value" }).fill("Mammamia!");
// Navigate away from the page
await page.goto(`about:blank`);
await setTimeout(1000);
await context.setOffline(false);
// Reload the page but without loading the coValue
// await page.goto(`/resume-sync?userName=SuperMario`);
await page.goto(`/resume-sync?userName=SuperMario`);
await setTimeout(1000);
await expect(page.getByTestId("id")).toBeInViewport();
// Create a new incognito instance and try to load the coValue
const newUserPage = await (await browser.newContext()).newPage();
await newUserPage.goto(`/resume-sync?userName=Luigi&id=${id}`);
await expect(newUserPage.getByTestId("id")).toBeInViewport();
// The initial user should have synced the value even if the coValue was not loaded
// when the user is back online
await expect(
newUserPage.getByRole("textbox", { name: "Value" }),
).toHaveValue("Mammamia!", {
timeout: 20_000,
});
});
});

View File

@@ -0,0 +1,34 @@
import { setTimeout } from "node:timers/promises";
import { expect, test } from "@playwright/test";
test.describe("Retry unavailable states", () => {
test("should retry unavailable values", async ({ page, browser }) => {
const context = page.context();
await page.goto("/retry-unavailable?userName=SuperMario");
await context.setOffline(true);
await page.getByRole("button", { name: "Create a new value!" }).click();
const id = await page.getByTestId("id").textContent();
// Create a new incognito instance and try to load the coValue
const newUserPage = await (await browser.newContext()).newPage();
await newUserPage.goto(`/retry-unavailable?userName=Luigi&id=${id}`);
await expect(newUserPage.getByTestId("id")).toBeInViewport({
timeout: 20_000,
});
// Make the load fail at least twice
await setTimeout(1000);
// Go back online, the value should be uploaded
await context.setOffline(false);
await expect(newUserPage.getByTestId("id")).toHaveText(id ?? "", {
timeout: 20_000,
});
});
});

View File

@@ -1,14 +1,14 @@
import { test, expect } from "@playwright/test";
import { expect, test } from "@playwright/test";
test.describe("CoMap - TestInput", () => {
test("should keep the cursor position when typing", async ({ page }) => {
await page.goto("/test-input");
await page.getByRole("textbox").fill("xx");
await page.getByRole('textbox').press('ArrowLeft');
await page.getByRole("textbox").press("ArrowLeft");
await page.getByRole("textbox").press("y");
await page.getByRole("textbox").press("y");
await expect(page.getByRole('textbox')).toHaveValue("xyyx");
await expect(page.getByRole("textbox")).toHaveValue("xyyx");
});
});

View File

@@ -21,5 +21,5 @@
"noFallthroughCasesInSwitch": true,
"baseUrl": "."
},
"include": ["src"],
"include": ["src"]
}

View File

@@ -1,10 +1,10 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import react from "@vitejs/plugin-react-swc";
import { defineConfig } from "vite";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
build: {
minify: false
}
})
minify: false,
},
});

View File

@@ -1,11 +0,0 @@
{
"extends": [
"next/core-web-vitals",
"prettier",
"plugin:prettier/recommended"
],
"plugins": ["prettier"],
"rules": {
"prettier/prettier": ["error"]
}
}

View File

@@ -1,11 +0,0 @@
{
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": false,
"trailingComma": "es5",
"bracketSpacing": true,
"arrowParens": "avoid",
"printWidth": 80,
"plugins": ["prettier-plugin-tailwindcss"]
}

View File

@@ -1,5 +1,167 @@
# jazz-example-book-shelf
## 0.1.22
### Patch Changes
- jazz-react@0.8.30
- jazz-tools@0.8.30
- jazz-browser-media-images@0.8.30
## 0.1.21
### Patch Changes
- jazz-react@0.8.29
- jazz-tools@0.8.29
- jazz-browser-media-images@0.8.29
## 0.1.20
### Patch Changes
- jazz-react@0.8.28
- jazz-tools@0.8.28
- jazz-browser-media-images@0.8.28
## 0.1.19
### Patch Changes
- jazz-react@0.8.27
- jazz-tools@0.8.27
- jazz-browser-media-images@0.8.27
## 0.1.18
### Patch Changes
- Updated dependencies [59d37df]
- jazz-react@0.8.26
## 0.1.17
### Patch Changes
- jazz-browser-media-images@0.8.24
- jazz-react@0.8.24
## 0.1.16
### Patch Changes
- Updated dependencies [d348c2d]
- Updated dependencies [6902b5b]
- Updated dependencies [1a0cd3d]
- jazz-tools@0.8.23
- jazz-react@0.8.23
- jazz-browser-media-images@0.8.23
## 0.1.15
### Patch Changes
- Updated dependencies [59cc64d]
- jazz-react@0.8.22
- jazz-browser-media-images@0.8.22
## 0.1.14
### Patch Changes
- Updated dependencies [149ca97]
- jazz-tools@0.8.21
- jazz-react@0.8.21
- jazz-browser-media-images@0.8.21
## 0.1.13
### Patch Changes
- Updated dependencies [dd9b13f]
- Updated dependencies [a69ed0b]
- Updated dependencies [3ef3ff3]
- Updated dependencies [c6931b8]
- jazz-react@0.8.20
- jazz-browser-media-images@0.8.20
## 0.1.12
### Patch Changes
- jazz-react@0.8.19
- jazz-tools@0.8.19
- jazz-browser-media-images@0.8.19
## 0.1.11
### Patch Changes
- jazz-react@0.8.18
- jazz-tools@0.8.18
- jazz-browser-media-images@0.8.18
## 0.1.10
### Patch Changes
- jazz-react@0.8.17
- jazz-tools@0.8.17
- jazz-browser-media-images@0.8.17
## 0.1.9
### Patch Changes
- Updated dependencies [2af107c]
- jazz-react@0.8.16
- jazz-browser-media-images@0.8.16
- jazz-tools@0.8.16
## 0.1.8
### Patch Changes
- Updated dependencies [cce679b]
- jazz-tools@0.8.15
- jazz-browser-media-images@0.8.15
- jazz-react@0.8.15
## 0.1.7
### Patch Changes
- Updated dependencies [36273b3]
- jazz-tools@0.8.14
- jazz-browser-media-images@0.8.14
- jazz-react@0.8.14
## 0.1.6
### Patch Changes
- Updated dependencies [fd011d7]
- jazz-tools@0.8.13
- jazz-browser-media-images@0.8.13
- jazz-react@0.8.13
## 0.1.5
### Patch Changes
- Updated dependencies [3cc6aee]
- jazz-react@0.8.12
- jazz-tools@0.8.12
- jazz-browser-media-images@0.8.12
## 0.1.4
### Patch Changes
- jazz-react@0.8.11
- jazz-tools@0.8.11
- jazz-browser-media-images@0.8.11
## 0.1.3
### Patch Changes

View File

@@ -1,5 +1,7 @@
# Jazz Book Shelf Example
Live version: [https://books-demo.jazz.tools](https://books-demo.jazz.tools)
## Installing & running the example locally
(this requires `pnpm` to be installed, see [https://pnpm.io/installation](https://pnpm.io/installation))
@@ -36,6 +38,6 @@ If you have feedback, let us know on [Discord](https://discord.gg/utDMjHYg42) or
## Configuration: sync server
By default, the example app uses [Jazz Global Mesh](https://jazz.tools/mesh) (`wss://sync.jazz.tools`) - so cross-device use, invites and collaboration should just work.
By default, the example app uses [Jazz Cloud](https://jazz.tools/cloud) (`wss://cloud.jazz.tools`) - so cross-device use, invites and collaboration should just work.
You can also run a local sync server by running `npx jazz-run sync` and adding the query param `?sync=ws://localhost:4200` to the URL of the example app (for example: `http://localhost:5173/?peer=ws://localhost:4200`), or by setting the `sync` parameter of the `<Jazz.Provider>` provider component in [./src/components/JazzAndAuth.tsx](./src/2_main.tsx).

View File

@@ -14,7 +14,7 @@ job "example-bookShelf$BRANCH_SUFFIX" {
constraint {
attribute = "${node.class}"
operator = "="
value = "mesh"
value = "cloud"
}
spread {

View File

@@ -1,19 +1,19 @@
{
"name": "jazz-example-book-shelf",
"version": "0.1.3",
"version": "0.1.22",
"private": true,
"scripts": {
"dev": "next dev",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",
"build": "next build",
"start": "next start",
"lint": "next lint",
"format": "prettier --write ."
"start": "next start"
},
"dependencies": {
"clsx": "^2.0.0",
"jazz-browser-media-images": "workspace:0.8.7",
"jazz-react": "workspace:0.8.7",
"jazz-tools": "workspace:0.8.5",
"jazz-browser-media-images": "workspace:0.8.30",
"jazz-react": "workspace:0.8.30",
"jazz-tools": "workspace:0.8.30",
"next": "14.2.5",
"react": "^18.2.0",
"react-dom": "^18.2.0"
@@ -22,13 +22,7 @@
"@types/node": "^22.5.1",
"@types/react": "^18.2.19",
"@types/react-dom": "^18.2.7",
"eslint": "^8.46.0",
"eslint-config-next": "14.2.5",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.1",
"postcss": "^8.4.27",
"prettier": "^3.1.1",
"prettier-plugin-tailwindcss": "^0.6.5",
"tailwindcss": "3.3.2",
"typescript": "^5.3.3"
}

View File

@@ -1,14 +1,14 @@
"use client";
import { ChangeEvent, useState } from "react";
import { BookReview, ListOfBookReviews } from "@/schema";
import { Button } from "@/components/Button";
import { Container } from "@/components/Container";
import { useAccount } from "@/components/JazzAndAuth";
import { useRouter } from "next/navigation";
import RatingInput from "@/components/RatingInput";
import { BookReview, ListOfBookReviews } from "@/schema";
import { createImage } from "jazz-browser-media-images";
import { Group, ImageDefinition } from "jazz-tools";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
import { useRouter } from "next/navigation";
import { ChangeEvent, useState } from "react";
export default function AddBookReview() {
const { me } = useAccount();
@@ -18,7 +18,7 @@ export default function AddBookReview() {
const [review, setReview] = useState("");
const [rating, setRating] = useState(0);
const [dateRead, setDateRead] = useState(
new Date().toISOString().split("T")[0]
new Date().toISOString().split("T")[0],
);
const [coverImage, setCoverImage] = useState<ImageDefinition | undefined>();
@@ -37,7 +37,7 @@ export default function AddBookReview() {
group.addMember("everyone", "reader");
if (file) {
createImage(file, { owner: group }).then(image => {
createImage(file, { owner: group }).then((image) => {
setCoverImage(image);
});
}
@@ -59,7 +59,7 @@ export default function AddBookReview() {
},
{
owner: me.profile._owner,
}
},
);
if (!me.profile.bookReviews) {
@@ -88,7 +88,7 @@ export default function AddBookReview() {
type="text"
value={title}
required
onChange={e => setTitle(e.target.value)}
onChange={(e) => setTitle(e.target.value)}
></input>
</label>
@@ -99,7 +99,7 @@ export default function AddBookReview() {
type="text"
value={author}
required
onChange={e => setAuthor(e.target.value)}
onChange={(e) => setAuthor(e.target.value)}
></input>
</label>
@@ -116,7 +116,10 @@ export default function AddBookReview() {
<div className="grid gap-1 text-sm text-gray-600">
Rating
<RatingInput value={rating} onChange={rating => setRating(rating)} />
<RatingInput
value={rating}
onChange={(rating) => setRating(rating)}
/>
</div>
<label className="grid gap-1 text-sm text-gray-600">
@@ -124,7 +127,7 @@ export default function AddBookReview() {
<textarea
className="rounded border border-gray-300 px-2 py-1 shadow-sm"
value={review}
onChange={e => setReview(e.target.value)}
onChange={(e) => setReview(e.target.value)}
></textarea>
</label>
<Button variant="primary" type="submit">

View File

@@ -1,13 +1,13 @@
"use client";
import { useCoState } from "@/components/JazzAndAuth";
import { BookReview } from "@/schema";
import { Group, ID } from "jazz-tools";
import { BookCover } from "@/components/BookCover";
import clsx from "clsx";
import RatingInput from "@/components/RatingInput";
import Rating from "@/components/Rating";
import { Container } from "@/components/Container";
import { useCoState } from "@/components/JazzAndAuth";
import Rating from "@/components/Rating";
import RatingInput from "@/components/RatingInput";
import { BookReview } from "@/schema";
import clsx from "clsx";
import { Group, ID } from "jazz-tools";
const BookReviewTitle = ({
bookReview,
@@ -28,9 +28,9 @@ const BookReviewTitle = ({
placeholder="Book title"
className={clsx(
className,
"w-full rounded border border-transparent px-2 py-1 hover:border-gray-300 hover:shadow-sm"
"w-full rounded border border-transparent px-2 py-1 hover:border-gray-300 hover:shadow-sm",
)}
onChange={e => (bookReview.title = e.target.value)}
onChange={(e) => (bookReview.title = e.target.value)}
></input>
);
};
@@ -54,9 +54,9 @@ const BookReviewAuthor = ({
placeholder="Author"
className={clsx(
className,
"w-full rounded border border-transparent px-2 py-1 hover:border-gray-300 hover:shadow-sm"
"w-full rounded border border-transparent px-2 py-1 hover:border-gray-300 hover:shadow-sm",
)}
onChange={e => (bookReview.author = e.target.value)}
onChange={(e) => (bookReview.author = e.target.value)}
></input>
);
};
@@ -85,9 +85,9 @@ const BookReviewDateRead = ({
placeholder="Date read"
className={clsx(
className,
"w-full rounded border border-transparent px-2 py-1 hover:border-gray-300 hover:shadow-sm"
"w-full rounded border border-transparent px-2 py-1 hover:border-gray-300 hover:shadow-sm",
)}
onChange={e => {
onChange={(e) => {
const date = new Date(e.target.value);
bookReview.dateRead = date;
}}
@@ -116,9 +116,9 @@ const BookReviewReview = ({
placeholder="Write your review here..."
className={clsx(
className,
"w-full rounded border border-transparent px-2 py-1 hover:border-gray-300 hover:shadow-sm"
"w-full rounded border border-transparent px-2 py-1 hover:border-gray-300 hover:shadow-sm",
)}
onChange={e => (bookReview.review = e.target.value)}
onChange={(e) => (bookReview.review = e.target.value)}
></textarea>
);
};
@@ -139,7 +139,7 @@ const BookReviewRating = ({
return (
<RatingInput
className={clsx(className, "p-2")}
onChange={rating => (bookReview.rating = rating)}
onChange={(rating) => (bookReview.rating = rating)}
value={bookReview.rating}
/>
);

View File

@@ -3,8 +3,8 @@ import { Inter } from "next/font/google";
import "./globals.css";
import { JazzAndAuth } from "@/components/JazzAndAuth";
import { Nav } from "@/components/Nav";
import { Fraunces } from "next/font/google";
import clsx from "clsx";
import { Fraunces } from "next/font/google";
const fraunces = Fraunces({
subsets: ["latin"],

View File

@@ -1,10 +1,10 @@
"use client";
import { Container } from "@/components/Container";
import { useAccount } from "@/components/JazzAndAuth";
import UserProfile from "@/components/UserProfile";
import { JazzAccount } from "@/schema";
import { ID } from "jazz-tools";
import { Container } from "@/components/Container";
export default function Home() {
const { me } = useAccount();

View File

@@ -1,7 +1,7 @@
import { Container } from "@/components/Container";
import UserProfile from "@/components/UserProfile";
import { JazzAccount } from "@/schema";
import { ID } from "jazz-tools";
import { Container } from "@/components/Container";
export default function Page({ params }: { params: { slug: string } }) {
const { slug } = params;

View File

@@ -1,12 +1,12 @@
import { ProgressiveImg } from "jazz-react";
import { BookReview } from "@/schema";
import { ChangeEvent, useRef, useState } from "react";
import { Group, ImageDefinition } from "jazz-tools";
import { createImage } from "jazz-browser-media-images";
import { useAccount } from "@/components/JazzAndAuth";
import clsx from "clsx";
import PlusIcon from "@/components/icons/PlusIcon";
import { Button } from "@/components/Button";
import { useAccount } from "@/components/JazzAndAuth";
import PlusIcon from "@/components/icons/PlusIcon";
import { BookReview } from "@/schema";
import clsx from "clsx";
import { createImage } from "jazz-browser-media-images";
import { ProgressiveImg } from "jazz-react";
import { Group, ImageDefinition } from "jazz-tools";
import { ChangeEvent, useRef, useState } from "react";
const BookCoverContainer = ({
children,
@@ -68,7 +68,7 @@ export function BookCoverInput({ bookReview }: { bookReview: BookReview }) {
const file = event.currentTarget.files?.[0];
if (file) {
createImage(file, { owner: me.profile._owner }).then(image => {
createImage(file, { owner: me.profile._owner }).then((image) => {
bookReview.cover = image;
});
}

View File

@@ -1,8 +1,8 @@
import { BookReview } from "@/schema";
import Rating from "@/components/Rating";
import { Group } from "jazz-tools";
import RatingInput from "@/components/RatingInput";
import { BookCover } from "@/components/BookCover";
import Rating from "@/components/Rating";
import RatingInput from "@/components/RatingInput";
import { BookReview } from "@/schema";
import { Group } from "jazz-tools";
export function BookReviewHeader({ bookReview }: { bookReview: BookReview }) {
const { title, author, rating, review, dateRead } = bookReview;
@@ -19,7 +19,7 @@ export function BookReviewHeader({ bookReview }: { bookReview: BookReview }) {
{bookReview._owner.castAs(Group).myRole() === "admin" ? (
<RatingInput
onChange={rating => (bookReview.rating = rating)}
onChange={(rating) => (bookReview.rating = rating)}
value={rating}
/>
) : (

View File

@@ -1,11 +1,11 @@
"use client";
import { BookReview } from "../schema";
import { ID } from "jazz-tools";
import { useCoState } from "@/components/JazzAndAuth";
import Link from "next/link";
import { BookCover, BookCoverReadOnly } from "@/components/BookCover";
import { useCoState } from "@/components/JazzAndAuth";
import StarIcon from "@/components/icons/StarIcon";
import { ID } from "jazz-tools";
import Link from "next/link";
import { BookReview } from "../schema";
export function BookReviewThumbnail({ id }: { id: ID<BookReview> }) {
const bookReview = useCoState(BookReview, id);

View File

@@ -1,6 +1,6 @@
import clsx from "clsx";
import Link from "next/link";
import type { ComponentProps } from "react";
import clsx from "clsx";
interface Props {
variant?: "primary" | "secondary" | "tertiary";
@@ -43,7 +43,7 @@ export function Button(props: AnchorProps | ButtonProps) {
customClassName,
variantClassNames.base,
variantClassNames[variant],
sizeClassNames[size]
sizeClassNames[size],
);
if (!!(props as AnchorProps).href) {

View File

@@ -1,7 +1,7 @@
"use client";
import { createJazzReactApp, useDemoAuth, DemoAuthBasicUI } from "jazz-react";
import { JazzAccount } from "@/schema";
import { DemoAuthBasicUI, createJazzReactApp, useDemoAuth } from "jazz-react";
const Jazz = createJazzReactApp({
AccountSchema: JazzAccount,
@@ -17,7 +17,7 @@ export function JazzAndAuth({ children }: { children: React.ReactNode }) {
<Jazz.Provider
auth={auth}
// replace `you@example.com` with your email as a temporary API key
peer="wss://mesh.jazz.tools/?key=you@example.com"
peer="wss://cloud.jazz.tools/?key=you@example.com"
>
{children}
</Jazz.Provider>

View File

@@ -1,9 +1,9 @@
"use client";
import { Button } from "@/components/Button";
import { Container } from "@/components/Container";
import { useAccount } from "@/components/JazzAndAuth";
import Link from "next/link";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function Nav() {
const { me, logOut } = useAccount();

View File

@@ -1,7 +1,7 @@
"use client";
import StarOutlineIcon from "@/components/icons/StarOutlineIcon";
import StarIcon from "@/components/icons/StarIcon";
import StarOutlineIcon from "@/components/icons/StarOutlineIcon";
import clsx from "clsx";
interface RatingInputProps {

View File

@@ -1,10 +1,10 @@
"use client";
import { useCoState } from "@/components/JazzAndAuth";
import { Group, ID } from "jazz-tools";
import { JazzAccount, JazzProfile, ListOfBookReviews } from "@/schema";
import { BookReviewThumbnail } from "@/components/BookReviewThumbnail";
import { Button } from "@/components/Button";
import { useCoState } from "@/components/JazzAndAuth";
import { JazzAccount, JazzProfile, ListOfBookReviews } from "@/schema";
import { Group, ID } from "jazz-tools";
export default function UserProfile({ id }: { id: ID<JazzAccount> }) {
const user = useCoState(JazzAccount, id);
@@ -13,7 +13,7 @@ export default function UserProfile({ id }: { id: ID<JazzAccount> }) {
const bookReviews = useCoState(
ListOfBookReviews,
user?.profile?._refs.bookReviews?.id,
[{}]
[{}],
);
return (
@@ -30,7 +30,7 @@ export default function UserProfile({ id }: { id: ID<JazzAccount> }) {
</div>
<div className="grid gap-4 md:grid-cols-4">
{bookReviews?.map(bookReview => (
{bookReviews?.map((bookReview) => (
<BookReviewThumbnail key={bookReview.id} id={bookReview.id} />
))}
</div>

View File

@@ -1,11 +1,11 @@
import {
CoMap,
co,
CoList,
Account,
Profile,
ImageDefinition,
CoList,
CoMap,
Encoders,
ImageDefinition,
Profile,
co,
} from "jazz-tools";
export class BookReview extends CoMap {

View File

@@ -1,13 +0,0 @@
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:react-hooks/recommended",
],
ignorePatterns: ["dist", ".eslintrc.cjs"],
parser: "@typescript-eslint/parser",
plugins: ["react-refresh"],
rules: {},
};

View File

@@ -1,10 +0,0 @@
{
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": false,
"trailingComma": "es5",
"bracketSpacing": true,
"arrowParens": "avoid",
"printWidth": 80
}

View File

@@ -1,5 +1,196 @@
# jazz-example-chat
## 0.0.106
### Patch Changes
- Updated dependencies [0a2fae3]
- Updated dependencies [99cda2f]
- cojson@0.8.30
- jazz-react@0.8.30
- jazz-react-auth-clerk@0.8.30
- jazz-tools@0.8.30
## 0.0.105
### Patch Changes
- Updated dependencies [dcc9c2e]
- Updated dependencies [699553f]
- cojson@0.8.29
- jazz-react@0.8.29
- jazz-react-auth-clerk@0.8.29
- jazz-tools@0.8.29
## 0.0.104
### Patch Changes
- Updated dependencies [605734c]
- cojson@0.8.28
- jazz-react@0.8.28
- jazz-react-auth-clerk@0.8.28
- jazz-tools@0.8.28
## 0.0.103
### Patch Changes
- Updated dependencies [75fdff4]
- cojson@0.8.27
- jazz-react@0.8.27
- jazz-react-auth-clerk@0.8.27
- jazz-tools@0.8.27
## 0.0.102
### Patch Changes
- Updated dependencies [59d37df]
- jazz-react@0.8.26
- jazz-react-auth-clerk@0.8.26
## 0.0.101
### Patch Changes
- jazz-react@0.8.24
- jazz-react-auth-clerk@0.8.24
## 0.0.100
### Patch Changes
- Updated dependencies [6f745be]
- Updated dependencies [d348c2d]
- Updated dependencies [124bf67]
- Updated dependencies [6902b5b]
- Updated dependencies [1a0cd3d]
- cojson@0.8.23
- jazz-tools@0.8.23
- jazz-react@0.8.23
- jazz-react-auth-clerk@0.8.23
## 0.0.99
### Patch Changes
- Updated dependencies [59cc64d]
- jazz-react@0.8.22
- jazz-react-auth-clerk@0.8.22
## 0.0.98
### Patch Changes
- Updated dependencies [0f30eea]
- Updated dependencies [149ca97]
- cojson@0.8.21
- jazz-tools@0.8.21
- jazz-react@0.8.21
- jazz-react-auth-clerk@0.8.21
## 0.0.97
### Patch Changes
- Updated dependencies [dd9b13f]
- Updated dependencies [a69ed0b]
- Updated dependencies [3ef3ff3]
- Updated dependencies [c6931b8]
- jazz-react@0.8.20
- jazz-react-auth-clerk@0.8.20
## 0.0.96
### Patch Changes
- Updated dependencies [9c2aadb]
- cojson@0.8.19
- jazz-react@0.8.19
- jazz-react-auth-clerk@0.8.19
- jazz-tools@0.8.19
## 0.0.95
### Patch Changes
- Updated dependencies [d4319d8]
- cojson@0.8.18
- jazz-react@0.8.18
- jazz-react-auth-clerk@0.8.18
- jazz-tools@0.8.18
## 0.0.94
### Patch Changes
- Updated dependencies [d433cf4]
- cojson@0.8.17
- jazz-react@0.8.17
- jazz-react-auth-clerk@0.8.17
- jazz-tools@0.8.17
## 0.0.93
### Patch Changes
- Updated dependencies [2af107c]
- Updated dependencies [b934fab]
- jazz-react@0.8.16
- cojson@0.8.16
- jazz-react-auth-clerk@0.8.16
- jazz-tools@0.8.16
## 0.0.92
### Patch Changes
- Updated dependencies [cce679b]
- Updated dependencies [221c58f]
- jazz-tools@0.8.15
- jazz-react-auth-clerk@0.8.15
- jazz-react@0.8.15
## 0.0.91
### Patch Changes
- Updated dependencies [36273b3]
- jazz-tools@0.8.14
- jazz-react@0.8.14
- jazz-react-auth-clerk@0.8.14
## 0.0.90
### Patch Changes
- Updated dependencies [fd011d7]
- jazz-tools@0.8.13
- jazz-react@0.8.13
- jazz-react-auth-clerk@0.8.13
## 0.0.89
### Patch Changes
- Updated dependencies [6ed75eb]
- Updated dependencies [3cc6aee]
- cojson@0.8.12
- jazz-react@0.8.12
- jazz-react-auth-clerk@0.8.12
- jazz-tools@0.8.12
## 0.0.88
### Patch Changes
- Updated dependencies [1ed4ab5]
- cojson@0.8.11
- jazz-react@0.8.11
- jazz-react-auth-clerk@0.8.11
- jazz-tools@0.8.11
## 0.0.87
### Patch Changes

View File

@@ -1,6 +1,6 @@
# Jazz Chat Example (with Clerk auth)
<!-- Live version: [https://chat-clerk.jazz.tools](https://chat-clerk.jazz.tools) -->
Live version: [https://chat-clerk-demo.jazz.tools](https://chat-clerk-demo.jazz.tools)
## Installing & running the example locally
@@ -37,6 +37,6 @@ If you have feedback, let us know on [Discord](https://discord.gg/utDMjHYg42) or
## Configuration: sync server
By default, the example app uses [Jazz Global Mesh](https://jazz.tools/mesh) (`wss://sync.jazz.tools`) - so cross-device use, invites and collaboration should just work.
By default, the example app uses [Jazz Cloud](https://jazz.tools/cloud) (`wss://cloud.jazz.tools`) - so cross-device use, invites and collaboration should just work.
You can also run a local sync server by running `npx jazz-run sync` and adding the query param `?sync=ws://localhost:4200` to the URL of the example app (for example: `http://localhost:5173/?peer=ws://localhost:4200`), or by setting the `sync` parameter of the `<Jazz.Provider>` provider component in [./src/2_main.tsx](./src/2_main.tsx).

View File

@@ -14,7 +14,7 @@ job "chat$BRANCH_SUFFIX" {
constraint {
attribute = "${node.class}"
operator = "="
value = "mesh"
value = "cloud"
}
spread {

View File

@@ -1,19 +1,15 @@
{
"name": "jazz-example-chat-clerk",
"private": true,
"version": "0.0.87",
"version": "0.0.106",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"format": "echo 'chat example is codegolfed'",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",
"preview": "vite preview"
},
"lint-staged": {
"*.{ts,tsx}": "eslint --fix",
"*.{js,jsx,mdx,json}": "prettier --write"
},
"dependencies": {
"@clerk/clerk-react": "^5.4.1",
"@radix-ui/react-checkbox": "^1.0.4",
@@ -21,11 +17,11 @@
"@radix-ui/react-toast": "^1.1.4",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
"cojson": "workspace:0.8.5",
"cojson": "workspace:0.8.30",
"hash-slash": "workspace:0.2.1",
"jazz-react": "workspace:0.8.7",
"jazz-react-auth-clerk": "workspace:0.8.7",
"jazz-tools": "workspace:0.8.5",
"jazz-react": "workspace:0.8.30",
"jazz-react-auth-clerk": "workspace:0.8.30",
"jazz-tools": "workspace:0.8.30",
"lucide-react": "^0.274.0",
"qrcode": "^1.5.3",
"react": "^18.2.0",
@@ -41,13 +37,8 @@
"@types/qrcode": "^1.5.1",
"@types/react": "^18.2.19",
"@types/react-dom": "^18.2.7",
"@typescript-eslint/eslint-plugin": "^6.2.1",
"@typescript-eslint/parser": "^6.2.1",
"@vitejs/plugin-react-swc": "^3.3.2",
"autoprefixer": "^10.4.14",
"eslint": "^8.46.0",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.3",
"postcss": "^8.4.27",
"tailwindcss": "3.3.2",
"typescript": "^5.3.3",

View File

@@ -1,8 +1,8 @@
import { Group, ID } from "jazz-tools";
import { useIframeHashRouter } from "hash-slash";
import { Group, ID } from "jazz-tools";
import { ChatScreen } from "./chatScreen.tsx";
import { useAccount } from "./main.tsx";
import { Chat } from "./schema.ts";
import { ChatScreen } from "./chatScreen.tsx";
import { AppContainer, TopBar } from "./ui.tsx";
export function App() {
@@ -24,7 +24,7 @@ export function App() {
</TopBar>
{router.route({
"/": () => createChat() as never,
"/chat/:id": id => <ChatScreen chatID={id as ID<Chat>} />,
"/chat/:id": (id) => <ChatScreen chatID={id as ID<Chat>} />,
})}
</AppContainer>
);

View File

@@ -1,6 +1,6 @@
import { ID } from "jazz-tools";
import { Chat, Message } from "./schema.ts";
import { useCoState } from "./main.tsx";
import { Chat, Message } from "./schema.ts";
import {
BubbleBody,
BubbleContainer,
@@ -16,12 +16,12 @@ export function ChatScreen(props: { chatID: ID<Chat> }) {
return chat ? (
<ChatContainer>
{chat.length > 0 ? (
chat.map(msg => <ChatBubble msg={msg} key={msg.id} />)
chat.map((msg) => <ChatBubble msg={msg} key={msg.id} />)
) : (
<EmptyChatMessage />
)}
<ChatInput
onSubmit={text => {
onSubmit={(text) => {
chat.push(Message.create({ text }, { owner: chat._owner }));
}}
/>

View File

@@ -1,6 +1,6 @@
import { createJazzReactApp } from "jazz-react";
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { createJazzReactApp } from "jazz-react";
import { App } from "./app.tsx";
import { ClerkProvider, SignInButton, useClerk } from "@clerk/clerk-react";
@@ -15,13 +15,13 @@ function JazzAndAuth({ children }: { children: React.ReactNode }) {
return (
<>
{state.errors.map(error => (
{state.errors.map((error) => (
<div key={error}>{error}</div>
))}
{auth ? (
<Jazz.Provider
auth={auth}
peer="wss://mesh.jazz.tools/?key=chat-example-jazz-clerk@gcmp.io"
peer="wss://cloud.jazz.tools/?key=chat-example-jazz-clerk@gcmp.io"
>
{children}
</Jazz.Provider>
@@ -42,5 +42,5 @@ createRoot(document.getElementById("root")!).render(
<App />
</JazzAndAuth>
</ClerkProvider>
</StrictMode>
</StrictMode>,
);

View File

@@ -1,4 +1,4 @@
import { CoMap, CoList, co } from "jazz-tools";
import { CoList, CoMap, co } from "jazz-tools";
export class Message extends CoMap {
text = co.string;

View File

@@ -1,6 +1,6 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react-swc";
import path from "path";
import react from "@vitejs/plugin-react-swc";
import { defineConfig } from "vite";
// https://vitejs.dev/config/
export default defineConfig({

View File

@@ -1,4 +0,0 @@
// https://docs.expo.dev/guides/using-eslint/
module.exports = {
extends: 'expo',
};

View File

@@ -1,25 +1,195 @@
# chat-rn-clerk
## 1.0.22
### Patch Changes
- jazz-react-auth-clerk@0.8.30
- jazz-react-native@0.8.30
- jazz-tools@0.8.30
- jazz-react-native-media-images@0.8.22
## 1.0.21
### Patch Changes
- jazz-react-native@0.8.29
- jazz-react-auth-clerk@0.8.29
- jazz-tools@0.8.29
- jazz-react-native-media-images@0.8.21
## 1.0.20
### Patch Changes
- jazz-react-auth-clerk@0.8.28
- jazz-react-native@0.8.28
- jazz-tools@0.8.28
- jazz-react-native-media-images@0.8.20
## 1.0.19
### Patch Changes
- jazz-react-auth-clerk@0.8.27
- jazz-react-native@0.8.27
- jazz-tools@0.8.27
- jazz-react-native-media-images@0.8.19
## 1.0.18
### Patch Changes
- jazz-react-auth-clerk@0.8.26
## 1.0.17
### Patch Changes
- jazz-react-auth-clerk@0.8.24
## 1.0.16
### Patch Changes
- Updated dependencies [d348c2d]
- Updated dependencies [6902b5b]
- Updated dependencies [1a0cd3d]
- jazz-tools@0.8.23
- jazz-react-auth-clerk@0.8.23
- jazz-react-native@0.8.23
- jazz-react-native-media-images@0.8.18
## 1.0.15
### Patch Changes
- jazz-react-auth-clerk@0.8.22
## 1.0.14
### Patch Changes
- Updated dependencies [149ca97]
- jazz-tools@0.8.21
- jazz-react-auth-clerk@0.8.21
- jazz-react-native@0.8.21
- jazz-react-native-media-images@0.8.17
## 1.0.13
### Patch Changes
- Updated dependencies [3ef3ff3]
- jazz-react-native-media-images@0.8.16
- jazz-react-native@0.8.20
- jazz-react-auth-clerk@0.8.20
## 1.0.12
### Patch Changes
- jazz-react-auth-clerk@0.8.19
- jazz-react-native@0.8.19
- jazz-tools@0.8.19
- jazz-react-native-media-images@0.8.15
## 1.0.11
### Patch Changes
- jazz-react-auth-clerk@0.8.18
- jazz-react-native@0.8.18
- jazz-tools@0.8.18
- jazz-react-native-media-images@0.8.14
## 1.0.10
### Patch Changes
- jazz-react-auth-clerk@0.8.17
- jazz-react-native@0.8.17
- jazz-tools@0.8.17
- jazz-react-native-media-images@0.8.13
## 1.0.9
### Patch Changes
- jazz-react-auth-clerk@0.8.16
- jazz-react-native@0.8.16
- jazz-tools@0.8.16
- jazz-react-native-media-images@0.8.12
## 1.0.8
### Patch Changes
- Updated dependencies [cce679b]
- Updated dependencies [221c58f]
- jazz-tools@0.8.15
- jazz-react-auth-clerk@0.8.15
- jazz-react-native@0.8.15
- jazz-react-native-media-images@0.8.11
## 1.0.7
### Patch Changes
- Updated dependencies [36273b3]
- jazz-tools@0.8.14
- jazz-react-auth-clerk@0.8.14
- jazz-react-native@0.8.14
- jazz-react-native-media-images@0.8.10
## 1.0.6
### Patch Changes
- Updated dependencies [fd011d7]
- jazz-tools@0.8.13
- jazz-react-auth-clerk@0.8.13
- jazz-react-native@0.8.13
- jazz-react-native-media-images@0.8.9
## 1.0.5
### Patch Changes
- jazz-react-auth-clerk@0.8.12
- jazz-react-native@0.8.12
- jazz-tools@0.8.12
- jazz-react-native-media-images@0.8.8
## 1.0.4
### Patch Changes
- jazz-react-auth-clerk@0.8.11
- jazz-react-native@0.8.11
- jazz-tools@0.8.11
- jazz-react-native-media-images@0.8.7
## 1.0.3
### Patch Changes
- b7639cf: feat(react-native): replaced react-native-mmkv with expo-secure-store and initialize it by default as kvStore in createJazzRNApp() (BREAKING)
- Updated dependencies [b7639cf]
- jazz-react-native@0.8.8
- b7639cf: feat(react-native): replaced react-native-mmkv with expo-secure-store and initialize it by default as kvStore in createJazzRNApp() (BREAKING)
- Updated dependencies [b7639cf]
- jazz-react-native@0.8.8
## 1.0.2
### Patch Changes
- Updated dependencies [32b05b6]
- jazz-react-native-media-images@0.8.6
- jazz-react-native@0.8.7
- jazz-react-auth-clerk@0.8.7
- Updated dependencies [32b05b6]
- jazz-react-native-media-images@0.8.6
- jazz-react-native@0.8.7
- jazz-react-auth-clerk@0.8.7
## 1.0.1
### Patch Changes
- jazz-react-native@0.8.6
- jazz-react-auth-clerk@0.8.6
- jazz-react-native@0.8.6
- jazz-react-auth-clerk@0.8.6

View File

@@ -1,76 +1,24 @@
<p align="center">
<a href="https://clerk.com?utm_source=github&utm_medium=clerk_docs" target="_blank" rel="noopener noreferrer">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./assets/images/light-logo.png">
<img alt="Clerk Logo for light background" src="./assets/images/dark-logo.png" height="64">
</picture>
</a>
<br />
</p>
<div align="center">
<h1>
Clerk and Expo Quickstart
</h1>
<a href="https://www.npmjs.com/package/@clerk/clerk-js">
<img alt="Downloads" src="https://img.shields.io/npm/dm/@clerk/clerk-js" />
</a>
<a href="https://discord.com/invite/b5rXHjAg7A">
<img alt="Discord" src="https://img.shields.io/discord/856971667393609759?color=7389D8&label&logo=discord&logoColor=ffffff" />
</a>
<a href="https://twitter.com/clerkdev">
<img alt="Twitter" src="https://img.shields.io/twitter/url.svg?label=%40clerkdev&style=social&url=https%3A%2F%2Ftwitter.com%2Fclerkdev" />
</a>
<br />
<br />
<img alt="Clerk Hero Image" src="./assets/images/hero.png">
</div>
# 🎷 Jazz + Expo + `expo-router` + Clerk Auth
## Introduction
## 🚀 How to Run
Clerk is a developer-first authentication and user management solution. It provides pre-built React components and hooks for sign-in, sign-up, user profile, and organization management. Clerk is designed to be easy to use and customize, and can be dropped into any React or Next.js application.
### 1. Inside the Workspace Root
After following the quickstart you'll have learned how to:
- Install `@clerk/clerk-expo`
- Setup your environment key
- Wrap your Expo app in `<ClerkProvider />` and supply your `tokenCache`
- Conditionally show content based on your auth state
- Build your sign-in and sign-up pages
## Running the template
First, install dependencies and build the project:
```bash
git clone https://github.com/clerk/clerk-expo-quickstart
pnpm i
pnpm run build
```
To run the example locally, you'll need to make sure you have XCode installed and configured properly, then:
### 2. Inside the `examples/chat-rn-clerk` Directory
1. Sign up for a Clerk account at [https://clerk.com](https://dashboard.clerk.com/sign-up?utm_source=DevRel&utm_medium=docs&utm_campaign=templates&utm_content=10-24-2023&utm_term=clerk-expo-quickstart).
Next, navigate to the specific example project and run the following commands:
2. Go to the [Clerk dashboard](https://dashboard.clerk.com?utm_source=DevRel&utm_medium=docs&utm_campaign=templates&utm_content=10-24-2023&utm_term=clerk-expo-quickstart) and create an application.
```bash
pnpm expo prebuild
npx pod-install
pnpm expo run:ios
```
3. Set the required Clerk environment variable as shown in [the example `env` file](./.env.example).
4. `npm install` the required dependencies.
5. `npm run start` to launch the development server.
## Learn more
To learn more about Clerk and Expo, check out the following resources:
- [Quickstart: Get started with Expo and Clerk](https://clerk.com/docs/quickstarts/expo?utm_source=DevRel&utm_medium=docs&utm_campaign=templates&utm_content=10-24-2023&utm_term=clerk-expo-quickstart)
- [Clerk Documentation](https://clerk.com/docs/references/expo/overview?utm_source=DevRel&utm_medium=docs&utm_campaign=templates&utm_content=10-24-2023&utm_term=clerk-expo-quickstart)
- [Expo Documentation](https://docs.expo.dev/)
## Found an issue or want to leave feedback
Feel free to create a support thread on our [Discord](https://clerk.com/discord). Our support team will be happy to assist you in the `#support` channel.
## Connect with us
You can discuss ideas, ask questions, and meet others from the community in our [Discord](https://discord.com/invite/b5rXHjAg7A).
If you prefer, you can also find support through our [Twitter](https://twitter.com/ClerkDev), or you can [email](mailto:support@clerk.dev) us!
This will set up and launch the app on iOS. For Android, you can replace the last command with `pnpm expo run:android`.

View File

@@ -1,17 +1,15 @@
import { Redirect, Stack } from "expo-router";
import React from "react";
import { useAuth } from "../../src/auth-context";
import { Redirect, Stack } from "expo-router";
export default function HomeLayout() {
const { isAuthenticated } = useAuth();
const { isAuthenticated } = useAuth();
if (isAuthenticated) {
return <Redirect href={"/chat"} />;
}
if (isAuthenticated) {
return <Redirect href={"/chat"} />;
}
return (
<Stack
screenOptions={{ headerShown: false, headerBackVisible: true }}
/>
);
return (
<Stack screenOptions={{ headerShown: false, headerBackVisible: true }} />
);
}

View File

@@ -1,33 +1,33 @@
import React from "react";
import { SignedOut } from "@clerk/clerk-expo";
import { Link } from "expo-router";
import React from "react";
import { Text, View } from "react-native";
export default function HomePage() {
return (
<View className="flex-1 justify-center items-center bg-gray-100 p-6">
<SignedOut>
<View className="bg-white p-6 rounded-lg shadow-lg w-11/12 max-w-md">
<Text className="text-2xl font-bold text-center text-gray-900 mb-4">
Jazz 🤝 Clerk 🤝 Expo
</Text>
<Link href="/sign-in" className="mb-4">
<Text className="text-center text-blue-600 underline text-lg">
Sign In
</Text>
</Link>
<Link href="/sign-in-oauth" className="mb-4">
<Text className="text-center text-blue-600 underline text-lg">
Sign In OAuth
</Text>
</Link>
<Link href="/sign-up">
<Text className="text-center text-blue-600 underline text-lg">
Sign Up
</Text>
</Link>
</View>
</SignedOut>
return (
<View className="flex-1 justify-center items-center bg-gray-100 p-6">
<SignedOut>
<View className="bg-white p-6 rounded-lg shadow-lg w-11/12 max-w-md">
<Text className="text-2xl font-bold text-center text-gray-900 mb-4">
Jazz 🤝 Clerk 🤝 Expo
</Text>
<Link href="/sign-in" className="mb-4">
<Text className="text-center text-blue-600 underline text-lg">
Sign In
</Text>
</Link>
<Link href="/sign-in-oauth" className="mb-4">
<Text className="text-center text-blue-600 underline text-lg">
Sign In OAuth
</Text>
</Link>
<Link href="/sign-up">
<Text className="text-center text-blue-600 underline text-lg">
Sign Up
</Text>
</Link>
</View>
);
</SignedOut>
</View>
);
}

View File

@@ -2,19 +2,19 @@ import { Redirect, Stack } from "expo-router";
import { useAuth } from "../../src/auth-context";
export default function UnAuthenticatedLayout() {
const { isAuthenticated } = useAuth();
const { isAuthenticated } = useAuth();
if (isAuthenticated) {
return <Redirect href={"/chat"} />;
}
if (isAuthenticated) {
return <Redirect href={"/chat"} />;
}
return (
<Stack
screenOptions={{
headerShown: true,
headerBackVisible: true,
headerTitle: "",
}}
/>
);
return (
<Stack
screenOptions={{
headerShown: true,
headerBackVisible: true,
headerTitle: "",
}}
/>
);
}

View File

@@ -1,65 +1,65 @@
import React from "react";
import * as WebBrowser from "expo-web-browser";
import { Text, View, TouchableOpacity } from "react-native";
import { Link } from "expo-router";
import { useOAuth } from "@clerk/clerk-expo";
import * as Linking from "expo-linking";
import { Link } from "expo-router";
import * as WebBrowser from "expo-web-browser";
import React from "react";
import { Text, TouchableOpacity, View } from "react-native";
export const useWarmUpBrowser = () => {
React.useEffect(() => {
// Warm up the android browser to improve UX
// https://docs.expo.dev/guides/authentication/#improving-user-experience
void WebBrowser.warmUpAsync();
return () => {
void WebBrowser.coolDownAsync();
};
}, []);
React.useEffect(() => {
// Warm up the android browser to improve UX
// https://docs.expo.dev/guides/authentication/#improving-user-experience
void WebBrowser.warmUpAsync();
return () => {
void WebBrowser.coolDownAsync();
};
}, []);
};
WebBrowser.maybeCompleteAuthSession();
const SignInWithOAuth = () => {
useWarmUpBrowser();
useWarmUpBrowser();
const { startOAuthFlow } = useOAuth({ strategy: "oauth_google" });
const { startOAuthFlow } = useOAuth({ strategy: "oauth_google" });
const onPress = React.useCallback(async () => {
try {
const { createdSessionId, signIn, signUp, setActive } =
await startOAuthFlow({
redirectUrl: Linking.createURL("/", {
scheme: "jazz-chat-rn-clerk",
}),
});
const onPress = React.useCallback(async () => {
try {
const { createdSessionId, signIn, signUp, setActive } =
await startOAuthFlow({
redirectUrl: Linking.createURL("/", {
scheme: "jazz-chat-rn-clerk",
}),
});
if (createdSessionId) {
setActive!({ session: createdSessionId });
} else {
// Use signIn or signUp for next steps such as MFA
}
} catch (err) {
console.error("OAuth error", err);
}
}, []);
if (createdSessionId) {
setActive!({ session: createdSessionId });
} else {
// Use signIn or signUp for next steps such as MFA
}
} catch (err) {
console.error("OAuth error", err);
}
}, []);
return (
<View className="flex-1 justify-center items-center bg-gray-50 p-6">
<View className="bg-white w-11/12 max-w-md p-8 rounded-lg shadow-lg items-center">
<TouchableOpacity
onPress={onPress}
className="w-full bg-red-500 py-3 rounded-lg flex items-center justify-center"
>
<Text className="text-white text-lg font-semibold">
Sign in with Google
</Text>
</TouchableOpacity>
<Link href="/" className="mt-4">
<Text className="text-blue-600 text-lg font-semibold underline mb-6">
Back to Home
</Text>
</Link>
</View>
</View>
);
return (
<View className="flex-1 justify-center items-center bg-gray-50 p-6">
<View className="bg-white w-11/12 max-w-md p-8 rounded-lg shadow-lg items-center">
<TouchableOpacity
onPress={onPress}
className="w-full bg-red-500 py-3 rounded-lg flex items-center justify-center"
>
<Text className="text-white text-lg font-semibold">
Sign in with Google
</Text>
</TouchableOpacity>
<Link href="/" className="mt-4">
<Text className="text-blue-600 text-lg font-semibold underline mb-6">
Back to Home
</Text>
</Link>
</View>
</View>
);
};
export default SignInWithOAuth;

View File

@@ -1,91 +1,79 @@
import { useSignIn } from "@clerk/clerk-expo";
import { Text, TextInput, View, TouchableOpacity } from "react-native";
import React from "react";
import { Link } from "expo-router";
import React from "react";
import { Text, TextInput, TouchableOpacity, View } from "react-native";
export default function SignInPage() {
const { signIn, setActive, isLoaded } = useSignIn();
const [emailAddress, setEmailAddress] = React.useState("");
const [password, setPassword] = React.useState("");
const [errorMessage, setErrorMessage] = React.useState("");
const { signIn, setActive, isLoaded } = useSignIn();
const [emailAddress, setEmailAddress] = React.useState("");
const [password, setPassword] = React.useState("");
const [errorMessage, setErrorMessage] = React.useState("");
const onSignInPress = React.useCallback(async () => {
if (!isLoaded) {
return;
}
const onSignInPress = React.useCallback(async () => {
if (!isLoaded) {
return;
}
setErrorMessage("");
setErrorMessage("");
try {
const signInAttempt = await signIn.create({
identifier: emailAddress,
password,
});
try {
const signInAttempt = await signIn.create({
identifier: emailAddress,
password,
});
if (signInAttempt.status === "complete") {
await setActive({ session: signInAttempt.createdSessionId });
} else {
console.error(JSON.stringify(signInAttempt, null, 2));
setErrorMessage("Invalid credentials. Please try again.");
}
} catch (err: any) {
console.error(JSON.stringify(err, null, 2));
if (err.errors && err.errors[0]?.message) {
setErrorMessage(err.errors[0].message);
} else {
setErrorMessage(
"An unexpected error occurred. Please try again.",
);
}
}
}, [isLoaded, emailAddress, password]);
if (signInAttempt.status === "complete") {
await setActive({ session: signInAttempt.createdSessionId });
} else {
console.error(JSON.stringify(signInAttempt, null, 2));
setErrorMessage("Invalid credentials. Please try again.");
}
} catch (err: any) {
console.error(JSON.stringify(err, null, 2));
if (err.errors && err.errors[0]?.message) {
setErrorMessage(err.errors[0].message);
} else {
setErrorMessage("An unexpected error occurred. Please try again.");
}
}
}, [isLoaded, emailAddress, password]);
return (
<View className="flex-1 justify-center items-center bg-gray-50 p-6">
<View className="bg-white w-11/12 max-w-md p-8 rounded-lg shadow-md">
<Text className="text-3xl font-bold text-center text-gray-800 mb-6">
Sign In
</Text>
{errorMessage ? (
<Text className="text-red-500 text-center mb-4">
{errorMessage}
</Text>
) : null}
<TextInput
autoCapitalize="none"
value={emailAddress}
placeholder="Email..."
onChangeText={(emailAddress) =>
setEmailAddress(emailAddress)
}
className="w-full h-12 mb-4 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TextInput
value={password}
placeholder="Password..."
secureTextEntry={true}
onChangeText={(password) => setPassword(password)}
className="w-full h-12 mb-6 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TouchableOpacity
onPress={onSignInPress}
className="w-full h-12 bg-blue-600 rounded-lg flex items-center justify-center"
>
<Text className="text-white text-lg font-semibold">
Sign In
</Text>
</TouchableOpacity>
<View className="flex-row items-center justify-center mt-4">
<Text className="text-gray-600">
Don't have an account?
</Text>
<Link href="/sign-up">
<Text className="text-blue-500 ml-2 font-semibold">
Sign up
</Text>
</Link>
</View>
</View>
return (
<View className="flex-1 justify-center items-center bg-gray-50 p-6">
<View className="bg-white w-11/12 max-w-md p-8 rounded-lg shadow-md">
<Text className="text-3xl font-bold text-center text-gray-800 mb-6">
Sign In
</Text>
{errorMessage ? (
<Text className="text-red-500 text-center mb-4">{errorMessage}</Text>
) : null}
<TextInput
autoCapitalize="none"
value={emailAddress}
placeholder="Email..."
onChangeText={(emailAddress) => setEmailAddress(emailAddress)}
className="w-full h-12 mb-4 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TextInput
value={password}
placeholder="Password..."
secureTextEntry={true}
onChangeText={(password) => setPassword(password)}
className="w-full h-12 mb-6 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TouchableOpacity
onPress={onSignInPress}
className="w-full h-12 bg-blue-600 rounded-lg flex items-center justify-center"
>
<Text className="text-white text-lg font-semibold">Sign In</Text>
</TouchableOpacity>
<View className="flex-row items-center justify-center mt-4">
<Text className="text-gray-600">Don't have an account?</Text>
<Link href="/sign-up">
<Text className="text-blue-500 ml-2 font-semibold">Sign up</Text>
</Link>
</View>
);
</View>
</View>
);
}

View File

@@ -1,128 +1,120 @@
import * as React from "react";
import { TextInput, View, Text, TouchableOpacity } from "react-native";
import { useSignUp } from "@clerk/clerk-expo";
import { useNavigation } from "@react-navigation/native";
import * as React from "react";
import { Text, TextInput, TouchableOpacity, View } from "react-native";
export default function SignUpPage() {
const { isLoaded, signUp, setActive } = useSignUp();
const { isLoaded, signUp, setActive } = useSignUp();
const [emailAddress, setEmailAddress] = React.useState("");
const [password, setPassword] = React.useState("");
const [pendingVerification, setPendingVerification] = React.useState(false);
const [code, setCode] = React.useState("");
const [errorMessage, setErrorMessage] = React.useState("");
const navigation = useNavigation();
const [emailAddress, setEmailAddress] = React.useState("");
const [password, setPassword] = React.useState("");
const [pendingVerification, setPendingVerification] = React.useState(false);
const [code, setCode] = React.useState("");
const [errorMessage, setErrorMessage] = React.useState("");
const navigation = useNavigation();
const onSignUpPress = async () => {
if (!isLoaded) return;
const onSignUpPress = async () => {
if (!isLoaded) return;
setErrorMessage("");
setErrorMessage("");
try {
await signUp.create({
emailAddress,
password,
});
try {
await signUp.create({
emailAddress,
password,
});
await signUp.prepareEmailAddressVerification({
strategy: "email_code",
});
await signUp.prepareEmailAddressVerification({
strategy: "email_code",
});
setPendingVerification(true);
} catch (err: any) {
console.error(JSON.stringify(err, null, 2));
if (err.errors && err.errors[0]?.message) {
setErrorMessage(err.errors[0].message);
} else {
setErrorMessage(
"An unexpected error occurred. Please try again.",
);
}
}
};
setPendingVerification(true);
} catch (err: any) {
console.error(JSON.stringify(err, null, 2));
if (err.errors && err.errors[0]?.message) {
setErrorMessage(err.errors[0].message);
} else {
setErrorMessage("An unexpected error occurred. Please try again.");
}
}
};
const onPressVerify = async () => {
if (!isLoaded) return;
const onPressVerify = async () => {
if (!isLoaded) return;
setErrorMessage("");
setErrorMessage("");
try {
const completeSignUp = await signUp.attemptEmailAddressVerification(
{
code,
},
);
try {
const completeSignUp = await signUp.attemptEmailAddressVerification({
code,
});
if (completeSignUp.status === "complete") {
await setActive({ session: completeSignUp.createdSessionId });
} else {
console.error(JSON.stringify(completeSignUp, null, 2));
setErrorMessage("Failed to verify. Please check your code.");
}
} catch (err: any) {
console.error(JSON.stringify(err, null, 2));
setErrorMessage("Invalid verification code. Please try again.");
}
};
if (completeSignUp.status === "complete") {
await setActive({ session: completeSignUp.createdSessionId });
} else {
console.error(JSON.stringify(completeSignUp, null, 2));
setErrorMessage("Failed to verify. Please check your code.");
}
} catch (err: any) {
console.error(JSON.stringify(err, null, 2));
setErrorMessage("Invalid verification code. Please try again.");
}
};
return (
<View className="flex-1 justify-center items-center bg-gray-50 p-6">
<View className="bg-white w-11/12 max-w-md p-8 rounded-lg shadow-lg">
<Text className="text-3xl font-bold text-center text-gray-800 mb-6">
{pendingVerification ? "Verify Email" : "Sign Up"}
</Text>
{errorMessage ? (
<Text className="text-red-500 text-center mb-4">
{errorMessage}
</Text>
) : null}
return (
<View className="flex-1 justify-center items-center bg-gray-50 p-6">
<View className="bg-white w-11/12 max-w-md p-8 rounded-lg shadow-lg">
<Text className="text-3xl font-bold text-center text-gray-800 mb-6">
{pendingVerification ? "Verify Email" : "Sign Up"}
</Text>
{errorMessage ? (
<Text className="text-red-500 text-center mb-4">{errorMessage}</Text>
) : null}
{!pendingVerification && (
<>
<TextInput
autoCapitalize="none"
value={emailAddress}
placeholder="Email..."
onChangeText={(email) => setEmailAddress(email)}
className="w-full h-12 mb-4 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TextInput
value={password}
placeholder="Password..."
secureTextEntry={true}
onChangeText={(password) => setPassword(password)}
className="w-full h-12 mb-6 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TouchableOpacity
onPress={onSignUpPress}
className="w-full h-12 bg-blue-600 rounded-lg flex justify-center items-center mb-4"
>
<Text className="text-white text-lg font-semibold">
Sign Up
</Text>
</TouchableOpacity>
</>
)}
{!pendingVerification && (
<>
<TextInput
autoCapitalize="none"
value={emailAddress}
placeholder="Email..."
onChangeText={(email) => setEmailAddress(email)}
className="w-full h-12 mb-4 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TextInput
value={password}
placeholder="Password..."
secureTextEntry={true}
onChangeText={(password) => setPassword(password)}
className="w-full h-12 mb-6 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TouchableOpacity
onPress={onSignUpPress}
className="w-full h-12 bg-blue-600 rounded-lg flex justify-center items-center mb-4"
>
<Text className="text-white text-lg font-semibold">Sign Up</Text>
</TouchableOpacity>
</>
)}
{pendingVerification && (
<>
<TextInput
value={code}
placeholder="Verification Code..."
onChangeText={(code) => setCode(code)}
className="w-full h-12 mb-4 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TouchableOpacity
onPress={onPressVerify}
className="w-full h-12 bg-green-600 rounded-lg flex justify-center items-center mb-4"
>
<Text className="text-white text-lg font-semibold">
Verify Email
</Text>
</TouchableOpacity>
</>
)}
</View>
</View>
);
{pendingVerification && (
<>
<TextInput
value={code}
placeholder="Verification Code..."
onChangeText={(code) => setCode(code)}
className="w-full h-12 mb-4 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
/>
<TouchableOpacity
onPress={onPressVerify}
className="w-full h-12 bg-green-600 rounded-lg flex justify-center items-center mb-4"
>
<Text className="text-white text-lg font-semibold">
Verify Email
</Text>
</TouchableOpacity>
</>
)}
</View>
</View>
);
}

View File

@@ -6,31 +6,29 @@ import { type PropsWithChildren } from "react";
* The contents of this function only run in Node.js environments and do not have access to the DOM or browser APIs.
*/
export default function Root({ children }: PropsWithChildren) {
return (
<html lang="en">
<head>
<meta charSet="utf-8" />
<meta httpEquiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
return (
<html lang="en">
<head>
<meta charSet="utf-8" />
<meta httpEquiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
{/*
{/*
Disable body scrolling on web. This makes ScrollView components work closer to how they do on native.
However, body scrolling is often nice to have for mobile web. If you want to enable it, remove this line.
*/}
<ScrollViewStyleReset />
<ScrollViewStyleReset />
{/* Using raw CSS styles as an escape-hatch to ensure the background color never flickers in dark-mode. */}
<style
dangerouslySetInnerHTML={{ __html: responsiveBackground }}
/>
{/* Add any additional <head> elements that you want globally available on web... */}
</head>
<body>{children}</body>
</html>
);
{/* Using raw CSS styles as an escape-hatch to ensure the background color never flickers in dark-mode. */}
<style dangerouslySetInnerHTML={{ __html: responsiveBackground }} />
{/* Add any additional <head> elements that you want globally available on web... */}
</head>
<body>{children}</body>
</html>
);
}
const responsiveBackground = `

View File

@@ -1,5 +1,5 @@
import { Link, Stack } from "expo-router";
import { StyleSheet, View, Text } from "react-native";
import { StyleSheet, Text, View } from "react-native";
export default function NotFoundScreen() {
return (

View File

@@ -1,43 +1,43 @@
import { useFonts } from "expo-font";
import { ClerkLoaded, ClerkProvider } from "@clerk/clerk-expo";
import { useFonts } from "expo-font";
import { Slot } from "expo-router";
import * as SplashScreen from "expo-splash-screen";
import React, { useEffect } from "react";
import { Slot } from "expo-router";
import { tokenCache } from "../cache";
import { JazzAndAuth } from "../src/auth-context";
SplashScreen.preventAutoHideAsync();
export default function RootLayout() {
const [loaded] = useFonts({
SpaceMono: require("../assets/fonts/SpaceMono-Regular.ttf"),
});
const [loaded] = useFonts({
SpaceMono: require("../assets/fonts/SpaceMono-Regular.ttf"),
});
useEffect(() => {
if (loaded) {
SplashScreen.hideAsync();
}
}, [loaded]);
if (!loaded) {
return null;
useEffect(() => {
if (loaded) {
SplashScreen.hideAsync();
}
}, [loaded]);
const publishableKey = process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY;
if (!loaded) {
return null;
}
if (!publishableKey) {
throw new Error(
"Missing Publishable Key. Please set EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY in your .env",
);
}
const publishableKey = process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY;
return (
<ClerkProvider tokenCache={tokenCache} publishableKey={publishableKey}>
<ClerkLoaded>
<JazzAndAuth>
<Slot />
</JazzAndAuth>
</ClerkLoaded>
</ClerkProvider>
if (!publishableKey) {
throw new Error(
"Missing Publishable Key. Please set EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY in your .env",
);
}
return (
<ClerkProvider tokenCache={tokenCache} publishableKey={publishableKey}>
<ClerkLoaded>
<JazzAndAuth>
<Slot />
</JazzAndAuth>
</ClerkLoaded>
</ClerkProvider>
);
}

View File

@@ -1,173 +1,168 @@
import React, {
SafeAreaView,
View,
Text,
Alert,
TouchableOpacity,
FlatList,
KeyboardAvoidingView,
TextInput,
Button,
} from "react-native";
import { useLocalSearchParams } from "expo-router";
import { useState, useEffect, useLayoutEffect } from "react";
import { useAccount, useCoState } from "@/src/jazz";
import { Chat, Message } from "@/src/schema";
import { Group, ID } from "jazz-tools";
import { useFocusEffect, useNavigation } from "@react-navigation/native";
import clsx from "clsx";
import { useNavigation, useFocusEffect } from "@react-navigation/native";
import * as Clipboard from "expo-clipboard";
import { useLocalSearchParams } from "expo-router";
import { Group, ID } from "jazz-tools";
import { useEffect, useLayoutEffect, useState } from "react";
import React, {
SafeAreaView,
View,
Text,
Alert,
TouchableOpacity,
FlatList,
KeyboardAvoidingView,
TextInput,
Button,
} from "react-native";
export default function Conversation() {
const { chatId } = useLocalSearchParams();
const { me } = useAccount();
const [chat, setChat] = useState<Chat>();
const [message, setMessage] = useState("");
const loadedChat = useCoState(Chat, chat?.id, [{}]);
const navigation = useNavigation();
const { chatId } = useLocalSearchParams();
const { me } = useAccount();
const [chat, setChat] = useState<Chat>();
const [message, setMessage] = useState("");
const loadedChat = useCoState(Chat, chat?.id, [{}]);
const navigation = useNavigation();
useEffect(() => {
if (chat) return;
if (chatId === "new") {
createChat();
} else {
loadChat(chatId as ID<Chat>);
}
}, [chat]);
useEffect(() => {
if (chat) return;
if (chatId === "new") {
createChat();
} else {
loadChat(chatId as ID<Chat>);
}
}, [chat]);
// Effect to dynamically set header options
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: "Chat",
headerRight: () =>
chat ? (
<Button
onPress={() => {
if (chat?.id) {
Clipboard.setStringAsync(
`https://chat.jazz.tools/#/chat/${chat.id}`,
);
Alert.alert(
"Copied to clipboard",
`Chat ID: ${chat.id}`,
);
}
}}
title="Share"
/>
) : null,
});
}, [navigation, chat]);
// Effect to dynamically set header options
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: "Chat",
headerRight: () =>
chat ? (
<Button
onPress={() => {
if (chat?.id) {
Clipboard.setStringAsync(
`https://chat.jazz.tools/#/chat/${chat.id}`,
);
Alert.alert("Copied to clipboard", `Chat ID: ${chat.id}`);
}
}}
title="Share"
/>
) : null,
});
}, [navigation, chat]);
const createChat = () => {
const group = Group.create({ owner: me });
group.addMember("everyone", "writer");
const chat = Chat.create([], { owner: group });
setChat(chat);
};
const createChat = () => {
const group = Group.create({ owner: me });
group.addMember("everyone", "writer");
const chat = Chat.create([], { owner: group });
setChat(chat);
};
const loadChat = async (chatId: ID<Chat>) => {
try {
const chat = await Chat.load(chatId, me, []);
setChat(chat);
} catch (error) {
console.log("Error loading chat", error);
Alert.alert("Error", `Error loading chat: ${error}`);
}
};
const loadChat = async (chatId: ID<Chat>) => {
try {
const chat = await Chat.load(chatId, me, []);
setChat(chat);
} catch (error) {
console.log("Error loading chat", error);
Alert.alert("Error", `Error loading chat: ${error}`);
}
};
const sendMessage = () => {
if (!chat) return;
if (message.trim()) {
chat.push(
Message.create({ text: message }, { owner: chat._owner }),
);
setMessage("");
}
};
const renderMessageItem = ({ item }: { item: Message }) => {
const isMe = item._edits.text.by?.isMe;
return (
<View
className={clsx(
`rounded-xl px-3 py-2 max-w-[75%] my-1`,
isMe ? `bg-blue-500 self-end` : `bg-gray-200 self-start`,
)}
>
{!isMe ? (
<Text
className={clsx(
`text-xs text-gray-500 mb-1`,
isMe ? "text-right" : "text-left",
)}
>
{item._edits.text.by?.profile?.name}
</Text>
) : null}
<View
className={clsx(
"flex relative items-end justify-between",
isMe ? "flex-row" : "flex-row",
)}
>
<Text
className={clsx(
!isMe ? "text-black" : "text-gray-200",
`text-md max-w-[85%]`,
)}
>
{item.text}
</Text>
<Text
className={clsx(
"text-[10px] text-right ml-2",
!isMe ? "mt-2 text-gray-500" : "mt-1 text-gray-200",
)}
>
{item._edits.text.madeAt.getHours()}:
{item._edits.text.madeAt.getMinutes()}
</Text>
</View>
</View>
);
};
const sendMessage = () => {
if (!chat) return;
if (message.trim()) {
chat.push(Message.create({ text: message }, { owner: chat._owner }));
setMessage("");
}
};
const renderMessageItem = ({ item }: { item: Message }) => {
const isMe = item._edits.text.by?.isMe;
return (
<View className="flex-1 bg-gray-50">
<FlatList
contentContainerStyle={{
flexGrow: 1,
paddingVertical: 10,
paddingHorizontal: 8,
}}
className="flex"
data={loadedChat}
keyExtractor={(item) => item.id}
renderItem={renderMessageItem}
/>
<KeyboardAvoidingView
keyboardVerticalOffset={110}
behavior="padding"
className="p-3 bg-white border-t border-gray-300"
>
<SafeAreaView className="flex-row items-center gap-2">
<TextInput
className="flex-1 rounded-full h-10 px-4 bg-gray-100 border border-gray-300 focus:border-blue-500 focus:bg-white"
value={message}
onChangeText={setMessage}
placeholder="Type a message..."
textAlignVertical="center"
onSubmitEditing={sendMessage}
/>
<TouchableOpacity
onPress={sendMessage}
className="bg-blue-500 rounded-full h-10 w-10 items-center justify-center"
>
<Text className="text-white text-xl"></Text>
</TouchableOpacity>
</SafeAreaView>
</KeyboardAvoidingView>
<View
className={clsx(
`rounded-xl px-3 py-2 max-w-[75%] my-1`,
isMe ? `bg-blue-500 self-end` : `bg-gray-200 self-start`,
)}
>
{!isMe ? (
<Text
className={clsx(
`text-xs text-gray-500 mb-1`,
isMe ? "text-right" : "text-left",
)}
>
{item._edits.text.by?.profile?.name}
</Text>
) : null}
<View
className={clsx(
"flex relative items-end justify-between",
isMe ? "flex-row" : "flex-row",
)}
>
<Text
className={clsx(
!isMe ? "text-black" : "text-gray-200",
`text-md max-w-[85%]`,
)}
>
{item.text}
</Text>
<Text
className={clsx(
"text-[10px] text-right ml-2",
!isMe ? "mt-2 text-gray-500" : "mt-1 text-gray-200",
)}
>
{item._edits.text.madeAt.getHours()}:
{item._edits.text.madeAt.getMinutes()}
</Text>
</View>
</View>
);
};
return (
<View className="flex-1 bg-gray-50">
<FlatList
contentContainerStyle={{
flexGrow: 1,
paddingVertical: 10,
paddingHorizontal: 8,
}}
className="flex"
data={loadedChat}
keyExtractor={(item) => item.id}
renderItem={renderMessageItem}
/>
<KeyboardAvoidingView
keyboardVerticalOffset={110}
behavior="padding"
className="p-3 bg-white border-t border-gray-300"
>
<SafeAreaView className="flex-row items-center gap-2">
<TextInput
className="flex-1 rounded-full h-10 px-4 bg-gray-100 border border-gray-300 focus:border-blue-500 focus:bg-white"
value={message}
onChangeText={setMessage}
placeholder="Type a message..."
textAlignVertical="center"
onSubmitEditing={sendMessage}
/>
<TouchableOpacity
onPress={sendMessage}
className="bg-blue-500 rounded-full h-10 w-10 items-center justify-center"
>
<Text className="text-white text-xl"></Text>
</TouchableOpacity>
</SafeAreaView>
</KeyboardAvoidingView>
</View>
);
}

View File

@@ -1,14 +1,14 @@
import React from "react";
import { Stack } from "expo-router";
import React from "react";
export default function ChatLayout() {
return (
<Stack
screenOptions={{
headerShown: true,
headerBackVisible: true,
headerTitle: "",
}}
/>
);
return (
<Stack
screenOptions={{
headerShown: true,
headerBackVisible: true,
headerTitle: "",
}}
/>
);
}

View File

@@ -1,85 +1,85 @@
import { useNavigation } from "@react-navigation/native";
import { useRouter } from "expo-router";
import { ID } from "jazz-tools";
import { useLayoutEffect } from "react";
import React, {
Button,
Text,
TouchableOpacity,
View,
Alert,
Button,
Text,
TouchableOpacity,
View,
Alert,
} from "react-native";
import { ID } from "jazz-tools";
import { useRouter } from "expo-router";
import { useNavigation } from "@react-navigation/native";
import { Chat } from "../../src/schema";
import { useAccount } from "../../src/jazz";
import { useUser } from "@clerk/clerk-expo";
import { useAccount } from "../../src/jazz";
import { Chat } from "../../src/schema";
export default function ChatScreen() {
const { logOut } = useAccount();
const router = useRouter();
const navigation = useNavigation();
const { user } = useUser();
const { logOut } = useAccount();
const router = useRouter();
const navigation = useNavigation();
const { user } = useUser();
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: "Chat",
headerRight: () => <Button onPress={logOut} title="Logout" />,
});
}, [navigation]);
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: "Chat",
headerRight: () => <Button onPress={logOut} title="Logout" />,
});
}, [navigation]);
const loadChat = async (chatId: ID<Chat> | "new") => {
router.navigate(`/chat/${chatId}`);
};
const loadChat = async (chatId: ID<Chat> | "new") => {
router.navigate(`/chat/${chatId}`);
};
const joinChat = () => {
Alert.prompt(
"Join Chat",
"Enter the Chat ID (example: co_zBGEHYvRfGuT2YSBraY3njGjnde)",
[
{
text: "Cancel",
style: "cancel",
},
{
text: "Join",
onPress: (chatId) => {
if (chatId) {
loadChat(chatId as ID<Chat>);
} else {
Alert.alert("Error", "Chat ID cannot be empty.");
}
},
},
],
"plain-text",
);
};
return (
<View className="flex-1 bg-gray-50">
<View className="flex-1 justify-center items-center px-6">
<View className="w-full max-w-sm bg-white p-8 rounded-lg shadow-lg">
<Text className="text-xl font-semibold text-gray-800">
Welcome, {user?.emailAddresses[0].emailAddress}
</Text>
<TouchableOpacity
onPress={() => loadChat("new")}
className="w-full bg-blue-600 py-4 rounded-md mb-4 mt-4"
>
<Text className="text-white text-lg font-semibold text-center">
Start New Chat
</Text>
</TouchableOpacity>
<TouchableOpacity
onPress={joinChat}
className="w-full bg-green-500 py-4 rounded-md"
>
<Text className="text-white text-lg font-semibold text-center">
Join Chat
</Text>
</TouchableOpacity>
</View>
</View>
</View>
const joinChat = () => {
Alert.prompt(
"Join Chat",
"Enter the Chat ID (example: co_zBGEHYvRfGuT2YSBraY3njGjnde)",
[
{
text: "Cancel",
style: "cancel",
},
{
text: "Join",
onPress: (chatId) => {
if (chatId) {
loadChat(chatId as ID<Chat>);
} else {
Alert.alert("Error", "Chat ID cannot be empty.");
}
},
},
],
"plain-text",
);
};
return (
<View className="flex-1 bg-gray-50">
<View className="flex-1 justify-center items-center px-6">
<View className="w-full max-w-sm bg-white p-8 rounded-lg shadow-lg">
<Text className="text-xl font-semibold text-gray-800">
Welcome, {user?.emailAddresses[0].emailAddress}
</Text>
<TouchableOpacity
onPress={() => loadChat("new")}
className="w-full bg-blue-600 py-4 rounded-md mb-4 mt-4"
>
<Text className="text-white text-lg font-semibold text-center">
Start New Chat
</Text>
</TouchableOpacity>
<TouchableOpacity
onPress={joinChat}
className="w-full bg-green-500 py-4 rounded-md"
>
<Text className="text-white text-lg font-semibold text-center">
Join Chat
</Text>
</TouchableOpacity>
</View>
</View>
</View>
);
}

View File

@@ -1,10 +1,7 @@
module.exports = function (api) {
api.cache(true);
return {
presets: ["babel-preset-expo"],
plugins: [
"nativewind/babel",
"@babel/plugin-transform-class-static-block",
],
};
api.cache(true);
return {
presets: ["babel-preset-expo"],
plugins: ["nativewind/babel"],
};
};

View File

@@ -2,35 +2,35 @@ import * as SecureStore from "expo-secure-store";
import { Platform } from "react-native";
export interface TokenCache {
getToken: (key: string) => Promise<string | undefined | null>;
saveToken: (key: string, token: string) => Promise<void>;
clearToken?: (key: string) => void;
getToken: (key: string) => Promise<string | undefined | null>;
saveToken: (key: string, token: string) => Promise<void>;
clearToken?: (key: string) => void;
}
const createTokenCache = (): TokenCache => {
return {
getToken: async (key: string) => {
try {
const item = await SecureStore.getItemAsync(key);
if (item) {
console.log(`${key} was used 🔐 \n`);
} else {
console.log("No values stored under key: " + key);
}
return item;
} catch (error) {
console.error("secure store get item error: ", error);
await SecureStore.deleteItemAsync(key);
return null;
}
},
saveToken: (key: string, token: string) => {
return SecureStore.setItemAsync(key, token);
},
};
return {
getToken: async (key: string) => {
try {
const item = await SecureStore.getItemAsync(key);
if (item) {
console.log(`${key} was used 🔐 \n`);
} else {
console.log("No values stored under key: " + key);
}
return item;
} catch (error) {
console.error("secure store get item error: ", error);
await SecureStore.deleteItemAsync(key);
return null;
}
},
saveToken: (key: string, token: string) => {
return SecureStore.setItemAsync(key, token);
},
};
};
// SecureStore is not supported on the web
// https://github.com/expo/expo/issues/7744#issuecomment-611093485
export const tokenCache =
Platform.OS !== "web" ? createTokenCache() : undefined;
Platform.OS !== "web" ? createTokenCache() : undefined;

View File

@@ -1,27 +1,27 @@
{
"cli": {
"version": ">= 12.5.1",
"appVersionSource": "remote"
"cli": {
"version": ">= 12.5.1",
"appVersionSource": "remote"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"ios-simulator": {
"extends": "development",
"ios": {
"simulator": true
}
},
"preview": {
"distribution": "internal"
},
"production": {
"autoIncrement": true
}
"ios-simulator": {
"extends": "development",
"ios": {
"simulator": true
}
},
"submit": {
"production": {}
"preview": {
"distribution": "internal"
},
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {}
}
}

View File

@@ -14,8 +14,8 @@ const config = getDefaultConfig(projectRoot);
config.watchFolders = [workspaceRoot];
// #2 - Try resolving with project modules first, then workspace modules
config.resolver.nodeModulesPaths = [
path.resolve(projectRoot, "node_modules"),
path.resolve(workspaceRoot, "node_modules"),
path.resolve(projectRoot, "node_modules"),
path.resolve(workspaceRoot, "node_modules"),
];
config.resolver.sourceExts = ["mjs", "js", "json", "ts", "tsx"];
config.resolver.unstable_enablePackageExports = true;
@@ -23,9 +23,9 @@ config.resolver.requireCycleIgnorePatterns = [/(^|\/|\\)node_modules($|\/|\\)/];
// Use turborepo to restore the cache when possible
config.cacheStores = [
new FileStore({
root: path.join(projectRoot, "node_modules", ".cache", "metro"),
}),
new FileStore({
root: path.join(projectRoot, "node_modules", ".cache", "metro"),
}),
];
module.exports = config;

View File

@@ -1,80 +1,78 @@
{
"name": "chat-rn-clerk",
"main": "index.js",
"version": "1.0.3",
"scripts": {
"build": "expo export -p ios",
"start": "expo start",
"android": "expo run:android",
"ios": "expo run:ios",
"web": "expo start --web",
"test": "jest --watchAll",
"lint": "expo lint"
},
"jest": {
"preset": "jest-expo"
},
"dependencies": {
"@azure/core-asynciterator-polyfill": "^1.0.2",
"@bam.tech/react-native-image-resizer": "^3.0.10",
"@clerk/clerk-expo": "^2.2.21",
"@expo/vector-icons": "^14.0.2",
"@react-native-community/netinfo": "^11.3.1",
"@react-navigation/native": "^6.1.18",
"@react-navigation/native-stack": "^6.11.0",
"base-64": "^1.0.0",
"buffer": "^6.0.3",
"clsx": "^2.0.0",
"expo": "~51.0.37",
"expo-build-properties": "~0.12.5",
"expo-clipboard": "~6.0.3",
"expo-constants": "~16.0.2",
"expo-crypto": "~13.0.2",
"expo-dev-client": "~4.0.28",
"expo-file-system": "^17.0.1",
"expo-font": "~12.0.4",
"expo-linking": "~6.3.1",
"expo-router": "~3.5.23",
"expo-secure-store": "~13.0.2",
"expo-splash-screen": "~0.27.5",
"expo-status-bar": "~1.12.1",
"expo-system-ui": "~3.0.7",
"expo-web-browser": "~13.0.3",
"jazz-react-auth-clerk": "workspace:*",
"jazz-react-native": "workspace:*",
"jazz-react-native-media-images": "workspace:*",
"jazz-tools": "workspace:*",
"nativewind": "^2.0.11",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-native": "~0.74.5",
"react-native-fetch-api": "^3.0.0",
"react-native-gesture-handler": "~2.16.1",
"react-native-get-random-values": "^1.11.0",
"react-native-mmkv": "3.0.1",
"react-native-polyfill-globals": "^3.1.0",
"react-native-quick-base64": "^2.1.2",
"react-native-reanimated": "~3.10.1",
"react-native-safe-area-context": "4.10.5",
"react-native-screens": "3.31.1",
"react-native-url-polyfill": "^2.0.0",
"react-native-web": "~0.19.10",
"text-encoding": "^0.7.0",
"web-streams-polyfill": "^3.2.1"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@babel/plugin-transform-class-static-block": "^7.24.7",
"@types/jest": "^29.5.3",
"@types/react": "^18.2.19",
"@types/react-test-renderer": "^18.0.7",
"eslint": "^8.46.0",
"eslint-config-expo": "^7.1.2",
"jest": "^29.2.1",
"jest-expo": "~51.0.3",
"react-test-renderer": "18.2.0",
"tailwindcss": "3.3.2",
"typescript": "^5.3.3"
},
"private": true
"name": "chat-rn-clerk",
"main": "index.js",
"version": "1.0.22",
"scripts": {
"build": "expo export -p ios",
"start": "expo start",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",
"android": "expo run:android",
"ios": "expo run:ios",
"web": "expo start --web",
"test": "jest --watchAll"
},
"jest": {
"preset": "jest-expo"
},
"dependencies": {
"@azure/core-asynciterator-polyfill": "^1.0.2",
"@bam.tech/react-native-image-resizer": "^3.0.10",
"@clerk/clerk-expo": "^2.2.21",
"@expo/vector-icons": "^14.0.2",
"@react-native-community/netinfo": "^11.3.1",
"@react-navigation/native": "^6.1.18",
"@react-navigation/native-stack": "^6.11.0",
"base-64": "^1.0.0",
"buffer": "^6.0.3",
"clsx": "^2.0.0",
"expo": "~51.0.37",
"expo-build-properties": "~0.12.5",
"expo-clipboard": "~6.0.3",
"expo-constants": "~16.0.2",
"expo-crypto": "~13.0.2",
"expo-dev-client": "~4.0.28",
"expo-file-system": "^17.0.1",
"expo-font": "~12.0.4",
"expo-linking": "~6.3.1",
"expo-router": "~3.5.23",
"expo-secure-store": "~13.0.2",
"expo-splash-screen": "~0.27.5",
"expo-status-bar": "~1.12.1",
"expo-system-ui": "~3.0.7",
"expo-web-browser": "~13.0.3",
"jazz-react-auth-clerk": "workspace:*",
"jazz-react-native": "workspace:*",
"jazz-react-native-media-images": "workspace:*",
"jazz-tools": "workspace:*",
"nativewind": "^2.0.11",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-native": "~0.74.5",
"react-native-fetch-api": "^3.0.0",
"react-native-gesture-handler": "~2.16.1",
"react-native-get-random-values": "^1.11.0",
"react-native-mmkv": "3.0.1",
"react-native-polyfill-globals": "^3.1.0",
"react-native-quick-base64": "^2.1.2",
"react-native-reanimated": "~3.10.1",
"react-native-safe-area-context": "4.10.5",
"react-native-screens": "3.31.1",
"react-native-url-polyfill": "^2.0.0",
"react-native-web": "~0.19.10",
"text-encoding": "^0.7.0",
"web-streams-polyfill": "^3.2.1"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@types/jest": "^29.5.3",
"@types/react": "^18.2.19",
"@types/react-test-renderer": "^18.0.7",
"jest": "^29.2.1",
"jest-expo": "~51.0.3",
"react-test-renderer": "18.2.0",
"tailwindcss": "3.3.2",
"typescript": "^5.3.3"
},
"private": true
}

View File

@@ -1,8 +1,8 @@
import "react-native-polyfill-globals/auto";
import "@azure/core-asynciterator-polyfill";
import { ReadableStream } from "web-streams-polyfill/ponyfill/es6";
import { polyfillGlobal } from "react-native/Libraries/Utilities/PolyfillFunctions";
import { Buffer } from "buffer";
import { polyfillGlobal } from "react-native/Libraries/Utilities/PolyfillFunctions";
import { ReadableStream } from "web-streams-polyfill/ponyfill/es6";
polyfillGlobal("Buffer", () => Buffer);
polyfillGlobal("ReadableStream", () => ReadableStream);

View File

@@ -1,62 +1,62 @@
import React, {
useContext,
createContext,
useEffect,
useState,
PropsWithChildren,
} from "react";
import { useClerk, useUser } from "@clerk/clerk-expo";
import { useJazzClerkAuth } from "jazz-react-auth-clerk";
import { Jazz } from "./jazz";
import React, {
useContext,
createContext,
useEffect,
useState,
PropsWithChildren,
} from "react";
import { Text, View } from "react-native";
import { Jazz } from "./jazz";
const AuthContext = createContext<{
isAuthenticated: boolean;
isLoading: boolean;
isAuthenticated: boolean;
isLoading: boolean;
}>({
isAuthenticated: false,
isLoading: true,
isAuthenticated: false,
isLoading: true,
});
export function useAuth() {
return useContext(AuthContext);
return useContext(AuthContext);
}
export function JazzAndAuth({ children }: PropsWithChildren) {
const { isSignedIn, isLoaded: isClerkLoaded } = useUser();
const clerk = useClerk();
const [auth, state] = useJazzClerkAuth(clerk);
const [isAuthenticated, setIsAuthenticated] = useState(false);
const { isSignedIn, isLoaded: isClerkLoaded } = useUser();
const clerk = useClerk();
const [auth, state] = useJazzClerkAuth(clerk);
const [isAuthenticated, setIsAuthenticated] = useState(false);
useEffect(() => {
if (isSignedIn && isClerkLoaded && auth) {
setIsAuthenticated(true);
} else {
setIsAuthenticated(false);
}
}, [isSignedIn, isClerkLoaded, auth]);
useEffect(() => {
if (isSignedIn && isClerkLoaded && auth) {
setIsAuthenticated(true);
} else {
setIsAuthenticated(false);
}
}, [isSignedIn, isClerkLoaded, auth]);
return (
<AuthContext.Provider
value={{ isAuthenticated, isLoading: !isClerkLoaded || !auth }}
return (
<AuthContext.Provider
value={{ isAuthenticated, isLoading: !isClerkLoaded || !auth }}
>
{state?.errors?.length > 0 &&
state.errors.map((error) => (
<View key={error}>
<Text style={{ color: "red" }}>{error}</Text>
</View>
))}
{auth ? (
<Jazz.Provider
auth={auth}
peer="wss://cloud.jazz.tools/?key=chat-rn-clerk-example-jazz@gcmp.io"
storage={undefined}
>
{state?.errors?.length > 0 &&
state.errors.map((error) => (
<View key={error}>
<Text style={{ color: "red" }}>{error}</Text>
</View>
))}
{auth ? (
<Jazz.Provider
auth={auth}
peer="wss://mesh.jazz.tools/?key=chat-rn-clerk-example-jazz@gcmp.io"
storage={undefined}
>
{children}
</Jazz.Provider>
) : (
children
)}
</AuthContext.Provider>
);
{children}
</Jazz.Provider>
) : (
children
)}
</AuthContext.Provider>
);
}

Some files were not shown because too many files have changed in this diff Show More