Compare commits
997 Commits
jazz-bette
...
jazz-bette
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c6a2a6092 | ||
|
|
e8a950e61a | ||
|
|
e2cbf035de | ||
|
|
47599b6307 | ||
|
|
901d0762ee | ||
|
|
d1c1b0c5cc | ||
|
|
cf4ad7285d | ||
|
|
2983c7bd58 | ||
|
|
ab6328f767 | ||
|
|
e0555debde | ||
|
|
247f4556e7 | ||
|
|
7903c737f4 | ||
|
|
6145da5525 | ||
|
|
fc0a2e77a3 | ||
|
|
334fbbbb7f | ||
|
|
eaac1e6580 | ||
|
|
114898d8a9 | ||
|
|
cbc3f0cc65 | ||
|
|
29c487e288 | ||
|
|
0b0590a364 | ||
|
|
1eb01997d8 | ||
|
|
0dc8d511a1 | ||
|
|
962213c712 | ||
|
|
427df8fcbb | ||
|
|
c40aad55dc | ||
|
|
dfca5926de | ||
|
|
9815ec61f0 | ||
|
|
fca60d213e | ||
|
|
b4fdab475b | ||
|
|
2b043abffa | ||
|
|
958c122c36 | ||
|
|
5842838371 | ||
|
|
e136e1b696 | ||
|
|
2475a46578 | ||
|
|
44f653a64b | ||
|
|
f8437042a6 | ||
|
|
acd908fbc2 | ||
|
|
4e61d1d191 | ||
|
|
db23582b4c | ||
|
|
4b0b6d8a69 | ||
|
|
d450b394fa | ||
|
|
0abc96e400 | ||
|
|
7562354b29 | ||
|
|
6c085a3919 | ||
|
|
6afff848bc | ||
|
|
47059845cc | ||
|
|
a1735a8232 | ||
|
|
1f5750d8c4 | ||
|
|
f756ce26b5 | ||
|
|
84f5bdda74 | ||
|
|
ee7aefa97c | ||
|
|
b0895981ba | ||
|
|
94f636b2ee | ||
|
|
331ab070f6 | ||
|
|
13e73adfb9 | ||
|
|
9f6079b6c6 | ||
|
|
4033d78fa6 | ||
|
|
83af94c850 | ||
|
|
70fe856713 | ||
|
|
42e4afc42b | ||
|
|
0e6797b222 | ||
|
|
3634eaf8e9 | ||
|
|
58dfda3d0f | ||
|
|
d304b0bcb5 | ||
|
|
44f5a3f5a2 | ||
|
|
ebb3ce1c25 | ||
|
|
a67bba0dcf | ||
|
|
4a72c26e42 | ||
|
|
084cb5936d | ||
|
|
f1552b8262 | ||
|
|
6826ad8e45 | ||
|
|
7c1b757b62 | ||
|
|
326e1734a4 | ||
|
|
0cf027c91b | ||
|
|
e358881b76 | ||
|
|
cee8010918 | ||
|
|
cc877139ef | ||
|
|
56a9b89538 | ||
|
|
199c463e28 | ||
|
|
50e523d19c | ||
|
|
796ea24288 | ||
|
|
c8be86e823 | ||
|
|
41b7054aab | ||
|
|
101adcd024 | ||
|
|
a2854aeec9 | ||
|
|
bdc9aee689 | ||
|
|
2f53ae0ab8 | ||
|
|
f76c05448c | ||
|
|
585e7e8177 | ||
|
|
82d8d1d873 | ||
|
|
2c523c86ff | ||
|
|
6616668d4a | ||
|
|
8a3be85e97 | ||
|
|
1a7f2b7379 | ||
|
|
caac82dffd | ||
|
|
27b48378e5 | ||
|
|
cfd3c3ca5c | ||
|
|
41f26b7a4f | ||
|
|
c57ebb1cea | ||
|
|
259aded5cc | ||
|
|
1f5e091dd7 | ||
|
|
bbb1c44977 | ||
|
|
4327ecbfdf | ||
|
|
114c10bc77 | ||
|
|
cecdf29721 | ||
|
|
bd717fc0d7 | ||
|
|
739fff68b3 | ||
|
|
d49cab0afa | ||
|
|
ffebb4fdaf | ||
|
|
32565f0e53 | ||
|
|
61a5889bea | ||
|
|
82bd3e1ea6 | ||
|
|
b800a6fba2 | ||
|
|
1b6dbfdfff | ||
|
|
061a70f1b3 | ||
|
|
f1c1e0dafd | ||
|
|
c3912fdb37 | ||
|
|
356bfa4860 | ||
|
|
38446668c4 | ||
|
|
e2bb3b8015 | ||
|
|
11dcfd703d | ||
|
|
0b09d23bd1 | ||
|
|
879b726537 | ||
|
|
66bbd03262 | ||
|
|
c09b63698f | ||
|
|
bed7db0a33 | ||
|
|
8ff3e234c1 | ||
|
|
296da5a5c4 | ||
|
|
700a4f1ba1 | ||
|
|
6f6663d825 | ||
|
|
844cdc907f | ||
|
|
9e32d4cb92 | ||
|
|
85dc6ba148 | ||
|
|
16c4d27e00 | ||
|
|
69170fe0e0 | ||
|
|
a646ba54b3 | ||
|
|
45d60fc3c8 | ||
|
|
6f0c399ccd | ||
|
|
40e1ca7cb1 | ||
|
|
80cf21e453 | ||
|
|
48c8a3d219 | ||
|
|
31bb1201fc | ||
|
|
08d1b05607 | ||
|
|
d64a14210d | ||
|
|
7e53d33e9b | ||
|
|
ea2b39cc30 | ||
|
|
6b835f95cf | ||
|
|
a229ae5f70 | ||
|
|
84fdc1d8fd | ||
|
|
9b1d52d183 | ||
|
|
14a8b32522 | ||
|
|
ddc09a0d6b | ||
|
|
3b45a3f2fd | ||
|
|
9034a45da0 | ||
|
|
6247fac6c5 | ||
|
|
a5ceaffb0c | ||
|
|
dcee2f9b4e | ||
|
|
f27a2c541e | ||
|
|
83fdc504ff | ||
|
|
2317a23fd4 | ||
|
|
a34c0675cd | ||
|
|
5a8a62b4a3 | ||
|
|
325a554bd1 | ||
|
|
7422943e83 | ||
|
|
23bfea5861 | ||
|
|
605a54eb11 | ||
|
|
a7aaee51e6 | ||
|
|
4b8983858a | ||
|
|
8a8c4d11e1 | ||
|
|
26994684d7 | ||
|
|
14a5e036a4 | ||
|
|
5b1c1ca522 | ||
|
|
a9c8458c51 | ||
|
|
5f31d6cbe1 | ||
|
|
b774bb345d | ||
|
|
7fd891d7b9 | ||
|
|
27cac4a6d7 | ||
|
|
2b71ef1181 | ||
|
|
ae169c7b3a | ||
|
|
d888c99d9a | ||
|
|
0b54917f19 | ||
|
|
c87b215b75 | ||
|
|
e4ba23cbef | ||
|
|
98c005a6e0 | ||
|
|
477fd8a62d | ||
|
|
90999ee709 | ||
|
|
38065f0cdf | ||
|
|
c77d16cdb3 | ||
|
|
9410084e6a | ||
|
|
8528db4de4 | ||
|
|
e0fe5a20b7 | ||
|
|
e16e4d53d1 | ||
|
|
d904fae506 | ||
|
|
f67c0b3db3 | ||
|
|
283d7c6bf0 | ||
|
|
e67c5838a9 | ||
|
|
0e7a7dbbc0 | ||
|
|
63c69b6b95 | ||
|
|
a141cbc7f7 | ||
|
|
6a5352cf3a | ||
|
|
27762637ee | ||
|
|
dcebe34891 | ||
|
|
99d510815f | ||
|
|
928962c08b | ||
|
|
cdadd6db1d | ||
|
|
d45b8ae70b | ||
|
|
445a58c864 | ||
|
|
1895b474ea | ||
|
|
fd02627069 | ||
|
|
827adc991d | ||
|
|
651b69e5af | ||
|
|
277e4d49e8 | ||
|
|
8990ff39a5 | ||
|
|
71e4c97255 | ||
|
|
577e960e28 | ||
|
|
f232f75d40 | ||
|
|
cfa44f32eb | ||
|
|
ef920435e9 | ||
|
|
87d05404dd | ||
|
|
535c460f5a | ||
|
|
e1a7f829b4 | ||
|
|
fa1b302474 | ||
|
|
45f73a774c | ||
|
|
2a9e271dc3 | ||
|
|
3d96d9c829 | ||
|
|
844051405d | ||
|
|
625eff2333 | ||
|
|
59e2871065 | ||
|
|
acdc88fb91 | ||
|
|
05eab4e2a9 | ||
|
|
efcd65ae38 | ||
|
|
f82177b9da | ||
|
|
ad60fa942a | ||
|
|
c1c553bad0 | ||
|
|
5272d3cd2a | ||
|
|
588ea02f63 | ||
|
|
d837811813 | ||
|
|
2b4aba2d1b | ||
|
|
50b4da18d9 | ||
|
|
d18d09e002 | ||
|
|
d983f27bbe | ||
|
|
fcf83b0da4 | ||
|
|
9231e2c22f | ||
|
|
33157ee0ad | ||
|
|
4b964edcaf | ||
|
|
df22f2617e | ||
|
|
ddc69f2268 | ||
|
|
7c62689319 | ||
|
|
280495c533 | ||
|
|
d5c6fbdc3c | ||
|
|
57776a1400 | ||
|
|
156c45aa0e | ||
|
|
2d0dba6bbc | ||
|
|
7241d2ad95 | ||
|
|
4a9eeace00 | ||
|
|
4f9c91f6ff | ||
|
|
a8e1726797 | ||
|
|
a6eeada331 | ||
|
|
3b38a8241c | ||
|
|
c49330c308 | ||
|
|
0c4e27c18d | ||
|
|
d8d273821e | ||
|
|
def0ca81b4 | ||
|
|
7ff13a8f55 | ||
|
|
53fff71f25 | ||
|
|
0e7e53238b | ||
|
|
fcc18e5212 | ||
|
|
5741d7f09c | ||
|
|
766d2c8846 | ||
|
|
70a43d0c39 | ||
|
|
c28a04d09e | ||
|
|
56fe0aa614 | ||
|
|
745e3132ca | ||
|
|
ace1c796b5 | ||
|
|
1556e41895 | ||
|
|
2badb7e706 | ||
|
|
6f5731b86e | ||
|
|
b9214a8ef4 | ||
|
|
c65940fa94 | ||
|
|
74e3c0864a | ||
|
|
1d3a0e8d6c | ||
|
|
e1f2c1936a | ||
|
|
10c139ae97 | ||
|
|
e0cd3a5637 | ||
|
|
cf44258848 | ||
|
|
4db5ec2dd8 | ||
|
|
c3610d3b98 | ||
|
|
4983e57e62 | ||
|
|
5b2fc70ca1 | ||
|
|
0e3a4d2c46 | ||
|
|
53af54570c | ||
|
|
c1be360e3b | ||
|
|
3b4c83088e | ||
|
|
25fd7f39ae | ||
|
|
591d6f1ed8 | ||
|
|
e0b4626c22 | ||
|
|
fbf9dd29db | ||
|
|
ae09b47c33 | ||
|
|
a273a0db58 | ||
|
|
277104ebba | ||
|
|
7eac549606 | ||
|
|
042d03f002 | ||
|
|
434e59d5c4 | ||
|
|
bb20907774 | ||
|
|
282425575f | ||
|
|
8e4cfd08b2 | ||
|
|
66b5f8d4c8 | ||
|
|
9c6ca9e864 | ||
|
|
858386b5b1 | ||
|
|
238e9ab7a0 | ||
|
|
f45af0a5cf | ||
|
|
22af329930 | ||
|
|
c27ac18135 | ||
|
|
8f86d44174 | ||
|
|
4d7555a4ee | ||
|
|
75501a9051 | ||
|
|
fc342306e2 | ||
|
|
8e4a9c7211 | ||
|
|
362284f6b7 | ||
|
|
975c7bc785 | ||
|
|
9a1295d4f6 | ||
|
|
256fdfd0db | ||
|
|
4cf2bf5fef | ||
|
|
cae74bd051 | ||
|
|
05a3786e23 | ||
|
|
0fa051a59d | ||
|
|
1378a1ff68 | ||
|
|
5ad093cb6a | ||
|
|
c114cf4029 | ||
|
|
98407c2314 | ||
|
|
03da7dc994 | ||
|
|
65e14c6176 | ||
|
|
9fa79b3a5f | ||
|
|
c90222d32e | ||
|
|
d084b41929 | ||
|
|
65e78014fa | ||
|
|
d693800eb3 | ||
|
|
12d5c68f98 | ||
|
|
4ab0b1f4b2 | ||
|
|
ec1e359621 | ||
|
|
44fb13ddd7 | ||
|
|
4fd4c5bbed | ||
|
|
9157effdb3 | ||
|
|
a1d31566ed | ||
|
|
dcde3aa811 | ||
|
|
30b2820a8c | ||
|
|
bb561e2650 | ||
|
|
7cdf397a01 | ||
|
|
44116b805b | ||
|
|
e93c27910d | ||
|
|
16428cace4 | ||
|
|
f48dabaa1a | ||
|
|
7ff90cb81e | ||
|
|
3a53cc4c00 | ||
|
|
ea6c50b2b8 | ||
|
|
6d93f7b388 | ||
|
|
ebc0139559 | ||
|
|
01c07e34e4 | ||
|
|
c89b94aa3b | ||
|
|
01e2977a13 | ||
|
|
41354cb2c1 | ||
|
|
530f9d3e11 | ||
|
|
c965c904bc | ||
|
|
a621141d76 | ||
|
|
0e1fbd7dfc | ||
|
|
d527ae2db0 | ||
|
|
b9261aa4c1 | ||
|
|
41dd1fa80b | ||
|
|
27efdf9b8e | ||
|
|
83068b33e9 | ||
|
|
769d9b0517 | ||
|
|
b0ffe5ed7e | ||
|
|
53dabbd955 | ||
|
|
a036a1c58c | ||
|
|
f4f47258eb | ||
|
|
7e605bb1f3 | ||
|
|
469ac44ff5 | ||
|
|
ea0045580c | ||
|
|
b84bf1826b | ||
|
|
a4fb2edfc2 | ||
|
|
06c5a1c2ba | ||
|
|
c67a0cd3ce | ||
|
|
48e11a243f | ||
|
|
b85423b39f | ||
|
|
b698ffbf45 | ||
|
|
de904698d8 | ||
|
|
a026073c41 | ||
|
|
5763c684c5 | ||
|
|
7c8180dcb4 | ||
|
|
a82b216901 | ||
|
|
f20182b1cc | ||
|
|
da3e101c50 | ||
|
|
7605d228f2 | ||
|
|
3063d74ab9 | ||
|
|
2a4e3fc0cd | ||
|
|
7cc6d63d40 | ||
|
|
d574bbc521 | ||
|
|
6388a7272b | ||
|
|
cd358888d8 | ||
|
|
f427f2324b | ||
|
|
ef4fdff4fc | ||
|
|
0f5e22f522 | ||
|
|
fc71d4548c | ||
|
|
f5c90d875f | ||
|
|
65963fffc8 | ||
|
|
d62285ba22 | ||
|
|
04575ff237 | ||
|
|
34a5e17cab | ||
|
|
759a800874 | ||
|
|
c5ca74e2a9 | ||
|
|
7f09bc9475 | ||
|
|
0e4a523757 | ||
|
|
d97956e5db | ||
|
|
38e0e3f29b | ||
|
|
733b48ab2d | ||
|
|
4bf6ecce9d | ||
|
|
2526e88cd1 | ||
|
|
f7742a0ba1 | ||
|
|
5360000f61 | ||
|
|
ca638e4d92 | ||
|
|
594d68e9ee | ||
|
|
de1ea09ec5 | ||
|
|
cf30fbd575 | ||
|
|
598e669705 | ||
|
|
e4ed11cd9d | ||
|
|
e74a077823 | ||
|
|
680a2e2b99 | ||
|
|
861d7b88f8 | ||
|
|
e35a380d16 | ||
|
|
08b1601dd1 | ||
|
|
d413df4864 | ||
|
|
b897e950bb | ||
|
|
69c92ab908 | ||
|
|
b177b09724 | ||
|
|
3110459530 | ||
|
|
f66ed45460 | ||
|
|
10e1612fd4 | ||
|
|
282a2798c7 | ||
|
|
31b89adb03 | ||
|
|
793787bc66 | ||
|
|
9cbbd55eef | ||
|
|
17710122af | ||
|
|
e4e3e173da | ||
|
|
9a438a05ae | ||
|
|
fb126b8194 | ||
|
|
a58ca736ec | ||
|
|
39d916aeff | ||
|
|
554dd8e6e6 | ||
|
|
8d8cb77316 | ||
|
|
4c615ba5c2 | ||
|
|
30dc4a8caa | ||
|
|
ffdad97a32 | ||
|
|
f548199027 | ||
|
|
9fecaee697 | ||
|
|
f3409d8575 | ||
|
|
1173884769 | ||
|
|
1c40b3fd6d | ||
|
|
8b66c92c46 | ||
|
|
dd60538ea2 | ||
|
|
8a7aab8520 | ||
|
|
d3fc467514 | ||
|
|
2506ac799b | ||
|
|
905ba921b1 | ||
|
|
336b51eac7 | ||
|
|
b71a8dec3d | ||
|
|
1058156953 | ||
|
|
edbc10c892 | ||
|
|
4470d52326 | ||
|
|
b110f00561 | ||
|
|
f3f8baebba | ||
|
|
d330e0e7e6 | ||
|
|
6d1bd2b70a | ||
|
|
5cf888930f | ||
|
|
9d75d38bbd | ||
|
|
6e79c8679e | ||
|
|
222a8c2976 | ||
|
|
5b7f02024e | ||
|
|
4b94b25a11 | ||
|
|
a99df9cb13 | ||
|
|
d359a4f491 | ||
|
|
588d7f41a2 | ||
|
|
1951d0f5b1 | ||
|
|
3ffb74d170 | ||
|
|
8a45dae3f7 | ||
|
|
6110c82106 | ||
|
|
597545741b | ||
|
|
5e42e2a8d8 | ||
|
|
19e2a61398 | ||
|
|
cb5fe3380e | ||
|
|
d0e2041b10 | ||
|
|
edce59d238 | ||
|
|
7f75d852c1 | ||
|
|
2683af7d28 | ||
|
|
4223720010 | ||
|
|
1b4508fea7 | ||
|
|
5b06a9d0a7 | ||
|
|
41c4fbb8f9 | ||
|
|
95febc7777 | ||
|
|
7ddff0a550 | ||
|
|
cebc58cd3a | ||
|
|
044626fbc8 | ||
|
|
28fdc43c89 | ||
|
|
2602a49f12 | ||
|
|
8505b0a0b6 | ||
|
|
f2418ff364 | ||
|
|
c81a49ebc3 | ||
|
|
776fa09279 | ||
|
|
5c200aa60d | ||
|
|
9fc6c5f6c8 | ||
|
|
7e06cd4a77 | ||
|
|
c43191d97b | ||
|
|
5706b5eb81 | ||
|
|
3cd07dca31 | ||
|
|
f69707f1af | ||
|
|
57e748d2ba | ||
|
|
c0cfdc0d32 | ||
|
|
3763a99e14 | ||
|
|
5eed930997 | ||
|
|
35e5e50508 | ||
|
|
201e2fd015 | ||
|
|
e88a3d0712 | ||
|
|
13b64af5b2 | ||
|
|
9804c6a729 | ||
|
|
3e743d56d3 | ||
|
|
b3ff726794 | ||
|
|
f98f88d89b | ||
|
|
ea3a69cf53 | ||
|
|
24987fa9ec | ||
|
|
56974412df | ||
|
|
adaedd2da2 | ||
|
|
a11472a497 | ||
|
|
3f269c7483 | ||
|
|
81b6b8fd04 | ||
|
|
2939790335 | ||
|
|
7e4ba07c4c | ||
|
|
48c29435bc | ||
|
|
8668906376 | ||
|
|
6d84e9e83f | ||
|
|
1fea0ef69c | ||
|
|
e4314accb6 | ||
|
|
ee3a4048ef | ||
|
|
9ee1edef3b | ||
|
|
8ab5a09a86 | ||
|
|
2624442903 | ||
|
|
2d199089d5 | ||
|
|
683c170b9d | ||
|
|
937d415cc2 | ||
|
|
ce0e9f0102 | ||
|
|
518406e23d | ||
|
|
9196154207 | ||
|
|
c907b2aac2 | ||
|
|
4dcbafa058 | ||
|
|
7ae9e01848 | ||
|
|
dd9ecf660d | ||
|
|
4f849050dc | ||
|
|
7591ac1f7e | ||
|
|
681600220f | ||
|
|
384e239ad5 | ||
|
|
54e1a09a46 | ||
|
|
392a9c5aac | ||
|
|
7f9b82a975 | ||
|
|
b5a9dfa7ec | ||
|
|
113c77b416 | ||
|
|
cad5444400 | ||
|
|
b2b350e4d0 | ||
|
|
5f65ca0874 | ||
|
|
5a88024420 | ||
|
|
bf025724aa | ||
|
|
80d5d62852 | ||
|
|
478334eabf | ||
|
|
479f9b0113 | ||
|
|
812622b161 | ||
|
|
8b35fae4b6 | ||
|
|
9e2ecb0378 | ||
|
|
527082b108 | ||
|
|
fe908b5300 | ||
|
|
1f99807971 | ||
|
|
47f54c4d81 | ||
|
|
814f65acaf | ||
|
|
78fd4c86a1 | ||
|
|
678f326bc1 | ||
|
|
ea33ad4864 | ||
|
|
57b6d5efb4 | ||
|
|
15929b121d | ||
|
|
6edd061202 | ||
|
|
eb4cef196c | ||
|
|
85703f9241 | ||
|
|
865d5385e9 | ||
|
|
5bb12523ee | ||
|
|
190cb1efb2 | ||
|
|
46ab1f6db2 | ||
|
|
a44fc6fc6d | ||
|
|
2376a8d3b2 | ||
|
|
2c3ec2fea6 | ||
|
|
da6f6ec4d5 | ||
|
|
8c78b37bfb | ||
|
|
75f8833c1a | ||
|
|
99d1f3f28b | ||
|
|
5f382309de | ||
|
|
aa7eb3cf2c | ||
|
|
9b41762e96 | ||
|
|
28be460286 | ||
|
|
df8af06814 | ||
|
|
2ef460fccf | ||
|
|
9660e2c03c | ||
|
|
908645e4b7 | ||
|
|
f3ca37ed5e | ||
|
|
a9d0fd14c4 | ||
|
|
c496f49bb0 | ||
|
|
b26666ab4c | ||
|
|
4066cfe011 | ||
|
|
e5f8b06af1 | ||
|
|
9088a349a0 | ||
|
|
54b12dcb7a | ||
|
|
a998f94789 | ||
|
|
485b5a238d | ||
|
|
c42ee6d6e2 | ||
|
|
d17eecfe16 | ||
|
|
1fb2fd0f50 | ||
|
|
0fce4adfc5 | ||
|
|
71b9a5ce25 | ||
|
|
b59086c808 | ||
|
|
fe91463652 | ||
|
|
b9065db109 | ||
|
|
d13da295ed | ||
|
|
0291389c3b | ||
|
|
f417f518cb | ||
|
|
f69f99a209 | ||
|
|
31c4fd7c07 | ||
|
|
613aadd775 | ||
|
|
0f969b4be4 | ||
|
|
f7ac1015b2 | ||
|
|
8ebfbc86db | ||
|
|
abad8e762f | ||
|
|
037e16392e | ||
|
|
49ac65c123 | ||
|
|
3510fb1273 | ||
|
|
bc3efe7ca0 | ||
|
|
3b06a7809e | ||
|
|
58aa04bb10 | ||
|
|
afb94ef043 | ||
|
|
7554dd9f88 | ||
|
|
7a3cfabb4c | ||
|
|
df7101a8ee | ||
|
|
f74b46ee2f | ||
|
|
9177579f53 | ||
|
|
f1c00903f9 | ||
|
|
1ca9299590 | ||
|
|
63500e17f2 | ||
|
|
4f0fb6c27f | ||
|
|
34082ccaf5 | ||
|
|
a09c417d81 | ||
|
|
034bd20b39 | ||
|
|
00a188c22f | ||
|
|
dc630b0807 | ||
|
|
484baabe22 | ||
|
|
f529bede7b | ||
|
|
87f82ac7cd | ||
|
|
6f637d21ab | ||
|
|
aeb96510da | ||
|
|
d53cc3676d | ||
|
|
81dedb6395 | ||
|
|
17cb04bfb1 | ||
|
|
a98b4e5d81 | ||
|
|
7eb7e2f656 | ||
|
|
80703ea1cc | ||
|
|
d46e0b9d0c | ||
|
|
430a9e252a | ||
|
|
6f519462df | ||
|
|
a0ae2811ce | ||
|
|
73e5a3548a | ||
|
|
c5da3a42a1 | ||
|
|
74fa115709 | ||
|
|
baa5278cf3 | ||
|
|
6852b60e72 | ||
|
|
fc2b054fc2 | ||
|
|
048ac1d54f | ||
|
|
4ed7d61ea4 | ||
|
|
ced325da06 | ||
|
|
5563799a2a | ||
|
|
5a783f8eac | ||
|
|
0ea1530ee9 | ||
|
|
164579ee9c | ||
|
|
fc453e68c1 | ||
|
|
48544ca4d1 | ||
|
|
d7c5d4a03d | ||
|
|
8384c55cce | ||
|
|
b2e2b91dd7 | ||
|
|
36d7791326 | ||
|
|
707d84dea0 | ||
|
|
be947d1086 | ||
|
|
3924bb2ede | ||
|
|
2e3003c2fc | ||
|
|
5ec15ba0a2 | ||
|
|
6da8e3948c | ||
|
|
c7ccf5c5d7 | ||
|
|
9e8c81a1a6 | ||
|
|
c563e2547f | ||
|
|
00cb697bc7 | ||
|
|
a6a0560059 | ||
|
|
225da5ca42 | ||
|
|
3943f7fc41 | ||
|
|
d982bb50db | ||
|
|
55fa5977c2 | ||
|
|
8b4bc1bc97 | ||
|
|
92de0a6683 | ||
|
|
e10d00b444 | ||
|
|
89b6c1cbb9 | ||
|
|
6ec1933d65 | ||
|
|
854c6761a4 | ||
|
|
fc8acb0688 | ||
|
|
7a65b35ac5 | ||
|
|
2ef3938d71 | ||
|
|
1e71b23779 | ||
|
|
31071a4b21 | ||
|
|
8f53a52110 | ||
|
|
08b105508f | ||
|
|
f567b3d24b | ||
|
|
dd750fc6e8 | ||
|
|
814d99e0bc | ||
|
|
0eb70c2171 | ||
|
|
64e787a57f | ||
|
|
1e8c3df83e | ||
|
|
5013b1d97d | ||
|
|
c4837b9b92 | ||
|
|
e527cb676b | ||
|
|
2c75c46029 | ||
|
|
f92f65cc28 | ||
|
|
d88a94bc68 | ||
|
|
e9bf27467f | ||
|
|
c9bd778c03 | ||
|
|
c3832ad794 | ||
|
|
9b807cbba9 | ||
|
|
32fd3cab19 | ||
|
|
7502dba11b | ||
|
|
df403ccbc6 | ||
|
|
e9baf69126 | ||
|
|
f597d64423 | ||
|
|
5c8ce99ab5 | ||
|
|
679ca6c36b | ||
|
|
e6130219fe | ||
|
|
046075288b | ||
|
|
57fa927640 | ||
|
|
8ef14d4850 | ||
|
|
1a7b7942ad | ||
|
|
5f42c97184 | ||
|
|
2a2b474aa4 | ||
|
|
b45bf9248e | ||
|
|
6c2b8a8f8f | ||
|
|
1f490d2aae | ||
|
|
7be49602dd | ||
|
|
cb73d474a6 | ||
|
|
cd03cb77f5 | ||
|
|
d9d5662b7a | ||
|
|
39cd197494 | ||
|
|
5397fb27bc | ||
|
|
f0bfdc3f5f | ||
|
|
5f45036e2a | ||
|
|
20eab19676 | ||
|
|
6af2feb2e7 | ||
|
|
60df32ba05 | ||
|
|
90f36e61d6 | ||
|
|
2d27cd5356 | ||
|
|
0262b9d501 | ||
|
|
115e22c89d | ||
|
|
687d9bbbff | ||
|
|
56ad6379d9 | ||
|
|
481ffa1d96 | ||
|
|
a383c7e984 | ||
|
|
8ca283147d | ||
|
|
c3d87796ed | ||
|
|
cb88caced9 | ||
|
|
1b766b6369 | ||
|
|
3f54da98f8 | ||
|
|
6313ead62d | ||
|
|
05b98c0f8b | ||
|
|
928e63620b | ||
|
|
f674910aa9 | ||
|
|
37fc25f5a6 | ||
|
|
5e9c338c27 | ||
|
|
4b61f7c7a5 | ||
|
|
1c8472ffbd | ||
|
|
9dba68ac36 | ||
|
|
13b57aa576 | ||
|
|
aedf0f3ac5 | ||
|
|
ea9b1eb88e | ||
|
|
83a88252e2 | ||
|
|
7fa61644b0 | ||
|
|
dbc6342222 | ||
|
|
12389c82f9 | ||
|
|
4c03a17d3a | ||
|
|
5d1ea45a9c | ||
|
|
780961d46f | ||
|
|
cc0479afe0 | ||
|
|
c102f18b62 | ||
|
|
57fb69fa6f | ||
|
|
8985e2d4ff | ||
|
|
cfb6786468 | ||
|
|
5662faa9c0 | ||
|
|
3e7d9cb585 | ||
|
|
ec65ba74a8 | ||
|
|
f679e6b392 | ||
|
|
3bcaa81c17 | ||
|
|
2116a598ae | ||
|
|
8a00392894 | ||
|
|
f3f2e85c53 | ||
|
|
0ff08e9893 | ||
|
|
ca517517f9 | ||
|
|
55bdbbf12e | ||
|
|
5c7a7d0f7c | ||
|
|
7a61c19135 | ||
|
|
af388c11d5 | ||
|
|
a2f87f304c | ||
|
|
df255f850f | ||
|
|
d14a069a12 | ||
|
|
aacef80994 | ||
|
|
2a237e5d32 | ||
|
|
0fe30eca0b | ||
|
|
dea7a8dfd9 | ||
|
|
ab7191bed0 | ||
|
|
901b7c0a51 | ||
|
|
17bea5975c | ||
|
|
e005ecd0a1 | ||
|
|
e7e505e5f3 | ||
|
|
d6ffe03d3c | ||
|
|
1120747a24 | ||
|
|
1e2d7d1c4e | ||
|
|
e26f110acd | ||
|
|
28f84a4ee6 | ||
|
|
cffe4abb84 | ||
|
|
2e0b7cee8c | ||
|
|
d3b47f59e8 | ||
|
|
aea3287965 | ||
|
|
6525f8a12e | ||
|
|
fe4c934a4b | ||
|
|
60261c8dba | ||
|
|
7411049faa | ||
|
|
356b06559b | ||
|
|
193738cfe2 | ||
|
|
ddb74fa167 | ||
|
|
aca5642671 | ||
|
|
a5bed20c4a | ||
|
|
09bf53a8d3 | ||
|
|
061ec996b1 | ||
|
|
a7ee0465b5 | ||
|
|
e995d8a1fe | ||
|
|
f9f24d2ad2 | ||
|
|
ed3197a7fd | ||
|
|
5ccb48446e | ||
|
|
772a88e98f | ||
|
|
04b20c2e42 | ||
|
|
e22a7f46ad | ||
|
|
f890f2f460 | ||
|
|
e9c17e12dc | ||
|
|
4b908e3024 | ||
|
|
90fd2b5da0 | ||
|
|
d7b4360f11 | ||
|
|
7aae2441a1 | ||
|
|
650e95a528 | ||
|
|
3d80ab11d9 | ||
|
|
85e6489a3e | ||
|
|
45b6c87ade | ||
|
|
edadc4b986 | ||
|
|
455b722357 | ||
|
|
ad2e1d1e98 | ||
|
|
7c94b70c31 | ||
|
|
74bcf1752e | ||
|
|
97a54b3911 | ||
|
|
c393c8880f | ||
|
|
359157fa70 | ||
|
|
62d9680449 | ||
|
|
db6067439d | ||
|
|
5051d6a410 | ||
|
|
25efaf30f5 | ||
|
|
98aadd9842 | ||
|
|
d555b18c11 | ||
|
|
550111f8a1 | ||
|
|
3d4a00a19d | ||
|
|
d06c6677dc | ||
|
|
ce30f3c4ff | ||
|
|
1072b9c2fe | ||
|
|
5ea41c69ef | ||
|
|
2d8eed3b69 | ||
|
|
45c9c8558f | ||
|
|
dccb80edf0 | ||
|
|
6f72419b6e | ||
|
|
fc55e5c8e8 | ||
|
|
4a74ccf399 | ||
|
|
a442315995 | ||
|
|
0d5ee3ed07 | ||
|
|
df7011167c | ||
|
|
28a785acb0 | ||
|
|
3ee557bfbe | ||
|
|
af94255166 | ||
|
|
4a0dea3f75 | ||
|
|
6a42bc9655 | ||
|
|
c6c8a7f6b7 | ||
|
|
133dd0e26d | ||
|
|
4e32cae8a7 | ||
|
|
49d721a29b | ||
|
|
2c6d27598d | ||
|
|
815339272f | ||
|
|
9c1f340029 | ||
|
|
b72ea9608d | ||
|
|
e637cb0700 | ||
|
|
c42848ece9 | ||
|
|
841a818dff | ||
|
|
f74881a3fe | ||
|
|
c559054378 | ||
|
|
d6d9c0adcb | ||
|
|
cdf9b5a71c | ||
|
|
4b950bce14 | ||
|
|
8343d8f0fe | ||
|
|
eeb280f17b | ||
|
|
a927334b40 | ||
|
|
be0c1bcda5 | ||
|
|
b861daca60 | ||
|
|
b4cd307eba | ||
|
|
1d0e83d3fa | ||
|
|
be7c4c29a1 | ||
|
|
ffa4db0b61 | ||
|
|
7daf992c51 | ||
|
|
333c583265 | ||
|
|
fa2227716f | ||
|
|
bfa5e14112 | ||
|
|
38dabd4602 | ||
|
|
dcdf89bba7 | ||
|
|
a6e6939015 | ||
|
|
71aa24054d | ||
|
|
4c88421440 | ||
|
|
64bad01d9a | ||
|
|
4dfa809a77 | ||
|
|
726df167f8 | ||
|
|
2f62cbde13 | ||
|
|
93ef74219d | ||
|
|
495aa81335 | ||
|
|
99caaba328 | ||
|
|
4bfcc787a1 | ||
|
|
7e96eb12dd | ||
|
|
a71eba2eb5 | ||
|
|
b129cf9328 | ||
|
|
a6e31c41b7 | ||
|
|
47746ff9ba | ||
|
|
4e4319a546 | ||
|
|
d1de8baf1d | ||
|
|
d427a2a13c | ||
|
|
1fa6c3987a | ||
|
|
ddf49e532f | ||
|
|
a0c4ef72ef | ||
|
|
99009a9054 | ||
|
|
e512df4eff | ||
|
|
da3ede8b54 | ||
|
|
56ed6d3271 | ||
|
|
78112bb19a | ||
|
|
ac6b0c6561 | ||
|
|
632365a4fb | ||
|
|
bf9312ad15 | ||
|
|
b54eac6484 | ||
|
|
156167e6d7 | ||
|
|
aef84cf2ef | ||
|
|
275a26e2c1 | ||
|
|
946ae63070 | ||
|
|
5cfe47ebbe | ||
|
|
6ee0ec755e | ||
|
|
8ffca202bd | ||
|
|
6d2bcc7490 | ||
|
|
69709c2cf2 | ||
|
|
e7733a5428 | ||
|
|
286b17431a | ||
|
|
e8c1a3535a | ||
|
|
b05878962b | ||
|
|
54b4595f23 | ||
|
|
99a2d9be00 | ||
|
|
bf1fbdc8c4 | ||
|
|
7c88b2c55d | ||
|
|
14b3aa29c7 | ||
|
|
bfaadb9d67 | ||
|
|
cb770e565d | ||
|
|
15190250e5 | ||
|
|
a50a9e6c9b | ||
|
|
b8f91dcb9d | ||
|
|
23f5879b54 | ||
|
|
f882b68490 | ||
|
|
ce149eba76 | ||
|
|
41d3a5c755 | ||
|
|
e88252bee4 | ||
|
|
a6b7857f6f | ||
|
|
265c30158e | ||
|
|
505e132f1e | ||
|
|
c6d5195cb5 | ||
|
|
8af543e7d6 | ||
|
|
016b2098a7 | ||
|
|
bb67d6c5fd | ||
|
|
60bf6f0a7a | ||
|
|
4683cc7ada | ||
|
|
83765a8509 | ||
|
|
be8ac6fc70 |
@@ -2,42 +2,22 @@
|
|||||||
"$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
|
"$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
|
||||||
"changelog": "@changesets/cli/changelog",
|
"changelog": "@changesets/cli/changelog",
|
||||||
"commit": false,
|
"commit": false,
|
||||||
"fixed": [],
|
"linked": [],
|
||||||
"linked": [
|
"fixed": [
|
||||||
[
|
[
|
||||||
"cojson",
|
"cojson",
|
||||||
"cojson-storage",
|
|
||||||
"cojson-storage-indexeddb",
|
"cojson-storage-indexeddb",
|
||||||
"cojson-storage-sqlite",
|
"cojson-storage-sqlite",
|
||||||
"cojson-transport-ws",
|
"cojson-transport-ws",
|
||||||
"jazz-browser",
|
|
||||||
"jazz-auth-clerk",
|
|
||||||
"jazz-auth-betterauth",
|
"jazz-auth-betterauth",
|
||||||
"jazz-betterauth-client-plugin",
|
"jazz-betterauth-client-plugin",
|
||||||
"jazz-betterauth-server-plugin",
|
"jazz-betterauth-server-plugin",
|
||||||
"jazz-react-auth-betterauth",
|
"jazz-react-auth-betterauth",
|
||||||
"jazz-browser-media-images",
|
|
||||||
"jazz-expo",
|
|
||||||
"jazz-inspector",
|
|
||||||
"jazz-inspector-element",
|
|
||||||
"jazz-nodejs",
|
|
||||||
"jazz-react",
|
|
||||||
"jazz-react-core",
|
|
||||||
"jazz-react-auth-clerk",
|
|
||||||
"jazz-react-native-core",
|
|
||||||
"jazz-react-native",
|
|
||||||
"jazz-react-native-media-images",
|
|
||||||
"jazz-run",
|
"jazz-run",
|
||||||
"jazz-svelte",
|
"jazz-tools"
|
||||||
"jazz-tools",
|
|
||||||
"jazz-vue"
|
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"baseBranch": "main",
|
"baseBranch": "main",
|
||||||
"updateInternalDependencies": "patch",
|
"updateInternalDependencies": "minor"
|
||||||
"ignore": [],
|
|
||||||
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
|
|
||||||
"onlyUpdatePeerDependentsWhenOutOfRange": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
23
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Description
|
||||||
|
<!-- Please include a summary of the change and which issue is fixed -->
|
||||||
|
<!-- Please also include relevant motivation and context -->
|
||||||
|
<!-- Include any links to documentation like RFC’s if necessary -->
|
||||||
|
<!-- Add a link to to relevant preview environments or anything that would simplify visual review process -->
|
||||||
|
<!-- Supplemental screenshots and video are encouraged, but the primary description should be in text -->
|
||||||
|
|
||||||
|
## Manual testing instructions
|
||||||
|
|
||||||
|
<!-- Add any actions required to manually test the changes -->
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
- [ ] Tests have been added and/or updated
|
||||||
|
- [ ] Tests have not been updated, because: <!-- Insert reason for not updating tests here -->
|
||||||
|
- [ ] I need help with writing tests
|
||||||
|
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] I've updated the part of the docs that are affected the PR changes
|
||||||
|
- [ ] I've generated a changeset, if a version bump is required
|
||||||
|
- [ ] I've updated the jsDoc comments to the public APIs I've modified, or added them when missing
|
||||||
37
.github/workflows/build-examples.yaml
vendored
@@ -1,37 +0,0 @@
|
|||||||
name: Build Examples
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "main" ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-examples:
|
|
||||||
runs-on: blacksmith-4vcpu-ubuntu-2204
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
example: [
|
|
||||||
"chat",
|
|
||||||
"clerk",
|
|
||||||
"passkey",
|
|
||||||
"inspector",
|
|
||||||
"music-player",
|
|
||||||
"password-manager",
|
|
||||||
"pets",
|
|
||||||
"reactions",
|
|
||||||
"todo",
|
|
||||||
]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
- name: Setup Source Code
|
|
||||||
uses: ./.github/actions/source-code/
|
|
||||||
|
|
||||||
- name: Pnpm Build
|
|
||||||
run: |
|
|
||||||
pnpm install
|
|
||||||
pnpm turbo build;
|
|
||||||
working-directory: ./examples/${{ matrix.example }}
|
|
||||||
26
.github/workflows/build-starters.yaml
vendored
@@ -1,26 +0,0 @@
|
|||||||
name: Build Starters
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: ["main"]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-starters:
|
|
||||||
runs-on: blacksmith-4vcpu-ubuntu-2204
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
starter: ["react-passkey-auth"]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
- name: Setup Source Code
|
|
||||||
uses: ./.github/actions/source-code/
|
|
||||||
|
|
||||||
- name: Pnpm Build
|
|
||||||
run: |
|
|
||||||
pnpm install
|
|
||||||
pnpm turbo build;
|
|
||||||
working-directory: ./starters/${{ matrix.starter }}
|
|
||||||
13
.github/workflows/code-quality.yml
vendored
@@ -1,19 +1,28 @@
|
|||||||
name: Code quality
|
name: Code quality
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
branches:
|
||||||
|
- "main"
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
quality:
|
quality:
|
||||||
runs-on: blacksmith-4vcpu-ubuntu-2204
|
runs-on: blacksmith-2vcpu-ubuntu-2404-arm
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Setup Biome
|
- name: Setup Biome
|
||||||
uses: biomejs/setup-biome@v2
|
uses: biomejs/setup-biome@v2
|
||||||
with:
|
with:
|
||||||
version: latest
|
version: 1.9.4
|
||||||
- name: Run Biome
|
- name: Run Biome
|
||||||
run: biome ci .
|
run: biome ci .
|
||||||
|
|
||||||
|
|||||||
10
.github/workflows/e2e-rn-test.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
name: End-to-End Tests for React Native
|
name: End-to-End Tests for React Native
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, synchronize, reopened]
|
types: [opened, synchronize, reopened]
|
||||||
@@ -38,7 +44,6 @@ jobs:
|
|||||||
- name: chat-rn-expo App Pre Build
|
- name: chat-rn-expo App Pre Build
|
||||||
working-directory: ./examples/chat-rn-expo
|
working-directory: ./examples/chat-rn-expo
|
||||||
run: |
|
run: |
|
||||||
pnpm build
|
|
||||||
pnpm expo prebuild --clean
|
pnpm expo prebuild --clean
|
||||||
|
|
||||||
- name: Install Maestro
|
- name: Install Maestro
|
||||||
@@ -61,7 +66,8 @@ jobs:
|
|||||||
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -no-metrics
|
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -no-metrics
|
||||||
disable-animations: true
|
disable-animations: true
|
||||||
working-directory: ./examples/chat-rn-expo/
|
working-directory: ./examples/chat-rn-expo/
|
||||||
script: ./test/e2e/run.sh
|
# killall due to this issue: https://github.com/ReactiveCircus/android-emulator-runner/issues/385
|
||||||
|
script: ./test/e2e/run.sh && ( killall -INT crashpad_handler || true )
|
||||||
|
|
||||||
- name: Copy Maestro Output
|
- name: Copy Maestro Output
|
||||||
if: steps.e2e_test.outcome != 'success'
|
if: steps.e2e_test.outcome != 'success'
|
||||||
|
|||||||
8
.github/workflows/jazz-run.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
name: Jazz Run Tests
|
name: Jazz Run Tests
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
@@ -8,7 +14,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: blacksmith-4vcpu-ubuntu-2204
|
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
148
.github/workflows/playwright.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
name: Playwright Tests
|
name: Playwright Tests
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
@@ -9,11 +15,11 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
runs-on: blacksmith-4vcpu-ubuntu-2204
|
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
project: ["tests/e2e", "examples/chat", "examples/clerk", "examples/betterauth", "examples/file-share-svelte", "examples/form", "examples/music-player", "examples/organization", "examples/pets", "starters/react-passkey-auth"]
|
shard: ["1/2", "2/2"]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@@ -23,21 +29,129 @@ jobs:
|
|||||||
- name: Setup Source Code
|
- name: Setup Source Code
|
||||||
uses: ./.github/actions/source-code/
|
uses: ./.github/actions/source-code/
|
||||||
|
|
||||||
- name: Pnpm Build
|
|
||||||
run: pnpm turbo build
|
|
||||||
working-directory: ./${{ matrix.project }}
|
|
||||||
|
|
||||||
- name: Install Playwright Browsers
|
- name: Install Playwright Browsers
|
||||||
run: pnpm exec playwright install
|
run: pnpm exec playwright install
|
||||||
working-directory: ./${{ matrix.project }}
|
|
||||||
|
|
||||||
- name: Run Playwright tests
|
- name: Run Playwright tests for shard ${{ matrix.shard }}
|
||||||
run: pnpm exec playwright test
|
run: |
|
||||||
working-directory: ./${{ matrix.project }}
|
# Parse shard information (e.g., "1/2" -> shard_num=1, total_shards=2)
|
||||||
|
IFS='/' read -r shard_num total_shards <<< "${{ matrix.shard }}"
|
||||||
- uses: actions/upload-artifact@v4
|
shard_index=$((shard_num - 1)) # Convert to 0-based index
|
||||||
if: failure()
|
|
||||||
with:
|
# Debug: Print parsed values
|
||||||
name: ${{ hashFiles(format('{0}/package.json', matrix.project)) }}-playwright-report
|
echo "Parsed shard_num: $shard_num"
|
||||||
path: ./${{ matrix.project }}/playwright-report/
|
echo "Parsed total_shards: $total_shards"
|
||||||
retention-days: 30
|
echo "Calculated shard_index: $shard_index"
|
||||||
|
|
||||||
|
# Define all projects to test
|
||||||
|
all_projects=(
|
||||||
|
"tests/e2e"
|
||||||
|
"examples/chat"
|
||||||
|
"examples/chat-svelte"
|
||||||
|
"examples/clerk"
|
||||||
|
"examples/betterauth"
|
||||||
|
"examples/file-share-svelte"
|
||||||
|
"examples/form"
|
||||||
|
"examples/inspector"
|
||||||
|
"examples/music-player"
|
||||||
|
"examples/organization"
|
||||||
|
"starters/react-passkey-auth"
|
||||||
|
"starters/svelte-passkey-auth"
|
||||||
|
"tests/jazz-svelte"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Calculate which projects this shard should run
|
||||||
|
shard_projects=()
|
||||||
|
for i in "${!all_projects[@]}"; do
|
||||||
|
if [ $((i % total_shards)) -eq $shard_index ]; then
|
||||||
|
shard_projects+=("${all_projects[i]}")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Track project results
|
||||||
|
overall_exit_code=0
|
||||||
|
failed_projects=()
|
||||||
|
passed_projects=()
|
||||||
|
|
||||||
|
echo "=== Running tests for shard ${{ matrix.shard }} ==="
|
||||||
|
echo "Projects in this shard:"
|
||||||
|
printf '%s\n' "${shard_projects[@]}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Run tests for each project
|
||||||
|
for project in "${shard_projects[@]}"; do
|
||||||
|
echo "=== Testing project: $project ==="
|
||||||
|
|
||||||
|
# Check if project directory exists
|
||||||
|
if [ ! -d "$project" ]; then
|
||||||
|
echo "❌ FAILED: Project directory $project does not exist"
|
||||||
|
failed_projects+=("$project (directory not found)")
|
||||||
|
overall_exit_code=1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if project has package.json
|
||||||
|
if [ ! -f "$project/package.json" ]; then
|
||||||
|
echo "❌ FAILED: No package.json found in $project"
|
||||||
|
failed_projects+=("$project (no package.json)")
|
||||||
|
overall_exit_code=1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build the project
|
||||||
|
echo "🔨 Building $project..."
|
||||||
|
cd "$project"
|
||||||
|
|
||||||
|
if [ -f .env.test ]; then
|
||||||
|
cp .env.test .env
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! pnpm turbo build; then
|
||||||
|
echo "❌ BUILD FAILED: $project"
|
||||||
|
failed_projects+=("$project (build failed)")
|
||||||
|
overall_exit_code=1
|
||||||
|
cd - > /dev/null
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run Playwright tests
|
||||||
|
echo "🧪 Running Playwright tests for $project..."
|
||||||
|
if ! pnpm exec playwright test; then
|
||||||
|
echo "❌ TESTS FAILED: $project"
|
||||||
|
failed_projects+=("$project (tests failed)")
|
||||||
|
overall_exit_code=1
|
||||||
|
else
|
||||||
|
echo "✅ TESTS PASSED: $project"
|
||||||
|
passed_projects+=("$project")
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd - > /dev/null
|
||||||
|
echo "=== Finished testing $project ==="
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
|
# Print summary report
|
||||||
|
echo "=========================================="
|
||||||
|
echo "📊 TEST SUMMARY FOR SHARD ${{ matrix.shard }}"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
if [ ${#passed_projects[@]} -gt 0 ]; then
|
||||||
|
echo "✅ PASSED (${#passed_projects[@]}):"
|
||||||
|
printf ' - %s\n' "${passed_projects[@]}"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${#failed_projects[@]} -gt 0 ]; then
|
||||||
|
echo "❌ FAILED (${#failed_projects[@]}):"
|
||||||
|
printf ' - %s\n' "${failed_projects[@]}"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo "Total projects in shard: ${#shard_projects[@]}"
|
||||||
|
echo "Passed: ${#passed_projects[@]}"
|
||||||
|
echo "Failed: ${#failed_projects[@]}"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# Exit with overall status
|
||||||
|
exit $overall_exit_code
|
||||||
|
|||||||
7
.github/workflows/pre-release.yml
vendored
@@ -1,4 +1,11 @@
|
|||||||
name: Pre-Publish tagged Pull Requests
|
name: Pre-Publish tagged Pull Requests
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, synchronize, reopened, labeled]
|
types: [opened, synchronize, reopened, labeled]
|
||||||
|
|||||||
2
.github/workflows/release.yml
vendored
@@ -17,7 +17,7 @@ concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
name: Release
|
name: Release
|
||||||
runs-on: blacksmith-4vcpu-ubuntu-2204
|
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repo
|
- name: Checkout Repo
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|||||||
8
.github/workflows/unit-test.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
name: Unit Tests
|
name: Unit Tests
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, synchronize, reopened]
|
types: [opened, synchronize, reopened]
|
||||||
@@ -9,7 +15,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
unit-tests:
|
unit-tests:
|
||||||
runs-on: blacksmith-4vcpu-ubuntu-2204
|
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|||||||
3
.gitignore
vendored
@@ -20,6 +20,9 @@ __screenshots__
|
|||||||
# Playwright
|
# Playwright
|
||||||
test-results
|
test-results
|
||||||
|
|
||||||
|
# Java
|
||||||
|
.java-version
|
||||||
|
|
||||||
.husky
|
.husky
|
||||||
|
|
||||||
.vscode/*
|
.vscode/*
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ You'll need Node.js 22.x installed (we're working on support for 23.x), and pnpm
|
|||||||
4. **Build the packages**:
|
4. **Build the packages**:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm build
|
pnpm build:packages
|
||||||
```
|
```
|
||||||
|
|
||||||
5. **Run tests** to verify everything is working:
|
5. **Run tests** to verify everything is working:
|
||||||
|
|||||||
@@ -11,8 +11,9 @@
|
|||||||
"jazz-tools.json",
|
"jazz-tools.json",
|
||||||
"**/ios/**",
|
"**/ios/**",
|
||||||
"**/android/**",
|
"**/android/**",
|
||||||
"packages/jazz-svelte/**",
|
"tests/jazz-svelte/src/**",
|
||||||
"examples/*svelte*/**",
|
"examples/*svelte*/**",
|
||||||
|
"starters/*svelte*/**",
|
||||||
"examples/jazz-paper-scissors/src/routeTree.gen.ts",
|
"examples/jazz-paper-scissors/src/routeTree.gen.ts",
|
||||||
"homepage/homepage/**",
|
"homepage/homepage/**",
|
||||||
"**/package.json"
|
"**/package.json"
|
||||||
@@ -55,7 +56,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"include": ["packages/cojson-storage*/**", "cojson-transport-ws/**"],
|
"include": ["packages/cojson/src/storage/*/**", "cojson-transport-ws/**"],
|
||||||
"linter": {
|
"linter": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"rules": {
|
"rules": {
|
||||||
@@ -64,7 +65,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"include": ["packages/**/src/tests/**"],
|
"include": ["**/tests/**"],
|
||||||
"linter": {
|
"linter": {
|
||||||
"rules": {
|
"rules": {
|
||||||
"correctness": {
|
"correctness": {
|
||||||
|
|||||||
6
examples/betterauth/.gitignore
vendored
@@ -36,8 +36,10 @@ yarn-error.log*
|
|||||||
.pnpm-debug.log*
|
.pnpm-debug.log*
|
||||||
|
|
||||||
# env files (can opt-in for committing if needed)
|
# env files (can opt-in for committing if needed)
|
||||||
.env*
|
.env
|
||||||
!.env
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
!.env.test
|
||||||
|
|
||||||
# vercel
|
# vercel
|
||||||
.vercel
|
.vercel
|
||||||
|
|||||||
@@ -1,5 +1,82 @@
|
|||||||
# betterauth
|
# betterauth
|
||||||
|
|
||||||
|
## 0.1.25
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [048ac1d]
|
||||||
|
- jazz-tools@0.14.22
|
||||||
|
- jazz-betterauth-server-plugin@0.14.22
|
||||||
|
- jazz-inspector@0.14.22
|
||||||
|
- jazz-react@0.14.22
|
||||||
|
- jazz-react-auth-betterauth@0.14.22
|
||||||
|
- jazz-betterauth-client-plugin@0.14.22
|
||||||
|
|
||||||
|
## 0.1.24
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [e7e505e]
|
||||||
|
- Updated dependencies [13b57aa]
|
||||||
|
- Updated dependencies [5662faa]
|
||||||
|
- Updated dependencies [2116a59]
|
||||||
|
- jazz-tools@0.14.21
|
||||||
|
- jazz-betterauth-server-plugin@0.14.21
|
||||||
|
- jazz-inspector@0.14.21
|
||||||
|
- jazz-react@0.14.21
|
||||||
|
- jazz-react-auth-betterauth@0.14.21
|
||||||
|
- jazz-betterauth-client-plugin@0.14.21
|
||||||
|
|
||||||
|
## 0.1.23
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [6f72419]
|
||||||
|
- Updated dependencies [04b20c2]
|
||||||
|
- jazz-tools@0.14.20
|
||||||
|
- jazz-betterauth-server-plugin@0.14.20
|
||||||
|
- jazz-inspector@0.14.20
|
||||||
|
- jazz-react@0.14.20
|
||||||
|
- jazz-react-auth-betterauth@0.14.20
|
||||||
|
- jazz-betterauth-client-plugin@0.14.20
|
||||||
|
|
||||||
|
## 0.1.22
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- jazz-betterauth-client-plugin@0.14.19
|
||||||
|
- jazz-betterauth-server-plugin@0.14.19
|
||||||
|
- jazz-react-auth-betterauth@0.14.19
|
||||||
|
- jazz-inspector@0.14.19
|
||||||
|
- jazz-react@0.14.19
|
||||||
|
- jazz-tools@0.14.19
|
||||||
|
|
||||||
|
## 0.1.21
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [4b950bc]
|
||||||
|
- Updated dependencies [d6d9c0a]
|
||||||
|
- Updated dependencies [c559054]
|
||||||
|
- jazz-tools@0.14.18
|
||||||
|
- jazz-betterauth-server-plugin@0.14.18
|
||||||
|
- jazz-inspector@0.14.18
|
||||||
|
- jazz-react@0.14.18
|
||||||
|
- jazz-react-auth-betterauth@0.14.18
|
||||||
|
- jazz-betterauth-client-plugin@0.14.18
|
||||||
|
|
||||||
|
## 0.1.20
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [e512df4]
|
||||||
|
- jazz-betterauth-server-plugin@0.14.17
|
||||||
|
- jazz-tools@0.14.17
|
||||||
|
- jazz-betterauth-client-plugin@0.14.17
|
||||||
|
- jazz-inspector@0.14.17
|
||||||
|
- jazz-react@0.14.17
|
||||||
|
- jazz-react-auth-betterauth@0.14.17
|
||||||
|
|
||||||
## 0.1.19
|
## 0.1.19
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -5,10 +5,12 @@ This example demonstrates how to integrate [Better Auth](https://www.better-auth
|
|||||||
## Getting started
|
## Getting started
|
||||||
|
|
||||||
To run this example, you may either:
|
To run this example, you may either:
|
||||||
* Clone the Jazz monorepo and run this example from within.
|
|
||||||
* Create a new Jazz project using this example as a template, and run that new project.
|
- Clone the Jazz monorepo and run this example from within.
|
||||||
|
- Create a new Jazz project using this example as a template, and run that new project.
|
||||||
|
|
||||||
### Setting environment variables
|
### Setting environment variables
|
||||||
|
|
||||||
- `NEXT_PUBLIC_AUTH_BASE_URL`: A URL to a Better Auth server. If undefined, the example will self-host a Better Auth server.
|
- `NEXT_PUBLIC_AUTH_BASE_URL`: A URL to a Better Auth server. If undefined, the example will self-host a Better Auth server.
|
||||||
- `BETTER_AUTH_SECRET`: The encryption secret used by the self-hosted Better Auth server (required only if `NEXT_PUBLIC_AUTH_BASE_URL` is undefined)
|
- `BETTER_AUTH_SECRET`: The encryption secret used by the self-hosted Better Auth server (required only if `NEXT_PUBLIC_AUTH_BASE_URL` is undefined)
|
||||||
- `GITHUB_CLIENT_ID`: The client ID for the GitHub OAuth provider used by the self-hosted Better Auth server (required only if `NEXT_PUBLIC_AUTH_BASE_URL` is undefined)
|
- `GITHUB_CLIENT_ID`: The client ID for the GitHub OAuth provider used by the self-hosted Better Auth server (required only if `NEXT_PUBLIC_AUTH_BASE_URL` is undefined)
|
||||||
@@ -17,38 +19,64 @@ To run this example, you may either:
|
|||||||
### Using this example as a template
|
### Using this example as a template
|
||||||
|
|
||||||
1. Create a new Jazz project, and use this example as a template.
|
1. Create a new Jazz project, and use this example as a template.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx create-jazz-app@latest betterauth-app --example betterauth
|
npx create-jazz-app@latest betterauth-app --example betterauth
|
||||||
```
|
```
|
||||||
2. Navigate to the new project and start the development server.
|
|
||||||
|
2. Navigate to the new project and install dependencies.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd betterauth-app
|
cd betterauth-app
|
||||||
pnpm install
|
pnpm install
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create a .env file (don't forget to set your [BETTER_AUTH_SECRET](https://www.better-auth.com/docs/installation#set-environment-variables)!)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mv .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Start the development server
|
||||||
|
|
||||||
|
```sh
|
||||||
pnpm dev
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
|
https://www.better-auth.com/docs/installation#set-environment-variables
|
||||||
|
|
||||||
### Using the monorepo
|
### Using the monorepo
|
||||||
|
|
||||||
This requires `pnpm` to be installed, see [https://pnpm.io/installation](https://pnpm.io/installation).
|
This requires `pnpm` to be installed, see [https://pnpm.io/installation](https://pnpm.io/installation).
|
||||||
|
|
||||||
Clone the jazz repository.
|
Clone the jazz repository.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/garden-co/jazz.git
|
git clone https://github.com/garden-co/jazz.git
|
||||||
```
|
```
|
||||||
|
|
||||||
Install and build dependencies.
|
Install and build dependencies.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm i && npx turbo build
|
pnpm i && npx turbo build
|
||||||
```
|
```
|
||||||
|
|
||||||
Go to the example directory.
|
Go to the example directory.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd jazz/examples/betterauth/
|
cd jazz/examples/betterauth/
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Create a .env file (don't forget to set your [BETTER_AUTH_SECRET](https://www.better-auth.com/docs/installation#set-environment-variables)!)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mv .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
Start the dev server.
|
Start the dev server.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm dev
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "betterauth",
|
"name": "betterauth",
|
||||||
"version": "0.1.19",
|
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -22,11 +21,9 @@
|
|||||||
"better-sqlite3": "^11.9.1",
|
"better-sqlite3": "^11.9.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
"jazz-react-auth-betterauth": "workspace:*",
|
||||||
"jazz-betterauth-client-plugin": "workspace:*",
|
"jazz-betterauth-client-plugin": "workspace:*",
|
||||||
"jazz-betterauth-server-plugin": "workspace:*",
|
"jazz-betterauth-server-plugin": "workspace:*",
|
||||||
"jazz-inspector": "workspace:*",
|
|
||||||
"jazz-react": "workspace:*",
|
|
||||||
"jazz-react-auth-betterauth": "workspace:*",
|
|
||||||
"jazz-tools": "workspace:*",
|
"jazz-tools": "workspace:*",
|
||||||
"lucide-react": "^0.510.0",
|
"lucide-react": "^0.510.0",
|
||||||
"next": "15.3.2",
|
"next": "15.3.2",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { useAccount } from "jazz-react";
|
|
||||||
import { Account } from "jazz-tools";
|
import { Account } from "jazz-tools";
|
||||||
|
import { useAccount } from "jazz-tools/react";
|
||||||
import {
|
import {
|
||||||
AppWindowMacIcon,
|
AppWindowMacIcon,
|
||||||
FileTextIcon,
|
FileTextIcon,
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { JazzProvider } from "jazz-react";
|
|
||||||
import { AuthProvider } from "jazz-react-auth-betterauth";
|
import { AuthProvider } from "jazz-react-auth-betterauth";
|
||||||
|
import { JazzReactProvider } from "jazz-tools/react";
|
||||||
import { type ReactNode, lazy } from "react";
|
import { type ReactNode, lazy } from "react";
|
||||||
|
|
||||||
const JazzDevTools =
|
const JazzDevTools =
|
||||||
process.env.NODE_ENV === "production"
|
process.env.NODE_ENV === "production"
|
||||||
? () => null
|
? () => null
|
||||||
: lazy(() =>
|
: lazy(() =>
|
||||||
import("jazz-inspector").then((res) => ({
|
import("jazz-tools/inspector").then((res) => ({
|
||||||
default: res.JazzInspector,
|
default: res.JazzInspector,
|
||||||
})),
|
})),
|
||||||
);
|
);
|
||||||
|
|
||||||
export function JazzAndAuth({ children }: { children: ReactNode }) {
|
export function JazzAndAuth({ children }: { children: ReactNode }) {
|
||||||
return (
|
return (
|
||||||
<JazzProvider
|
<JazzReactProvider
|
||||||
sync={{
|
sync={{
|
||||||
peer: "wss://cloud.jazz.tools/?key=betterauth-example@garden.co",
|
peer: "wss://cloud.jazz.tools/?key=betterauth-example@garden.co",
|
||||||
}}
|
}}
|
||||||
@@ -28,6 +28,6 @@ export function JazzAndAuth({ children }: { children: ReactNode }) {
|
|||||||
{children}
|
{children}
|
||||||
</AuthProvider>
|
</AuthProvider>
|
||||||
<JazzDevTools />
|
<JazzDevTools />
|
||||||
</JazzProvider>
|
</JazzReactProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { useAccount, useIsAuthenticated } from "jazz-react";
|
|
||||||
import { useAuth } from "jazz-react-auth-betterauth";
|
import { useAuth } from "jazz-react-auth-betterauth";
|
||||||
import { Account } from "jazz-tools";
|
import { Account } from "jazz-tools";
|
||||||
|
import { useAccount, useIsAuthenticated } from "jazz-tools/react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useCallback } from "react";
|
import { useCallback } from "react";
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { useAccount, useIsAuthenticated } from "jazz-react";
|
|
||||||
import { useAuth } from "jazz-react-auth-betterauth";
|
import { useAuth } from "jazz-react-auth-betterauth";
|
||||||
|
import { useAccount, useIsAuthenticated } from "jazz-tools/react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useRouter } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
|
|||||||
17
examples/chat-rn-expo-clerk/.gitignore
vendored
@@ -1,17 +0,0 @@
|
|||||||
node_modules/
|
|
||||||
.expo/
|
|
||||||
dist/
|
|
||||||
npm-debug.*
|
|
||||||
*.jks
|
|
||||||
*.p8
|
|
||||||
*.p12
|
|
||||||
*.key
|
|
||||||
*.mobileprovision
|
|
||||||
*.orig.*
|
|
||||||
web-build/
|
|
||||||
|
|
||||||
# macOS
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
ios
|
|
||||||
android
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# 🎷 Jazz + Expo + `expo-router` + Clerk Auth
|
|
||||||
|
|
||||||
## 🚀 How to Run
|
|
||||||
|
|
||||||
### 1. Inside the Workspace Root
|
|
||||||
|
|
||||||
First, install dependencies and build the project:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm i
|
|
||||||
pnpm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Inside the `examples/chat-rn-expo-clerk` Directory
|
|
||||||
|
|
||||||
Next, navigate to the specific example project and run the following commands:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm expo prebuild
|
|
||||||
pnpx pod-install
|
|
||||||
pnpm expo run:ios
|
|
||||||
```
|
|
||||||
|
|
||||||
This will set up and launch the app on iOS. For Android, you can replace the last command with `pnpm expo run:android`.
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
{
|
|
||||||
"expo": {
|
|
||||||
"name": "jazz-chat-rn-expo-clerk",
|
|
||||||
"scheme": "jazz-chat-rn-expo-clerk",
|
|
||||||
"slug": "jazz-chat-rn-expo-clerk",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"orientation": "portrait",
|
|
||||||
"icon": "./assets/images/icon.png",
|
|
||||||
"userInterfaceStyle": "light",
|
|
||||||
"splash": {
|
|
||||||
"image": "./assets/images/splash.png",
|
|
||||||
"resizeMode": "contain",
|
|
||||||
"backgroundColor": "#ffffff"
|
|
||||||
},
|
|
||||||
"ios": {
|
|
||||||
"supportsTablet": true,
|
|
||||||
"bundleIdentifier": "com.jazz.chatrnclerk"
|
|
||||||
},
|
|
||||||
"android": {
|
|
||||||
"adaptiveIcon": {
|
|
||||||
"foregroundImage": "./assets/images/adaptive-icon.png",
|
|
||||||
"backgroundColor": "#ffffff"
|
|
||||||
},
|
|
||||||
"package": "com.jazz.chatrnclerk"
|
|
||||||
},
|
|
||||||
"newArchEnabled": true,
|
|
||||||
"plugins": [
|
|
||||||
"expo-secure-store",
|
|
||||||
"expo-font",
|
|
||||||
"expo-router",
|
|
||||||
"expo-sqlite",
|
|
||||||
[
|
|
||||||
"expo-image-picker",
|
|
||||||
{
|
|
||||||
"photosPermission": "The app accesses your photos to let you share them with your friends."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"extra": {
|
|
||||||
"eas": {
|
|
||||||
"projectId": "ca3d46e5-a10a-47ec-9d77-3b841e1c62d4"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import { Redirect, Stack } from "expo-router";
|
|
||||||
import { useIsAuthenticated } from "jazz-expo";
|
|
||||||
import React from "react";
|
|
||||||
|
|
||||||
export default function HomeLayout() {
|
|
||||||
const isAuthenticated = useIsAuthenticated();
|
|
||||||
|
|
||||||
if (isAuthenticated) {
|
|
||||||
return <Redirect href={"/chat"} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Stack screenOptions={{ headerShown: false, headerBackVisible: true }} />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
import { SignedOut } from "@clerk/clerk-expo";
|
|
||||||
import { Link } from "expo-router";
|
|
||||||
import React from "react";
|
|
||||||
import { Text, View } from "react-native";
|
|
||||||
|
|
||||||
export default function HomePage() {
|
|
||||||
return (
|
|
||||||
<View className="flex-1 justify-center items-center bg-gray-100 p-6">
|
|
||||||
<SignedOut>
|
|
||||||
<View className="bg-white p-6 rounded-lg shadow-lg w-11/12 max-w-md">
|
|
||||||
<Text className="text-2xl font-bold text-center text-gray-900 mb-4">
|
|
||||||
Jazz 🤝 Clerk 🤝 Expo
|
|
||||||
</Text>
|
|
||||||
<Link href="/sign-in" className="mb-4">
|
|
||||||
<Text className="text-center text-blue-600 underline text-lg">
|
|
||||||
Sign In
|
|
||||||
</Text>
|
|
||||||
</Link>
|
|
||||||
<Link href="/sign-in-oauth" className="mb-4">
|
|
||||||
<Text className="text-center text-blue-600 underline text-lg">
|
|
||||||
Sign In OAuth
|
|
||||||
</Text>
|
|
||||||
</Link>
|
|
||||||
<Link href="/sign-up">
|
|
||||||
<Text className="text-center text-blue-600 underline text-lg">
|
|
||||||
Sign Up
|
|
||||||
</Text>
|
|
||||||
</Link>
|
|
||||||
</View>
|
|
||||||
</SignedOut>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import { Redirect, Stack } from "expo-router";
|
|
||||||
import { useIsAuthenticated } from "jazz-expo";
|
|
||||||
|
|
||||||
export default function UnAuthenticatedLayout() {
|
|
||||||
const isAuthenticated = useIsAuthenticated();
|
|
||||||
|
|
||||||
if (isAuthenticated) {
|
|
||||||
return <Redirect href={"/chat"} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Stack
|
|
||||||
screenOptions={{
|
|
||||||
headerShown: true,
|
|
||||||
headerBackVisible: true,
|
|
||||||
headerTitle: "",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
import { useOAuth } from "@clerk/clerk-expo";
|
|
||||||
import * as Linking from "expo-linking";
|
|
||||||
import { Link } from "expo-router";
|
|
||||||
import * as WebBrowser from "expo-web-browser";
|
|
||||||
import React from "react";
|
|
||||||
import { Text, TouchableOpacity, View } from "react-native";
|
|
||||||
|
|
||||||
export const useWarmUpBrowser = () => {
|
|
||||||
React.useEffect(() => {
|
|
||||||
// Warm up the android browser to improve UX
|
|
||||||
// https://docs.expo.dev/guides/authentication/#improving-user-experience
|
|
||||||
void WebBrowser.warmUpAsync();
|
|
||||||
return () => {
|
|
||||||
void WebBrowser.coolDownAsync();
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
};
|
|
||||||
|
|
||||||
WebBrowser.maybeCompleteAuthSession();
|
|
||||||
|
|
||||||
const SignInWithOAuth = () => {
|
|
||||||
useWarmUpBrowser();
|
|
||||||
|
|
||||||
const { startOAuthFlow } = useOAuth({ strategy: "oauth_google" });
|
|
||||||
|
|
||||||
const onPress = React.useCallback(async () => {
|
|
||||||
try {
|
|
||||||
const { createdSessionId, signIn, signUp, setActive } =
|
|
||||||
await startOAuthFlow({
|
|
||||||
redirectUrl: Linking.createURL("/", {
|
|
||||||
scheme: "jazz-chat-rn-expo-clerk",
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (createdSessionId) {
|
|
||||||
setActive!({ session: createdSessionId });
|
|
||||||
} else {
|
|
||||||
// Use signIn or signUp for next steps such as MFA
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.error("OAuth error", err);
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<View className="flex-1 justify-center items-center bg-gray-50 p-6">
|
|
||||||
<View className="bg-white w-11/12 max-w-md p-8 rounded-lg shadow-lg items-center">
|
|
||||||
<TouchableOpacity
|
|
||||||
onPress={onPress}
|
|
||||||
className="w-full bg-red-500 py-3 rounded-lg flex items-center justify-center"
|
|
||||||
>
|
|
||||||
<Text className="text-white text-lg font-semibold">
|
|
||||||
Sign in with Google
|
|
||||||
</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
<Link href="/" className="mt-4">
|
|
||||||
<Text className="text-blue-600 text-lg font-semibold underline mb-6">
|
|
||||||
Back to Home
|
|
||||||
</Text>
|
|
||||||
</Link>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
export default SignInWithOAuth;
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import { useSignIn } from "@clerk/clerk-expo";
|
|
||||||
import { Link } from "expo-router";
|
|
||||||
import React from "react";
|
|
||||||
import { Text, TextInput, TouchableOpacity, View } from "react-native";
|
|
||||||
|
|
||||||
export default function SignInPage() {
|
|
||||||
const { signIn, setActive, isLoaded } = useSignIn();
|
|
||||||
const [emailAddress, setEmailAddress] = React.useState("");
|
|
||||||
const [password, setPassword] = React.useState("");
|
|
||||||
const [errorMessage, setErrorMessage] = React.useState("");
|
|
||||||
|
|
||||||
const onSignInPress = React.useCallback(async () => {
|
|
||||||
if (!isLoaded) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setErrorMessage("");
|
|
||||||
|
|
||||||
try {
|
|
||||||
const signInAttempt = await signIn.create({
|
|
||||||
identifier: emailAddress,
|
|
||||||
password,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (signInAttempt.status === "complete") {
|
|
||||||
await setActive({ session: signInAttempt.createdSessionId });
|
|
||||||
} else {
|
|
||||||
console.error(JSON.stringify(signInAttempt, null, 2));
|
|
||||||
setErrorMessage("Invalid credentials. Please try again.");
|
|
||||||
}
|
|
||||||
} catch (err: any) {
|
|
||||||
console.error(JSON.stringify(err, null, 2));
|
|
||||||
if (err.errors && err.errors[0]?.message) {
|
|
||||||
setErrorMessage(err.errors[0].message);
|
|
||||||
} else {
|
|
||||||
setErrorMessage("An unexpected error occurred. Please try again.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [isLoaded, emailAddress, password]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<View className="flex-1 justify-center items-center bg-gray-50 p-6">
|
|
||||||
<View className="bg-white w-11/12 max-w-md p-8 rounded-lg shadow-md">
|
|
||||||
<Text className="text-3xl font-bold text-center text-gray-800 mb-6">
|
|
||||||
Sign In
|
|
||||||
</Text>
|
|
||||||
{errorMessage ? (
|
|
||||||
<Text className="text-red-500 text-center mb-4">{errorMessage}</Text>
|
|
||||||
) : null}
|
|
||||||
<TextInput
|
|
||||||
autoCapitalize="none"
|
|
||||||
value={emailAddress}
|
|
||||||
placeholder="Email..."
|
|
||||||
onChangeText={(emailAddress) => setEmailAddress(emailAddress)}
|
|
||||||
className="w-full h-12 mb-4 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
|
|
||||||
/>
|
|
||||||
<TextInput
|
|
||||||
value={password}
|
|
||||||
placeholder="Password..."
|
|
||||||
secureTextEntry={true}
|
|
||||||
onChangeText={(password) => setPassword(password)}
|
|
||||||
className="w-full h-12 mb-6 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
|
|
||||||
/>
|
|
||||||
<TouchableOpacity
|
|
||||||
onPress={onSignInPress}
|
|
||||||
className="w-full h-12 bg-blue-600 rounded-lg flex items-center justify-center"
|
|
||||||
>
|
|
||||||
<Text className="text-white text-lg font-semibold">Sign In</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
<View className="flex-row items-center justify-center mt-4">
|
|
||||||
<Text className="text-gray-600">Don't have an account?</Text>
|
|
||||||
<Link href="/sign-up">
|
|
||||||
<Text className="text-blue-500 ml-2 font-semibold">Sign up</Text>
|
|
||||||
</Link>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
import { useSignUp } from "@clerk/clerk-expo";
|
|
||||||
import { useNavigation } from "@react-navigation/native";
|
|
||||||
import * as React from "react";
|
|
||||||
import { Text, TextInput, TouchableOpacity, View } from "react-native";
|
|
||||||
|
|
||||||
export default function SignUpPage() {
|
|
||||||
const { isLoaded, signUp, setActive } = useSignUp();
|
|
||||||
|
|
||||||
const [emailAddress, setEmailAddress] = React.useState("");
|
|
||||||
const [password, setPassword] = React.useState("");
|
|
||||||
const [pendingVerification, setPendingVerification] = React.useState(false);
|
|
||||||
const [code, setCode] = React.useState("");
|
|
||||||
const [errorMessage, setErrorMessage] = React.useState("");
|
|
||||||
const navigation = useNavigation();
|
|
||||||
|
|
||||||
const onSignUpPress = async () => {
|
|
||||||
if (!isLoaded) return;
|
|
||||||
|
|
||||||
setErrorMessage("");
|
|
||||||
|
|
||||||
try {
|
|
||||||
await signUp.create({
|
|
||||||
emailAddress,
|
|
||||||
password,
|
|
||||||
});
|
|
||||||
|
|
||||||
await signUp.prepareEmailAddressVerification({
|
|
||||||
strategy: "email_code",
|
|
||||||
});
|
|
||||||
|
|
||||||
setPendingVerification(true);
|
|
||||||
} catch (err: any) {
|
|
||||||
console.error(JSON.stringify(err, null, 2));
|
|
||||||
if (err.errors && err.errors[0]?.message) {
|
|
||||||
setErrorMessage(err.errors[0].message);
|
|
||||||
} else {
|
|
||||||
setErrorMessage("An unexpected error occurred. Please try again.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onPressVerify = async () => {
|
|
||||||
if (!isLoaded) return;
|
|
||||||
|
|
||||||
setErrorMessage("");
|
|
||||||
|
|
||||||
try {
|
|
||||||
const completeSignUp = await signUp.attemptEmailAddressVerification({
|
|
||||||
code,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (completeSignUp.status === "complete") {
|
|
||||||
await setActive({ session: completeSignUp.createdSessionId });
|
|
||||||
} else {
|
|
||||||
console.error(JSON.stringify(completeSignUp, null, 2));
|
|
||||||
setErrorMessage("Failed to verify. Please check your code.");
|
|
||||||
}
|
|
||||||
} catch (err: any) {
|
|
||||||
console.error(JSON.stringify(err, null, 2));
|
|
||||||
setErrorMessage("Invalid verification code. Please try again.");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<View className="flex-1 justify-center items-center bg-gray-50 p-6">
|
|
||||||
<View className="bg-white w-11/12 max-w-md p-8 rounded-lg shadow-lg">
|
|
||||||
<Text className="text-3xl font-bold text-center text-gray-800 mb-6">
|
|
||||||
{pendingVerification ? "Verify Email" : "Sign Up"}
|
|
||||||
</Text>
|
|
||||||
{errorMessage ? (
|
|
||||||
<Text className="text-red-500 text-center mb-4">{errorMessage}</Text>
|
|
||||||
) : null}
|
|
||||||
|
|
||||||
{!pendingVerification && (
|
|
||||||
<>
|
|
||||||
<TextInput
|
|
||||||
autoCapitalize="none"
|
|
||||||
value={emailAddress}
|
|
||||||
placeholder="Email..."
|
|
||||||
onChangeText={(email) => setEmailAddress(email)}
|
|
||||||
className="w-full h-12 mb-4 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
|
|
||||||
/>
|
|
||||||
<TextInput
|
|
||||||
value={password}
|
|
||||||
placeholder="Password..."
|
|
||||||
secureTextEntry={true}
|
|
||||||
onChangeText={(password) => setPassword(password)}
|
|
||||||
className="w-full h-12 mb-6 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
|
|
||||||
/>
|
|
||||||
<TouchableOpacity
|
|
||||||
onPress={onSignUpPress}
|
|
||||||
className="w-full h-12 bg-blue-600 rounded-lg flex justify-center items-center mb-4"
|
|
||||||
>
|
|
||||||
<Text className="text-white text-lg font-semibold">Sign Up</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{pendingVerification && (
|
|
||||||
<>
|
|
||||||
<TextInput
|
|
||||||
value={code}
|
|
||||||
placeholder="Verification Code..."
|
|
||||||
onChangeText={(code) => setCode(code)}
|
|
||||||
className="w-full h-12 mb-4 px-4 bg-gray-100 border border-gray-300 rounded-lg focus:border-blue-500 focus:outline-none"
|
|
||||||
/>
|
|
||||||
<TouchableOpacity
|
|
||||||
onPress={onPressVerify}
|
|
||||||
className="w-full h-12 bg-green-600 rounded-lg flex justify-center items-center mb-4"
|
|
||||||
>
|
|
||||||
<Text className="text-white text-lg font-semibold">
|
|
||||||
Verify Email
|
|
||||||
</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
import { ScrollViewStyleReset } from "expo-router/html";
|
|
||||||
import { type PropsWithChildren } from "react";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file is web-only and used to configure the root HTML for every web page during static rendering.
|
|
||||||
* The contents of this function only run in Node.js environments and do not have access to the DOM or browser APIs.
|
|
||||||
*/
|
|
||||||
export default function Root({ children }: PropsWithChildren) {
|
|
||||||
return (
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charSet="utf-8" />
|
|
||||||
<meta httpEquiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta
|
|
||||||
name="viewport"
|
|
||||||
content="width=device-width, initial-scale=1, shrink-to-fit=no"
|
|
||||||
/>
|
|
||||||
|
|
||||||
{/*
|
|
||||||
Disable body scrolling on web. This makes ScrollView components work closer to how they do on native.
|
|
||||||
However, body scrolling is often nice to have for mobile web. If you want to enable it, remove this line.
|
|
||||||
*/}
|
|
||||||
<ScrollViewStyleReset />
|
|
||||||
|
|
||||||
{/* Using raw CSS styles as an escape-hatch to ensure the background color never flickers in dark-mode. */}
|
|
||||||
<style dangerouslySetInnerHTML={{ __html: responsiveBackground }} />
|
|
||||||
{/* Add any additional <head> elements that you want globally available on web... */}
|
|
||||||
</head>
|
|
||||||
<body>{children}</body>
|
|
||||||
</html>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const responsiveBackground = `
|
|
||||||
body {
|
|
||||||
background-color: #fff;
|
|
||||||
}
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
body {
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
}`;
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import { Link, Stack } from "expo-router";
|
|
||||||
import { StyleSheet, Text, View } from "react-native";
|
|
||||||
|
|
||||||
export default function NotFoundScreen() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Stack.Screen options={{ title: "Oops!" }} />
|
|
||||||
<View style={styles.container}>
|
|
||||||
<Text>This screen doesn't exist.</Text>
|
|
||||||
<Link href="/" style={styles.link}>
|
|
||||||
<Text>Go to home screen!</Text>
|
|
||||||
</Link>
|
|
||||||
</View>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
|
||||||
container: {
|
|
||||||
flex: 1,
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center",
|
|
||||||
padding: 20,
|
|
||||||
},
|
|
||||||
link: {
|
|
||||||
marginTop: 15,
|
|
||||||
paddingVertical: 15,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
import "../global.css";
|
|
||||||
import { ClerkLoaded, ClerkProvider } from "@clerk/clerk-expo";
|
|
||||||
import { secureStore } from "@clerk/clerk-expo/secure-store";
|
|
||||||
import { useFonts } from "expo-font";
|
|
||||||
import { Slot, useRouter, useSegments } from "expo-router";
|
|
||||||
import * as SplashScreen from "expo-splash-screen";
|
|
||||||
import { useIsAuthenticated, useJazzContext } from "jazz-expo";
|
|
||||||
import React, { useEffect } from "react";
|
|
||||||
import { tokenCache } from "../cache";
|
|
||||||
import { JazzAndAuth } from "../src/auth-context";
|
|
||||||
|
|
||||||
SplashScreen.preventAutoHideAsync();
|
|
||||||
|
|
||||||
function InitialLayout() {
|
|
||||||
const isAuthenticated = useIsAuthenticated();
|
|
||||||
const segments = useSegments();
|
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const inAuthGroup = segments[0] === "(auth)";
|
|
||||||
|
|
||||||
if (isAuthenticated && inAuthGroup) {
|
|
||||||
router.replace("/chat");
|
|
||||||
} else if (!isAuthenticated && !inAuthGroup) {
|
|
||||||
router.replace("/");
|
|
||||||
}
|
|
||||||
|
|
||||||
SplashScreen.hideAsync();
|
|
||||||
}, [isAuthenticated, segments, router]);
|
|
||||||
|
|
||||||
return <Slot />;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function RootLayout() {
|
|
||||||
const [fontsLoaded] = useFonts({
|
|
||||||
SpaceMono: require("../assets/fonts/SpaceMono-Regular.ttf"),
|
|
||||||
});
|
|
||||||
|
|
||||||
const publishableKey = process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY;
|
|
||||||
|
|
||||||
if (!publishableKey) {
|
|
||||||
throw new Error(
|
|
||||||
"Missing Publishable Key. Please set EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY in your .env",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (fontsLoaded) {
|
|
||||||
} else {
|
|
||||||
SplashScreen.preventAutoHideAsync();
|
|
||||||
}
|
|
||||||
}, [fontsLoaded]);
|
|
||||||
|
|
||||||
if (!fontsLoaded) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ClerkProvider
|
|
||||||
tokenCache={tokenCache}
|
|
||||||
publishableKey={publishableKey}
|
|
||||||
__experimental_resourceCache={secureStore}
|
|
||||||
>
|
|
||||||
<ClerkLoaded>
|
|
||||||
<JazzAndAuth>
|
|
||||||
<InitialLayout />
|
|
||||||
</JazzAndAuth>
|
|
||||||
</ClerkLoaded>
|
|
||||||
</ClerkProvider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,234 +0,0 @@
|
|||||||
import { Chat, Message } from "@/src/schema";
|
|
||||||
import { useNavigation } from "@react-navigation/native";
|
|
||||||
import clsx from "clsx";
|
|
||||||
import * as Clipboard from "expo-clipboard";
|
|
||||||
import * as ImagePicker from "expo-image-picker";
|
|
||||||
import { useLocalSearchParams } from "expo-router";
|
|
||||||
import { useAccount, useCoState } from "jazz-expo";
|
|
||||||
import { ProgressiveImg } from "jazz-expo";
|
|
||||||
import { createImage } from "jazz-react-native-media-images";
|
|
||||||
import { CoPlainText, Group, Loaded } from "jazz-tools";
|
|
||||||
import { useEffect, useLayoutEffect, useState } from "react";
|
|
||||||
import React, {
|
|
||||||
SafeAreaView,
|
|
||||||
View,
|
|
||||||
Text,
|
|
||||||
Alert,
|
|
||||||
TouchableOpacity,
|
|
||||||
FlatList,
|
|
||||||
KeyboardAvoidingView,
|
|
||||||
TextInput,
|
|
||||||
Button,
|
|
||||||
Image,
|
|
||||||
ActivityIndicator,
|
|
||||||
} from "react-native";
|
|
||||||
|
|
||||||
export default function Conversation() {
|
|
||||||
const { chatId } = useLocalSearchParams();
|
|
||||||
const { me } = useAccount();
|
|
||||||
const [chat, setChat] = useState<Loaded<typeof Chat>>();
|
|
||||||
const [message, setMessage] = useState("");
|
|
||||||
const loadedChat = useCoState(Chat, chat?.id, { resolve: { $each: true } });
|
|
||||||
const navigation = useNavigation();
|
|
||||||
const [isUploading, setIsUploading] = useState(false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (chat) return;
|
|
||||||
if (chatId === "new") {
|
|
||||||
createChat();
|
|
||||||
} else {
|
|
||||||
loadChat(chatId as string);
|
|
||||||
}
|
|
||||||
}, [chat]);
|
|
||||||
|
|
||||||
// Effect to dynamically set header options
|
|
||||||
useLayoutEffect(() => {
|
|
||||||
navigation.setOptions({
|
|
||||||
headerTitle: "Chat",
|
|
||||||
headerRight: () =>
|
|
||||||
chat ? (
|
|
||||||
<Button
|
|
||||||
onPress={() => {
|
|
||||||
if (chat?.id) {
|
|
||||||
Clipboard.setStringAsync(
|
|
||||||
`https://chat.jazz.tools/#/chat/${chat.id}`,
|
|
||||||
);
|
|
||||||
Alert.alert("Copied to clipboard", `Chat ID: ${chat.id}`);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
title="Share"
|
|
||||||
/>
|
|
||||||
) : null,
|
|
||||||
});
|
|
||||||
}, [navigation, chat]);
|
|
||||||
|
|
||||||
const createChat = () => {
|
|
||||||
const group = Group.create({ owner: me });
|
|
||||||
group.addMember("everyone", "writer");
|
|
||||||
const chat = Chat.create([], { owner: group });
|
|
||||||
setChat(chat);
|
|
||||||
};
|
|
||||||
|
|
||||||
const loadChat = async (chatId: string) => {
|
|
||||||
try {
|
|
||||||
const chat = await Chat.load(chatId);
|
|
||||||
if (chat) setChat(chat);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Error loading chat", error);
|
|
||||||
Alert.alert("Error", `Error loading chat: ${error}`);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const sendMessage = () => {
|
|
||||||
if (!chat) return;
|
|
||||||
if (message.trim()) {
|
|
||||||
chat.push(
|
|
||||||
Message.create(
|
|
||||||
{ text: CoPlainText.create(message, chat._owner) },
|
|
||||||
chat._owner,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
setMessage("");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleImageUpload = async () => {
|
|
||||||
try {
|
|
||||||
const result = await ImagePicker.launchImageLibraryAsync({
|
|
||||||
mediaTypes: ImagePicker.MediaTypeOptions.Images,
|
|
||||||
base64: true,
|
|
||||||
quality: 0.7,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!result.canceled && result.assets[0].base64 && chat) {
|
|
||||||
setIsUploading(true);
|
|
||||||
const base64Uri = `data:image/jpeg;base64,${result.assets[0].base64}`;
|
|
||||||
|
|
||||||
const image = await createImage(base64Uri, {
|
|
||||||
owner: chat._owner,
|
|
||||||
maxSize: 2048,
|
|
||||||
});
|
|
||||||
|
|
||||||
chat.push(
|
|
||||||
Message.create(
|
|
||||||
{ text: CoPlainText.create("", chat._owner), image },
|
|
||||||
chat._owner,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
Alert.alert("Error", "Failed to upload image");
|
|
||||||
} finally {
|
|
||||||
setIsUploading(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderMessageItem = ({ item }: { item: Loaded<typeof Message> }) => {
|
|
||||||
const isMe = item._edits.text?.by?.isMe;
|
|
||||||
return (
|
|
||||||
<View
|
|
||||||
className={clsx(
|
|
||||||
`rounded-xl px-3 py-2 max-w-[75%] my-1`,
|
|
||||||
isMe ? `bg-blue-500 self-end` : `bg-gray-200 self-start`,
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{!isMe ? (
|
|
||||||
<Text
|
|
||||||
className={clsx(
|
|
||||||
`text-xs text-gray-500 mb-1`,
|
|
||||||
isMe ? "text-right" : "text-left",
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{item._edits.text?.by?.profile?.name}
|
|
||||||
</Text>
|
|
||||||
) : null}
|
|
||||||
<View
|
|
||||||
className={clsx(
|
|
||||||
"flex relative items-end justify-between",
|
|
||||||
isMe ? "flex-row" : "flex-row",
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{item.image && (
|
|
||||||
<ProgressiveImg image={item.image} maxWidth={1024}>
|
|
||||||
{({ src, res, originalSize }) => (
|
|
||||||
<Image
|
|
||||||
source={{ uri: src }}
|
|
||||||
className="w-48 h-48 rounded-lg mb-2"
|
|
||||||
resizeMode="cover"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</ProgressiveImg>
|
|
||||||
)}
|
|
||||||
{item.text && (
|
|
||||||
<Text
|
|
||||||
className={clsx(
|
|
||||||
!isMe ? "text-black" : "text-gray-200",
|
|
||||||
`text-md max-w-[85%]`,
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{item.text}
|
|
||||||
</Text>
|
|
||||||
)}
|
|
||||||
<Text
|
|
||||||
className={clsx(
|
|
||||||
"text-[10px] text-right ml-2",
|
|
||||||
!isMe ? "mt-2 text-gray-500" : "mt-1 text-gray-200",
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{item._edits.text?.madeAt?.getHours().toString().padStart(2, "0")}:
|
|
||||||
{item._edits.text?.madeAt?.getMinutes().toString().padStart(2, "0")}
|
|
||||||
</Text>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<View className="flex-1 bg-gray-50">
|
|
||||||
<FlatList
|
|
||||||
contentContainerStyle={{
|
|
||||||
flexGrow: 1,
|
|
||||||
paddingVertical: 10,
|
|
||||||
paddingHorizontal: 8,
|
|
||||||
}}
|
|
||||||
className="flex"
|
|
||||||
data={loadedChat}
|
|
||||||
keyExtractor={(item) => item.id}
|
|
||||||
renderItem={renderMessageItem}
|
|
||||||
/>
|
|
||||||
<KeyboardAvoidingView
|
|
||||||
keyboardVerticalOffset={110}
|
|
||||||
behavior="padding"
|
|
||||||
className="p-3 bg-white border-t border-gray-300"
|
|
||||||
>
|
|
||||||
<SafeAreaView className="flex-row items-center gap-2">
|
|
||||||
<TouchableOpacity
|
|
||||||
onPress={handleImageUpload}
|
|
||||||
disabled={isUploading}
|
|
||||||
className="h-10 w-10 items-center justify-center"
|
|
||||||
>
|
|
||||||
{isUploading ? (
|
|
||||||
<ActivityIndicator size="small" color="#0000ff" />
|
|
||||||
) : (
|
|
||||||
<Text className="text-2xl">🖼️</Text>
|
|
||||||
)}
|
|
||||||
</TouchableOpacity>
|
|
||||||
<TextInput
|
|
||||||
className="flex-1 rounded-full h-10 px-4 bg-gray-100 border border-gray-300 focus:border-blue-500 focus:bg-white"
|
|
||||||
value={message}
|
|
||||||
onChangeText={setMessage}
|
|
||||||
placeholder="Type a message..."
|
|
||||||
textAlignVertical="center"
|
|
||||||
onSubmitEditing={sendMessage}
|
|
||||||
/>
|
|
||||||
<TouchableOpacity
|
|
||||||
onPress={sendMessage}
|
|
||||||
className="bg-blue-500 rounded-full h-10 w-10 items-center justify-center"
|
|
||||||
>
|
|
||||||
<Text className="text-white text-xl">↑</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
</SafeAreaView>
|
|
||||||
</KeyboardAvoidingView>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import { Stack } from "expo-router";
|
|
||||||
import React from "react";
|
|
||||||
|
|
||||||
export default function ChatLayout() {
|
|
||||||
return (
|
|
||||||
<Stack
|
|
||||||
screenOptions={{
|
|
||||||
headerShown: true,
|
|
||||||
headerBackVisible: true,
|
|
||||||
headerTitle: "",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
import { useNavigation } from "@react-navigation/native";
|
|
||||||
import { useRouter } from "expo-router";
|
|
||||||
import { ID } from "jazz-tools";
|
|
||||||
import { useLayoutEffect } from "react";
|
|
||||||
import React, {
|
|
||||||
Button,
|
|
||||||
Text,
|
|
||||||
TouchableOpacity,
|
|
||||||
View,
|
|
||||||
Alert,
|
|
||||||
} from "react-native";
|
|
||||||
|
|
||||||
import { useUser } from "@clerk/clerk-expo";
|
|
||||||
import { useAccount } from "jazz-expo";
|
|
||||||
import { Chat } from "../../src/schema";
|
|
||||||
|
|
||||||
export default function ChatScreen() {
|
|
||||||
const { logOut } = useAccount();
|
|
||||||
const router = useRouter();
|
|
||||||
const navigation = useNavigation();
|
|
||||||
const { user } = useUser();
|
|
||||||
|
|
||||||
function handleLogOut() {
|
|
||||||
logOut();
|
|
||||||
router.navigate("/");
|
|
||||||
}
|
|
||||||
|
|
||||||
useLayoutEffect(() => {
|
|
||||||
navigation.setOptions({
|
|
||||||
headerTitle: "Chat",
|
|
||||||
headerRight: () => <Button onPress={handleLogOut} title="Logout" />,
|
|
||||||
});
|
|
||||||
}, [navigation]);
|
|
||||||
|
|
||||||
const loadChat = async (chatId: string | "new") => {
|
|
||||||
router.navigate(`/chat/${chatId}`);
|
|
||||||
};
|
|
||||||
|
|
||||||
const joinChat = () => {
|
|
||||||
Alert.prompt(
|
|
||||||
"Join Chat",
|
|
||||||
"Enter the Chat ID (example: co_zBGEHYvRfGuT2YSBraY3njGjnde)",
|
|
||||||
[
|
|
||||||
{
|
|
||||||
text: "Cancel",
|
|
||||||
style: "cancel",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: "Join",
|
|
||||||
onPress: (chatId) => {
|
|
||||||
if (chatId) {
|
|
||||||
loadChat(chatId);
|
|
||||||
} else {
|
|
||||||
Alert.alert("Error", "Chat ID cannot be empty.");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"plain-text",
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<View className="flex-1 bg-gray-50">
|
|
||||||
<View className="flex-1 justify-center items-center px-6">
|
|
||||||
<View className="w-full max-w-sm bg-white p-8 rounded-lg shadow-lg">
|
|
||||||
<Text className="text-xl font-semibold text-gray-800">
|
|
||||||
Welcome, {user?.emailAddresses[0].emailAddress}
|
|
||||||
</Text>
|
|
||||||
<TouchableOpacity
|
|
||||||
onPress={() => loadChat("new")}
|
|
||||||
className="w-full bg-blue-600 py-4 rounded-md mb-4 mt-4"
|
|
||||||
>
|
|
||||||
<Text className="text-white text-lg font-semibold text-center">
|
|
||||||
Start New Chat
|
|
||||||
</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
<TouchableOpacity
|
|
||||||
onPress={joinChat}
|
|
||||||
className="w-full bg-green-500 py-4 rounded-md"
|
|
||||||
>
|
|
||||||
<Text className="text-white text-lg font-semibold text-center">
|
|
||||||
Join Chat
|
|
||||||
</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 313 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 46 KiB |
@@ -1,9 +0,0 @@
|
|||||||
module.exports = function (api) {
|
|
||||||
api.cache(true);
|
|
||||||
return {
|
|
||||||
presets: [
|
|
||||||
["babel-preset-expo", { jsxImportSource: "nativewind" }],
|
|
||||||
"nativewind/babel",
|
|
||||||
],
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import * as SecureStore from "expo-secure-store";
|
|
||||||
import { Platform } from "react-native";
|
|
||||||
|
|
||||||
export interface TokenCache {
|
|
||||||
getToken: (key: string) => Promise<string | undefined | null>;
|
|
||||||
saveToken: (key: string, token: string) => Promise<void>;
|
|
||||||
clearToken: (key: string) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const createTokenCache = (): TokenCache => {
|
|
||||||
return {
|
|
||||||
getToken: async (key: string) => {
|
|
||||||
try {
|
|
||||||
const item = await SecureStore.getItemAsync(key);
|
|
||||||
if (item) {
|
|
||||||
console.log(`${key} was used 🔐 \n`);
|
|
||||||
} else {
|
|
||||||
console.log("No values stored under key: " + key);
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
} catch (error) {
|
|
||||||
console.error("secure store get item error: ", error);
|
|
||||||
await SecureStore.deleteItemAsync(key);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
saveToken: (key: string, token: string) => {
|
|
||||||
return SecureStore.setItemAsync(key, token);
|
|
||||||
},
|
|
||||||
clearToken: (key: string) => {
|
|
||||||
return SecureStore.deleteItemAsync(key);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// SecureStore is not supported on the web
|
|
||||||
// https://github.com/expo/expo/issues/7744#issuecomment-611093485
|
|
||||||
export const tokenCache =
|
|
||||||
Platform.OS !== "web" ? createTokenCache() : undefined;
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"cli": {
|
|
||||||
"version": ">= 12.5.1",
|
|
||||||
"appVersionSource": "remote"
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"development": {
|
|
||||||
"developmentClient": true,
|
|
||||||
"distribution": "internal"
|
|
||||||
},
|
|
||||||
"ios-simulator": {
|
|
||||||
"extends": "development",
|
|
||||||
"ios": {
|
|
||||||
"simulator": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"preview": {
|
|
||||||
"distribution": "internal"
|
|
||||||
},
|
|
||||||
"production": {
|
|
||||||
"autoIncrement": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"submit": {
|
|
||||||
"production": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
import "./polyfills";
|
|
||||||
import "expo-router/entry";
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
// Learn more https://docs.expo.dev/guides/monorepos
|
|
||||||
const { getDefaultConfig } = require("expo/metro-config");
|
|
||||||
const { withNativeWind } = require("nativewind/metro");
|
|
||||||
const { FileStore } = require("metro-cache");
|
|
||||||
const path = require("path");
|
|
||||||
|
|
||||||
// eslint-disable-next-line no-undef
|
|
||||||
const projectRoot = __dirname;
|
|
||||||
const workspaceRoot = path.resolve(projectRoot, "../..");
|
|
||||||
|
|
||||||
const config = getDefaultConfig(projectRoot);
|
|
||||||
|
|
||||||
// Since we are using pnpm, we have to setup the monorepo manually for Metro
|
|
||||||
// #1 - Watch all files in the monorepo
|
|
||||||
config.watchFolders = [workspaceRoot];
|
|
||||||
// #2 - Try resolving with project modules first, then workspace modules
|
|
||||||
config.resolver.nodeModulesPaths = [
|
|
||||||
path.resolve(projectRoot, "node_modules"),
|
|
||||||
path.resolve(workspaceRoot, "node_modules"),
|
|
||||||
];
|
|
||||||
config.resolver.sourceExts = ["mjs", "js", "json", "ts", "tsx"];
|
|
||||||
config.resolver.requireCycleIgnorePatterns = [
|
|
||||||
/(^|\/|\\)node_modules($|\/|\\)/,
|
|
||||||
/(^|\/|\\)packages($|\/|\\)/,
|
|
||||||
];
|
|
||||||
|
|
||||||
// Use turborepo to restore the cache when possible
|
|
||||||
config.cacheStores = [
|
|
||||||
new FileStore({
|
|
||||||
root: path.join(projectRoot, "node_modules", ".cache", "metro"),
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
|
|
||||||
// module.exports = config;
|
|
||||||
module.exports = withNativeWind(config, { input: "./global.css" });
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/// <reference types="nativewind/types" />
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "chat-rn-expo-clerk",
|
|
||||||
"main": "index.js",
|
|
||||||
"version": "1.0.139",
|
|
||||||
"scripts": {
|
|
||||||
"build": "expo export -p ios",
|
|
||||||
"start": "expo start",
|
|
||||||
"format-and-lint": "biome check .",
|
|
||||||
"format-and-lint:fix": "biome check . --write",
|
|
||||||
"android": "expo run:android",
|
|
||||||
"ios": "expo prebuild && pnpx pod-install && expo run:ios",
|
|
||||||
"web": "expo start --web",
|
|
||||||
"run:ios": "pnpm expo prebuild && npx pod-install && pnpm expo run:ios"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@azure/core-asynciterator-polyfill": "^1.0.2",
|
|
||||||
"@bacons/text-decoder": "0.0.0",
|
|
||||||
"@bam.tech/react-native-image-resizer": "^3.0.11",
|
|
||||||
"@clerk/clerk-expo": "^2.2.21",
|
|
||||||
"@craftzdog/react-native-buffer": "6.0.5",
|
|
||||||
"@expo/vector-icons": "^14.1.0",
|
|
||||||
"@react-native-community/netinfo": "11.4.1",
|
|
||||||
"@react-navigation/native": "7.0.19",
|
|
||||||
"@react-navigation/native-stack": "7.2.1",
|
|
||||||
"clsx": "^2.0.0",
|
|
||||||
"expo": "^53.0.8",
|
|
||||||
"expo-build-properties": "~0.14.6",
|
|
||||||
"expo-clipboard": "~7.1.4",
|
|
||||||
"expo-constants": "~17.1.6",
|
|
||||||
"expo-crypto": "~14.1.4",
|
|
||||||
"expo-dev-client": "~5.1.8",
|
|
||||||
"expo-file-system": "^18.1.9",
|
|
||||||
"expo-font": "~13.3.1",
|
|
||||||
"expo-image-picker": "~16.1.4",
|
|
||||||
"expo-linking": "~7.1.4",
|
|
||||||
"expo-router": "~5.0.6",
|
|
||||||
"expo-secure-store": "~14.2.3",
|
|
||||||
"expo-splash-screen": "~0.30.8",
|
|
||||||
"expo-sqlite": "15.2.9",
|
|
||||||
"expo-status-bar": "~2.2.3",
|
|
||||||
"expo-web-browser": "~14.1.6",
|
|
||||||
"jazz-expo": "workspace:*",
|
|
||||||
"jazz-react-native-media-images": "workspace:*",
|
|
||||||
"jazz-tools": "workspace:*",
|
|
||||||
"nativewind": "^4.1.21",
|
|
||||||
"react": "19.0.0",
|
|
||||||
"react-dom": "19.0.0",
|
|
||||||
"react-native": "0.79.2",
|
|
||||||
"react-native-gesture-handler": "~2.24.0",
|
|
||||||
"react-native-get-random-values": "^1.11.0",
|
|
||||||
"react-native-reanimated": "~3.17.5",
|
|
||||||
"react-native-safe-area-context": "5.4.0",
|
|
||||||
"react-native-screens": "4.10.0",
|
|
||||||
"react-native-url-polyfill": "^2.0.0",
|
|
||||||
"react-native-web": "~0.20.0",
|
|
||||||
"readable-stream": "4.7.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@babel/core": "^7.25.2",
|
|
||||||
"@types/react": "~19.0.14",
|
|
||||||
"@types/react-test-renderer": "^19.0.0",
|
|
||||||
"react-test-renderer": "18.3.1",
|
|
||||||
"tailwindcss": "^3.4.17",
|
|
||||||
"typescript": "5.8.3"
|
|
||||||
},
|
|
||||||
"private": true
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
/* eslint-disable import/order */
|
|
||||||
|
|
||||||
// @ts-expect-error - @types/react-native doesn't cover this file
|
|
||||||
import { polyfillGlobal } from "react-native/Libraries/Utilities/PolyfillFunctions";
|
|
||||||
|
|
||||||
import { Buffer } from "@craftzdog/react-native-buffer";
|
|
||||||
polyfillGlobal("Buffer", () => Buffer);
|
|
||||||
|
|
||||||
// @ts-expect-error - @types/readable-stream doesn't have ReadableStream type
|
|
||||||
import { ReadableStream } from "readable-stream";
|
|
||||||
polyfillGlobal("ReadableStream", () => ReadableStream);
|
|
||||||
|
|
||||||
import "@azure/core-asynciterator-polyfill";
|
|
||||||
|
|
||||||
import "@bacons/text-decoder/install";
|
|
||||||
|
|
||||||
import "react-native-get-random-values";
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export const apiKey = "chat-rn-expo-clerk-example-jazz@garden.co";
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import { useClerk } from "@clerk/clerk-expo";
|
|
||||||
import { JazzProviderWithClerk } from "jazz-expo/auth/clerk";
|
|
||||||
import React, { PropsWithChildren } from "react";
|
|
||||||
import { apiKey } from "./apiKey";
|
|
||||||
|
|
||||||
export function JazzAndAuth({ children }: PropsWithChildren) {
|
|
||||||
const clerk = useClerk();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<JazzProviderWithClerk
|
|
||||||
clerk={clerk}
|
|
||||||
sync={{
|
|
||||||
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</JazzProviderWithClerk>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
/** @type {import('tailwindcss').Config} */
|
|
||||||
module.exports = {
|
|
||||||
// NOTE: Update this to include the paths to all of your component files.
|
|
||||||
content: [
|
|
||||||
"./app/**/*.{js,jsx,ts,tsx}",
|
|
||||||
"./components/**/*.{js,jsx,ts,tsx}",
|
|
||||||
"./src/**/*.{js,jsx,ts,tsx}",
|
|
||||||
],
|
|
||||||
presets: [require("nativewind/preset")],
|
|
||||||
theme: {
|
|
||||||
extend: {},
|
|
||||||
},
|
|
||||||
plugins: [],
|
|
||||||
};
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "expo/tsconfig.base",
|
|
||||||
"compilerOptions": {
|
|
||||||
"strict": true,
|
|
||||||
"moduleResolution": "bundler",
|
|
||||||
"paths": {
|
|
||||||
"@/*": ["./*"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"include": ["**/*.ts", "**/*.tsx", "nativewind-env.d.ts"]
|
|
||||||
}
|
|
||||||
7
examples/chat-rn-expo/.gitignore
vendored
@@ -36,4 +36,9 @@ yarn-error.*
|
|||||||
# typescript
|
# typescript
|
||||||
*.tsbuildinfo
|
*.tsbuildinfo
|
||||||
android/
|
android/
|
||||||
ios/
|
ios/
|
||||||
|
# env files
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
!.env.test
|
||||||
|
|||||||
@@ -1,5 +1,60 @@
|
|||||||
# chat-rn-expo
|
# chat-rn-expo
|
||||||
|
|
||||||
|
## 1.0.13
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [048ac1d]
|
||||||
|
- jazz-tools@0.14.22
|
||||||
|
- jazz-expo@0.14.22
|
||||||
|
|
||||||
|
## 1.0.12
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [e7e505e]
|
||||||
|
- Updated dependencies [cfb6786]
|
||||||
|
- Updated dependencies [13b57aa]
|
||||||
|
- Updated dependencies [5662faa]
|
||||||
|
- Updated dependencies [2116a59]
|
||||||
|
- jazz-tools@0.14.21
|
||||||
|
- jazz-expo@0.14.21
|
||||||
|
|
||||||
|
## 1.0.11
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [6f72419]
|
||||||
|
- Updated dependencies [04b20c2]
|
||||||
|
- jazz-tools@0.14.20
|
||||||
|
- jazz-expo@0.14.20
|
||||||
|
|
||||||
|
## 1.0.10
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [061ec99]
|
||||||
|
- jazz-expo@0.14.19
|
||||||
|
- jazz-tools@0.14.19
|
||||||
|
|
||||||
|
## 1.0.9
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [4b950bc]
|
||||||
|
- Updated dependencies [d6d9c0a]
|
||||||
|
- Updated dependencies [c559054]
|
||||||
|
- jazz-tools@0.14.18
|
||||||
|
- jazz-expo@0.14.18
|
||||||
|
|
||||||
|
## 1.0.8
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [e512df4]
|
||||||
|
- jazz-tools@0.14.17
|
||||||
|
- jazz-expo@0.14.17
|
||||||
|
|
||||||
## 1.0.7
|
## 1.0.7
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
},
|
},
|
||||||
"ios": {
|
"ios": {
|
||||||
"supportsTablet": true,
|
"supportsTablet": true,
|
||||||
"bundleIdentifier": "com.anonymous.chatrnexpo"
|
"bundleIdentifier": "tools.jazz.chatrnexpo"
|
||||||
},
|
},
|
||||||
"android": {
|
"android": {
|
||||||
"adaptiveIcon": {
|
"adaptiveIcon": {
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
"backgroundColor": "#ffffff"
|
"backgroundColor": "#ffffff"
|
||||||
},
|
},
|
||||||
"edgeToEdgeEnabled": true,
|
"edgeToEdgeEnabled": true,
|
||||||
"package": "com.anonymous.chatrnexpo"
|
"package": "tools.jazz.chatrnexpo"
|
||||||
},
|
},
|
||||||
"web": {
|
"web": {
|
||||||
"favicon": "./assets/favicon.png"
|
"favicon": "./assets/favicon.png"
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "chat-rn-expo",
|
"name": "chat-rn-expo",
|
||||||
"version": "1.0.7",
|
|
||||||
"main": "index.ts",
|
"main": "index.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "expo prebuild",
|
"build": "expo prebuild",
|
||||||
@@ -12,17 +11,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@azure/core-asynciterator-polyfill": "^1.0.2",
|
"@azure/core-asynciterator-polyfill": "^1.0.2",
|
||||||
"@bacons/text-decoder": "^0.0.0",
|
"@bacons/text-decoder": "^0.0.0",
|
||||||
"@craftzdog/react-native-buffer": "^6.0.5",
|
"@bam.tech/react-native-image-resizer": "^3.0.11",
|
||||||
"@react-native-community/netinfo": "11.4.1",
|
"@react-native-community/netinfo": "11.4.1",
|
||||||
"expo": "~53.0.9",
|
"expo": "54.0.0-canary-20250701-6a945c5",
|
||||||
"expo-clipboard": "^7.1.4",
|
"expo-clipboard": "^7.1.4",
|
||||||
"expo-secure-store": "~14.2.3",
|
"expo-secure-store": "~14.2.3",
|
||||||
"expo-sqlite": "~15.2.10",
|
"expo-sqlite": "~15.2.10",
|
||||||
"expo-status-bar": "~2.2.3",
|
|
||||||
"jazz-expo": "workspace:*",
|
|
||||||
"jazz-tools": "workspace:*",
|
"jazz-tools": "workspace:*",
|
||||||
"react": "19.0.0",
|
"react": "19.1.0",
|
||||||
"react-native": "0.79.2",
|
"react-native": "0.80.0",
|
||||||
"react-native-get-random-values": "^1.11.0",
|
"react-native-get-random-values": "^1.11.0",
|
||||||
"readable-stream": "^4.7.0"
|
"readable-stream": "^4.7.0"
|
||||||
},
|
},
|
||||||
@@ -32,4 +29,4 @@
|
|||||||
"typescript": "~5.8.3"
|
"typescript": "~5.8.3"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
}
|
}
|
||||||
@@ -3,9 +3,6 @@
|
|||||||
// @ts-expect-error - @types/react-native doesn't cover this file
|
// @ts-expect-error - @types/react-native doesn't cover this file
|
||||||
import { polyfillGlobal } from "react-native/Libraries/Utilities/PolyfillFunctions";
|
import { polyfillGlobal } from "react-native/Libraries/Utilities/PolyfillFunctions";
|
||||||
|
|
||||||
import { Buffer } from "@craftzdog/react-native-buffer";
|
|
||||||
polyfillGlobal("Buffer", () => Buffer);
|
|
||||||
|
|
||||||
// @ts-expect-error - @types/readable-stream doesn't have ReadableStream type
|
// @ts-expect-error - @types/readable-stream doesn't have ReadableStream type
|
||||||
import { ReadableStream } from "readable-stream";
|
import { ReadableStream } from "readable-stream";
|
||||||
polyfillGlobal("ReadableStream", () => ReadableStream);
|
polyfillGlobal("ReadableStream", () => ReadableStream);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { JazzProvider } from "jazz-expo";
|
import { JazzExpoProvider } from "jazz-tools/expo";
|
||||||
import React, { StrictMode } from "react";
|
import React, { StrictMode } from "react";
|
||||||
import { apiKey } from "./apiKey";
|
import { apiKey } from "./apiKey";
|
||||||
import ChatScreen from "./chat";
|
import ChatScreen from "./chat";
|
||||||
@@ -6,13 +6,13 @@ import ChatScreen from "./chat";
|
|||||||
export default function App() {
|
export default function App() {
|
||||||
return (
|
return (
|
||||||
<StrictMode>
|
<StrictMode>
|
||||||
<JazzProvider
|
<JazzExpoProvider
|
||||||
sync={{
|
sync={{
|
||||||
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
|
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ChatScreen />
|
<ChatScreen />
|
||||||
</JazzProvider>
|
</JazzExpoProvider>
|
||||||
</StrictMode>
|
</StrictMode>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import React, {
|
|||||||
StyleSheet,
|
StyleSheet,
|
||||||
} from "react-native";
|
} from "react-native";
|
||||||
|
|
||||||
import { useAccount, useCoState } from "jazz-expo";
|
import { useAccount, useCoState } from "jazz-tools/expo";
|
||||||
import { Chat, Message } from "./schema";
|
import { Chat, Message } from "./schema";
|
||||||
|
|
||||||
export default function ChatScreen() {
|
export default function ChatScreen() {
|
||||||
@@ -128,7 +128,11 @@ export default function ChatScreen() {
|
|||||||
}}
|
}}
|
||||||
testID="chat-id-input"
|
testID="chat-id-input"
|
||||||
/>
|
/>
|
||||||
<TouchableOpacity onPress={joinChat} style={styles.joinChatButton}>
|
<TouchableOpacity
|
||||||
|
testID="join-chat-button"
|
||||||
|
onPress={joinChat}
|
||||||
|
style={styles.joinChatButton}
|
||||||
|
>
|
||||||
<Text style={styles.newChatButtonText}>Join chat</Text>
|
<Text style={styles.newChatButtonText}>Join chat</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# fully erased. The tap into the input field hits the middle, and clears all
|
# fully erased. The tap into the input field hits the middle, and clears all
|
||||||
# text to the left. If there's more to the right, it slides left, and thus we
|
# text to the left. If there's more to the right, it slides left, and thus we
|
||||||
# repeat this step. https://maestro.mobile.dev/api-reference/commands/erasetext
|
# repeat this step. https://maestro.mobile.dev/api-reference/commands/erasetext
|
||||||
appId: com.jazz.chatrn
|
appId: tools.jazz.chatrnexpo
|
||||||
---
|
---
|
||||||
- copyTextFrom:
|
- copyTextFrom:
|
||||||
id: ${id}
|
id: ${id}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
appId: com.jazz.chatrn
|
appId: tools.jazz.chatrnexpo
|
||||||
---
|
---
|
||||||
- launchApp
|
- launchApp
|
||||||
|
|
||||||
@@ -41,12 +41,17 @@ appId: com.jazz.chatrn
|
|||||||
# logout
|
# logout
|
||||||
- tapOn: "Logout"
|
- tapOn: "Logout"
|
||||||
- assertVisible: "Username"
|
- assertVisible: "Username"
|
||||||
- assertVisible: "Anonymous user"
|
|
||||||
|
|
||||||
# join chat
|
- extendedWaitUntil:
|
||||||
|
visible: "Anonymous user"
|
||||||
|
timeout: 10000
|
||||||
|
# join chat
|
||||||
|
|
||||||
|
## Commented because it fails on CI
|
||||||
# - tapOn:
|
# - tapOn:
|
||||||
# id: "chat-id-input"
|
# id: "chat-id-input"
|
||||||
# - inputText: "co_zFs6KFyhxPw4xtw83tcEMzeHUNv" # Use a static id because maestro doesn't have access to the system clipboard
|
# - inputText: "co_zFs6KFyhxPw4xtw83tcEMzeHUNv" # Use a static id because maestro doesn't have access to the system clipboard
|
||||||
# - tapOn: "Join chat"
|
# - tapOn:
|
||||||
|
# id: "join-chat-button"
|
||||||
# - assertVisible: "boorad"
|
# - assertVisible: "boorad"
|
||||||
# - assertVisible: "bro, low key, it do be like that tho"
|
# - assertVisible: "bro, low key, it do be like that tho"
|
||||||
|
|||||||
@@ -3,14 +3,18 @@
|
|||||||
# This script is necessary, because unlike ios, the android emulator action
|
# This script is necessary, because unlike ios, the android emulator action
|
||||||
# accepts a script, runs it as your tests, then terminates.
|
# accepts a script, runs it as your tests, then terminates.
|
||||||
|
|
||||||
# set -e
|
set -e
|
||||||
|
|
||||||
# # build and install the app
|
OUTPUT_FILE=~/output/android-install.log
|
||||||
# echo "Building and installing Android app."
|
mkdir -p ~/output
|
||||||
# echo "If it fails, its output will be in artifact: android-install.log..."
|
touch $OUTPUT_FILE
|
||||||
# cd ./android/
|
|
||||||
# ./gradlew installRelease >> ~/output/android-install.log 2>&1
|
# build and install the app
|
||||||
# cd ..
|
echo "Building and installing Android app."
|
||||||
|
echo "If it fails, its output will be in artifact: android-install.log..."
|
||||||
|
cd ./android/
|
||||||
|
./gradlew installRelease >> $OUTPUT_FILE 2>&1
|
||||||
|
cd ..
|
||||||
|
|
||||||
# run the e2e tests
|
# run the e2e tests
|
||||||
export PATH="$PATH":"$HOME/.maestro/bin"
|
export PATH="$PATH":"$HOME/.maestro/bin"
|
||||||
|
|||||||
13
examples/chat-rn-expo/test/e2e/runLocal.sh
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This script is necessary, because unlike ios, the android emulator action
|
||||||
|
# accepts a script, runs it as your tests, then terminates.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# run the e2e tests
|
||||||
|
export PATH="$PATH":"$HOME/.maestro/bin"
|
||||||
|
export MAESTRO_DRIVER_STARTUP_TIMEOUT=300000 # setting to 5 mins 👀
|
||||||
|
export MAESTRO_CLI_NO_ANALYTICS=1
|
||||||
|
export MAESTRO_CLI_ANALYSIS_NOTIFICATION_DISABLED=true
|
||||||
|
maestro test test/e2e/flow.yml
|
||||||
6
examples/chat-rn/.gitignore
vendored
@@ -73,3 +73,9 @@ yarn-error.log
|
|||||||
!.yarn/releases
|
!.yarn/releases
|
||||||
!.yarn/sdks
|
!.yarn/sdks
|
||||||
!.yarn/versions
|
!.yarn/versions
|
||||||
|
|
||||||
|
# env files
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
!.env.test
|
||||||
|
|||||||
@@ -1,5 +1,72 @@
|
|||||||
# chat-rn
|
# chat-rn
|
||||||
|
|
||||||
|
## 1.0.140
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [57fb69f]
|
||||||
|
- Updated dependencies [048ac1d]
|
||||||
|
- cojson@0.14.22
|
||||||
|
- jazz-tools@0.14.22
|
||||||
|
- cojson-transport-ws@0.14.22
|
||||||
|
- jazz-react-native@0.14.22
|
||||||
|
|
||||||
|
## 1.0.139
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [e7e505e]
|
||||||
|
- Updated dependencies [c3d8779]
|
||||||
|
- Updated dependencies [13b57aa]
|
||||||
|
- Updated dependencies [5662faa]
|
||||||
|
- Updated dependencies [2116a59]
|
||||||
|
- jazz-tools@0.14.21
|
||||||
|
- cojson@0.14.21
|
||||||
|
- jazz-react-native@0.14.21
|
||||||
|
- cojson-transport-ws@0.14.21
|
||||||
|
|
||||||
|
## 1.0.138
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [6f72419]
|
||||||
|
- Updated dependencies [04b20c2]
|
||||||
|
- jazz-tools@0.14.20
|
||||||
|
- jazz-react-native@0.14.20
|
||||||
|
- cojson@0.14.20
|
||||||
|
- cojson-transport-ws@0.14.20
|
||||||
|
|
||||||
|
## 1.0.137
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [061ec99]
|
||||||
|
- jazz-react-native@0.14.19
|
||||||
|
- cojson@0.14.19
|
||||||
|
- cojson-transport-ws@0.14.19
|
||||||
|
- jazz-tools@0.14.19
|
||||||
|
|
||||||
|
## 1.0.136
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [4b950bc]
|
||||||
|
- Updated dependencies [0d5ee3e]
|
||||||
|
- Updated dependencies [d6d9c0a]
|
||||||
|
- Updated dependencies [c559054]
|
||||||
|
- jazz-tools@0.14.18
|
||||||
|
- cojson@0.14.18
|
||||||
|
- jazz-react-native@0.14.18
|
||||||
|
- cojson-transport-ws@0.14.18
|
||||||
|
|
||||||
|
## 1.0.135
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [e512df4]
|
||||||
|
- jazz-tools@0.14.17
|
||||||
|
- jazz-react-native@0.14.17
|
||||||
|
|
||||||
## 1.0.134
|
## 1.0.134
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ This will set up and launch the app on iOS. For Android, you can skip `pnpm pods
|
|||||||
This was created using the following command:
|
This was created using the following command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpx @react-native-community/cli init chat-rn --version 0.76.7 --install-pods true --skip-git-init true --package-name com.chatrn --directory chat-rn
|
pnpx @react-native-community/cli init chat-rn --version 0.76.9 --install-pods true --skip-git-init true --package-name com.chatrn --directory chat-rn
|
||||||
```
|
```
|
||||||
|
|
||||||
Then change package name in `package.json`, and begin build instructions above.
|
Then change package name in `package.json`, and begin build instructions above.
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ react {
|
|||||||
// The root of your project, i.e. where "package.json" lives. Default is '../..'
|
// The root of your project, i.e. where "package.json" lives. Default is '../..'
|
||||||
// root = file("../../")
|
// root = file("../../")
|
||||||
// The folder where the react-native NPM package is. Default is ../../node_modules/react-native
|
// The folder where the react-native NPM package is. Default is ../../node_modules/react-native
|
||||||
// reactNativeDir = file("../../node_modules/react-native")
|
reactNativeDir = file("../../../../node_modules/react-native")
|
||||||
// The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
|
// The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
|
||||||
// codegenDir = file("../../node_modules/@react-native/codegen")
|
codegenDir = file("../../../../node_modules/@react-native/codegen")
|
||||||
// The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js
|
// The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js
|
||||||
// cliFile = file("../../node_modules/react-native/cli.js")
|
cliFile = file("../../../../node_modules/react-native/cli.js")
|
||||||
|
|
||||||
/* Variants */
|
/* Variants */
|
||||||
// The list of variants to that are debuggable. For those we're going to
|
// The list of variants to that are debuggable. For those we're going to
|
||||||
@@ -63,14 +63,14 @@ def enableProguardInReleaseBuilds = false
|
|||||||
* The preferred build flavor of JavaScriptCore (JSC)
|
* The preferred build flavor of JavaScriptCore (JSC)
|
||||||
*
|
*
|
||||||
* For example, to use the international variant, you can use:
|
* For example, to use the international variant, you can use:
|
||||||
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
|
* `def jscFlavor = io.github.react-native-community:jsc-android-intl:2026004.+`
|
||||||
*
|
*
|
||||||
* The international variant includes ICU i18n library and necessary data
|
* The international variant includes ICU i18n library and necessary data
|
||||||
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
||||||
* give correct results when using with locales other than en-US. Note that
|
* give correct results when using with locales other than en-US. Note that
|
||||||
* this variant is about 6MiB larger per architecture than default.
|
* this variant is about 6MiB larger per architecture than default.
|
||||||
*/
|
*/
|
||||||
def jscFlavor = 'org.webkit:android-jsc:+'
|
def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
ndkVersion rootProject.ext.ndkVersion
|
ndkVersion rootProject.ext.ndkVersion
|
||||||
|
|||||||
@@ -4,13 +4,11 @@ import android.app.Application
|
|||||||
import com.facebook.react.PackageList
|
import com.facebook.react.PackageList
|
||||||
import com.facebook.react.ReactApplication
|
import com.facebook.react.ReactApplication
|
||||||
import com.facebook.react.ReactHost
|
import com.facebook.react.ReactHost
|
||||||
|
import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative
|
||||||
import com.facebook.react.ReactNativeHost
|
import com.facebook.react.ReactNativeHost
|
||||||
import com.facebook.react.ReactPackage
|
import com.facebook.react.ReactPackage
|
||||||
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
|
|
||||||
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
|
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
|
||||||
import com.facebook.react.defaults.DefaultReactNativeHost
|
import com.facebook.react.defaults.DefaultReactNativeHost
|
||||||
import com.facebook.react.soloader.OpenSourceMergedSoMapping
|
|
||||||
import com.facebook.soloader.SoLoader
|
|
||||||
|
|
||||||
class MainApplication : Application(), ReactApplication {
|
class MainApplication : Application(), ReactApplication {
|
||||||
|
|
||||||
@@ -35,10 +33,6 @@ class MainApplication : Application(), ReactApplication {
|
|||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
SoLoader.init(this, OpenSourceMergedSoMapping)
|
loadReactNative(this)
|
||||||
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
|
||||||
// If you opted-in for the New Architecture, we load the native entry point for this app.
|
|
||||||
load()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ buildscript {
|
|||||||
buildToolsVersion = "35.0.0"
|
buildToolsVersion = "35.0.0"
|
||||||
minSdkVersion = 24
|
minSdkVersion = 24
|
||||||
compileSdkVersion = 35
|
compileSdkVersion = 35
|
||||||
targetSdkVersion = 34
|
targetSdkVersion = 35
|
||||||
ndkVersion = "26.1.10909125"
|
ndkVersion = "27.1.12297006"
|
||||||
kotlinVersion = "1.9.25"
|
kotlinVersion = "2.1.20"
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
9
examples/chat-rn/android/gradlew
vendored
@@ -86,8 +86,7 @@ done
|
|||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
APP_BASE_NAME=${0##*/}
|
APP_BASE_NAME=${0##*/}
|
||||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
|
||||||
' "$PWD" ) || exit
|
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD=maximum
|
MAX_FD=maximum
|
||||||
@@ -115,7 +114,7 @@ case "$( uname )" in #(
|
|||||||
NONSTOP* ) nonstop=true ;;
|
NONSTOP* ) nonstop=true ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
CLASSPATH="\\\"\\\""
|
||||||
|
|
||||||
|
|
||||||
# Determine the Java command to use to start the JVM.
|
# Determine the Java command to use to start the JVM.
|
||||||
@@ -206,7 +205,7 @@ fi
|
|||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
# Collect all arguments for the java command:
|
# Collect all arguments for the java command:
|
||||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||||
# and any embedded shellness will be escaped.
|
# and any embedded shellness will be escaped.
|
||||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||||
# treated as '${Hostname}' itself on the command line.
|
# treated as '${Hostname}' itself on the command line.
|
||||||
@@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
|||||||
set -- \
|
set -- \
|
||||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
-classpath "$CLASSPATH" \
|
-classpath "$CLASSPATH" \
|
||||||
org.gradle.wrapper.GradleWrapperMain \
|
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
|
||||||
"$@"
|
"$@"
|
||||||
|
|
||||||
# Stop when "xargs" is not available.
|
# Stop when "xargs" is not available.
|
||||||
|
|||||||
9
examples/chat-rn/android/gradlew.bat
vendored
@@ -1,3 +1,8 @@
|
|||||||
|
@REM Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
|
@REM
|
||||||
|
@REM This source code is licensed under the MIT license found in the
|
||||||
|
@REM LICENSE file in the root directory of this source tree.
|
||||||
|
|
||||||
@rem
|
@rem
|
||||||
@rem Copyright 2015 the original author or authors.
|
@rem Copyright 2015 the original author or authors.
|
||||||
@rem
|
@rem
|
||||||
@@ -70,11 +75,11 @@ goto fail
|
|||||||
:execute
|
:execute
|
||||||
@rem Setup the command line
|
@rem Setup the command line
|
||||||
|
|
||||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
set CLASSPATH=
|
||||||
|
|
||||||
|
|
||||||
@rem Execute Gradle
|
@rem Execute Gradle
|
||||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
|
||||||
|
|
||||||
:end
|
:end
|
||||||
@rem End local scope for the variables with windows NT shell
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") }
|
pluginManagement { includeBuild("../../../node_modules/@react-native/gradle-plugin") }
|
||||||
plugins { id("com.facebook.react.settings") }
|
plugins { id("com.facebook.react.settings") }
|
||||||
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
|
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
|
||||||
rootProject.name = 'ChatRN'
|
rootProject.name = 'ChatRN'
|
||||||
include ':app'
|
include ':app'
|
||||||
includeBuild('../node_modules/@react-native/gradle-plugin')
|
includeBuild('../../../node_modules/@react-native/gradle-plugin')
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
"name": "ChatRN",
|
"name": "ChatRN",
|
||||||
"displayName": "ChatRN",
|
"displayName": "ChatRN",
|
||||||
"android": {
|
"android": {
|
||||||
"package": "com.anonymous.ChatRN"
|
"package": "tools.jazz.chatrn"
|
||||||
},
|
},
|
||||||
"ios": {
|
"ios": {
|
||||||
"bundleIdentifier": "com.anonymous.ChatRN"
|
"bundleIdentifier": "tools.jazz.chatrn"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
presets: ["module:@react-native/babel-preset"],
|
presets: ["module:@react-native/babel-preset"],
|
||||||
|
plugins: ["@babel/plugin-transform-export-namespace-from"],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,56 +7,27 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
00E356F31AD99517003FC87E /* ChatRNTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ChatRNTests.m */; };
|
|
||||||
0C80B921A6F3F58F76C31292 /* libPods-ChatRN.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-ChatRN.a */; };
|
0C80B921A6F3F58F76C31292 /* libPods-ChatRN.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-ChatRN.a */; };
|
||||||
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
|
|
||||||
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
||||||
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
|
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; };
|
||||||
7699B88040F8A987B510C191 /* libPods-ChatRN-ChatRNTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-ChatRN-ChatRNTests.a */; };
|
|
||||||
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
|
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
|
||||||
FDBE82F8CEBB429FCE591919 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };
|
927557B966FCFCEE5896C589 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
|
||||||
00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
|
|
||||||
remoteInfo = ChatRN;
|
|
||||||
};
|
|
||||||
/* End PBXContainerItemProxy section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
00E356EE1AD99517003FC87E /* ChatRNTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChatRNTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
|
||||||
00E356F21AD99517003FC87E /* ChatRNTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChatRNTests.m; sourceTree = "<group>"; };
|
|
||||||
13B07F961A680F5B00A75B9A /* ChatRN.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChatRN.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
13B07F961A680F5B00A75B9A /* ChatRN.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChatRN.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ChatRN/AppDelegate.h; sourceTree = "<group>"; };
|
|
||||||
13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = ChatRN/AppDelegate.mm; sourceTree = "<group>"; };
|
|
||||||
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ChatRN/Images.xcassets; sourceTree = "<group>"; };
|
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ChatRN/Images.xcassets; sourceTree = "<group>"; };
|
||||||
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ChatRN/Info.plist; sourceTree = "<group>"; };
|
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ChatRN/Info.plist; sourceTree = "<group>"; };
|
||||||
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ChatRN/main.m; sourceTree = "<group>"; };
|
|
||||||
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = ChatRN/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = ChatRN/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
||||||
19F6CBCC0A4E27FBF8BF4A61 /* libPods-ChatRN-ChatRNTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ChatRN-ChatRNTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
3B4392A12AC88292D35C810B /* Pods-ChatRN.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChatRN.debug.xcconfig"; path = "Target Support Files/Pods-ChatRN/Pods-ChatRN.debug.xcconfig"; sourceTree = "<group>"; };
|
3B4392A12AC88292D35C810B /* Pods-ChatRN.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChatRN.debug.xcconfig"; path = "Target Support Files/Pods-ChatRN/Pods-ChatRN.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
5709B34CF0A7D63546082F79 /* Pods-ChatRN.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChatRN.release.xcconfig"; path = "Target Support Files/Pods-ChatRN/Pods-ChatRN.release.xcconfig"; sourceTree = "<group>"; };
|
5709B34CF0A7D63546082F79 /* Pods-ChatRN.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChatRN.release.xcconfig"; path = "Target Support Files/Pods-ChatRN/Pods-ChatRN.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
5B7EB9410499542E8C5724F5 /* Pods-ChatRN-ChatRNTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChatRN-ChatRNTests.debug.xcconfig"; path = "Target Support Files/Pods-ChatRN-ChatRNTests/Pods-ChatRN-ChatRNTests.debug.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
5DCACB8F33CDC322A6C60F78 /* libPods-ChatRN.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ChatRN.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
5DCACB8F33CDC322A6C60F78 /* libPods-ChatRN.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ChatRN.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = ChatRN/AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = ChatRN/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = ChatRN/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
89C6BE57DB24E9ADA2F236DE /* Pods-ChatRN-ChatRNTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChatRN-ChatRNTests.release.xcconfig"; path = "Target Support Files/Pods-ChatRN-ChatRNTests/Pods-ChatRN-ChatRNTests.release.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
|
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
00E356EB1AD99517003FC87E /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
7699B88040F8A987B510C191 /* libPods-ChatRN-ChatRNTests.a in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
|
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -68,32 +39,13 @@
|
|||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
00E356EF1AD99517003FC87E /* ChatRNTests */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
00E356F21AD99517003FC87E /* ChatRNTests.m */,
|
|
||||||
00E356F01AD99517003FC87E /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = ChatRNTests;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
00E356F01AD99517003FC87E /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
00E356F11AD99517003FC87E /* Info.plist */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
13B07FAE1A68108700A75B9A /* ChatRN */ = {
|
13B07FAE1A68108700A75B9A /* ChatRN */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
|
|
||||||
13B07FB01A68108700A75B9A /* AppDelegate.mm */,
|
|
||||||
13B07FB51A68108700A75B9A /* Images.xcassets */,
|
13B07FB51A68108700A75B9A /* Images.xcassets */,
|
||||||
|
761780EC2CA45674006654EE /* AppDelegate.swift */,
|
||||||
13B07FB61A68108700A75B9A /* Info.plist */,
|
13B07FB61A68108700A75B9A /* Info.plist */,
|
||||||
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
|
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
|
||||||
13B07FB71A68108700A75B9A /* main.m */,
|
|
||||||
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,
|
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,
|
||||||
);
|
);
|
||||||
name = ChatRN;
|
name = ChatRN;
|
||||||
@@ -104,7 +56,6 @@
|
|||||||
children = (
|
children = (
|
||||||
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
|
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
|
||||||
5DCACB8F33CDC322A6C60F78 /* libPods-ChatRN.a */,
|
5DCACB8F33CDC322A6C60F78 /* libPods-ChatRN.a */,
|
||||||
19F6CBCC0A4E27FBF8BF4A61 /* libPods-ChatRN-ChatRNTests.a */,
|
|
||||||
);
|
);
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -121,7 +72,6 @@
|
|||||||
children = (
|
children = (
|
||||||
13B07FAE1A68108700A75B9A /* ChatRN */,
|
13B07FAE1A68108700A75B9A /* ChatRN */,
|
||||||
832341AE1AAA6A7D00B99B32 /* Libraries */,
|
832341AE1AAA6A7D00B99B32 /* Libraries */,
|
||||||
00E356EF1AD99517003FC87E /* ChatRNTests */,
|
|
||||||
83CBBA001A601CBA00E9B192 /* Products */,
|
83CBBA001A601CBA00E9B192 /* Products */,
|
||||||
2D16E6871FA4F8E400B85C8A /* Frameworks */,
|
2D16E6871FA4F8E400B85C8A /* Frameworks */,
|
||||||
BBD78D7AC51CEA395F1C20DB /* Pods */,
|
BBD78D7AC51CEA395F1C20DB /* Pods */,
|
||||||
@@ -135,7 +85,6 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
13B07F961A680F5B00A75B9A /* ChatRN.app */,
|
13B07F961A680F5B00A75B9A /* ChatRN.app */,
|
||||||
00E356EE1AD99517003FC87E /* ChatRNTests.xctest */,
|
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -145,8 +94,6 @@
|
|||||||
children = (
|
children = (
|
||||||
3B4392A12AC88292D35C810B /* Pods-ChatRN.debug.xcconfig */,
|
3B4392A12AC88292D35C810B /* Pods-ChatRN.debug.xcconfig */,
|
||||||
5709B34CF0A7D63546082F79 /* Pods-ChatRN.release.xcconfig */,
|
5709B34CF0A7D63546082F79 /* Pods-ChatRN.release.xcconfig */,
|
||||||
5B7EB9410499542E8C5724F5 /* Pods-ChatRN-ChatRNTests.debug.xcconfig */,
|
|
||||||
89C6BE57DB24E9ADA2F236DE /* Pods-ChatRN-ChatRNTests.release.xcconfig */,
|
|
||||||
);
|
);
|
||||||
path = Pods;
|
path = Pods;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -154,27 +101,6 @@
|
|||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
00E356ED1AD99517003FC87E /* ChatRNTests */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ChatRNTests" */;
|
|
||||||
buildPhases = (
|
|
||||||
A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */,
|
|
||||||
00E356EA1AD99517003FC87E /* Sources */,
|
|
||||||
00E356EB1AD99517003FC87E /* Frameworks */,
|
|
||||||
00E356EC1AD99517003FC87E /* Resources */,
|
|
||||||
C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */,
|
|
||||||
F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
00E356F51AD99517003FC87E /* PBXTargetDependency */,
|
|
||||||
);
|
|
||||||
name = ChatRNTests;
|
|
||||||
productName = ChatRNTests;
|
|
||||||
productReference = 00E356EE1AD99517003FC87E /* ChatRNTests.xctest */;
|
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
|
||||||
};
|
|
||||||
13B07F861A680F5B00A75B9A /* ChatRN */ = {
|
13B07F861A680F5B00A75B9A /* ChatRN */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ChatRN" */;
|
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ChatRN" */;
|
||||||
@@ -204,10 +130,6 @@
|
|||||||
attributes = {
|
attributes = {
|
||||||
LastUpgradeCheck = 1210;
|
LastUpgradeCheck = 1210;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
00E356ED1AD99517003FC87E = {
|
|
||||||
CreatedOnToolsVersion = 6.2;
|
|
||||||
TestTargetID = 13B07F861A680F5B00A75B9A;
|
|
||||||
};
|
|
||||||
13B07F861A680F5B00A75B9A = {
|
13B07F861A680F5B00A75B9A = {
|
||||||
LastSwiftMigration = 1120;
|
LastSwiftMigration = 1120;
|
||||||
};
|
};
|
||||||
@@ -227,26 +149,18 @@
|
|||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
13B07F861A680F5B00A75B9A /* ChatRN */,
|
13B07F861A680F5B00A75B9A /* ChatRN */,
|
||||||
00E356ED1AD99517003FC87E /* ChatRNTests */,
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
00E356EC1AD99517003FC87E /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
13B07F8E1A680F5B00A75B9A /* Resources */ = {
|
13B07F8E1A680F5B00A75B9A /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
|
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
|
||||||
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
|
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
|
||||||
FDBE82F8CEBB429FCE591919 /* PrivacyInfo.xcprivacy in Resources */,
|
927557B966FCFCEE5896C589 /* PrivacyInfo.xcprivacy in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -286,28 +200,6 @@
|
|||||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ChatRN/Pods-ChatRN-frameworks.sh\"\n";
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ChatRN/Pods-ChatRN-frameworks.sh\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
|
||||||
"${PODS_ROOT}/Manifest.lock",
|
|
||||||
);
|
|
||||||
name = "[CP] Check Pods Manifest.lock";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
"$(DERIVED_FILE_DIR)/Pods-ChatRN-ChatRNTests-checkManifestLockResult.txt",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = {
|
C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -330,23 +222,6 @@
|
|||||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-ChatRN-ChatRNTests/Pods-ChatRN-ChatRNTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
|
||||||
);
|
|
||||||
name = "[CP] Embed Pods Frameworks";
|
|
||||||
outputFileListPaths = (
|
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-ChatRN-ChatRNTests/Pods-ChatRN-ChatRNTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ChatRN-ChatRNTests/Pods-ChatRN-ChatRNTests-frameworks.sh\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = {
|
E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -364,105 +239,20 @@
|
|||||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ChatRN/Pods-ChatRN-resources.sh\"\n";
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ChatRN/Pods-ChatRN-resources.sh\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-ChatRN-ChatRNTests/Pods-ChatRN-ChatRNTests-resources-${CONFIGURATION}-input-files.xcfilelist",
|
|
||||||
);
|
|
||||||
name = "[CP] Copy Pods Resources";
|
|
||||||
outputFileListPaths = (
|
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-ChatRN-ChatRNTests/Pods-ChatRN-ChatRNTests-resources-${CONFIGURATION}-output-files.xcfilelist",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ChatRN-ChatRNTests/Pods-ChatRN-ChatRNTests-resources.sh\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
00E356EA1AD99517003FC87E /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
00E356F31AD99517003FC87E /* ChatRNTests.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
13B07F871A680F5B00A75B9A /* Sources */ = {
|
13B07F871A680F5B00A75B9A /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
|
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */,
|
||||||
13B07FC11A68108700A75B9A /* main.m in Sources */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
|
||||||
00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
target = 13B07F861A680F5B00A75B9A /* ChatRN */;
|
|
||||||
targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
/* End PBXTargetDependency section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
00E356F61AD99517003FC87E /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-ChatRN-ChatRNTests.debug.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = ChatRNTests/Info.plist;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
"@loader_path/Frameworks",
|
|
||||||
);
|
|
||||||
OTHER_LDFLAGS = (
|
|
||||||
"-ObjC",
|
|
||||||
"-lc++",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ChatRN.app/ChatRN";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
00E356F71AD99517003FC87E /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-ChatRN-ChatRNTests.release.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
INFOPLIST_FILE = ChatRNTests/Info.plist;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
"@loader_path/Frameworks",
|
|
||||||
);
|
|
||||||
OTHER_LDFLAGS = (
|
|
||||||
"-ObjC",
|
|
||||||
"-lc++",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ChatRN.app/ChatRN";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
13B07F941A680F5B00A75B9A /* Debug */ = {
|
13B07F941A680F5B00A75B9A /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-ChatRN.debug.xcconfig */;
|
baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-ChatRN.debug.xcconfig */;
|
||||||
@@ -672,15 +462,6 @@
|
|||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ChatRNTests" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
00E356F61AD99517003FC87E /* Debug */,
|
|
||||||
00E356F71AD99517003FC87E /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ChatRN" */ = {
|
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ChatRN" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
|
|||||||
7
examples/chat-rn/ios/ChatRN.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#import <RCTAppDelegate.h>
|
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
|
|
||||||
@interface AppDelegate : RCTAppDelegate
|
|
||||||
|
|
||||||
@end
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#import "AppDelegate.h"
|
|
||||||
|
|
||||||
#import <React/RCTBundleURLProvider.h>
|
|
||||||
|
|
||||||
@implementation AppDelegate
|
|
||||||
|
|
||||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
|
||||||
{
|
|
||||||
self.moduleName = @"ChatRN";
|
|
||||||
// You can add your custom initial props in the dictionary below.
|
|
||||||
// They will be passed down to the ViewController used by React Native.
|
|
||||||
self.initialProps = @{};
|
|
||||||
|
|
||||||
return [super application:application didFinishLaunchingWithOptions:launchOptions];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
|
|
||||||
{
|
|
||||||
return [self bundleURL];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSURL *)bundleURL
|
|
||||||
{
|
|
||||||
#if DEBUG
|
|
||||||
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
|
|
||||||
#else
|
|
||||||
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
48
examples/chat-rn/ios/ChatRN/AppDelegate.swift
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import UIKit
|
||||||
|
import React
|
||||||
|
import React_RCTAppDelegate
|
||||||
|
import ReactAppDependencyProvider
|
||||||
|
|
||||||
|
@main
|
||||||
|
class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||||
|
var window: UIWindow?
|
||||||
|
|
||||||
|
var reactNativeDelegate: ReactNativeDelegate?
|
||||||
|
var reactNativeFactory: RCTReactNativeFactory?
|
||||||
|
|
||||||
|
func application(
|
||||||
|
_ application: UIApplication,
|
||||||
|
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
|
||||||
|
) -> Bool {
|
||||||
|
let delegate = ReactNativeDelegate()
|
||||||
|
let factory = RCTReactNativeFactory(delegate: delegate)
|
||||||
|
delegate.dependencyProvider = RCTAppDependencyProvider()
|
||||||
|
|
||||||
|
reactNativeDelegate = delegate
|
||||||
|
reactNativeFactory = factory
|
||||||
|
|
||||||
|
window = UIWindow(frame: UIScreen.main.bounds)
|
||||||
|
|
||||||
|
factory.startReactNative(
|
||||||
|
withModuleName: "ChatRN",
|
||||||
|
in: window,
|
||||||
|
launchOptions: launchOptions
|
||||||
|
)
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate {
|
||||||
|
override func sourceURL(for bridge: RCTBridge) -> URL? {
|
||||||
|
self.bundleURL()
|
||||||
|
}
|
||||||
|
|
||||||
|
override func bundleURL() -> URL? {
|
||||||
|
#if DEBUG
|
||||||
|
RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")
|
||||||
|
#else
|
||||||
|
Bundle.main.url(forResource: "main", withExtension: "jsbundle")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -34,6 +34,8 @@
|
|||||||
</dict>
|
</dict>
|
||||||
<key>NSLocationWhenInUseUsageDescription</key>
|
<key>NSLocationWhenInUseUsageDescription</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
|
<key>RCTNewArchEnabled</key>
|
||||||
|
<true/>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>LaunchScreen</string>
|
<string>LaunchScreen</string>
|
||||||
<key>UIRequiredDeviceCapabilities</key>
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
#import <UIKit/UIKit.h>
|
|
||||||
|
|
||||||
#import "AppDelegate.h"
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
@autoreleasepool {
|
|
||||||
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -23,11 +23,6 @@ target 'ChatRN' do
|
|||||||
:app_path => "#{Pod::Config.instance.installation_root}/.."
|
:app_path => "#{Pod::Config.instance.installation_root}/.."
|
||||||
)
|
)
|
||||||
|
|
||||||
target 'ChatRNTests' do
|
|
||||||
inherit! :complete
|
|
||||||
# Pods for testing
|
|
||||||
end
|
|
||||||
|
|
||||||
post_install do |installer|
|
post_install do |installer|
|
||||||
# https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202
|
# https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202
|
||||||
react_native_post_install(
|
react_native_post_install(
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ module.exports = makeMetroConfig({
|
|||||||
resolveRequest: MetroSymlinksResolver(),
|
resolveRequest: MetroSymlinksResolver(),
|
||||||
extraNodeModules,
|
extraNodeModules,
|
||||||
nodeModulesPaths,
|
nodeModulesPaths,
|
||||||
|
sourceExts: ["mjs", "js", "json", "ts", "tsx"],
|
||||||
},
|
},
|
||||||
sourceExts: ["mjs", "js", "json", "ts", "tsx"],
|
|
||||||
watchFolders,
|
watchFolders,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "chat-rn",
|
"name": "chat-rn",
|
||||||
"version": "1.0.134",
|
"private": true,
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"android": "react-native run-android",
|
"android": "react-native run-android",
|
||||||
@@ -12,46 +12,38 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@azure/core-asynciterator-polyfill": "^1.0.2",
|
"@azure/core-asynciterator-polyfill": "^1.0.2",
|
||||||
"@bacons/text-decoder": "0.0.0",
|
"@bacons/text-decoder": "0.0.0",
|
||||||
"@craftzdog/react-native-buffer": "6.0.5",
|
"@op-engineering/op-sqlite": "14.1.0",
|
||||||
"@op-engineering/op-sqlite": "^11.4.8",
|
"@react-native-clipboard/clipboard": "1.16.3",
|
||||||
"@react-native-clipboard/clipboard": "1.16.1",
|
|
||||||
"@react-native-community/netinfo": "11.4.1",
|
"@react-native-community/netinfo": "11.4.1",
|
||||||
"@react-navigation/native": "7.0.19",
|
"@react-navigation/native": "7.1.14",
|
||||||
"@react-navigation/native-stack": "7.2.1",
|
"@react-navigation/native-stack": "7.3.19",
|
||||||
"clsx": "^2.0.0",
|
|
||||||
"cojson": "workspace:*",
|
|
||||||
"cojson-transport-ws": "workspace:*",
|
|
||||||
"jazz-react-native": "workspace:*",
|
|
||||||
"jazz-tools": "workspace:*",
|
"jazz-tools": "workspace:*",
|
||||||
"react": "19.0.0",
|
"react": "19.1.0",
|
||||||
"react-native": "0.79.2",
|
"react-native": "0.80.0",
|
||||||
"react-native-get-random-values": "^1.11.0",
|
"react-native-get-random-values": "^1.11.0",
|
||||||
"react-native-mmkv": "^3.2.0",
|
"react-native-mmkv": "3.3.0",
|
||||||
"react-native-polyfill-globals": "^3.1.0",
|
"react-native-safe-area-context": "5.5.0",
|
||||||
"react-native-safe-area-context": "4.12.0",
|
"react-native-screens": "4.11.1",
|
||||||
"react-native-screens": "4.4.0",
|
|
||||||
"react-native-url-polyfill": "^2.0.0",
|
|
||||||
"readable-stream": "4.7.0"
|
"readable-stream": "4.7.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@babel/core": "^7.25.2",
|
||||||
|
"@babel/plugin-transform-export-namespace-from": "^7.27.1",
|
||||||
"@babel/preset-env": "^7.25.3",
|
"@babel/preset-env": "^7.25.3",
|
||||||
"@babel/runtime": "^7.25.0",
|
"@babel/runtime": "^7.25.0",
|
||||||
"@react-native-community/cli": "15.0.1",
|
"@react-native-community/cli": "19.0.0",
|
||||||
"@react-native-community/cli-platform-android": "15.0.1",
|
"@react-native-community/cli-platform-android": "19.0.0",
|
||||||
"@react-native-community/cli-platform-ios": "15.0.1",
|
"@react-native-community/cli-platform-ios": "19.0.0",
|
||||||
"@react-native/babel-preset": "0.76.7",
|
"@react-native/babel-preset": "0.80.0",
|
||||||
"@react-native/eslint-config": "0.76.7",
|
"@react-native/eslint-config": "0.80.0",
|
||||||
"@react-native/metro-config": "0.76.7",
|
"@react-native/metro-config": "0.80.0",
|
||||||
"@react-native/typescript-config": "0.76.7",
|
"@react-native/typescript-config": "0.80.0",
|
||||||
"@rnx-kit/metro-config": "^2.0.1",
|
"@rnx-kit/metro-config": "^2.0.1",
|
||||||
"@rnx-kit/metro-resolver-symlinks": "^0.2.1",
|
"@rnx-kit/metro-resolver-symlinks": "^0.2.5",
|
||||||
"@types/react": "^18.3.12",
|
"@types/react": "^19.1.0",
|
||||||
"@types/react-test-renderer": "^18.0.0",
|
|
||||||
"eslint": "^8.19.0",
|
"eslint": "^8.19.0",
|
||||||
"pod-install": "^0.3.5",
|
"pod-install": "^0.3.5",
|
||||||
"prettier": "2.8.8",
|
"prettier": "2.8.8",
|
||||||
"react-test-renderer": "18.3.1",
|
|
||||||
"typescript": "5.6.2"
|
"typescript": "5.6.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
useNavigationContainerRef,
|
useNavigationContainerRef,
|
||||||
} from "@react-navigation/native";
|
} from "@react-navigation/native";
|
||||||
import { createNativeStackNavigator } from "@react-navigation/native-stack";
|
import { createNativeStackNavigator } from "@react-navigation/native-stack";
|
||||||
import { JazzProvider } from "jazz-react-native";
|
import { JazzReactNativeProvider } from "jazz-tools/react-native";
|
||||||
import React, { StrictMode, useEffect, useState } from "react";
|
import React, { StrictMode, useEffect, useState } from "react";
|
||||||
import { Linking } from "react-native";
|
import { Linking } from "react-native";
|
||||||
import { apiKey } from "./apiKey";
|
import { apiKey } from "./apiKey";
|
||||||
@@ -49,7 +49,7 @@ function App() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<StrictMode>
|
<StrictMode>
|
||||||
<JazzProvider
|
<JazzReactNativeProvider
|
||||||
sync={{
|
sync={{
|
||||||
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
|
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
|
||||||
}}
|
}}
|
||||||
@@ -67,7 +67,7 @@ function App() {
|
|||||||
/>
|
/>
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
</NavigationContainer>
|
</NavigationContainer>
|
||||||
</JazzProvider>
|
</JazzReactNativeProvider>
|
||||||
</StrictMode>
|
</StrictMode>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import Clipboard from "@react-native-clipboard/clipboard";
|
import Clipboard from "@react-native-clipboard/clipboard";
|
||||||
import { useAccount, useCoState } from "jazz-react-native";
|
|
||||||
import { CoPlainText, Group, ID, Loaded, Profile } from "jazz-tools";
|
import { CoPlainText, Group, ID, Loaded, Profile } from "jazz-tools";
|
||||||
|
import { useAccount, useCoState } from "jazz-tools/react-native";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import {
|
import {
|
||||||
Alert,
|
|
||||||
Button,
|
Button,
|
||||||
FlatList,
|
FlatList,
|
||||||
KeyboardAvoidingView,
|
KeyboardAvoidingView,
|
||||||
@@ -19,6 +18,7 @@ import { Chat, Message } from "./schema";
|
|||||||
export function ChatScreen({ navigation }: { navigation: any }) {
|
export function ChatScreen({ navigation }: { navigation: any }) {
|
||||||
const { me, logOut } = useAccount();
|
const { me, logOut } = useAccount();
|
||||||
const [chatId, setChatId] = useState<string>();
|
const [chatId, setChatId] = useState<string>();
|
||||||
|
const [chatIdInput, setChatIdInput] = useState<string>();
|
||||||
const loadedChat = useCoState(Chat, chatId, { resolve: { $each: true } });
|
const loadedChat = useCoState(Chat, chatId, { resolve: { $each: true } });
|
||||||
const [message, setMessage] = useState("");
|
const [message, setMessage] = useState("");
|
||||||
const profile = useCoState(Profile, me._refs.profile?.id, {});
|
const profile = useCoState(Profile, me._refs.profile?.id, {});
|
||||||
@@ -36,10 +36,8 @@ export function ChatScreen({ navigation }: { navigation: any }) {
|
|||||||
<Button
|
<Button
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
if (loadedChat?.id) {
|
if (loadedChat?.id) {
|
||||||
Clipboard.setString(
|
Clipboard.setString(loadedChat.id);
|
||||||
`https://chat.jazz.tools/#/chat/${loadedChat.id}`,
|
console.log("Copied to clipboard", `Chat ID: ${loadedChat.id}`);
|
||||||
);
|
|
||||||
Alert.alert("Copied to clipboard", `Chat ID: ${loadedChat.id}`);
|
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
title="Share"
|
title="Share"
|
||||||
@@ -56,27 +54,11 @@ export function ChatScreen({ navigation }: { navigation: any }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const joinChat = () => {
|
const joinChat = () => {
|
||||||
Alert.prompt(
|
if (chatIdInput) {
|
||||||
"Join Chat",
|
setChatId(chatIdInput as ID<Chat>);
|
||||||
"Enter the Chat ID (example: co_zBGEHYvRfGuT2YSBraY3njGjnde)",
|
} else {
|
||||||
[
|
console.warn("Error: Chat ID cannot be empty.");
|
||||||
{
|
}
|
||||||
text: "Cancel",
|
|
||||||
style: "cancel",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: "Join",
|
|
||||||
onPress: (chatId) => {
|
|
||||||
if (chatId) {
|
|
||||||
setChatId(chatId);
|
|
||||||
} else {
|
|
||||||
Alert.alert("Error", "Chat ID cannot be empty.");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"plain-text",
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const sendMessage = () => {
|
const sendMessage = () => {
|
||||||
@@ -153,6 +135,16 @@ export function ChatScreen({ navigation }: { navigation: any }) {
|
|||||||
<TouchableOpacity onPress={createChat} style={styles.newChatButton}>
|
<TouchableOpacity onPress={createChat} style={styles.newChatButton}>
|
||||||
<Text style={styles.buttonText}>Start new chat</Text>
|
<Text style={styles.buttonText}>Start new chat</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
|
<Text style={styles.usernameLabel}>Join existing chat</Text>
|
||||||
|
<TextInput
|
||||||
|
style={styles.chatIdInput}
|
||||||
|
placeholder="Chat ID"
|
||||||
|
value={chatIdInput ?? ""}
|
||||||
|
onChangeText={setChatIdInput}
|
||||||
|
textAlignVertical="center"
|
||||||
|
onSubmitEditing={joinChat}
|
||||||
|
testID="chat-id-input"
|
||||||
|
/>
|
||||||
<TouchableOpacity onPress={joinChat} style={styles.joinChatButton}>
|
<TouchableOpacity onPress={joinChat} style={styles.joinChatButton}>
|
||||||
<Text style={styles.buttonText}>Join chat</Text>
|
<Text style={styles.buttonText}>Join chat</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
@@ -205,27 +197,91 @@ export function ChatScreen({ navigation }: { navigation: any }) {
|
|||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: {
|
container: {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
flexDirection: "column",
|
},
|
||||||
height: "100%",
|
welcomeContainer: {
|
||||||
|
flex: 1,
|
||||||
|
alignItems: "center",
|
||||||
|
justifyContent: "center",
|
||||||
|
padding: 16,
|
||||||
|
},
|
||||||
|
usernameLabel: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: "bold",
|
||||||
|
marginBottom: 16,
|
||||||
|
},
|
||||||
|
usernameInput: {
|
||||||
|
width: 160,
|
||||||
|
height: 48,
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: "#ddd",
|
||||||
|
borderRadius: 8,
|
||||||
|
paddingHorizontal: 8,
|
||||||
|
marginBottom: 24,
|
||||||
|
},
|
||||||
|
chatIdInput: {
|
||||||
|
width: 320,
|
||||||
|
height: 48,
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: "#ddd",
|
||||||
|
borderRadius: 8,
|
||||||
|
paddingHorizontal: 8,
|
||||||
|
marginBottom: 24,
|
||||||
|
marginTop: 8,
|
||||||
|
},
|
||||||
|
newChatButton: {
|
||||||
|
backgroundColor: "#3B82F6",
|
||||||
|
padding: 16,
|
||||||
|
borderRadius: 8,
|
||||||
|
marginBottom: 24,
|
||||||
|
},
|
||||||
|
joinChatButton: {
|
||||||
|
backgroundColor: "#10B981",
|
||||||
|
padding: 16,
|
||||||
|
borderRadius: 8,
|
||||||
|
},
|
||||||
|
buttonText: {
|
||||||
|
color: "white",
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: "bold",
|
||||||
|
textAlign: "center",
|
||||||
|
},
|
||||||
|
messageList: {
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
inputContainer: {
|
||||||
|
padding: 12,
|
||||||
|
},
|
||||||
|
inputWrapper: {
|
||||||
|
flexDirection: "row",
|
||||||
|
alignItems: "center",
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: "#ddd",
|
||||||
|
borderRadius: 8,
|
||||||
|
paddingHorizontal: 12,
|
||||||
|
},
|
||||||
|
messageInput: {
|
||||||
|
flex: 1,
|
||||||
|
height: 32,
|
||||||
|
paddingHorizontal: 8,
|
||||||
|
},
|
||||||
|
sendButton: {
|
||||||
|
paddingHorizontal: 16,
|
||||||
},
|
},
|
||||||
messageContainer: {
|
messageContainer: {
|
||||||
borderRadius: 8,
|
flexDirection: "column",
|
||||||
paddingVertical: 4,
|
alignItems: "flex-start",
|
||||||
paddingHorizontal: 6,
|
marginBottom: 8,
|
||||||
maxWidth: "80%",
|
|
||||||
},
|
},
|
||||||
myMessage: {
|
myMessage: {
|
||||||
backgroundColor: "#e5e7eb", // gray-200
|
|
||||||
alignSelf: "flex-end",
|
alignSelf: "flex-end",
|
||||||
textAlign: "right",
|
|
||||||
},
|
},
|
||||||
otherMessage: {
|
otherMessage: {
|
||||||
backgroundColor: "#d1d5db", // gray-300
|
|
||||||
alignSelf: "flex-start",
|
alignSelf: "flex-start",
|
||||||
},
|
},
|
||||||
senderName: {
|
senderName: {
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
color: "#6b7280", // gray-500
|
color: "#666",
|
||||||
|
marginBottom: 4,
|
||||||
},
|
},
|
||||||
textRight: {
|
textRight: {
|
||||||
textAlign: "right",
|
textAlign: "right",
|
||||||
@@ -234,92 +290,27 @@ const styles = StyleSheet.create({
|
|||||||
textAlign: "left",
|
textAlign: "left",
|
||||||
},
|
},
|
||||||
messageContent: {
|
messageContent: {
|
||||||
position: "relative",
|
backgroundColor: "#f0f0f0",
|
||||||
flexDirection: "row",
|
borderRadius: 8,
|
||||||
alignItems: "flex-end",
|
padding: 8,
|
||||||
justifyContent: "space-between",
|
|
||||||
},
|
},
|
||||||
messageText: {
|
messageText: {
|
||||||
color: "#000000",
|
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
maxWidth: "85%",
|
|
||||||
},
|
},
|
||||||
timestamp: {
|
timestamp: {
|
||||||
fontSize: 10,
|
fontSize: 10,
|
||||||
color: "#6b7280", // gray-500
|
color: "#666",
|
||||||
textAlign: "right",
|
marginTop: 4,
|
||||||
marginLeft: 8,
|
|
||||||
},
|
},
|
||||||
timestampOther: {
|
timestampOther: {
|
||||||
|
textAlign: "left",
|
||||||
marginTop: 8,
|
marginTop: 8,
|
||||||
},
|
},
|
||||||
timestampMy: {
|
timestampMy: {
|
||||||
|
textAlign: "right",
|
||||||
marginTop: 4,
|
marginTop: 4,
|
||||||
},
|
},
|
||||||
welcomeContainer: {
|
avatar: {
|
||||||
flex: 1,
|
|
||||||
flexDirection: "column",
|
|
||||||
height: "100%",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center",
|
|
||||||
},
|
|
||||||
usernameLabel: {
|
|
||||||
fontSize: 16,
|
|
||||||
fontWeight: "bold",
|
|
||||||
marginBottom: 24,
|
|
||||||
},
|
|
||||||
usernameInput: {
|
|
||||||
borderRadius: 4,
|
|
||||||
height: 48,
|
|
||||||
padding: 8,
|
|
||||||
marginBottom: 48,
|
|
||||||
width: 160,
|
|
||||||
borderWidth: 1,
|
|
||||||
borderColor: "#e5e7eb", // gray-200
|
|
||||||
},
|
|
||||||
newChatButton: {
|
|
||||||
backgroundColor: "#3b82f6", // blue-500
|
|
||||||
padding: 16,
|
|
||||||
borderRadius: 6,
|
|
||||||
},
|
|
||||||
joinChatButton: {
|
|
||||||
backgroundColor: "#10b981", // green-500
|
|
||||||
padding: 16,
|
|
||||||
borderRadius: 6,
|
|
||||||
marginTop: 16,
|
|
||||||
},
|
|
||||||
buttonText: {
|
|
||||||
color: "white",
|
|
||||||
fontWeight: "600",
|
|
||||||
},
|
|
||||||
messageList: {
|
|
||||||
flex: 1,
|
|
||||||
},
|
|
||||||
inputContainer: {
|
|
||||||
paddingVertical: 16,
|
|
||||||
paddingHorizontal: 10,
|
|
||||||
backgroundColor: "white",
|
|
||||||
borderTopWidth: 1,
|
|
||||||
borderTopColor: "#d1d5db", // gray-300
|
|
||||||
},
|
|
||||||
inputWrapper: {
|
|
||||||
flex: 1,
|
|
||||||
flexDirection: "row",
|
|
||||||
alignItems: "center",
|
|
||||||
margin: 5,
|
|
||||||
},
|
|
||||||
messageInput: {
|
|
||||||
borderRadius: 20,
|
|
||||||
height: 32,
|
|
||||||
paddingVertical: 0,
|
|
||||||
paddingHorizontal: 8,
|
|
||||||
borderWidth: 1,
|
|
||||||
borderColor: "#e5e7eb", // gray-200
|
|
||||||
flex: 1,
|
|
||||||
},
|
|
||||||
sendButton: {
|
|
||||||
marginLeft: 10,
|
|
||||||
backgroundColor: "#d1d5db", // gray-300
|
|
||||||
borderRadius: 16,
|
borderRadius: 16,
|
||||||
height: 32,
|
height: 32,
|
||||||
width: 32,
|
width: 32,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useAcceptInvite } from "jazz-react-native";
|
import { useAcceptInviteNative } from "jazz-tools/react-native";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { Text } from "react-native";
|
import { Text } from "react-native";
|
||||||
import { Chat } from "./schema";
|
import { Chat } from "./schema";
|
||||||
@@ -8,7 +8,7 @@ export function HandleInviteScreen({
|
|||||||
}: {
|
}: {
|
||||||
navigation: any;
|
navigation: any;
|
||||||
}) {
|
}) {
|
||||||
useAcceptInvite({
|
useAcceptInviteNative({
|
||||||
invitedObjectSchema: Chat,
|
invitedObjectSchema: Chat,
|
||||||
onAccept: async (chatId) => {
|
onAccept: async (chatId) => {
|
||||||
navigation.navigate("ChatScreen", { chatId });
|
navigation.navigate("ChatScreen", { chatId });
|
||||||
|
|||||||
@@ -4,9 +4,6 @@
|
|||||||
import { polyfillGlobal } from "react-native/Libraries/Utilities/PolyfillFunctions";
|
import { polyfillGlobal } from "react-native/Libraries/Utilities/PolyfillFunctions";
|
||||||
// import 'react-native-polyfill-globals/auto';
|
// import 'react-native-polyfill-globals/auto';
|
||||||
|
|
||||||
import { Buffer } from "@craftzdog/react-native-buffer";
|
|
||||||
polyfillGlobal("Buffer", () => Buffer);
|
|
||||||
|
|
||||||
// @ts-expect-error - @types/readable-stream doesn't have ReadableStream type
|
// @ts-expect-error - @types/readable-stream doesn't have ReadableStream type
|
||||||
import { ReadableStream } from "readable-stream";
|
import { ReadableStream } from "readable-stream";
|
||||||
polyfillGlobal("ReadableStream", () => ReadableStream);
|
polyfillGlobal("ReadableStream", () => ReadableStream);
|
||||||
|
|||||||