Compare commits

..

372 Commits

Author SHA1 Message Date
Anselm Eickhoff
676f2195ab Merge pull request #898 from garden-co/chore/example-projects-ci
Rename chat-clerk to clerk in yaml file
2024-11-28 15:15:52 +00:00
Trisha Lim
45ba926cff Rename chat-clerk to clerk in yaml file 2024-11-28 14:40:21 +00:00
Anselm Eickhoff
a909f2212f Merge pull request #895 from garden-co/changeset-release/main
Version Packages
2024-11-28 12:51:04 +00:00
github-actions[bot]
d55f944238 Version Packages 2024-11-28 12:45:00 +00:00
Anselm Eickhoff
7b557f188b Merge pull request #894 from garden-co/fix/known-message-errors
fix: removed a no more valid error on the known state message sync
2024-11-28 12:43:23 +00:00
Trisha Lim
9ca25d1cdf Add changeset 2024-11-28 10:09:56 +00:00
Trisha Lim
4339e485e2 Update lock file 2024-11-28 10:09:56 +00:00
Trisha Lim
e6dcec2317 Change thumbnail for password manager example 2024-11-28 10:09:56 +00:00
Trisha Lim
057286a8df Add passkey example to examples page 2024-11-28 10:09:56 +00:00
Trisha Lim
b0fa35e11e Replace chat-clerk example with minimal clerk example 2024-11-28 10:09:56 +00:00
Anselm Eickhoff
ae6f3a39c7 Merge pull request #888 from garden-co/changeset-release/main 2024-11-28 07:00:44 +00:00
Guido D'Orsi
e4f110fa9f fix: Removed a no more valid error on the known state message sync 2024-11-28 01:23:24 +01:00
github-actions[bot]
5d72d0a5a0 Version Packages 2024-11-27 14:25:17 +00:00
Anselm Eickhoff
bb874490c5 Write initial "Defining Schemas" docs (#826)
* Document most of CoValue schemas

* Fix typo and broken links

---------

Co-authored-by: Trisha Lim <hello@trishalim.com>
2024-11-27 14:24:05 +00:00
Anselm Eickhoff
a2c6d0cb16 Merge pull request #883 from garden-co/trishalim-jazz-441
Redesign footer
2024-11-27 14:06:46 +00:00
Trisha Lim
fe6648b3a5 Remove github stars iframe 2024-11-27 13:37:20 +00:00
Anselm Eickhoff
c1ab97d976 Merge pull request #886 from bradstdev/patch-1 2024-11-27 09:05:03 +00:00
Benjamin S. Leveritt
3cb27e11dd Chore: Add changeset 2024-11-27 08:14:38 +00:00
bradstdev
50f94c2b81 Make passkeys discoverable
Reference: https://web.dev/articles/webauthn-discoverable-credentials

"To ensure your credentials are created as passkeys (discoverable credentials), specify residentKey and requireResidentKey when the credential is created."

Bitwarden (and possibly other password managers) won't find passkeys created on other devices unless they are discoverable.
2024-11-27 06:32:26 +10:00
Anselm Eickhoff
3937781246 Merge pull request #885 from garden-co/benjamin-jazz-536
Fix comment regarding localStorage
2024-11-26 19:42:54 +00:00
Benjamin S. Leveritt
44bcf6e411 Fix comment regarding localStorage 2024-11-26 19:25:31 +00:00
Trisha Lim
b66206f1a6 Change footer links for jazz 2024-11-26 13:56:13 +00:00
Trisha Lim
973824795e Redesign footer 2024-11-26 13:53:42 +00:00
Trisha Lim
f4974e5975 Fix inconsistent social icons size 2024-11-26 13:29:43 +00:00
Trisha Lim
9099bbf75f Fix grid layout on mobile 2024-11-26 11:41:52 +00:00
Anselm Eickhoff
e1a40b41eb Merge pull request #879 from sventies/patch-1
Check for clerk.user before rendering the app
2024-11-26 11:29:36 +00:00
sventies
9683e24237 Check for clerk.user
Check if we're actually authed before navigating to the app. (as per the code in the docs as well: https://jazz.tools/docs/authentication/auth-methods#clerk)
2024-11-26 12:12:58 +01:00
Anselm Eickhoff
0ff381b8d5 Merge pull request #872 from garden-co/changeset-release/main 2024-11-25 21:46:23 +00:00
github-actions[bot]
ef7931761a Version Packages 2024-11-25 21:08:25 +00:00
Anselm Eickhoff
da30641856 Merge pull request #829 from garden-co/benjamin-jazz-514 2024-11-25 21:05:46 +00:00
Anselm Eickhoff
01435dc20b Merge pull request #843 from garden-co/benjamin-jazz-494 2024-11-25 21:05:04 +00:00
Anselm Eickhoff
506256e291 Merge pull request #868 from garden-co/jazz-run/json 2024-11-25 21:03:50 +00:00
Anselm Eickhoff
6bb0d38b26 Merge pull request #860 from garden-co/trishalim-jazz-509 2024-11-25 21:03:30 +00:00
Anselm Eickhoff
397ff9ce09 Merge pull request #874 from garden-co/aeplay-jazz-532 2024-11-25 21:02:38 +00:00
Anselm
df42b2b295 Add changesets 2024-11-25 14:43:37 +00:00
Anselm
aae280b7da Implement and test getting all CoMap edits 2024-11-25 14:41:40 +00:00
Anselm Eickhoff
d1e4ee0fe4 Merge pull request #840 from garden-co/benjamin-jazz-524
Fix `jazz-*-auth-clerk` readmes
2024-11-25 13:35:35 +00:00
Benjamin S. Leveritt
7cfd47b7f3 Add minimal example links 2024-11-25 12:37:47 +00:00
Benjamin S. Leveritt
c34ce695ea Improves navigation links 2024-11-25 12:37:47 +00:00
Benjamin S. Leveritt
7666dc6da2 Add documentation for authentication hooks 2024-11-25 12:37:47 +00:00
Benjamin S. Leveritt
be3ac8aa63 Fix formatting 2024-11-25 12:37:47 +00:00
Benjamin S. Leveritt
b759668022 Improve browser auth typedocs 2024-11-25 12:37:47 +00:00
Benjamin S. Leveritt
1ada04f6f4 Add Passphrase section to Auth Methods 2024-11-25 12:37:47 +00:00
Benjamin S. Leveritt
f3455bc691 Add stub typedocs to browser auth 2024-11-25 12:37:47 +00:00
Benjamin S. Leveritt
044f61e3d7 Add authentication method page stub 2024-11-25 12:37:47 +00:00
Trisha Lim
6d63f4cf2e Reuse FeatureCard on Coming Soon section 2024-11-25 12:34:23 +00:00
Trisha Lim
b828f41cf0 Renamed LabelledFeatureIcon to FeatureCard 2024-11-25 12:34:23 +00:00
Trisha Lim
14d24888e1 Make coming soon section 4-col 2024-11-25 12:34:23 +00:00
Trisha Lim
29bdb0a120 Add cols prop to GappedGrid component 2024-11-25 12:34:23 +00:00
Trisha Lim
c7ec6baba8 Create card component 2024-11-25 12:34:23 +00:00
Anselm Eickhoff
f8cf198a27 Merge pull request #709 from garden-co/benjamin-jazz-438 2024-11-25 12:32:59 +00:00
Benjamin S. Leveritt
720435e2f2 Add examples to access coFeed 2024-11-25 12:29:57 +00:00
Benjamin S. Leveritt
2dcf6925b4 Add explanation and example for coFeed.push 2024-11-25 12:29:57 +00:00
Benjamin S. Leveritt
55d49a3435 Update CoFeed ensureLoaded
To clarify depth and undefined states
2024-11-25 12:29:57 +00:00
Benjamin S. Leveritt
33d1c11909 Update packages/jazz-tools/src/coValues/coStream.ts
Co-authored-by: Anselm Eickhoff <anselm.eickhoff@gmail.com>
2024-11-25 12:29:57 +00:00
Benjamin S. Leveritt
02ee69672d Update packages/jazz-tools/src/coValues/interfaces.ts
Co-authored-by: Anselm Eickhoff <anselm.eickhoff@gmail.com>
2024-11-25 12:29:57 +00:00
Benjamin S. Leveritt
743f7d068b Tweak CoList docs 2024-11-25 11:51:01 +00:00
Benjamin S. Leveritt
c0a1bb272e Add docs for type ID 2024-11-25 11:49:49 +00:00
Benjamin S. Leveritt
a9f08ebbbe Add a few more notes for coMaps 2024-11-25 11:49:49 +00:00
Benjamin S. Leveritt
0d86b132ea Add more docs to BinaryCoStream docs 2024-11-25 11:49:46 +00:00
Benjamin S. Leveritt
5114bbec88 Add FileStream docs 2024-11-25 11:46:38 +00:00
Benjamin S. Leveritt
29deedb163 Add coStream docs 2024-11-25 11:39:05 +00:00
Benjamin S. Leveritt
a322a0e3b5 Add more coStream docs 2024-11-25 11:35:19 +00:00
Benjamin S. Leveritt
4fea86141f Fix description 2024-11-25 11:34:47 +00:00
Benjamin S. Leveritt
d923d45a82 Add some initial coStream docs 2024-11-25 11:34:11 +00:00
Trisha Lim
ff52fb3275 Add loading state to button 2024-11-25 10:42:16 +00:00
Anselm
c65a8806f6 Test current CoMap _edits behavior 2024-11-25 10:16:00 +00:00
Trisha Lim
8c8a5b242a Add Gio to team page 2024-11-25 10:03:25 +00:00
Benjamin S. Leveritt
d020ee2825 Merge pull request #856 from garden-co/trishalim-jazz-522
API Reference: typography and spacing adjustments
2024-11-23 07:26:36 +00:00
Guido D'Orsi
2e2a13f22d feat(account): add --json option to output the account info as json 2024-11-22 22:49:05 +01:00
Trisha Lim
b1056c2ed3 Add env var names to turbo.json 2024-11-22 19:31:37 +00:00
Guido D'Orsi
e00489d8ee Merge pull request #865 from garden-co/fix/less-reads-on-known-state
chore(SyncStateSubscriptionManager): improve the internal API
2024-11-22 18:21:39 +01:00
Anselm Eickhoff
1e08581049 Merge pull request #864 from garden-co/changeset-release/main
Version Packages
2024-11-22 17:20:42 +00:00
Guido D'Orsi
5a5f886bdf chore: formatting 2024-11-22 18:20:41 +01:00
Guido D'Orsi
e5c575ec10 chore(SyncStateSubscriptionManager): improve the internal API 2024-11-22 18:18:44 +01:00
github-actions[bot]
68c2b2598e Version Packages 2024-11-22 17:17:04 +00:00
Anselm Eickhoff
c0ba15cca8 Merge pull request #863 from garden-co/fix/less-reads-on-known-state
perf(SyncStateSubscriptionManager): make the isUploaded computation lazy
2024-11-22 17:15:49 +00:00
Trisha Lim
3e0493f88f Create social links component 2024-11-22 17:07:17 +00:00
Guido D'Orsi
e511d6d56a chore: changeset 2024-11-22 18:03:10 +01:00
Guido D'Orsi
53f4b23c0a perf(SyncStateSubscriptionManager): make the isUploaded computation lazy 2024-11-22 18:02:07 +01:00
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
Trisha Lim
0fa017d148 Add newsletter subscription form to jazz footer 2024-11-22 16:42:31 +00:00
Guido D'Orsi
99cda2f33d fix: reduce noise on Peer close and increase load timeout 2024-11-22 17:23:31 +01:00
Trisha Lim
7c4f519ca1 Move NewsletterForm component to design system 2024-11-22 16:18:42 +00: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
Trisha Lim
94e3922efc Adjust scroll margin in API Reference pages; fixes #830 2024-11-22 15:00:50 +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
Trisha Lim
a18ed077ca API Ref: make headings more prominent 2024-11-22 14:48:16 +00: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
Benjamin S. Leveritt
28fea37446 Fix comment block for rendering with TypeDoc 2024-11-21 20:23:24 +00:00
Benjamin S. Leveritt
61915fe3ed Split doc-generation scripts into separate commands
Easier to run individually
2024-11-21 20:23:24 +00: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
Benjamin S. Leveritt
1a4bda09ca Chore: Add changesets to bump Npm 2024-11-21 08:24:18 +00:00
Benjamin S. Leveritt
815f54fafb Fix readmes 2024-11-21 08:20:49 +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
329 changed files with 11693 additions and 4148 deletions

View File

@@ -11,12 +11,14 @@ jobs:
matrix:
example: [
"chat",
"chat-clerk",
"clerk",
"passkey",
"inspector",
"music-player",
"password-manager",
"pets",
"todo",
"onboarding",
]
steps:
@@ -55,4 +57,4 @@ jobs:
run: |
pnpm install
pnpm turbo build;
working-directory: ./examples/${{ matrix.example }}
working-directory: ./examples/${{ matrix.example }}

View File

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

4
.gitignore vendored
View File

@@ -15,4 +15,6 @@ coverage
# Playwright
test-results
.husky
.husky
.vscode/settings.json

View File

@@ -1,3 +0,0 @@
{
"editor.defaultFormatter": "biomejs.biome"
}

View File

@@ -15,6 +15,6 @@ For community and support, please join our [Discord](https://discord.gg/utDMjHYg
- 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.

View File

@@ -7,7 +7,7 @@
},
"files": {
"ignoreUnknown": false,
"ignore": ["jazz-tools.json"]
"ignore": ["jazz-tools.json", "**/ios/**", "**/android/**"]
},
"formatter": {
"enabled": true,

View File

@@ -1,5 +1,148 @@
# @jazz-e2e/binarycostream
## 0.0.111
### Patch Changes
- Updated dependencies [e4f110f]
- cojson@0.8.34
- jazz-react@0.8.34
- jazz-tools@0.8.34
## 0.0.110
### Patch Changes
- jazz-react@0.8.33
## 0.0.109
### Patch Changes
- Updated dependencies [df42b2b]
- Updated dependencies [df42b2b]
- cojson@0.8.32
- jazz-tools@0.8.32
- jazz-react@0.8.32
## 0.0.108
### Patch Changes
- Updated dependencies [e511d6d]
- cojson@0.8.31
- jazz-react@0.8.31
- jazz-tools@0.8.31
## 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

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,7 +1,7 @@
{
"name": "@jazz-e2e/binarycostream",
"name": "@jazz-e2e/filestream",
"private": true,
"version": "0.0.95",
"version": "0.0.111",
"type": "module",
"scripts": {
"dev": "vite",
@@ -13,11 +13,11 @@
"test:ui": "playwright test --ui"
},
"dependencies": {
"cojson": "workspace:0.8.17",
"cojson": "workspace:0.8.34",
"hash-slash": "workspace:0.2.1",
"is-ci": "^3.0.1",
"jazz-react": "workspace:0.8.17",
"jazz-tools": "workspace:0.8.17",
"jazz-react": "workspace:0.8.34",
"jazz-tools": "workspace:0.8.34",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},

View File

@@ -1,21 +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 { waitForCoValue } from "./lib/waitForCoValue";
import { UploadedFile } from "./schema";
async function getUploadedFile(me: Account, uploadedFileId: ID<UploadedFile>) {
const uploadedFile = await waitForCoValue(
UploadedFile,
uploadedFileId,
me,
Boolean,
{},
);
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;
}

View File

@@ -1,4 +1,4 @@
import { Account, BinaryCoStream, Group } from "jazz-tools";
import { Account, FileStream, Group } from "jazz-tools";
import { UploadedFile } from "../schema";
export async function generateTestFile(me: Account, bytes: number) {
@@ -8,7 +8,7 @@ export async function generateTestFile(me: Account, bytes: number) {
const ownership = { owner: group };
const testFile = UploadedFile.create(
{
file: await BinaryCoStream.createFromBlob(
file: await FileStream.createFromBlob(
new Blob(["1".repeat(bytes)], { type: "image/png" }),
ownership,
),

View File

@@ -1,7 +1,7 @@
import { BinaryCoStream, CoMap, co } 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,148 @@
# @jazz-e2e/covalues
## 0.0.110
### Patch Changes
- Updated dependencies [e4f110f]
- cojson@0.8.34
- jazz-react@0.8.34
- jazz-tools@0.8.34
## 0.0.109
### Patch Changes
- jazz-react@0.8.33
## 0.0.108
### Patch Changes
- Updated dependencies [df42b2b]
- Updated dependencies [df42b2b]
- cojson@0.8.32
- jazz-tools@0.8.32
- jazz-react@0.8.32
## 0.0.107
### Patch Changes
- Updated dependencies [e511d6d]
- cojson@0.8.31
- jazz-react@0.8.31
- jazz-tools@0.8.31
## 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

View File

@@ -1,7 +1,7 @@
{
"name": "@jazz-e2e/covalues",
"private": true,
"version": "0.0.94",
"version": "0.0.110",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -3,6 +3,7 @@ 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";
const router = createBrowserRouter([
@@ -14,6 +15,10 @@ const router = createBrowserRouter([
path: "/resume-sync",
element: <ResumeSyncState />,
},
{
path: "/retry-unavailable",
element: <RetryUnavailable />,
},
{
path: "/",
element: <TestInput />,

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

@@ -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,5 +1,138 @@
# jazz-example-book-shelf
## 0.1.26
### Patch Changes
- jazz-react@0.8.34
- jazz-tools@0.8.34
- jazz-browser-media-images@0.8.34
## 0.1.25
### Patch Changes
- jazz-browser-media-images@0.8.33
- jazz-react@0.8.33
## 0.1.24
### Patch Changes
- Updated dependencies [df42b2b]
- jazz-tools@0.8.32
- jazz-react@0.8.32
- jazz-browser-media-images@0.8.32
## 0.1.23
### Patch Changes
- jazz-react@0.8.31
- jazz-tools@0.8.31
- jazz-browser-media-images@0.8.31
## 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

View File

@@ -1,6 +1,6 @@
{
"name": "jazz-example-book-shelf",
"version": "0.1.10",
"version": "0.1.26",
"private": true,
"scripts": {
"dev": "next dev",
@@ -11,9 +11,9 @@
},
"dependencies": {
"clsx": "^2.0.0",
"jazz-browser-media-images": "workspace:0.8.17",
"jazz-react": "workspace:0.8.17",
"jazz-tools": "workspace:0.8.17",
"jazz-browser-media-images": "workspace:0.8.34",
"jazz-react": "workspace:0.8.34",
"jazz-tools": "workspace:0.8.34",
"next": "14.2.5",
"react": "^18.2.0",
"react-dom": "^18.2.0"

File diff suppressed because it is too large Load Diff

View File

@@ -1,42 +0,0 @@
# Jazz Chat Example (with Clerk auth)
Live version: [https://chat-clerk-demo.jazz.tools](https://chat-clerk-demo.jazz.tools)
## Installing & running the example locally
(this requires `pnpm` to be installed, see [https://pnpm.io/installation](https://pnpm.io/installation))
Start by checking out `jazz`
```bash
git clone https://github.com/gardencmp/jazz.git
cd jazz/examples/chat-clerk
pnpm pack --pack-destination /tmp
mkdir -p ~/jazz-examples/chat-clerk # or any other directory
tar -xf /tmp/jazz-example-chat-* --strip-components 1 -C ~/jazz-examples/chat-clerk
cd ~/jazz-examples/chat-clerk
```
This ensures that you have the example app without git history and independent of the Jazz multi-package monorepo.
Install dependencies:
```bash
pnpm install
```
Start the dev server:
```bash
pnpm dev
```
## Questions / problems / feedback
If you have feedback, let us know on [Discord](https://discord.gg/utDMjHYg42) or open an issue or PR to fix something that seems wrong.
## Configuration: sync server
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

@@ -1,56 +0,0 @@
job "chat$BRANCH_SUFFIX" {
region = "global"
datacenters = ["*"]
group "static" {
count = 4
network {
port "http" {
to = 80
}
}
constraint {
attribute = "${node.class}"
operator = "="
value = "cloud"
}
spread {
attribute = "${node.datacenter}"
weight = 100
}
constraint {
distinct_hosts = true
}
task "server" {
driver = "docker"
config {
image = "$DOCKER_TAG"
ports = ["http"]
auth = {
username = "$DOCKER_USER"
password = "$DOCKER_PASSWORD"
}
}
service {
tags = ["public"]
name = "chat$BRANCH_SUFFIX"
port = "http"
provider = "consul"
}
resources {
cpu = 50 # MHz
memory = 50 # MB
}
}
}
}
# deploy bump 4

View File

@@ -1,47 +0,0 @@
{
"name": "jazz-example-chat-clerk",
"private": true,
"version": "0.0.94",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",
"preview": "vite preview"
},
"dependencies": {
"@clerk/clerk-react": "^5.4.1",
"@radix-ui/react-checkbox": "^1.0.4",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-toast": "^1.1.4",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
"cojson": "workspace:0.8.17",
"hash-slash": "workspace:0.2.1",
"jazz-react": "workspace:0.8.17",
"jazz-react-auth-clerk": "workspace:0.8.17",
"jazz-tools": "workspace:0.8.17",
"lucide-react": "^0.274.0",
"qrcode": "^1.5.3",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router": "^6.16.0",
"react-router-dom": "^6.16.0",
"react-use": "^17.4.0",
"tailwind-merge": "^1.14.0",
"tailwindcss-animate": "^1.0.7",
"uniqolor": "^1.1.0"
},
"devDependencies": {
"@types/qrcode": "^1.5.1",
"@types/react": "^18.2.19",
"@types/react-dom": "^18.2.7",
"@vitejs/plugin-react-swc": "^3.3.2",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.27",
"tailwindcss": "3.3.2",
"typescript": "^5.3.3",
"vite": "^5.0.10"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -1,31 +0,0 @@
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 { AppContainer, TopBar } from "./ui.tsx";
export function App() {
const { me, logOut } = useAccount();
const router = useIframeHashRouter();
const createChat = () => {
if (!me) return;
const group = Group.create({ owner: me });
group.addMember("everyone", "writer");
const chat = Chat.create([], { owner: group });
router.navigate("/#/chat/" + chat.id);
};
return (
<AppContainer>
<TopBar>
{me?.profile?.name} · <button onClick={logOut}>Log out</button>
</TopBar>
{router.route({
"/": () => createChat() as never,
"/chat/:id": (id) => <ChatScreen chatID={id as ID<Chat>} />,
})}
</AppContainer>
);
}

View File

@@ -1,43 +0,0 @@
import { ID } from "jazz-tools";
import { useCoState } from "./main.tsx";
import { Chat, Message } from "./schema.ts";
import {
BubbleBody,
BubbleContainer,
BubbleInfo,
ChatContainer,
ChatInput,
EmptyChatMessage,
} from "./ui.tsx";
export function ChatScreen(props: { chatID: ID<Chat> }) {
const chat = useCoState(Chat, props.chatID, [{}]);
return chat ? (
<ChatContainer>
{chat.length > 0 ? (
chat.map((msg) => <ChatBubble msg={msg} key={msg.id} />)
) : (
<EmptyChatMessage />
)}
<ChatInput
onSubmit={(text) => {
chat.push(Message.create({ text }, { owner: chat._owner }));
}}
/>
</ChatContainer>
) : (
<div>Loading...</div>
);
}
function ChatBubble(props: { msg: Message }) {
const lastEdit = props.msg._edits.text;
return (
<BubbleContainer fromMe={lastEdit.by?.isMe}>
<BubbleBody>{props.msg.text}</BubbleBody>
<BubbleInfo by={lastEdit.by?.profile?.name} madeAt={lastEdit.madeAt} />
</BubbleContainer>
);
}

View File

@@ -1,78 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 20 14.3% 4.1%;
--card: 0 0% 100%;
--card-foreground: 20 14.3% 4.1%;
--popover: 0 0% 100%;
--popover-foreground: 20 14.3% 4.1%;
--primary: 24 9.8% 10%;
--primary-foreground: 60 9.1% 97.8%;
--secondary: 60 4.8% 95.9%;
--secondary-foreground: 24 9.8% 10%;
--muted: 60 4.8% 95.9%;
--muted-foreground: 25 5.3% 44.7%;
--accent: 60 4.8% 95.9%;
--accent-foreground: 24 9.8% 10%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 60 9.1% 97.8%;
--border: 20 5.9% 90%;
--input: 20 5.9% 90%;
--ring: 20 14.3% 4.1%;
--radius: 0.5rem;
}
.dark {
--background: 20 14.3% 4.1%;
--foreground: 60 9.1% 97.8%;
--card: 20 14.3% 4.1%;
--card-foreground: 60 9.1% 97.8%;
--popover: 20 14.3% 4.1%;
--popover-foreground: 60 9.1% 97.8%;
--primary: 60 9.1% 97.8%;
--primary-foreground: 24 9.8% 10%;
--secondary: 12 6.5% 15.1%;
--secondary-foreground: 60 9.1% 97.8%;
--muted: 12 6.5% 15.1%;
--muted-foreground: 24 5.4% 63.9%;
--accent: 12 6.5% 15.1%;
--accent-foreground: 60 9.1% 97.8%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 60 9.1% 97.8%;
--border: 12 6.5% 15.1%;
--input: 12 6.5% 15.1%;
--ring: 24 5.7% 82.9%;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
margin: 0;
padding: 0;
}
}

View File

@@ -1,7 +0,0 @@
import { CoList, CoMap, co } from "jazz-tools";
export class Message extends CoMap {
text = co.string;
}
export class Chat extends CoList.Of(co.ref(Message)) {}

View File

@@ -1,63 +0,0 @@
export function AppContainer(props: { children: React.ReactNode }) {
return (
<div className="flex flex-col items-center justify-between w-screen h-screen p-2 dark:bg-black dark:text-white">
{props.children}
</div>
);
}
export function TopBar(props: { children: React.ReactNode }) {
return (
<div className="mb-5 px-2 py-1 text-sm self-end">{props.children}</div>
);
}
export function ChatContainer(props: { children: React.ReactNode }) {
return (
<div className="w-full max-w-xl h-full flex flex-col items-stretch">
{props.children}
</div>
);
}
export function EmptyChatMessage() {
return <div className="m-auto text-sm">(Empty chat)</div>;
}
export function BubbleContainer(props: {
children: React.ReactNode;
fromMe: boolean | undefined;
}) {
const align = props.fromMe ? "items-end" : "items-start";
return <div className={`${align} flex flex-col`}>{props.children}</div>;
}
export function BubbleBody(props: { children: React.ReactNode }) {
return (
<div className="rounded-xl bg-stone-100 dark:bg-stone-700 dark:text-white py-2 px-4 mt-2 min-w-[5rem]">
{props.children}
</div>
);
}
export function BubbleInfo(props: { by: string | undefined; madeAt: Date }) {
return (
<div className="text-xs text-neutral-500 ml-2">
{props.by} {props.madeAt.toLocaleTimeString()}
</div>
);
}
export function ChatInput(props: { onSubmit: (text: string) => void }) {
return (
<input
className="rounded p-2 border mt-auto dark:bg-black dark:text-white border-stone-300 dark:border-stone-700"
placeholder="Type a message and press Enter"
onKeyDown={({ key, currentTarget: input }) => {
if (key !== "Enter" || !input.value) return;
props.onSubmit(input.value);
input.value = "";
}}
/>
);
}

View File

@@ -1,75 +0,0 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./pages/**/*.{ts,tsx}",
"./components/**/*.{ts,tsx}",
"./app/**/*.{ts,tsx}",
"./src/**/*.{ts,tsx}",
],
theme: {
container: {
center: true,
padding: "2rem",
screens: {
"2xl": "1400px",
},
},
extend: {
colors: {
border: "hsl(var(--border))",
input: "hsl(var(--input))",
ring: "hsl(var(--ring))",
background: "hsl(var(--background))",
foreground: "hsl(var(--foreground))",
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
secondary: {
DEFAULT: "hsl(var(--secondary))",
foreground: "hsl(var(--secondary-foreground))",
},
destructive: {
DEFAULT: "hsl(var(--destructive))",
foreground: "hsl(var(--destructive-foreground))",
},
muted: {
DEFAULT: "hsl(var(--muted))",
foreground: "hsl(var(--muted-foreground))",
},
accent: {
DEFAULT: "hsl(var(--accent))",
foreground: "hsl(var(--accent-foreground))",
},
popover: {
DEFAULT: "hsl(var(--popover))",
foreground: "hsl(var(--popover-foreground))",
},
card: {
DEFAULT: "hsl(var(--card))",
foreground: "hsl(var(--card-foreground))",
},
},
borderRadius: {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
},
keyframes: {
"accordion-down": {
from: { height: 0 },
to: { height: "var(--radix-accordion-content-height)" },
},
"accordion-up": {
from: { height: "var(--radix-accordion-content-height)" },
to: { height: 0 },
},
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
},
},
},
plugins: [require("tailwindcss-animate")],
};

View File

@@ -1,5 +1,144 @@
# chat-rn-clerk
## 1.0.26
### Patch Changes
- Updated dependencies [9ca25d1]
- jazz-react-auth-clerk@0.8.34
- jazz-react-native@0.8.34
- jazz-tools@0.8.34
- jazz-react-native-media-images@0.8.25
## 1.0.25
### Patch Changes
- jazz-react-auth-clerk@0.8.33
## 1.0.24
### Patch Changes
- Updated dependencies [1a4bda0]
- Updated dependencies [df42b2b]
- jazz-react-auth-clerk@0.8.32
- jazz-tools@0.8.32
- jazz-react-native@0.8.32
- jazz-react-native-media-images@0.8.24
## 1.0.23
### Patch Changes
- jazz-react-auth-clerk@0.8.31
- jazz-react-native@0.8.31
- jazz-tools@0.8.31
- jazz-react-native-media-images@0.8.23
## 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

View File

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

View File

@@ -1,7 +1,7 @@
{
"name": "chat-rn-clerk",
"main": "index.js",
"version": "1.0.10",
"version": "1.0.26",
"scripts": {
"build": "expo export -p ios",
"start": "expo start",
@@ -65,7 +65,6 @@
},
"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",

View File

@@ -1,5 +1,94 @@
# chat-rn
## 1.0.24
### Patch Changes
- jazz-react-native@0.8.34
- jazz-tools@0.8.34
## 1.0.23
### Patch Changes
- Updated dependencies [df42b2b]
- jazz-tools@0.8.32
- jazz-react-native@0.8.32
## 1.0.22
### Patch Changes
- jazz-react-native@0.8.31
- jazz-tools@0.8.31
## 1.0.21
### Patch Changes
- jazz-react-native@0.8.30
- jazz-tools@0.8.30
## 1.0.20
### Patch Changes
- jazz-react-native@0.8.29
- jazz-tools@0.8.29
## 1.0.19
### Patch Changes
- jazz-react-native@0.8.28
- jazz-tools@0.8.28
## 1.0.18
### Patch Changes
- jazz-react-native@0.8.27
- jazz-tools@0.8.27
## 1.0.17
### Patch Changes
- Updated dependencies [d348c2d]
- Updated dependencies [6902b5b]
- Updated dependencies [1a0cd3d]
- jazz-tools@0.8.23
- jazz-react-native@0.8.23
## 1.0.16
### Patch Changes
- Updated dependencies [149ca97]
- jazz-tools@0.8.21
- jazz-react-native@0.8.21
## 1.0.15
### Patch Changes
- Updated dependencies [3ef3ff3]
- jazz-react-native@0.8.20
## 1.0.14
### Patch Changes
- jazz-react-native@0.8.19
- jazz-tools@0.8.19
## 1.0.13
### Patch Changes
- jazz-react-native@0.8.18
- jazz-tools@0.8.18
## 1.0.12
### Patch Changes

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "chat-rn",
"version": "1.0.12",
"version": "1.0.24",
"main": "index.js",
"scripts": {
"build": "expo export -p ios",
@@ -45,7 +45,6 @@
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@babel/plugin-transform-class-static-block": "^7.24.7",
"@types/react": "^18.2.19",
"tailwindcss": "3.3.2",
"typescript": "^5.3.3"

View File

@@ -1,5 +1,131 @@
# chat-vue
## 0.0.17
### Patch Changes
- jazz-browser@0.8.34
- jazz-tools@0.8.34
- jazz-vue@0.8.22
## 0.0.16
### Patch Changes
- Updated dependencies [3cb27e1]
- jazz-browser@0.8.33
- jazz-vue@0.8.21
## 0.0.15
### Patch Changes
- Updated dependencies [df42b2b]
- jazz-tools@0.8.32
- jazz-browser@0.8.32
- jazz-vue@0.8.20
## 0.0.14
### Patch Changes
- jazz-browser@0.8.31
- jazz-tools@0.8.31
- jazz-vue@0.8.19
## 0.0.13
### Patch Changes
- jazz-browser@0.8.30
- jazz-tools@0.8.30
- jazz-vue@0.8.18
## 0.0.12
### Patch Changes
- jazz-browser@0.8.29
- jazz-tools@0.8.29
- jazz-vue@0.8.17
## 0.0.11
### Patch Changes
- jazz-browser@0.8.28
- jazz-tools@0.8.28
- jazz-vue@0.8.16
## 0.0.10
### Patch Changes
- jazz-browser@0.8.27
- jazz-tools@0.8.27
- jazz-vue@0.8.15
## 0.0.9
### Patch Changes
- jazz-browser@0.8.24
- jazz-vue@0.8.14
## 0.0.8
### Patch Changes
- Updated dependencies [d348c2d]
- Updated dependencies [e442bb8]
- Updated dependencies [6902b5b]
- Updated dependencies [1a0cd3d]
- jazz-tools@0.8.23
- jazz-browser@0.8.23
- jazz-vue@0.8.13
## 0.0.7
### Patch Changes
- a734530: fix useCoState reactivity
- Updated dependencies [f6bc8af]
- Updated dependencies [a734530]
- jazz-browser@0.8.22
- jazz-vue@0.8.12
## 0.0.6
### Patch Changes
- Updated dependencies [149ca97]
- jazz-tools@0.8.21
- jazz-browser@0.8.21
- jazz-vue@0.8.11
## 0.0.5
### Patch Changes
- jazz-browser@0.8.20
- jazz-vue@0.8.10
## 0.0.4
### Patch Changes
- jazz-browser@0.8.19
- jazz-tools@0.8.19
- jazz-vue@0.8.9
## 0.0.3
### Patch Changes
- jazz-browser@0.8.18
- jazz-tools@0.8.18
- jazz-vue@0.8.8
## 0.0.2
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "chat-vue",
"version": "0.0.2",
"version": "0.0.17",
"private": true,
"type": "module",
"scripts": {

View File

@@ -1,5 +1,149 @@
# jazz-example-chat
## 0.0.112
### Patch Changes
- Updated dependencies [e4f110f]
- cojson@0.8.34
- jazz-react@0.8.34
- jazz-tools@0.8.34
## 0.0.111
### Patch Changes
- jazz-react@0.8.33
## 0.0.110
### Patch Changes
- Updated dependencies [df42b2b]
- Updated dependencies [df42b2b]
- cojson@0.8.32
- jazz-tools@0.8.32
- jazz-react@0.8.32
## 0.0.109
### Patch Changes
- Updated dependencies [e511d6d]
- cojson@0.8.31
- jazz-react@0.8.31
- jazz-tools@0.8.31
## 0.0.108
### Patch Changes
- Updated dependencies [0a2fae3]
- Updated dependencies [99cda2f]
- cojson@0.8.30
- jazz-react@0.8.30
- jazz-tools@0.8.30
## 0.0.107
### Patch Changes
- Updated dependencies [dcc9c2e]
- Updated dependencies [699553f]
- cojson@0.8.29
- jazz-react@0.8.29
- jazz-tools@0.8.29
## 0.0.106
### Patch Changes
- Updated dependencies [605734c]
- cojson@0.8.28
- jazz-react@0.8.28
- jazz-tools@0.8.28
## 0.0.105
### Patch Changes
- Updated dependencies [75fdff4]
- cojson@0.8.27
- jazz-react@0.8.27
- jazz-tools@0.8.27
## 0.0.104
### Patch Changes
- 59d37df: add autologin option to DemoAuth to skip login
- Updated dependencies [59d37df]
- jazz-react@0.8.26
## 0.0.103
### Patch Changes
- jazz-react@0.8.24
## 0.0.102
### 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.101
### Patch Changes
- Updated dependencies [59cc64d]
- jazz-react@0.8.22
## 0.0.100
### Patch Changes
- Updated dependencies [0f30eea]
- Updated dependencies [149ca97]
- cojson@0.8.21
- jazz-tools@0.8.21
- jazz-react@0.8.21
## 0.0.99
### Patch Changes
- Updated dependencies [dd9b13f]
- Updated dependencies [a69ed0b]
- Updated dependencies [3ef3ff3]
- Updated dependencies [c6931b8]
- jazz-react@0.8.20
## 0.0.98
### Patch Changes
- Updated dependencies [9c2aadb]
- cojson@0.8.19
- jazz-react@0.8.19
- jazz-tools@0.8.19
## 0.0.97
### Patch Changes
- Updated dependencies [d4319d8]
- cojson@0.8.18
- jazz-react@0.8.18
- jazz-tools@0.8.18
## 0.0.96
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-example-chat",
"private": true,
"version": "0.0.96",
"version": "0.0.112",
"type": "module",
"scripts": {
"dev": "vite",
@@ -18,10 +18,10 @@
"@radix-ui/react-toast": "^1.1.4",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
"cojson": "workspace:0.8.17",
"cojson": "workspace:0.8.34",
"hash-slash": "workspace:0.2.1",
"jazz-react": "workspace:0.8.17",
"jazz-tools": "workspace:0.8.17",
"jazz-react": "workspace:0.8.34",
"jazz-tools": "workspace:0.8.34",
"lucide-react": "^0.274.0",
"qrcode": "^1.5.3",
"react": "^18.2.0",

View File

@@ -1,3 +1,4 @@
import { inIframe, onChatLoad } from "@/util.ts";
import { useIframeHashRouter } from "hash-slash";
import { Group, ID } from "jazz-tools";
import { ChatScreen } from "./chatScreen.tsx";
@@ -15,12 +16,16 @@ export function App() {
group.addMember("everyone", "writer");
const chat = Chat.create([], { owner: group });
router.navigate("/#/chat/" + chat.id);
// for https://jazz.tools marketing site demo only
onChatLoad(chat, me);
};
return (
<AppContainer>
<TopBar>
<p>{me?.profile?.name}</p> · <button onClick={logOut}>Log out</button>
<p>{me?.profile?.name}</p>
{!inIframe && <button onClick={logOut}>Log out</button>}
</TopBar>
{router.route({
"/": () => createChat() as never,

View File

@@ -48,10 +48,11 @@ export function ChatScreen(props: { chatID: ID<Chat> }) {
function ChatBubble(props: { msg: Message }) {
const lastEdit = props.msg._edits.text;
const fromMe = lastEdit.by?.isMe;
return (
<BubbleContainer fromMe={lastEdit.by?.isMe}>
<BubbleBody>{props.msg.text}</BubbleBody>
<BubbleContainer fromMe={fromMe}>
<BubbleBody fromMe={fromMe}>{props.msg.text}</BubbleBody>
<BubbleInfo by={lastEdit.by?.profile?.name} madeAt={lastEdit.madeAt} />
</BubbleContainer>
);

View File

@@ -1,3 +1,4 @@
import clsx from "clsx";
import { useId } from "react";
export function AppContainer(props: { children: React.ReactNode }) {
@@ -10,7 +11,7 @@ export function AppContainer(props: { children: React.ReactNode }) {
export function TopBar(props: { children: React.ReactNode }) {
return (
<div className="p-3 bg-white w-full flex justify-end gap-1 text-xs border-b dark:bg-transparent dark:border-stone-800">
<div className="p-3 bg-white w-full flex justify-between gap-2 border-b dark:bg-transparent dark:border-stone-800">
{props.children}
</div>
);
@@ -29,7 +30,7 @@ export function ChatBody(props: { children: React.ReactNode }) {
export function EmptyChatMessage() {
return (
<div className="h-full text-base text-stone-500 flex items-center justify-center px-3 md:text-xl">
<div className="h-full text-base text-stone-500 flex items-center justify-center px-3 text-lg md:text-2xl">
Start a conversation below.
</div>
);
@@ -41,15 +42,26 @@ export function BubbleContainer(props: {
}) {
const align = props.fromMe ? "items-end" : "items-start";
return (
<div className={`${align} flex flex-col m-2`} role="row">
<div className={`${align} flex flex-col m-3`} role="row">
{props.children}
</div>
);
}
export function BubbleBody(props: { children: React.ReactNode }) {
export function BubbleBody(props: {
children: React.ReactNode;
fromMe: boolean | undefined;
}) {
return (
<div className="rounded-2xl text-sm line-clamp-10 text-ellipsis bg-white max-w-full whitespace-pre-wrap dark:bg-stone-700 dark:text-white py-1 px-3 shadow-sm">
<div
className={clsx(
"line-clamp-10 text-ellipsis whitespace-pre-wrap",
"rounded-2xl max-w-full py-1 px-3 shadow-sm",
props.fromMe
? "bg-white dark:bg-stone-700 dark:text-white"
: "bg-blue text-white",
)}
>
{props.children}
</div>
);
@@ -73,7 +85,7 @@ export function ChatInput(props: { onSubmit: (text: string) => void }) {
</label>
<input
id={inputId}
className="rounded-full py-2 px-4 text-sm border block w-full dark:bg-black dark:text-white dark:border-stone-700"
className="rounded-full py-2 px-4 border block w-full dark:bg-black dark:text-white dark:border-stone-700"
placeholder="Type a message and press Enter"
maxLength={2048}
onKeyDown={({ key, currentTarget: input }) => {

27
examples/chat/src/util.ts Normal file
View File

@@ -0,0 +1,27 @@
// This is only for demo purposes for https://jazz.tools
// This is NOT needed to make the chat work
import { Chat } from "@/schema.ts";
import { Account, CoValue, ID } from "jazz-tools";
export function waitForUpload(id: ID<CoValue>, me: Account) {
const syncManager = me._raw.core.node.syncManager;
const peers = syncManager.getPeers();
return Promise.all(
peers.map((peer) => syncManager.waitForUploadIntoPeer(peer.id, id)),
);
}
export function onChatLoad(chat: Chat, me: Account) {
if (window.parent) {
waitForUpload(chat.id, me).then(() => {
window.parent.postMessage(
{ type: "chat-load", id: "/chat/" + chat.id },
"*",
);
});
}
}
export const inIframe = window.self !== window.top;

View File

@@ -16,6 +16,10 @@ module.exports = {
},
extend: {
colors: {
blue: {
700: "#3313F7",
DEFAULT: "#3313F7",
},
border: "hsl(var(--border))",
input: "hsl(var(--input))",
ring: "hsl(var(--ring))",

View File

@@ -20,10 +20,6 @@ export class ChatPage {
await this.messageInput.press("Enter");
}
async expectLoaded() {
await expect(this.messageInput).toBeVisible();
}
async expectMessageRow(message: string) {
await expect(this.page.getByText(message)).toBeVisible();
}

View File

@@ -22,5 +22,3 @@ dist-ssr
*.njsproj
*.sln
*.sw?
sync-db/

View File

@@ -0,0 +1,94 @@
# minimal-auth-clerk
## 0.0.11
### Patch Changes
- 9ca25d1: Rename passkey and clerk examples
- Updated dependencies [9ca25d1]
- jazz-react-auth-clerk@0.8.34
- jazz-react@0.8.34
- jazz-tools@0.8.34
## 0.0.10
### Patch Changes
- jazz-react@0.8.33
- jazz-react-auth-clerk@0.8.33
## 0.0.9
### Patch Changes
- Updated dependencies [1a4bda0]
- Updated dependencies [df42b2b]
- jazz-react-auth-clerk@0.8.32
- jazz-tools@0.8.32
- jazz-react@0.8.32
## 0.0.8
### Patch Changes
- jazz-react@0.8.31
- jazz-react-auth-clerk@0.8.31
- jazz-tools@0.8.31
## 0.0.7
### Patch Changes
- jazz-react@0.8.30
- jazz-react-auth-clerk@0.8.30
- jazz-tools@0.8.30
## 0.0.6
### Patch Changes
- jazz-react@0.8.29
- jazz-react-auth-clerk@0.8.29
- jazz-tools@0.8.29
## 0.0.5
### Patch Changes
- jazz-react@0.8.28
- jazz-react-auth-clerk@0.8.28
- jazz-tools@0.8.28
## 0.0.4
### Patch Changes
- jazz-react@0.8.27
- jazz-react-auth-clerk@0.8.27
- jazz-tools@0.8.27
## 0.0.3
### Patch Changes
- Updated dependencies [59d37df]
- jazz-react@0.8.26
- jazz-react-auth-clerk@0.8.26
## 0.0.2
### Patch Changes
- jazz-react@0.8.24
- jazz-react-auth-clerk@0.8.24
## 0.0.1
### Patch Changes
- Updated dependencies [d348c2d]
- Updated dependencies [6902b5b]
- Updated dependencies [1a0cd3d]
- jazz-tools@0.8.23
- jazz-react@0.8.23
- jazz-react-auth-clerk@0.8.23

3
examples/clerk/README.md Normal file
View File

@@ -0,0 +1,3 @@
# Minimal Jazz Auth Clerk Example
This is a minimal example of how to use Clerk authentication with Jazz.

16
examples/clerk/index.html Normal file
View File

@@ -0,0 +1,16 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Minimal Auth Clerk Example | Jazz</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

View File

@@ -0,0 +1,30 @@
{
"name": "clerk",
"private": true,
"version": "0.0.11",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"preview": "vite preview",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write"
},
"dependencies": {
"@clerk/clerk-react": "^5.4.1",
"jazz-tools": "workspace:*",
"jazz-react": "workspace:*",
"jazz-react-auth-clerk": "workspace:0.8.34",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
"devDependencies": {
"@biomejs/biome": "1.9.4",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react": "^4.3.3",
"globals": "^15.11.0",
"typescript": "~5.6.2",
"vite": "^5.4.10"
}
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,42 @@
#root {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: filter 300ms;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.react:hover {
filter: drop-shadow(0 0 2em #61dafbaa);
}
@keyframes logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: no-preference) {
a:nth-of-type(2) .logo {
animation: logo-spin infinite 20s linear;
}
}
.card {
padding: 2em;
}
.read-the-docs {
color: #888;
}

View File

@@ -0,0 +1,16 @@
import "./App.css";
import { useAccount } from "./main";
function App() {
const { me, logOut } = useAccount();
return (
<>
<h1>You're logged in</h1>
<p>Welcome back, {me?.profile?.name}</p>
<button onClick={() => logOut()}>Logout</button>
</>
);
}
export default App;

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,68 @@
:root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}

View File

@@ -1,10 +1,17 @@
import { ClerkProvider, SignInButton, useClerk } from "@clerk/clerk-react";
import { createJazzReactApp } from "jazz-react";
import { useJazzClerkAuth } from "jazz-react-auth-clerk";
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { App } from "./app.tsx";
import App from "./App.tsx";
import "./index.css";
import { ClerkProvider, SignInButton, useClerk } from "@clerk/clerk-react";
import { useJazzClerkAuth } from "jazz-react-auth-clerk";
// Import your publishable key
const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY;
if (!PUBLISHABLE_KEY) {
throw new Error("Add your Clerk publishable key to the .env.local file");
}
const Jazz = createJazzReactApp();
export const { useAccount, useCoState } = Jazz;
@@ -15,13 +22,13 @@ function JazzAndAuth({ children }: { children: React.ReactNode }) {
return (
<>
{state.errors.map((error) => (
{state?.errors?.map((error) => (
<div key={error}>{error}</div>
))}
{auth ? (
{clerk.user && auth ? (
<Jazz.Provider
auth={auth}
peer="wss://cloud.jazz.tools/?key=chat-example-jazz-clerk@gcmp.io"
peer="wss://cloud.jazz.tools/?key=minimal-auth-clerk-example@gcmp.io"
>
{children}
</Jazz.Provider>
@@ -34,10 +41,7 @@ function JazzAndAuth({ children }: { children: React.ReactNode }) {
createRoot(document.getElementById("root")!).render(
<StrictMode>
<ClerkProvider
publishableKey={import.meta.env.VITE_CLERK_PUBLISHABLE_KEY}
afterSignOutUrl="/"
>
<ClerkProvider publishableKey={PUBLISHABLE_KEY} afterSignOutUrl="/">
<JazzAndAuth>
<App />
</JazzAndAuth>

View File

@@ -0,0 +1,24 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2023", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src"]
}

View File

@@ -0,0 +1,7 @@
{
"files": [],
"references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
]
}

View File

@@ -0,0 +1,22 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["vite.config.ts"]
}

View File

@@ -0,0 +1,7 @@
import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
});

View File

@@ -1,5 +1,96 @@
# jazz-example-inspector
## 0.0.81
### Patch Changes
- Updated dependencies [e4f110f]
- cojson@0.8.34
- cojson-transport-ws@0.8.34
## 0.0.80
### Patch Changes
- Updated dependencies [df42b2b]
- cojson@0.8.32
- cojson-transport-ws@0.8.32
## 0.0.79
### Patch Changes
- Updated dependencies [e511d6d]
- cojson@0.8.31
- cojson-transport-ws@0.8.31
## 0.0.78
### Patch Changes
- Updated dependencies [0a2fae3]
- Updated dependencies [99cda2f]
- cojson@0.8.30
- cojson-transport-ws@0.8.30
## 0.0.77
### Patch Changes
- Updated dependencies [dcc9c2e]
- Updated dependencies [699553f]
- cojson-transport-ws@0.8.29
- cojson@0.8.29
## 0.0.76
### Patch Changes
- Updated dependencies [605734c]
- cojson@0.8.28
- cojson-transport-ws@0.8.28
## 0.0.75
### Patch Changes
- Updated dependencies [75fdff4]
- cojson@0.8.27
- cojson-transport-ws@0.8.27
## 0.0.74
### Patch Changes
- Updated dependencies [6f745be]
- Updated dependencies [124bf67]
- cojson@0.8.23
- cojson-transport-ws@0.8.23
## 0.0.73
### Patch Changes
- Updated dependencies [0f30eea]
- cojson@0.8.21
- cojson-transport-ws@0.8.21
## 0.0.72
### Patch Changes
- Updated dependencies [9c2aadb]
- cojson@0.8.19
- cojson-transport-ws@0.8.19
## 0.0.71
### Patch Changes
- Updated dependencies [d4319d8]
- cojson@0.8.18
- cojson-transport-ws@0.8.18
## 0.0.70
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-inspector",
"private": true,
"version": "0.0.70",
"version": "0.0.81",
"type": "module",
"scripts": {
"dev": "vite",
@@ -16,8 +16,8 @@
"@radix-ui/react-toast": "^1.1.4",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
"cojson": "workspace:0.8.17",
"cojson-transport-ws": "workspace:0.8.17",
"cojson": "workspace:0.8.34",
"cojson-transport-ws": "workspace:0.8.34",
"hash-slash": "workspace:0.2.1",
"lucide-react": "^0.274.0",
"qrcode": "^1.5.3",

View File

@@ -1,5 +1,123 @@
# jazz-example-musicplayer
## 0.0.32
### Patch Changes
- jazz-react@0.8.34
- jazz-tools@0.8.34
## 0.0.31
### Patch Changes
- jazz-react@0.8.33
## 0.0.30
### Patch Changes
- Updated dependencies [df42b2b]
- jazz-tools@0.8.32
- jazz-react@0.8.32
## 0.0.29
### Patch Changes
- jazz-react@0.8.31
- jazz-tools@0.8.31
## 0.0.28
### Patch Changes
- jazz-react@0.8.30
- jazz-tools@0.8.30
## 0.0.27
### Patch Changes
- jazz-react@0.8.29
- jazz-tools@0.8.29
## 0.0.26
### Patch Changes
- jazz-react@0.8.28
- jazz-tools@0.8.28
## 0.0.25
### Patch Changes
- jazz-react@0.8.27
- jazz-tools@0.8.27
## 0.0.24
### Patch Changes
- Updated dependencies [59d37df]
- jazz-react@0.8.26
## 0.0.23
### Patch Changes
- jazz-react@0.8.24
## 0.0.22
### Patch Changes
- Updated dependencies [d348c2d]
- Updated dependencies [6902b5b]
- Updated dependencies [1a0cd3d]
- jazz-tools@0.8.23
- jazz-react@0.8.23
## 0.0.21
### Patch Changes
- Updated dependencies [59cc64d]
- jazz-react@0.8.22
## 0.0.20
### Patch Changes
- Updated dependencies [149ca97]
- jazz-tools@0.8.21
- jazz-react@0.8.21
## 0.0.19
### Patch Changes
- Updated dependencies [dd9b13f]
- Updated dependencies [a69ed0b]
- Updated dependencies [3ef3ff3]
- Updated dependencies [c6931b8]
- jazz-react@0.8.20
## 0.0.18
### Patch Changes
- jazz-react@0.8.19
- jazz-tools@0.8.19
## 0.0.17
### Patch Changes
- jazz-react@0.8.18
- jazz-tools@0.8.18
## 0.0.16
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "jazz-example-music-player",
"private": true,
"version": "0.0.16",
"version": "0.0.32",
"type": "module",
"scripts": {
"dev": "vite",
@@ -18,8 +18,8 @@
"@radix-ui/react-toast": "^1.1.4",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
"jazz-react": "workspace:0.8.17",
"jazz-tools": "workspace:0.8.17",
"jazz-react": "workspace:0.8.34",
"jazz-tools": "workspace:0.8.34",
"lucide-react": "^0.274.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",

View File

@@ -1,11 +1,4 @@
import {
Account,
BinaryCoStream,
CoList,
CoMap,
Profile,
co,
} from "jazz-tools";
import { Account, CoList, CoMap, FileStream, Profile, co } from "jazz-tools";
/** Walkthrough: Defining the data model with CoJSON
*
@@ -36,12 +29,12 @@ export class MusicTrack extends CoMap {
sourceTrack = co.optional.ref(MusicTrack);
/**
* In Jazz you can files using BinaryCoStream.
* In Jazz you can upload files using FileStream.
*
* As for any other coValue the music files we put inside BinaryCoStream
* As for any other coValue the music files we put inside FileStream
* is available offline and end-to-end encrypted 😉
*/
file = co.ref(BinaryCoStream);
file = co.ref(FileStream);
waveform = co.ref(MusicTrackWaveform);
}

View File

@@ -70,7 +70,11 @@ function JazzAndAuth({ children }: { children: React.ReactNode }) {
return (
<>
<Jazz.Provider auth={auth} peer={peer}>
<Jazz.Provider
storage={["singleTabOPFS", "indexedDB"]}
auth={auth}
peer={peer}
>
{children}
</Jazz.Provider>
<DemoAuthBasicUI appName="Jazz Music Player" state={state} />

View File

@@ -1,5 +1,5 @@
import { getAudioFileData } from "@/lib/audio/getAudioFileData";
import { BinaryCoStream, Group } from "jazz-tools";
import { FileStream, Group } from "jazz-tools";
import {
ListOfTracks,
MusicTrack,
@@ -35,14 +35,14 @@ export async function uploadMusicTracks(
for (const file of files) {
const data = await getAudioFileData(file);
// We transform the file blob into a BinaryCoStream
// We transform the file blob into a FileStream
// making it a collaborative value that is encrypted, easy
// to share across devices and users and available offline!
const binaryCoStream = await BinaryCoStream.createFromBlob(file, ownership);
const fileStream = await FileStream.createFromBlob(file, ownership);
const musicTrack = MusicTrack.create(
{
file: binaryCoStream,
file: fileStream,
duration: data.duration,
waveform: MusicTrackWaveform.create({ data: data.waveform }, ownership),
title: file.name,
@@ -98,7 +98,7 @@ export async function addTrackToPlaylist(
* won't need to clone values to have this kind of sharing granularity
*/
const ownership = { owner: playlist._owner };
const blob = await BinaryCoStream.loadAsBlob(track._refs.file.id, account);
const blob = await FileStream.loadAsBlob(track._refs.file.id, account);
const waveform = await MusicTrackWaveform.load(
track._refs.waveform.id,
account,
@@ -109,7 +109,7 @@ export async function addTrackToPlaylist(
const trackClone = MusicTrack.create(
{
file: await BinaryCoStream.createFromBlob(blob, ownership),
file: await FileStream.createFromBlob(blob, ownership),
duration: track.duration,
waveform: MusicTrackWaveform.create({ data: waveform.data }, ownership),
title: track.title,

View File

@@ -1,7 +1,7 @@
import { MusicTrack, Playlist } from "@/1_schema";
import { usePlayMedia } from "@/lib/audio/usePlayMedia";
import { usePlayState } from "@/lib/audio/usePlayState";
import { BinaryCoStream, ID } from "jazz-tools";
import { FileStream, ID } from "jazz-tools";
import { useRef, useState } from "react";
import { useAccount } from "./2_main";
import { updateActivePlaylist, updateActiveTrack } from "./4_actions";
@@ -27,7 +27,7 @@ export function useMediaPlayer() {
setLoading(track.id);
const file = await BinaryCoStream.loadAsBlob(track._refs.file.id, me);
const file = await FileStream.loadAsBlob(track._refs.file.id, me);
if (!file) {
setLoading(null);

26
examples/onboarding/.gitignore vendored Normal file
View File

@@ -0,0 +1,26 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
playwright-report

View File

@@ -0,0 +1,98 @@
# jazz-example-onboarding
## 0.0.13
### Patch Changes
- jazz-react@0.8.34
- jazz-tools@0.8.34
- jazz-browser-media-images@0.8.34
## 0.0.12
### Patch Changes
- jazz-browser-media-images@0.8.33
- jazz-react@0.8.33
## 0.0.11
### Patch Changes
- Updated dependencies [df42b2b]
- jazz-tools@0.8.32
- jazz-react@0.8.32
- jazz-browser-media-images@0.8.32
## 0.0.10
### Patch Changes
- jazz-react@0.8.31
- jazz-tools@0.8.31
- jazz-browser-media-images@0.8.31
## 0.0.9
### Patch Changes
- jazz-react@0.8.30
- jazz-tools@0.8.30
- jazz-browser-media-images@0.8.30
## 0.0.8
### Patch Changes
- jazz-react@0.8.29
- jazz-tools@0.8.29
- jazz-browser-media-images@0.8.29
## 0.0.7
### Patch Changes
- jazz-react@0.8.28
- jazz-tools@0.8.28
- jazz-browser-media-images@0.8.28
## 0.0.6
### Patch Changes
- jazz-react@0.8.27
- jazz-tools@0.8.27
- jazz-browser-media-images@0.8.27
## 0.0.5
### Patch Changes
- Updated dependencies [59d37df]
- jazz-react@0.8.26
## 0.0.4
### Patch Changes
- jazz-browser-media-images@0.8.24
- jazz-react@0.8.24
## 0.0.3
### 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.0.2
### Patch Changes
- Updated dependencies [59cc64d]
- jazz-react@0.8.22
- jazz-browser-media-images@0.8.22

View File

@@ -0,0 +1 @@
# vite-ts-react-tailwind

View File

@@ -2,13 +2,11 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<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 Chat Example</title>
<title>Jazz onboarding example</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/app.tsx"></script>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

View File

@@ -0,0 +1,36 @@
{
"name": "jazz-example-onboarding",
"private": true,
"version": "0.0.13",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"format-and-lint": "biome check .",
"format-and-lint:fix": "biome check . --write",
"preview": "vite preview",
"test": "playwright test",
"test:ui": "playwright test --ui",
"sync": "jazz-run sync"
},
"dependencies": {
"jazz-browser-media-images": "workspace:*",
"jazz-react": "workspace:*",
"jazz-tools": "workspace:*",
"react": "18.3.1",
"react-dom": "18.3.1"
},
"devDependencies": {
"jazz-run": "workspace:*",
"@playwright/test": "^1.46.1",
"@types/react": "^18.2.19",
"@types/react-dom": "^18.2.7",
"@vitejs/plugin-react": "^4.2.1",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.27",
"tailwindcss": "^3.3.2",
"typescript": "^5.3.3",
"is-ci": "^3.0.1",
"vite": "^5.0.10"
}
}

View File

@@ -0,0 +1,46 @@
import { defineConfig, devices } from "@playwright/test";
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",
/* 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",
permissions: ["clipboard-read", "clipboard-write"],
},
/* Configure projects for major browsers */
projects: [
{
name: "chromium",
use: { ...devices["Desktop Chrome"] },
},
],
/* Run your local dev server before starting the tests */
webServer: [
{
command: "pnpm preview --port 5173",
url: "http://localhost:5173/",
reuseExistingServer: !isCI,
},
],
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

View File

@@ -0,0 +1,100 @@
import { Button } from "@/components/Button.tsx";
import { useAcceptInvite, useAccount, useCoState } from "@/main.tsx";
import { EmployeeList } from "@/pages/EmployeeList.tsx";
import { EmployeeOnboading } from "@/pages/EmployeeOnboarding.tsx";
import { NewEmployee } from "@/pages/NewEmployee.tsx";
import { CoEmployee, EmployeeCoList } from "@/schema.ts";
import { ID } from "jazz-tools";
import { useEffect } from "react";
import {
RouterProvider,
createHashRouter,
useNavigate,
useParams,
} from "react-router-dom";
function ImportEmployee({
employeeListCoId,
}: { employeeListCoId: ID<EmployeeCoList> }) {
const { employeeCoId } = useParams();
const navigate = useNavigate();
const employees = useCoState(EmployeeCoList, employeeListCoId, [{}]);
const employee = useCoState(CoEmployee, employeeCoId as ID<CoEmployee>, {});
useEffect(() => {
if (!employee || !employees) return;
const exists = employees.find((employee) => employeeCoId === employee.id);
if (!exists) {
employees.push(employee);
}
navigate("/");
}, [employee, employees, navigate]);
return <div>Importing Employee ${employeeCoId} ...</div>;
}
function AcceptInvite() {
const navigate = useNavigate();
useAcceptInvite({
invitedObjectSchema: CoEmployee,
onAccept: (employeeCoId) => {
navigate(`/import/${employeeCoId}`);
},
});
return <p>Accepting invite...</p>;
}
function App() {
const { me, logOut } = useAccount();
const employeeCoListId = me.profile?._refs.employees.id;
const router = createHashRouter([
{
path: "/",
element: <EmployeeList employeeListCoId={employeeCoListId} />,
},
{
path: "employee/new",
element: <NewEmployee employeeListCoId={employeeCoListId} />,
},
{
path: "/employee/:employeeCoId",
element: <EmployeeOnboading />,
},
{
path: "/import/:employeeCoId",
element: <ImportEmployee employeeListCoId={employeeCoListId} />,
},
{
path: "/invite/*",
element: <AcceptInvite />,
},
]);
return (
<>
<header className="flex flex-wrap space-x-8 max-w-screen-lg m-2">
<h1 className="text-3xl font-extrabold">
Jazz Onboarding Flow example
</h1>
<Button
onClick={() => {
window.location.href = "/";
logOut();
}}
text="Log Out"
/>
</header>
<main className="ml-2">
{employeeCoListId && <RouterProvider router={router} />}
</main>
</>
);
}
export default App;

View File

@@ -0,0 +1,29 @@
const disabledClasses =
"text-white bg-gray-400 dark:bg-gray-500 cursor-not-allowed";
const regularClasses =
"text-white bg-gradient-to-r from-green-400 via-green-500 to-green-600 hover:bg-gradient-to-br focus:ring-4 focus:outline-none focus:ring-green-300 dark:focus:ring-green-800";
export function Button({
text,
onClick,
disabled,
...props
}: {
text: string;
onClick?: () => void;
disabled?: boolean;
}) {
return (
<button
{...props}
onClick={onClick}
type="button"
disabled={disabled}
className={`${
disabled ? disabledClasses : regularClasses
} text-base font-medium rounded-lg text-sm px-5 py-2.5 text-center me-2 mb-2`}
>
{text}
</button>
);
}

View File

@@ -0,0 +1,19 @@
import React from "react";
import { Link } from "react-router-dom";
export function ButtonLink({
to,
children,
}: {
to: string;
children: React.ReactNode;
}) {
return (
<Link
className="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800"
to={to}
>
{children}
</Link>
);
}

View File

@@ -0,0 +1,19 @@
import React from "react";
import { Link } from "react-router-dom";
export function NavLink({
to,
children,
}: {
to: string;
children: React.ReactNode;
}) {
return (
<Link
className="font-medium text-blue-600 dark:text-blue-500 hover:underline"
to={to}
>
{children}
</Link>
);
}

View File

@@ -0,0 +1,24 @@
import { useNavigate } from "react-router-dom";
import { Button } from "./Button.tsx";
export function NavigateBack() {
const navigate = useNavigate();
const canGoBack = window.history.state.idx !== 0;
if (!canGoBack) return null;
return (
<div>
<Button onClick={() => navigate(-1)} text="< Back" />
</div>
);
}
export function NavigateButton({ text, to }: { text: string; to: string }) {
const navigate = useNavigate();
return (
<div>
<Button onClick={() => navigate(to)} text={text} />
</div>
);
}

View File

@@ -0,0 +1,19 @@
import React from "react";
export function Stack({
children,
horizontal,
}: {
children: React.ReactNode;
horizontal?: boolean;
}) {
return (
<div
className={`container flex ${
horizontal ? "flex-row" : "flex-col"
} col ${horizontal ? "space-x-4 flex-wrap" : "space-y-4"} p-4`}
>
{children}
</div>
);
}

View File

@@ -0,0 +1,36 @@
import { ChangeEvent } from "react";
export function TextInput({
id,
value,
label,
onChange,
disabled,
}: {
id: string;
label: string;
value: string;
onChange: (e: ChangeEvent<HTMLInputElement>) => void;
disabled?: boolean;
}) {
return (
<div>
<label
htmlFor={id}
className="block mb-2 font-medium text-gray-900 dark:text-white"
>
{label}
</label>
<input
value={value}
onChange={onChange}
type="text"
id={id}
disabled={disabled}
className="disabled:cursor-not-allowed bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
placeholder="John"
required
/>
</div>
);
}

View File

@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@@ -0,0 +1,39 @@
import App from "@/App.tsx";
import React from "react";
import ReactDOM from "react-dom/client";
import "@/index.css";
import { HRAccount } from "@/schema.ts";
import { DemoAuthBasicUI, createJazzReactApp, useDemoAuth } from "jazz-react";
const Jazz = createJazzReactApp({
AccountSchema: HRAccount,
});
export const { useAccount, useCoState, useAcceptInvite } = Jazz;
const peer =
(new URL(window.location.href).searchParams.get(
"peer",
) as `ws://${string}`) ??
"wss://cloud.jazz.tools/?key=onboarding-example-jazz@gcmp.io";
function JazzAndAuth({ children }: { children: React.ReactNode }) {
const [auth, authState] = useDemoAuth();
return (
<>
<Jazz.Provider auth={auth} peer={peer}>
{children}
</Jazz.Provider>
{authState.state !== "signedIn" && (
<DemoAuthBasicUI appName="Jazz Onboarding" state={authState} />
)}
</>
);
}
ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
<JazzAndAuth>
<App />
</JazzAndAuth>
</React.StrictMode>,
);

View File

@@ -0,0 +1,50 @@
import { NavLink } from "@/components/NavLink.tsx";
import { NavigateButton } from "@/components/NavigateBack.tsx";
import { Stack } from "@/components/Stack.tsx";
import { useCoState } from "@/main.tsx";
import { CoEmployee, EmployeeCoList } from "@/schema.ts";
import { ID } from "jazz-tools";
export function EmployeeList({
employeeListCoId,
}: {
employeeListCoId: ID<EmployeeCoList>;
}) {
const employees = useCoState(EmployeeCoList, employeeListCoId, [{}]);
if (!employees) {
return <div>Loading...</div>;
}
return (
<Stack>
<NavigateButton to="/employee/new" text={"Add New Employee"} />
<ul className="max-w-md">
{employees.map((employee: CoEmployee) =>
employee.deleted ? null : (
<li key={employee.id} className="flex flex-row space-x-8 w-full">
<span>{employee._owner.myRole()}</span>
<span className="w-1/3">
<NavLink to={`/employee/${employee.id}`}>
{employee.name}
</NavLink>
</span>
{employee.finalStep?.done && <span></span>}
{employee._owner.myRole() === "admin" &&
!employee.finalStep?.done && (
<span
onClick={() => {
employee.deleted = true;
}}
className="cursor-pointer"
>
🗑
</span>
)}
</li>
),
)}
</ul>
</Stack>
);
}

View File

@@ -0,0 +1,240 @@
import { Button } from "@/components/Button.tsx";
import { NavigateBack } from "@/components/NavigateBack.tsx";
import { Stack } from "@/components/Stack.tsx";
import { TextInput } from "@/components/TextInput.tsx";
import { useCoState } from "@/main.tsx";
import { createImage } from "jazz-browser-media-images";
import { ProgressiveImg, createInviteLink } from "jazz-react";
import { CoMap, ID } from "jazz-tools";
import { ChangeEvent, ReactNode, useCallback } from "react";
import { useParams } from "react-router";
import {
CoDocUploadStep,
CoEmployee,
CoFinalStep,
CoInitialStep,
} from "../schema.ts";
const Card = ({
children,
title,
isDone,
isActive,
}: {
children: ReactNode;
title: string;
isDone: boolean;
isActive?: boolean;
}) => (
<div
className={`w-full p-4 bg-white border border-gray-200 rounded-lg shadow max-w-md ${
isActive ? "border-gray-900 hover:bg-green-50 shadow-xl" : ""
}`}
>
<Stack horizontal={true}>
<h5 className="mb-2 text-2xl text-gray-900">{title}</h5>
<h6 className="mb-2 text-2xl">
{isDone ? "✅" : isActive ? "❓" : "⌛"}
</h6>
</Stack>
{children}
</div>
);
const InfoCard = ({
initialStep,
canWrite,
}: {
initialStep: CoInitialStep;
canWrite: boolean;
}) => {
const isDisabled = !initialStep.isCurrentStep() || !canWrite;
return (
<Card
title="Personal Info"
isDone={initialStep?.done}
isActive={initialStep.isCurrentStep()}
>
<Stack>
<TextInput
disabled={isDisabled}
id="ssn"
label="Social Security Number"
value={initialStep.ssn || ""}
onChange={({ target: { value } }) => (initialStep.ssn = value)}
/>
<TextInput
disabled={isDisabled}
id="address"
label="Address"
value={initialStep.address || ""}
onChange={({ target: { value } }) => (initialStep.address = value)}
/>
{!initialStep.done && (
<Button
text={"Upload step >"}
disabled={!initialStep.ssn || !initialStep.address || isDisabled}
onClick={() => (initialStep.done = true)}
/>
)}
</Stack>
</Card>
);
};
const UploadCard = ({
uploadStep,
canWrite,
}: {
uploadStep: CoDocUploadStep;
canWrite: boolean;
}) => {
const isDisabled = !uploadStep.isCurrentStep() || !canWrite;
const onImageSelected = useCallback(
async (event: ChangeEvent<HTMLInputElement>) => {
if (!event.target.files) return;
const image = await createImage(event.target.files[0], {
owner: uploadStep._owner,
});
uploadStep.photo = image;
},
[uploadStep],
);
return (
<Card
title="Uploads"
isDone={uploadStep?.done}
isActive={uploadStep.isCurrentStep()}
>
<Stack>
{uploadStep.photo && (
<ProgressiveImg image={uploadStep.photo}>
{({ src }) => (
<img
className="max-h-full max-w-full rounded-l-sm rounded-r-md shadow-lg p-2"
src={src}
/>
)}
</ProgressiveImg>
)}
{!uploadStep.done && (
<>
<input
type="file"
disabled={isDisabled}
onChange={onImageSelected}
data-testid="file-upload"
/>
<Button
text={"Confirmation step >"}
disabled={isDisabled || !uploadStep.photo}
onClick={() => (uploadStep.done = true)}
/>
</>
)}
</Stack>
</Card>
);
};
const ConfirmationCard = ({
finalStep,
editable,
}: {
finalStep: CoFinalStep;
editable: boolean;
}) => {
const isDisabled = !finalStep.isCurrentStep() || !editable;
return (
<Card
title="Confirmation by admin"
isDone={finalStep?.done}
isActive={finalStep.isCurrentStep()}
>
<Stack>
{!finalStep.done && (
<Button
text="Confirmation by admin"
disabled={isDisabled}
onClick={() => (finalStep.done = true)}
/>
)}
</Stack>
</Card>
);
};
export function EmployeeOnboading() {
const { employeeCoId } = useParams();
const employee = useCoState(CoEmployee, employeeCoId as ID<CoEmployee>, {});
const handleInviteLinkCreation = useCallback(
(role: "reader" | "writer") => {
if (!employee) return;
const link = createInviteLink(employee, role);
navigator.clipboard.writeText(link);
alert("Invite link copied to clipboard!");
},
[employee],
);
const isMeWriter = (step: CoMap): boolean => {
return ["writer", "admin"].includes(step._owner.myRole() || "");
};
return (
<>
<Stack>
<Stack horizontal={true}>
<NavigateBack />
{employee?._owner.myRole() === "admin" && (
<Button
text={"Invite a co-worker"}
onClick={() => handleInviteLinkCreation("writer")}
/>
)}
</Stack>
<h2 className="mb-2 text-2xl text-gray-900 font-semibold">
{employee ? employee.name : "Loading..."}
</h2>
</Stack>
{employee && (
<Stack>
{employee.initialStep ? (
<InfoCard
initialStep={employee.initialStep}
canWrite={isMeWriter(employee.initialStep)}
/>
) : (
<div>Loading...</div>
)}
{employee.docUploadStep ? (
<UploadCard
uploadStep={employee.docUploadStep}
canWrite={isMeWriter(employee.docUploadStep)}
/>
) : (
<div>Loading...</div>
)}
{employee.finalStep ? (
<ConfirmationCard
finalStep={employee.finalStep}
editable={isMeWriter(employee.finalStep)}
/>
) : (
<div>Loading...</div>
)}
</Stack>
)}
</>
);
}

View File

@@ -0,0 +1,89 @@
import { Button } from "@/components/Button.tsx";
import { NavigateBack } from "@/components/NavigateBack.tsx";
import { Stack } from "@/components/Stack.tsx";
import { TextInput } from "@/components/TextInput.tsx";
import { useAccount, useCoState } from "@/main.tsx";
import { Group, ID } from "jazz-tools";
import { useCallback, useState } from "react";
import { useNavigate } from "react-router-dom";
import {
CoDocUploadStep,
CoEmployee,
CoFinalStep,
CoInitialStep,
EmployeeCoList,
} from "../schema.ts";
export function NewEmployee({
employeeListCoId,
}: {
employeeListCoId: ID<EmployeeCoList>;
}) {
const navigate = useNavigate();
const { me } = useAccount();
const employees = useCoState(EmployeeCoList, employeeListCoId, [{}]);
const [employeeName, setEmployeeName] = useState<string>("");
const createEmployee = useCallback(() => {
if (!employees) return;
const writerGroup = Group.create({ owner: me });
const readerGroup = Group.create({ owner: me });
readerGroup.addMember("everyone", "reader");
const initialStep = CoInitialStep.create(
{ done: false, type: "initial" },
{ owner: writerGroup },
);
const docUploadStep = CoDocUploadStep.create(
{ done: false, prevStep: initialStep, type: "upload" },
{ owner: writerGroup },
);
const finalStep = CoFinalStep.create(
{ done: false, prevStep: docUploadStep, type: "final" },
{ owner: readerGroup },
);
const employee = CoEmployee.create(
{
name: employeeName,
initialStep,
docUploadStep,
finalStep,
},
{ owner: writerGroup },
);
employees.push(employee);
setEmployeeName("");
}, [employeeName, employees]);
return (
<div className="w-96">
<Stack>
<NavigateBack />
<form>
<TextInput
label="Employee name"
id="employee-name"
value={employeeName}
onChange={({ target: { value } }) => setEmployeeName(value)}
/>
</form>
<Button
disabled={!employeeName}
onClick={() => {
createEmployee();
navigate("/");
}}
text="Create Employee"
/>
</Stack>
</div>
);
}

View File

@@ -0,0 +1,78 @@
import {
Account,
CoList,
CoMap,
ImageDefinition,
Profile,
co,
} from "jazz-tools";
type Steps = "initial" | "upload" | "final";
interface Step {
type: Steps;
prevStep: ReturnType<typeof co.ref> | undefined;
done: boolean;
isCurrentStep(): boolean;
}
export class CoInitialStep extends CoMap implements Step {
type = co.literal("initial");
ssn? = co.string;
address? = co.string;
done = co.boolean;
prevStep = co.null;
isCurrentStep() {
return !this.done;
}
}
export class CoDocUploadStep extends CoMap implements Step {
type = co.literal("upload");
prevStep = co.ref(CoInitialStep);
photo = co.ref(ImageDefinition, { optional: true });
done = co.boolean;
isCurrentStep() {
return !!(this.prevStep?.done && !this.done);
}
}
export class CoFinalStep extends CoMap implements Step {
type = co.literal("final");
prevStep = co.ref(CoDocUploadStep);
done = co.boolean;
isCurrentStep() {
return !!(this.prevStep?.done && !this.done);
}
}
export class CoEmployee extends CoMap {
name = co.string;
deleted? = co.boolean;
initialStep = co.ref(CoInitialStep);
docUploadStep = co.ref(CoDocUploadStep);
finalStep = co.ref(CoFinalStep);
}
export class EmployeeCoList extends CoList.Of(co.ref(CoEmployee)) {}
export class HRProfile extends Profile {
employees = co.ref(EmployeeCoList);
}
export class HRAccount extends Account {
profile = co.ref(HRProfile)!;
migrate(this: HRAccount, creationProps?: { name: string }) {
super.migrate(creationProps);
if (!this.profile._refs.employees) {
this.profile.employees = EmployeeCoList.create([], {
owner: this.profile._owner,
});
}
}
}

1
examples/onboarding/src/vite-env.d.ts vendored Normal file
View File

@@ -0,0 +1 @@
/// <reference types="vite/client" />

View File

@@ -0,0 +1,8 @@
/** @type {import('tailwindcss').Config} */
export default {
content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
theme: {
extend: {},
},
plugins: [],
};

View File

@@ -0,0 +1,117 @@
import {
Browser,
BrowserContext,
Page,
chromium,
expect,
test,
} from "@playwright/test";
import { EmployeeOnboardingPage } from "./pages/EmployeeOnboardingPage";
import { HomePage } from "./pages/HomePage";
import { LoginPage } from "./pages/LoginPage";
async function scrollToBottom(page: Page) {
await page.evaluate(() => {
window.scrollTo(0, document.body.scrollHeight);
});
}
const login = async ({
page,
userName,
loginAs = false,
}: {
page: Page;
userName: string;
loginAs?: boolean;
}) => {
const loginPage = new LoginPage(page);
await loginPage.goto("/");
if (loginAs) {
await loginPage.loginAs(userName);
} else {
await loginPage.fillUsername(userName);
await loginPage.signup();
}
};
test.describe("Admin onboarding flow", () => {
let browser: Browser;
let adminContext: BrowserContext;
let writerContext: BrowserContext;
test.beforeAll(async () => {
browser = await chromium.launch();
adminContext = await browser.newContext();
writerContext = await browser.newContext();
});
test.afterAll(async () => {
await adminContext.close();
await writerContext.close();
await browser.close();
});
test("Create and delete flow", async () => {
const adminPage = await adminContext.newPage();
await login({ page: adminPage, userName: "HR specialist" });
const adminHomePage = new HomePage(adminPage);
await adminHomePage.createEmployee("Paul");
await adminHomePage.createEmployee("Sean");
await adminHomePage.expectEmployee(["Sean", "admin"]);
await adminHomePage.expectEmployee(["Paul", "admin"]);
await adminHomePage.deleteEmployee("Sean");
await adminHomePage.expectEmployeeDeleted("Sean");
await adminPage.close();
});
test("Onboard flow", async () => {
const adminPage = await adminContext.newPage();
const writerPage = await writerContext.newPage();
const adminUser = "HR specialist";
const writerUser = "Invitee";
await login({ page: adminPage, userName: adminUser });
await login({ page: writerPage, userName: writerUser });
const adminHomePage = new HomePage(adminPage);
await adminHomePage.createEmployee("Paul");
await adminHomePage.expectEmployee(["Paul", "admin"]);
await adminHomePage.navigateToEmployeeOnboardingPage("Paul");
const adminOnboardingPage = new EmployeeOnboardingPage(adminPage);
// create invitation
const invitation = await adminOnboardingPage.getShareLink();
// Wait for the invitation to be synced
await writerPage.waitForTimeout(3000);
//fill out by invitee (writer)
await writerPage.goto(invitation);
const writerHomePage = new HomePage(writerPage);
await writerHomePage.expectEmployee(["Paul", "write"]);
await writerHomePage.navigateToEmployeeOnboardingPage("Paul");
const writerOnboardingPage = new EmployeeOnboardingPage(writerPage);
await writerOnboardingPage.expectEmployeeName("Paul");
await writerOnboardingPage.fillPersonalDetailsCardAndSave(
"123-45-6789",
"123 Elm Street",
);
await writerOnboardingPage.fillUploadCardAndSave(
"./public/jazz-logo-low-res.jpg",
);
// invitee cannot confirm the onboarding completion
expect(
writerOnboardingPage.finalConfirmationButton.isDisabled(),
).toBeTruthy();
// final confirmation step by admin
await scrollToBottom(adminPage);
await adminOnboardingPage.finalConfirmationButton.click();
await adminOnboardingPage.backButton.click();
await adminHomePage.expectOnboardingCompleteForEmployee("Paul");
});
});

View File

@@ -0,0 +1,92 @@
import { Locator, Page, expect } from "@playwright/test";
export class EmployeeOnboardingPage {
readonly page: Page;
readonly shareButton: Locator;
readonly backButton: Locator;
readonly logoutButton: Locator;
readonly finalConfirmationButton: Locator;
readonly fileInput: Locator;
constructor(page: Page) {
this.page = page;
this.shareButton = page.getByRole("button", {
name: /invite a co-worker/i,
});
this.backButton = page.getByRole("button", {
name: /back/i,
});
this.logoutButton = page.getByRole("button", {
name: /log out/i,
});
this.finalConfirmationButton = this.page.getByRole("button", {
name: /confirmation by admin/i,
});
this.fileInput = page.getByTestId("file-upload");
}
async uploadFile(value: string) {
// Start waiting for file chooser before clicking. Note no await.
const fileChooserPromise = this.page.waitForEvent("filechooser");
await this.fileInput.click();
const fileChooser = await fileChooserPromise;
await fileChooser.setFiles(value);
}
async expectEmployeeName(name: string) {
await expect(
this.page.getByRole("heading", {
name: name,
}),
).toBeVisible();
}
async fillPersonalDetailsCardAndSave(ssn: string, address: string) {
const nextStepButton = this.page.getByRole("button", {
name: /upload step >/i,
});
await expect(nextStepButton).toBeDisabled();
const ssnInput = this.page.getByLabel(/Social Security Number/i);
await ssnInput.fill(ssn);
const addressInput = this.page.getByLabel(/Address/i);
await addressInput.fill(address);
// save and hide the button
await expect(nextStepButton).toBeEnabled();
await nextStepButton.click();
await expect(nextStepButton).not.toBeVisible();
}
async fillUploadCardAndSave(file: string) {
const nextStepButton = this.page.getByRole("button", {
name: /confirmation step >/i,
});
await expect(nextStepButton).toBeDisabled();
await this.uploadFile(file);
await expect(nextStepButton).toBeEnabled();
await nextStepButton.click();
await expect(nextStepButton).not.toBeVisible();
}
async getShareLink() {
await this.shareButton.click();
const inviteUrl = await this.page.evaluate(() =>
navigator.clipboard.readText(),
);
expect(inviteUrl).toBeTruthy();
return inviteUrl;
}
async logout() {
await this.logoutButton.click();
}
}

View File

@@ -0,0 +1,66 @@
import { Locator, Page, expect } from "@playwright/test";
import { NewEmployeePage } from "./NewEmployeePage";
export class HomePage {
readonly page: Page;
readonly newEmployeeLink: Locator;
readonly logoutButton: Locator;
constructor(page: Page) {
this.page = page;
this.newEmployeeLink = page.getByRole("button", {
name: "Add New Employee",
});
this.logoutButton = page.getByRole("button", {
name: "Log Out",
});
}
async expectEmployee([name, role]: [string, string]) {
const liElement = this.page.locator(
`li:has-text("${name}"):has-text("${role}")`,
);
await expect(liElement).toBeVisible();
}
async deleteEmployee(name: string) {
const liElement = this.page.locator(`li:has-text("${name}")`);
const deleteIcon = liElement.locator('span:has-text("🗑")');
await deleteIcon.click();
}
async expectOnboardingCompleteForEmployee(name: string) {
const liElement = this.page.locator(`li:has-text("${name}")`);
const completionIcon = liElement.locator('span:has-text("✅")');
await expect(completionIcon).toBeVisible();
}
async expectEmployeeDeleted(name: string) {
const liElement = this.page.locator(`li:has-text("${name}")`);
await expect(liElement).not.toBeVisible();
}
async navigateToEmployeeOnboardingPage(name: string) {
await this.page
.getByRole("link", {
name,
})
.click();
}
async navigateToNewEmployee() {
await this.newEmployeeLink.click();
}
async createEmployee(name: string) {
await this.navigateToNewEmployee();
const newEmployeePage = new NewEmployeePage(this.page);
await newEmployeePage.fillEmployeeName(name);
await newEmployeePage.submit();
}
async logout() {
await this.logoutButton.click();
}
}

View File

@@ -0,0 +1,40 @@
import { Locator, Page, expect } from "@playwright/test";
export class LoginPage {
readonly page: Page;
readonly usernameInput: Locator;
readonly signupButton: Locator;
constructor(page: Page) {
this.page = page;
this.usernameInput = page.getByRole("textbox");
this.signupButton = page.getByRole("button", {
name: "Sign up",
});
}
async goto(url: string) {
await this.page.goto(url);
}
async fillUsername(value: string) {
await this.usernameInput.clear();
await this.usernameInput.fill(value);
}
async loginAs(value: string) {
await this.page
.getByRole("button", {
name: value,
})
.click();
}
async signup() {
await this.signupButton.click();
}
async expectLoaded() {
await expect(this.signupButton).toBeVisible();
}
}

View File

@@ -0,0 +1,24 @@
import { Locator, Page } from "@playwright/test";
export class NewEmployeePage {
readonly page: Page;
readonly employeeNameInput: Locator;
readonly submitButton: Locator;
constructor(page: Page) {
this.page = page;
this.employeeNameInput = page.getByLabel(/employee name/i);
this.submitButton = page.getByRole("button", {
name: /create employee/i,
});
}
async fillEmployeeName(value: string) {
await this.employeeNameInput.clear();
await this.employeeNameInput.fill(value);
}
async submit() {
await this.submitButton.click();
}
}

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