From dc55f580049d284c6e01271e3885c4fa23a8f458 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Tue, 19 Jul 2022 15:37:24 -0500 Subject: [PATCH] Replace mobx-state-tree with mobx and get a basic home feed rendering --- README.md | 4 +- package.json | 6 +- src/App.native.tsx | 28 ++++- src/App.web.tsx | 28 ++++- src/assets/alice.jpg | Bin 0 -> 25330 bytes src/assets/bob.jpg | Bin 0 -> 45720 bytes src/assets/carla.jpg | Bin 0 -> 12259 bytes src/state/index.ts | 33 ++--- src/state/{env.ts => lib/api.ts} | 59 +++------ src/state/lib/type-guards.ts | 10 ++ src/state/models/feed-view.ts | 98 +++++++++++++++ src/state/models/me.ts | 79 ++++++------ src/state/models/root-store.ts | 46 ++++--- src/state/models/session.ts | 199 ++++++++++++++++--------------- src/view/com/Feed.tsx | 17 +++ src/view/com/FeedItem.tsx | 104 ++++++++++++++++ src/view/screens/Home.tsx | 25 ++-- src/view/screens/Login.tsx | 32 ++--- src/view/screens/Signup.tsx | 14 +-- yarn.lock | 25 ++-- 20 files changed, 534 insertions(+), 273 deletions(-) create mode 100644 src/assets/alice.jpg create mode 100644 src/assets/bob.jpg create mode 100644 src/assets/carla.jpg rename src/state/{env.ts => lib/api.ts} (85%) create mode 100644 src/state/lib/type-guards.ts create mode 100644 src/state/models/feed-view.ts create mode 100644 src/view/com/Feed.tsx create mode 100644 src/view/com/FeedItem.tsx diff --git a/README.md b/README.md index bbd39046..2133d9c6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Uses: - [React Native](https://reactnative.dev) - [React Native for Web](https://necolas.github.io/react-native-web/) - [React Navigation](https://reactnative.dev/docs/navigation#react-navigation) -- [MobX](https://mobx.js.org/README.html) and [MobX State Tree](https://mobx-state-tree.js.org/) +- [MobX](https://mobx.js.org/README.html) - [Async Storage](https://github.com/react-native-async-storage/async-storage) ## TODOs @@ -54,7 +54,7 @@ The `metro.config.js` file rewrites a couple of imports. This is partly to work ### Cryptography -For native builds, we must provide a polyfill of `webcrypto`. We use a custom native module AppSecureRandom (based on [react-native-securerandom](https://github.com/robhogan/react-native-securerandom)) for the CRNG and [msrcrypto](https://github.com/kevlened/msrCrypto) for the cryptography. +For native builds, we must provide a polyfill of `webcrypto`. We use a custom native module AppSecureRandom (based on [react-native-securerandom](https://github.com/robhogan/react-native-securerandom)) for the CRNG and [msrcrypto](https://github.com/microsoft/MSR-JavaScript-Crypto) for the cryptography. **NOTE** Keys are not currently stored securely. diff --git a/package.json b/package.json index ed5c2025..7c87b38e 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "dependencies": { "@adxp/auth": "*", "@adxp/common": "*", - "@adxp/mock-api": "git+ssh://git@github.com:bluesky-social/adx-mock-api.git#0bccd04217c78a7c9786a45684ac2ffb9767429b", + "@adxp/mock-api": "git+ssh://git@github.com:bluesky-social/adx-mock-api.git#74a1f810a342aa4b58a54724e21c57d2faa5e72e", "@react-native-async-storage/async-storage": "^1.17.6", "@react-navigation/bottom-tabs": "^6.3.1", "@react-navigation/native": "^6.0.10", @@ -23,9 +23,9 @@ "@react-navigation/stack": "^6.2.1", "@zxing/text-encoding": "^0.9.0", "base64-js": "^1.5.1", - "mobx": "^6.6.0", + "mobx": "^6.6.1", "mobx-react-lite": "^3.4.0", - "mobx-state-tree": "^5.1.5", + "moment": "^2.29.4", "react": "17.0.2", "react-dom": "17.0.2", "react-native": "0.68.2", diff --git a/src/App.native.tsx b/src/App.native.tsx index 1326b184..071b7457 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -1,11 +1,35 @@ import 'react-native-url-polyfill/auto' import React, {useState, useEffect} from 'react' +import moment from 'moment' import {whenWebCrypto} from './platform/polyfills.native' -import {RootStore, setupState, RootStoreProvider} from './state' +import {RootStoreModel, setupState, RootStoreProvider} from './state' import * as Routes from './view/routes' +moment.updateLocale('en', { + relativeTime: { + future: 'in %s', + past: '%s ago', + s: 'a few seconds', + ss: '%ds', + m: 'a minute', + mm: '%dm', + h: 'an hour', + hh: '%dh', + d: 'a day', + dd: '%dd', + w: 'a week', + ww: '%dw', + M: 'a month', + MM: '%dmo', + y: 'a year', + yy: '%dy', + }, +}) + function App() { - const [rootStore, setRootStore] = useState(undefined) + const [rootStore, setRootStore] = useState( + undefined, + ) // init useEffect(() => { diff --git a/src/App.web.tsx b/src/App.web.tsx index 34b6ac6c..a6f98487 100644 --- a/src/App.web.tsx +++ b/src/App.web.tsx @@ -1,9 +1,33 @@ import React, {useState, useEffect} from 'react' -import {RootStore, setupState, RootStoreProvider} from './state' +import moment from 'moment' +import {RootStoreModel, setupState, RootStoreProvider} from './state' import * as Routes from './view/routes' +moment.updateLocale('en', { + relativeTime: { + future: 'in %s', + past: '%s ago', + s: 'a few seconds', + ss: '%ds', + m: 'a minute', + mm: '%dm', + h: 'an hour', + hh: '%dh', + d: 'a day', + dd: '%dd', + w: 'a week', + ww: '%dw', + M: 'a month', + MM: '%dmo', + y: 'a year', + yy: '%dy', + }, +}) + function App() { - const [rootStore, setRootStore] = useState(undefined) + const [rootStore, setRootStore] = useState( + undefined, + ) // init useEffect(() => { diff --git a/src/assets/alice.jpg b/src/assets/alice.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83555d962565eef02af4ea436f1dffd0c5ba1f50 GIT binary patch literal 25330 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 literal 0 HcmV?d00001 diff --git a/src/assets/bob.jpg b/src/assets/bob.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0567772b6a2c2921a0471610f6ccff6e12da3bc3 GIT binary patch literal 45720 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 Fe*hK1gkt~z literal 0 HcmV?d00001 diff --git a/src/assets/carla.jpg b/src/assets/carla.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f26734280586e413df743027c9b88528a253a839 GIT binary patch literal 12259 zcmbulWmH}<(>A)%0xj;Yg(Agnw79#w%MBEFcPZ{r+}+)+xVt;WU5Yz=JkR^RYn?ym z$605xvsN-$nVm^8vv;n{`_lU+fFda>Aqqf1006{C0^V1FUjWR13HF2F;6Kur&j<*g zzn~!^eIzt|R1DOQ2OozJ2kRr#k`WP+(K6F~qhaP|W8;<|g|G542Pn$`bcc)JRc0BkzblpkfdEEr#?+*b9E zB8$&tRe9PZZ+56($61Q}$0T8dT=vf9Q&jcQr%uBPziDJysrv$eP|JDJ3%!)OH%UEl zm&8-FML}a10D-!1o^qW}k-4KYsZdQw<+6Lm4}41htTOQS=1jT0+*<~snm5*jTJ2=l z^#x!*Aq$O-(P!mWyMU~S(%AkyK<~5y03>?f)9mfTTgFvXnbHP#nb`0NkKU9vp+-Fb zAbIVhpCx%NT(2}0C>!~Mf^$ot9E`M@PypcH{;@qvd+hoT12PQmT4)KaMc%(KqLuEhVTLXYViz>9#MQNKwOZ@&x-tWZ&eyGYyeE>qc*KJnV zan0qjCBaRUT*agqxuXF53;@t3jl0{u9h2YIzz7Ws5X|R3wgB+0(x~rBFFyIzX^%Ee z9#3riwMNtU??U4e03gS-yI-W)pFQ+V%uJtH{wP9U=&8rCZTpyH0Q`DSD?^kyyL@Qe z!v9f+!1eWv6tLua2k!pU?9HOGW+)MkA8J;q^&ts>x*o509?`KjFmtN*No~mznBf25 z=DCHFX-v1CS+7L&y!3kVYUrRFez4)HFwLE@#BLboM_>LP6i>a}B^a+K`F^})ScUyq zVV02B*S07^?7A~z)B$ax>Z6AmL3n&5)tmnaQ!_o`4$;uizrW~6WgiXptV*4IZCv38 z*vgtZNYefctgnehLLZ_8T(57RuTMAp_A3p;4Xlk&`ONrc^XUG4tdL>O?gOz;cFPMk z(q)|GP0bPS-0f-l6acW!_u*&mtyB%(*d)6hTz(t+7xZTG7ML=<`LXL7)^wZaj;q@i zgK8+U6s)WVls%6_vjKpZdd<gn?%008}k#fRJ{cYs?jMaRlV zonTMkoXw{iZlKg<)%RmkC)W0^?=z|=N1s??Z)2Cc{=@RTd_Zn-Bg(}4TP9WW(FfAM zn5o9juHA^*>Ucl>l>cJ*j{SU%=WWls24|u-u z_?T8KHM83#1D>hx0K=_S{bI;LE71x+Bug4Y1D;n!83_OXoPeq=}^G5|1wB>|W>?zFQ&nkWD|?@8{a8#4+ZJ^gomX5~7U1Q<@T z@JQ*1##ccBsESVM_ix!ek-voi%yox%^F9+d;=T~^Gww28??9TOApqS*w0eNS4?rPX z9P%o0`U1Uz7iIRmX5IsRzEFZC6A`t&^x1$?UgW%RbzL!lhhfZw{>#b+Ko*D&uY(IW zb36mSKZ)>>jl#998t>fs!j5MNJoKU*E;9yggq@rphp8TeN23cu`Ro%R7+b!XX;U7{AZGP zKo*p^zOBTgqMcxFz`3q!0V9F$JNh{3Av(x&F51L7B9~;OcuH{KMm&4*VxGC(6EwgY zX*Ori^d*s3O8{w!?ocl+rUj=s_?lf)sHZ9cGbL$ zD3j)WCBpoQbXF?I`$w1MKkQMsu|?7q& z-h?C13rP4N8>wkb2Bv0opJx)0`7`(w`OUfQ6MbgNymdAx^OIzo*L&V z5n-z%XTT>&k56b``-@vHk?wINv61rH!4O$!x#!?=GjGribzL<<$*Rj`=-i`ln;6q% z@aEnYrXzm41HPY@v4m^`3Q~RPd^o%O}jKZ-4W#r-xYrfcpk9h|C zWFE@bG7uGa!Od`ppKIg^DYG)vf|x+#iC&Yu1%t)SeMFhU@%WK2l_^DzDdzAnycPKc zIks@1H)3D7v^X4ZYflT~N28PX?>Qr`une?^+ACZB1u`q6Jzi2^z)<7gvw9R*&)3+x zwqPk)S;o@{>3BP+Hpn|b*x13li|~p!=vqdT(F{7J7a`-W&?T|c1{CfyLk&*o1zy6%zNEvPJ^2QgKC`*3?DrP%(esJ=-3I|Te_*^doWuuqADUWb^6J%$%90q!7>9RVsazT(l z!cGcUgRS|Gat>#ditv_-(+I;%>Iz+9G*+6qhp4#dyspv))MQz8G<6oX4=t6rpOhgf z?T%}M0(Qc}@}er z4v!3TKfE{=q5QLvmN-@deaIhs2VeU$WR!-s6Ni09&85Y!1vkaf#YZH|-2-2(h3#DM z!a(4lW0Ix6MYXxP$6;@?1l5*L+u5UdqevqZNWx-VSbuu2(~9pA`#~gbYet{z zx>&}Xp++KbA$Ri4KX=PKd}%}5&A17I7G4|^P7$jhF}fi^>VmC=Z~QPk;9w=9+DaNo z0*D9`j$iBv7lvOel(~kG!l_Hk5h-n=>}gua5^$87uq55gwBYdabG_^k*({SJtLuGM zD9uJH%uA_gYC1dGacCn3b*y7m-?MO*sOrq5Es0Q{msegUaJEa+}XybRx~AsuFJ#u>(@vK^f)~lR8A%dLFL$0ZMpDoT}8bv(?JA1;Y~}c%y^Pyk&`Z zS$?}KlrdX^&2A@%L=&a1APYnNN;%~qkD<`y!6-Ico;fsRad@Zqx9mwpYlq~jN>$7o z`M;87rA|MDZYJGZVTpL|ennJQqZaGfyQVr+%=P$>#LN}E5>B( zL`24oL01O2jE9-+d#f_zl$;oatm+g5VFM8h7&#mNy}4hiG6hMcJgs9kBLn@VjACY? zi~3qBaiX{=LD{I_sX6GOV!5c|C=n4^MU!=dc!Ztr9R5PvY}JNsHv~Z*#EEB~p0$ni z0s=U;MH*_d#c>afOp!Qq>aTxfSgXx*n=ib(^zt25wH7&wmdhWI53Otw%e4#-VorIb z?ci`ljBSk;pcR6qkEeZ%%&PwN!zx6ngl)7lqptD&^A?~B6TKoKMOqzLe#`*3*DSsr2ftj0X)U&m1tW{b;ho1l;D}|CkqFi7k z0-cT9bQ;z_0s`8b6LsotKv;LB!G!@`Nxh=OD6CmNh2=BlDnU-ik(A_6Z9CnysCwS z0H*Rw=Y82=>|NMun4J(H6tBRA5N@kD^9~XJ74XKP1 ze*)n}7y34`K_J|N)4PkDM03i4zO5|x zz+C-tGdGakiX&{S&CQMS5d<0`xO#j}b!-E;)MQD&V(cZ^wVuDbB~uHEY-tVhGz6TP zS=vr(JOx8~p8Xlk<#aDYFft)dKwbMvaR#!k6&0mx>4pBbfc9#X)Pbq&?vT1rmT^WY zI1CCYTa_yR>11E-1pA42v46mYop5N{-#zY2RZ6lEc%bC(S4=FCwJYi0Z%r*D#T7fh zcT{Sy1X{Bmz$}5o3@7HW;n@H`N)Kh8M#0^}!%tp2pPq!hXUuU!`#sU7xxsh9)x9CP zAIwjc*Uk?qPKFp#dRQ%l+n%Q|sb?%>WgTGmBwz(8gC}Mam>vVBT!O@=eYPU zi|XU_7FvEm{%W#sdDo&$f?qHM_9$KD`~;t8)4;IrWrYc;yFZ0du?v^ELcYYtd124m zR?=)UT8;$`S*k*lOIBJ+Ce;LXvvd@rCK7DX7HgRZg{xh^bGDentnr>(JQru6S5XU* zfm>oLvLP(+FYHYC?)67@YrTT)hY9=|(Y7E*1e99CHw9foyRtzqKkJgtM+%EKVj4Ue zt?-{k8y)dl%gr=l+KT0^oI$YEaOY^+SEIUoSmu~YS=~rs3%QJzTc~);Gl>cbO8<(H zQ@-k6*yNehVp0CksI)9hIRb;i5 zm**ax-h?nR(}5tfQoCVyCO>x4v&1M-wumP8i!dlQz=js7+V1Vj_R4%kPe_qt@%$YS zexrez#?&qO+lM+%w;cg{rMU!IRuu}Z7d+SyNvY%3i?N}Rcy(NGh}#|WwW*J~QeVQ8 zDkY9+F!J00ufh}drY9=3-G&BHiQzGqvT+(G%_pMFslA2oB*h>X@wkR+Ov7jk`)*s1 zZqTbEg@_T%gva(E!3Botch0;=9l5Wf7gkXgzK5G4)sH`1S+UXctjnAbxuUZ%P~%iD zt)f@0V-7KlpbkJ&X*JS?;SeV~Cqx+do!IsBOhlHSf^mYp*pT&cj*f>IX{k*~ z>f&-U79D6K79a`iK)s)GU%lTrGB=9f0dg{04RsT@Q~cz+$O$`&hEmY4j^w+lU)2=J zar}RV(y8#;^p+9KR1~;8>ar_v-8~+LV}^PZxuV3yQjWz+Z-s-&dgKj74cqG-Q7;dv zQM_mr2O-ceV$O}^7l(A^41by}?cw{JN3}Kuz>=pf^^;XDDI>tLajyUVOQ@iNiR!A- z`V%v;T79p@>XsGyw1&i|OM78OXwQ2+<5_gS z25xaxm?)3MpwZutM%RSPW##DDuLz&5s1SJ^5?*MEoZKZ`UYi~L_}Wr%(Nu152&Flu zCmS<%p$~+&9?Io}A`}K5wVKH1jD#Xz6j$O3EhwmHMnbp9arRLOFc&mnA$)7$@(sd~ zm=@zAJA@06n}_y~M(&NKbi6g zF|`#t(3K7v)?z0Paha({?%j~K0^94DZHts=H||@s?`c}y5*>eox$4RJeaYl(;#+6G z3XfW1#D?{$=(_1B>5Ue-e0lDbOX|+-(;vxjqgy06#crBuXJ|FMBuBr3!j>%#+S|k1 zb9j6I2C&aw{qVy`pTT(had6|^c{Hmb64GW{|X+v zoPIgGtEdda)6frs5RV2^APS2)v0$TShWrvkR9D69koM5dnyyPZCf=*@9=D2VAA2U2 z+j)>n>zsUM>V9aLFuz))RaT9M4GFt(M>;jnYQ?4u=EYSy1389;rRQGXEXy5=06O=s zR^&gfSF$qxOh?k_Kz66h>~%~?R>bHY0zwE_|_>p0!m-!b-uW7uaL2A-E!(V30(YKiLGrB zxQN#fyk9p7_WnTQ?hlt?uTwC+kw2gzaTEaZ0|JDGfro*HgMs;ghCXTlDl{n*nt*}< z3csCSEDZVwIwWXc(~ZHXXqZDTBtMNQtOWLt%iRL81k}zb>pSGt{a>gEkq>wWmiU(j zB8=_U{E80;VM0Fd)QGLGB5WXnUr^-l3Y~E*X&lUq?mBxAeGGiVCr|I%RA0E52l?z9 zdtK3mD7&|<^P6_5G(AEXkIqJVck?`yOk&S0xktN2rC$q!Z`X7ZU(@&-Z2eKhFXGMr zuww9x3DWs@-g0=fdmTDx#<<4`cmI9|AYu}Fx8|N^I;X|j&EEi3~Wb{pbgWkzb#9U?&19zC&ZnQq3@D#x=0fq!#<6S3IVy@0Euz?ksEW zwaeqBT*ov8kwTdep{~3Z6aBNJ;dx2(&^4fxdY=^ z@48AUnoIxiQ$N0lQnvYR01Fx<>(iA$hrGX?2_qVVxrvjI&FLt$3Sfowno|)wr2Yf*gxQbCAAP3 zA@|FtbT$o+iA``VHgLXm@OR-e8?wc6G;RCYBUqD!J%PLW?GL4f(O53X17qO)ygwxx zO-pHpFuVIjlk47;2MdcuWScMDq|lEf3QX(ng6-GgsuwF{;T-1K-q**Xn03C~dB)=7 z5lCeGJXmXi{w?6s9&Beu@6a-Z(wpiOQ5AAbK8mN}1axp0!d1i{XX+-p#M@jR65Z-0 zBMr1?VewwG#;_xq(^eFL8>KxZO=Duri%svn(`0U~v>I~pf)ZOL7e>XA^->WTe}A=y z3z#&VuIm(Xk7|7XPc^W->?ig(*<^hq2k8e#;9R~j7kUc(A@k};fPZJn{otx zNZulb!TS~I*u`XmsgujUWp49vj5}EDUdLvt>^R3NMq)^NnjKY`M`bUEvdLFaYRw)t zNKuI9^oMi6b#Z~|>XwhX*O(GTh-jPmB38M5I&+!_q=Ff74c301h%f;r?9g$tX{rRi zb}*7jKs+o8)3x2V$4>M^7&h1RoEj{$&4A?c+dl!c7v)CZmZXtBtZdX#F;I58x}{2e zi%Ml#BcuhM%oOLG%&)O4p_b&xT)xdxeF;4qiZ<0>=rh>Px=)J6Xd6R&NK?vf8cG7c zzpL7uZkTQ?nmySoPC*02=3ykNLgB0}Y}jjxU&egJIx2h7941#kIl>{k_!JrVGs{NB zIZXJACGj}h!thyz;7Fh~N9E2651J*0xx`3M^+Da=xTr(p%&9&5lRNT&Uur;2Jg11fk3EuL@3(d`@~8n4h!cX!`1id^Gze@ z;LjAH6y$}&G}u}$FuX2ZtWQ>IIJ!go>d>^t`<=hG$zWqRDc!IP&i}->dFxWpk3S8E zMNI9qDMr9mg3xC-dHeBbjM6XUEQC0 zLVjC{c5vuNnH7Y9`b4u;AxezBs3AZVGn>C-0xLtHzITG)7^89EB9l#*{SUSiu~D2a zEnLxmkmtKh?MN@BYD2fKlSe80w05`)-iy5t$v_bx#fb&sLWVd(^DOF1p%gKRWrgg7 zju2(l$h$LC!MI8uvRLnIb2e2&K!m1=3!=6T4dcG4?st00A53r%sm3a`C*5vX5m$ zbN!7))qX2S3r2_f5}-bR9ValZS}nizZ^>v2O%(Z9f@-P{Juv;BhJB}lBDo3Z(@%L3 zZ_# zDaqsTltZNe8)aUaRE*_W^r^Kq7AQNfDW>I1rIsx6M)ovN2KGc(e1du(W7AX8D!Xs6Xdcdi)6naVxmrg6Q}q?pr$Bq8V=xN2&I69kM~R zO|6AbHVX!~3?4d)*qT0fFn1GIe#|eu3JElhQ>Rbm`aL3ycsRHng>)r2ET@iuQ-T6nBwZN$=>BFIyWJmN49FyK-;tF@M2>bi1!=yOjchBui}Sk;XOtp{-^3hC--;%WX(u$>ERsTEr=tf}7ZbZU@XHQ7Y+&)(D{mPB9^ zctfPBfi^ttOu46-WumzG66|D|M~$~;tO3(Uuot|&F)E#1M%_%Z566xCPj0Ns^CbPy zTZL@BMqdZTR`$DkT3g$CGSt|`kIbMUM;eVbiH=r^Nw~pvFKMsH;y38*IwleT)+o*l zUVhjq(c${DHazA18D~7ddk8ZeUk3H6Pat3BZ7c3s_beSH+uHCGO(^1IPz^bz$MLG1 zPccV@dTtx)60gPBxgVSz(`CCa1b=L>9dZiu)cq}>6stdx&X4Mj$=7bvOb(Q1kB`B` z0LENL-s-Z@r-LKf;|KwaJTM|W-@k2QrIN#S2mUpX#o9L@??4(vZd-x=_ykWY?$Z@q zG5Ac!-qixhOJ*ax$OjTh5Oa2_?F6Zl*u}jAGk2dnhyt+I5epK>>?ybsN_Wr5fZ?0ug^HGk$Ya5j#<$sAGSXfG_a@2MDqzG{ts{nq(|zB(G~4T8dX z?(>O*WWR=NsTvuVz(ONL84t$O;*GmnJcOSsE^9)GT-nQs2O(FP+lGfbP)%?YIhmg=kAQ%^m7k>oqv;Sl#j; zRn`<#F@Ie-h6Q+t6Xbs9WB^^z$-DzPGS<3$L-JFIKa@yU2XjC-c37F#B+bKehPS@( z6oHhRpQb*(6{-cw zy1k)O2w;~<%R6I!6Yaexb;X9^NHIT7M?ue*muV!ShG-2Bqd|6^O{E&caP8KwfwM0? z^A@gZ=}(T9YxbQvxlxqKYjc&DYK>72!yQ?Vi1Xt?I`h3|-?z+n#io=9=0m<)b0Q4J z(-OhKtLRpXwsTI~7_0V0L8q;xkCL~VoEFp3%LsNG9dx%H-nflM2i6h)kXOH-FYPT5 zbvmztczI%?HjO#K5IeTWaA2?cHFc-T6z_VZ2>J~bI_ZKCJ-p=faihRvP6t`#8JHTf zoZ?y`2}O?h1C!a&!nhe#OzBTU4R%hVFv2dzOQeIA;xlb;QOup4QT|ZRm}ZfF9|`8pU@TiY0P~iVYODBnBS(2?OZ3l zJML4@oFXvXJy07{zzm4M4G48P)FZpckE= z{Bc_O#0~51+r6#z3OH^3ih1Z1!^El-?POjws}xpq5uZanjHWXDW3d$J*P<4^cw4+QG2fnC?f^LZ!n`XTlvW_GyD z!Yrjuk1V(QU^K5E5J%CHwP#BHXjddY3mM+qIjOWEiR$Uhj6*z|v0Cj)Vr^Q9+xwRX zah%W^tGG1$T^FYXTkGG;h~PFln>XJ8J8dFQnK@aD2nVI3>hJB-xW>Y(kG{mFrO26Z zgw)S;|DfoaY(tV@!lA?@#e#UwOfmmq;6M_&e_VKHPt(`09-f~K#eMbs5gh{6{X%=N zjT&{57TC}fX9&NPzo}AK-!#$Jb(rG-vU#b_8+-MF5pbg{e9FfU1r^7AolG|(%sW%V zdrKjS5=j+~V;0x@89xcF^48&OSm!Dcnv(JoYW&HRGUrT^1vhRzqBpW+`cFgAU$J7% zf_+hTZ^>P&8`my>ptB3)vks#SWS;&kt5H=vlU< zZ5Q4!kW`NDp!Fhpail26H7Cn#Kd{uEC7{~5mHiHw@fA5EIvfcN^jlTrw#hNn%!~vC zP=s|pOD$9|E+h^vV7w(X?Quzzd_P+XB7d~qb2#2G`K=nKQ9sJO8E~prHKLamSevyT zWc*FgAxegj_aECrQxb0)qUjT2fBy*27+p*imF>Vqfg^^jw>Xm7gq$r7h74*L6o#jP z(AdiXAm7NXb+Udx-UD6j}EzHXDbD=ac!-`)Gmk{p7 z?%ISV*V#qMv070F?ZZ1n#?kt8j}rw2^PG1Jn0y2`NtB(>t>Nl&@r3wpii_^^>6#BJ z)fA#JUthW=Jt zMcu$ZIg=sDqza9?$gLXg^CH?!{Dlw@qsr0e?Ef}s$GRc|-mYn~_8BLCYbY|qPEEXq zti>Ka$SlXxvWIa1SqMU9WY&xs1iCSn@KEHPDe4`oIH|9)$@e(g8AlPFs5x6CKZ zi$9iA+Tdq>&6?pUs=rrAKiD?ps}RAk%@&_l5aZ8-49&R$Qr9&uxD{A?I29+Bna-u&RrKHLy*;XSa;J5U&; zPGMT0SXmVElKh0oO6tE(DyFz;+{MYs!-ujO97bC}AU5<@C~Qyq$|)kd)KB5qg;@fl zLz>w*Br@z)w$Bw3zSx^wDoGt&|9fN&P$k|EDt12-c3za8_SY_d{)e4HZiZ91P{Ckj z)R4u*Rj88ID!$DTJ>p?XdU75|;MWO7S;;b38zEXNyjz0;MPv-q4smt+ujC9oJCMN$ zg+ds|mmh#1y-{ADA^Nv6Oq@Ip_ctw3oeg=60H#5%ChPc&WX>Fn97(yiAq-zHvj{y| zvJ-c=_0^O6{9f7e#55m)-KR0f%qgPCuZAAo1jXf*fwoV$kMG1A@Nh z;xo!dPG8Cy1$IT~f7iU!=&VzC!x8)54N+F;i}MTPKv9jwc}lQ$z!~BYpdmL`m~2sX zaKVvc(0ka8-H4D2(TKOt`<0o+nZ}856F^e?-$2yZ?Wj47(4Y4Vb+J^%zyp_0sMEQ6 zr2$s7;3)a{SL%FWTo)B0qwU8XH2wm|N3adLThH1CSbQZm6L z0ykrQ@BW|=o2$I`bQcbWZ5|=&m!Ztp`ieh7yBunl^4m8DJ-(3PZi>-(+)v-t=(UEN zTg^AbtPlRtvIw6;ROdgVYu+WmHA=Oq3j)l?*fvnxV#zrhRolGtZ#%;KzQcK4jy-AQ zL_b5%NJ1uA?7a7(c$JIEMMTbv0k6`15NrLk_rtQ!sbR2tYUrdODFuzc1P9t9=^acr1=s-8_~~3S0pJ0yxH5f zaSpf;G+|D1R}Z{78!h?v#LWm;KAJ~}E~FUooJ-isnp12JoIz-Lp9U$qI?gz?pWyN2 z-I<8grt_vw8}_4A8br);q8QNhC)?+{>vZAyKTQZj*O - storage.save(ROOT_STATE_STORAGE_KEY, snapshot), - ) + autorun(() => { + const snapshot = rootStore.serialize() + console.log('saving', snapshot) + storage.save(ROOT_STATE_STORAGE_KEY, snapshot) + }) // TODO rootStore.session.setAuthed(true) @@ -47,4 +49,3 @@ export async function setupState() { } export {useStores, RootStoreModel, RootStoreProvider} from './models/root-store' -export type {RootStore} from './models/root-store' diff --git a/src/state/env.ts b/src/state/lib/api.ts similarity index 85% rename from src/state/env.ts rename to src/state/lib/api.ts index a9e9bf24..19c0c2d8 100644 --- a/src/state/env.ts +++ b/src/state/lib/api.ts @@ -3,48 +3,19 @@ * models live. They are made available to every model via dependency injection. */ -import {getEnv, IStateTreeNode} from 'mobx-state-tree' // import {ReactNativeStore} from './auth' -import {AdxClient, blueskywebSchemas, AdxRepoClient} from '@adxp/mock-api' -import * as storage from './lib/storage' +import {AdxClient, AdxRepoClient} from '@adxp/mock-api' +import * as storage from './storage' -export const adx = new AdxClient({ - pds: 'http://localhost', - schemas: blueskywebSchemas, -}) - -export class Environment { - adx = adx - // authStore?: ReactNativeStore - - constructor() {} - - async setup() { - await adx.setupMock( - () => storage.load('mock-root'), - async root => { - await storage.save('mock-root', root) - }, - generateMockData, - ) - // this.authStore = await ReactNativeStore.load() - } -} - -/** - * Extension to the MST models that adds the env property. - * Usage: - * - * .extend(withEnvironment) - * - */ -export const withEnvironment = (self: IStateTreeNode) => ({ - views: { - get env() { - return getEnv(self) +export async function setup(adx: AdxClient) { + await adx.setupMock( + () => storage.load('mock-root'), + async root => { + await storage.save('mock-root', root) }, - }, -}) + () => generateMockData(adx), + ) +} // TEMPORARY // mock api config @@ -59,20 +30,20 @@ function* dateGen() { } const date = dateGen() -function repo(didOrName: string) { +function repo(adx: AdxClient, didOrName: string) { const userDb = adx.mockDb.getUser(didOrName) if (!userDb) throw new Error(`User not found: ${didOrName}`) return adx.mainPds.repo(userDb.did, userDb.writable) } -export async function generateMockData() { +export async function generateMockData(adx: AdxClient) { await adx.mockDb.addUser({name: 'alice.com', writable: true}) await adx.mockDb.addUser({name: 'bob.com', writable: true}) await adx.mockDb.addUser({name: 'carla.com', writable: true}) - const alice = repo('alice.com') - const bob = repo('bob.com') - const carla = repo('carla.com') + const alice = repo(adx, 'alice.com') + const bob = repo(adx, 'bob.com') + const carla = repo(adx, 'carla.com') await alice.collection('blueskyweb.xyz:Profiles').put('Profile', 'profile', { $type: 'blueskyweb.xyz:Profile', diff --git a/src/state/lib/type-guards.ts b/src/state/lib/type-guards.ts new file mode 100644 index 00000000..4ae31f3a --- /dev/null +++ b/src/state/lib/type-guards.ts @@ -0,0 +1,10 @@ +export function isObj(v: unknown): v is Record { + return !!v && typeof v === 'object' +} + +export function hasProp( + data: object, + prop: K, +): data is Record { + return prop in data +} diff --git a/src/state/models/feed-view.ts b/src/state/models/feed-view.ts new file mode 100644 index 00000000..1fc507a7 --- /dev/null +++ b/src/state/models/feed-view.ts @@ -0,0 +1,98 @@ +import {makeAutoObservable, runInAction} from 'mobx' +import {bsky} from '@adxp/mock-api' +import {RootStoreModel} from './root-store' + +export class FeedViewItemModel implements bsky.FeedView.FeedItem { + key: string = '' + uri: string = '' + author: bsky.FeedView.User = {did: '', name: '', displayName: ''} + repostedBy?: bsky.FeedView.User + record: Record = {} + embed?: + | bsky.FeedView.RecordEmbed + | bsky.FeedView.ExternalEmbed + | bsky.FeedView.UnknownEmbed + replyCount: number = 0 + repostCount: number = 0 + likeCount: number = 0 + indexedAt: string = '' + + constructor(key: string, v: bsky.FeedView.FeedItem) { + makeAutoObservable(this) + this.key = key + Object.assign(this, v) + } +} + +export class FeedViewModel implements bsky.FeedView.Response { + state = 'idle' + error = '' + params: bsky.FeedView.Params + feed: FeedViewItemModel[] = [] + + constructor(public rootStore: RootStoreModel, params: bsky.FeedView.Params) { + makeAutoObservable( + this, + {rootStore: false, params: false}, + {autoBind: true}, + ) + this.params = params + } + + get hasContent() { + return this.feed.length !== 0 + } + + get hasError() { + return this.error !== '' + } + + get isLoading() { + return this.state === 'loading' + } + + get isEmpty() { + return !this.hasContent && !this.hasError && !this.isLoading + } + + async fetch() { + if (this.hasContent) { + await this.updateContent() + } else { + await this.initialLoad() + } + } + + async initialLoad() { + this.state = 'loading' + this.error = '' + try { + const res = (await this.rootStore.api.mainPds.view( + 'blueskyweb.xyz:FeedView', + this.params, + )) as bsky.FeedView.Response + this._replaceAll(res) + runInAction(() => { + this.state = 'idle' + }) + } catch (e: any) { + runInAction(() => { + this.state = 'error' + this.error = `Failed to load feed: ${e.toString()}` + }) + } + } + + async updateContent() { + // TODO: refetch and update items + } + + private _replaceAll(res: bsky.FeedView.Response) { + this.feed.length = 0 + let counter = 0 + for (const item of res.feed) { + // TODO: validate .record + this.feed.push(new FeedViewItemModel(`item-${counter++}`, item)) + } + } +} diff --git a/src/state/models/me.ts b/src/state/models/me.ts index bc4b1314..3fd5db9a 100644 --- a/src/state/models/me.ts +++ b/src/state/models/me.ts @@ -1,48 +1,41 @@ -import {Instance, SnapshotOut, types, flow, getRoot} from 'mobx-state-tree' -import {RootStore} from './root-store' -import {withEnvironment} from '../env' +import {makeAutoObservable, runInAction} from 'mobx' +import {RootStoreModel} from './root-store' -export const MeModel = types - .model('Me') - .props({ - did: types.maybe(types.string), - name: types.maybe(types.string), - displayName: types.maybe(types.string), - description: types.maybe(types.string), - }) - .extend(withEnvironment) - .actions(self => ({ - load: flow(function* () { - const sess = (getRoot(self) as RootStore).session - if (sess.isAuthed) { - // TODO temporary - const userDb = self.env.adx.mockDb.mainUser - self.did = userDb.did - self.name = userDb.name - const profile = yield self.env.adx - .repo(self.did, true) - .collection('blueskyweb.xyz:Profiles') - .get('Profile', 'profile') - .catch(_ => undefined) +export class MeModel { + did?: string + name?: string + displayName?: string + description?: string + + constructor(public rootStore: RootStoreModel) { + makeAutoObservable(this, {rootStore: false}, {autoBind: true}) + } + + async load() { + const sess = this.rootStore.session + if (sess.isAuthed) { + const userDb = this.rootStore.api.mockDb.mainUser + this.did = userDb.did + this.name = userDb.name + const profile = await this.rootStore.api + .repo(this.did, true) + .collection('blueskyweb.xyz:Profiles') + .get('Profile', 'profile') + .catch(_ => undefined) + runInAction(() => { if (profile?.valid) { - self.displayName = profile.value.displayName - self.description = profile.value.description + this.displayName = profile.value.displayName + this.description = profile.value.description } else { - self.displayName = '' - self.description = '' + this.displayName = '' + this.description = '' } - } else { - self.did = undefined - self.name = undefined - self.displayName = undefined - self.description = undefined - } - }), - })) - -export interface Me extends Instance {} -export interface MeSnapshot extends SnapshotOut {} - -export function createDefaultMe() { - return {} + }) + } else { + this.did = undefined + this.name = undefined + this.displayName = undefined + this.description = undefined + } + } } diff --git a/src/state/models/root-store.ts b/src/state/models/root-store.ts index b38b36e8..a5d35606 100644 --- a/src/state/models/root-store.ts +++ b/src/state/models/root-store.ts @@ -2,27 +2,43 @@ * The root store is the base of all modeled state. */ -import {Instance, SnapshotOut, types} from 'mobx-state-tree' +import {makeAutoObservable} from 'mobx' +import {adx, AdxClient} from '@adxp/mock-api' import {createContext, useContext} from 'react' -import {SessionModel, createDefaultSession} from './session' -import {MeModel, createDefaultMe} from './me' +import {isObj, hasProp} from '../lib/type-guards' +import {SessionModel} from './session' +import {MeModel} from './me' +import {FeedViewModel} from './feed-view' -export const RootStoreModel = types.model('RootStore').props({ - session: SessionModel, - me: MeModel, -}) +export class RootStoreModel { + session = new SessionModel() + me = new MeModel(this) + homeFeed = new FeedViewModel(this, {}) -export interface RootStore extends Instance {} -export interface RootStoreSnapshot extends SnapshotOut {} + constructor(public api: AdxClient) { + makeAutoObservable(this, { + api: false, + serialize: false, + hydrate: false, + }) + } -export function createDefaultRootStore() { - return { - session: createDefaultSession(), - me: createDefaultMe(), + serialize(): unknown { + return { + session: this.session.serialize(), + } + } + + hydrate(v: unknown) { + if (isObj(v)) { + if (hasProp(v, 'session')) { + this.session.hydrate(v.session) + } + } } } -// react context & hook utilities -const RootStoreContext = createContext({} as RootStore) +const throwawayInst = new RootStoreModel(adx) // this will be replaced by the loader +const RootStoreContext = createContext(throwawayInst) export const RootStoreProvider = RootStoreContext.Provider export const useStores = () => useContext(RootStoreContext) diff --git a/src/state/models/session.ts b/src/state/models/session.ts index 1a3fbad3..7c760206 100644 --- a/src/state/models/session.ts +++ b/src/state/models/session.ts @@ -1,106 +1,109 @@ -import {Instance, SnapshotOut, types, flow} from 'mobx-state-tree' +import {makeAutoObservable} from 'mobx' +import {isObj, hasProp} from '../lib/type-guards' // import {UserConfig} from '../../api' // import * as auth from '../lib/auth' -import {withEnvironment} from '../env' -export const SessionModel = types - .model('Session') - .props({ - isAuthed: types.boolean, - uiIsProcessing: types.maybe(types.boolean), - uiError: types.maybe(types.string), +export class SessionModel { + isAuthed = false - // TODO: these should be stored somewhere secret - serverUrl: types.maybe(types.string), - secretKeyStr: types.maybe(types.string), - rootAuthToken: types.maybe(types.string), - }) - .extend(withEnvironment) - .actions(self => ({ - setAuthed: (v: boolean) => { - self.isAuthed = v - }, - login: flow(function* () { - /*self.uiIsProcessing = true - self.uiError = undefined - try { - if (!self.env.authStore) { - throw new Error('Auth store not initialized') - } - const res = yield auth.requestAppUcan(self.env.authStore) - self.isAuthed = res - self.uiIsProcessing = false - return res - } catch (e: any) { - console.error('Failed to request app ucan', e) - self.uiError = e.toString() - self.uiIsProcessing = false - return false - }*/ - }), - logout: flow(function* () { - /*self.uiIsProcessing = true - self.uiError = undefined - try { - if (!self.env.authStore) { - throw new Error('Auth store not initialized') - } - const res = yield auth.logout(self.env.authStore) - self.isAuthed = false - self.uiIsProcessing = false - return res - } catch (e: any) { - console.error('Failed to log out', e) - self.uiError = e.toString() - self.uiIsProcessing = false - return false - }*/ - }), - /*loadAccount: flow(function* () { - self.uiIsProcessing = true - self.uiError = undefined - try { - // const cfg = yield UserConfig.hydrate({ - // serverUrl: self.serverUrl, - // secretKeyStr: self.secretKeyStr, - // rootAuthToken: self.rootAuthToken, - // }) - // self.env.api.setUserCfg(cfg) - self.isAuthed = true - self.uiIsProcessing = false - return true - } catch (e: any) { - console.error('Failed to create test account', e) - self.uiError = e.toString() - self.uiIsProcessing = false - return false + constructor() { + makeAutoObservable(this, { + serialize: false, + hydrate: false, + }) + } + + serialize(): unknown { + return { + isAuthed: this.isAuthed, + } + } + + hydrate(v: unknown) { + if (isObj(v)) { + if (hasProp(v, 'isAuthed') && typeof v.isAuthed === 'boolean') { + this.isAuthed = v.isAuthed } - }), - createTestAccount: flow(function* (_serverUrl: string) { - self.uiIsProcessing = true - self.uiError = undefined - try { - // const cfg = yield UserConfig.createTest(serverUrl) - // const state = yield cfg.serialize() - // self.serverUrl = state.serverUrl - // self.secretKeyStr = state.secretKeyStr - // self.rootAuthToken = state.rootAuthToken - self.isAuthed = true - // self.env.api.setUserCfg(cfg) - } catch (e: any) { - console.error('Failed to create test account', e) - self.uiError = e.toString() - } - self.uiIsProcessing = false - }),*/ - })) + } + } -export interface Session extends Instance {} -export interface SessionSnapshot extends SnapshotOut {} - -export function createDefaultSession() { - return { - isAuthed: false, - uiState: 'idle', + setAuthed(v: boolean) { + this.isAuthed = v } } + +// TODO +/*login: flow(function* () { + /*self.uiIsProcessing = true + self.uiError = undefined + try { + if (!self.env.authStore) { + throw new Error('Auth store not initialized') + } + const res = yield auth.requestAppUcan(self.env.authStore) + self.isAuthed = res + self.uiIsProcessing = false + return res + } catch (e: any) { + console.error('Failed to request app ucan', e) + self.uiError = e.toString() + self.uiIsProcessing = false + return false + } +}), +logout: flow(function* () { + self.uiIsProcessing = true + self.uiError = undefined + try { + if (!self.env.authStore) { + throw new Error('Auth store not initialized') + } + const res = yield auth.logout(self.env.authStore) + self.isAuthed = false + self.uiIsProcessing = false + return res + } catch (e: any) { + console.error('Failed to log out', e) + self.uiError = e.toString() + self.uiIsProcessing = false + return false + } +}), +loadAccount: flow(function* () { + self.uiIsProcessing = true + self.uiError = undefined + try { + // const cfg = yield UserConfig.hydrate({ + // serverUrl: self.serverUrl, + // secretKeyStr: self.secretKeyStr, + // rootAuthToken: self.rootAuthToken, + // }) + // self.env.api.setUserCfg(cfg) + self.isAuthed = true + self.uiIsProcessing = false + return true + } catch (e: any) { + console.error('Failed to create test account', e) + self.uiError = e.toString() + self.uiIsProcessing = false + return false + } +}), +createTestAccount: flow(function* (_serverUrl: string) { + self.uiIsProcessing = true + self.uiError = undefined + try { + // const cfg = yield UserConfig.createTest(serverUrl) + // const state = yield cfg.serialize() + // self.serverUrl = state.serverUrl + // self.secretKeyStr = state.secretKeyStr + // self.rootAuthToken = state.rootAuthToken + self.isAuthed = true + // self.env.api.setUserCfg(cfg) + } catch (e: any) { + console.error('Failed to create test account', e) + self.uiError = e.toString() + } + self.uiIsProcessing = false +}), +}))*/ diff --git a/src/view/com/Feed.tsx b/src/view/com/Feed.tsx new file mode 100644 index 00000000..2cba0610 --- /dev/null +++ b/src/view/com/Feed.tsx @@ -0,0 +1,17 @@ +import React from 'react' +import {observer} from 'mobx-react-lite' +import {Text, View} from 'react-native' +import {FeedViewModel} from '../../state/models/feed-view' +import {FeedItem} from './FeedItem' + +export const Feed = observer(function Feed({feed}: {feed: FeedViewModel}) { + return ( + + {feed.isLoading && Loading...} + {feed.hasError && {feed.error}} + {feed.hasContent && + feed.feed.map(item => )} + {feed.isEmpty && This feed is empty!} + + ) +}) diff --git a/src/view/com/FeedItem.tsx b/src/view/com/FeedItem.tsx new file mode 100644 index 00000000..8f838d5d --- /dev/null +++ b/src/view/com/FeedItem.tsx @@ -0,0 +1,104 @@ +import React from 'react' +import {observer} from 'mobx-react-lite' +import {Text, Image, ImageSourcePropType, StyleSheet, View} from 'react-native' +import {bsky} from '@adxp/mock-api' +import moment from 'moment' +import {FeedViewItemModel} from '../../state/models/feed-view' + +const IMAGES: Record = { + 'alice.com': require('../../assets/alice.jpg'), + 'bob.com': require('../../assets/bob.jpg'), + 'carla.com': require('../../assets/carla.jpg'), +} + +export const FeedItem = observer(function FeedItem({ + item, +}: { + item: FeedViewItemModel +}) { + const record = item.record as unknown as bsky.Post.Record + return ( + + {item.repostedBy && ( + + Reposted by {item.repostedBy.displayName} + + )} + + + + + + + + {item.author.displayName} + + + @{item.author.name} + + + · {moment(item.indexedAt).fromNow(true)} + + + {record.text} + + + + ) +}) + +const styles = StyleSheet.create({ + outer: { + borderTopWidth: 1, + borderTopColor: '#e8e8e8', + backgroundColor: '#fff', + padding: 10, + }, + repostedBy: { + paddingLeft: 70, + color: 'gray', + fontWeight: 'bold', + fontSize: 13, + }, + layout: { + flexDirection: 'row', + }, + layoutAvi: { + width: 70, + }, + avi: { + width: 60, + height: 60, + borderRadius: 30, + resizeMode: 'cover', + }, + layoutContent: { + flex: 1, + }, + meta: { + flexDirection: 'row', + paddingTop: 2, + paddingBottom: 4, + }, + metaItem: { + paddingRight: 5, + }, + metaDisplayName: { + fontSize: 15, + fontWeight: 'bold', + }, + metaName: { + fontSize: 14, + color: 'gray', + }, + metaDate: { + fontSize: 14, + color: 'gray', + }, + postText: { + fontSize: 15, + }, +}) diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index 5210d9d4..53ec44eb 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -1,20 +1,23 @@ -import React from 'react' -import {Text, Button, View} from 'react-native' +import React, {useEffect} from 'react' +import {Text, View} from 'react-native' import {Shell} from '../shell' -import type {RootTabsScreenProps} from '../routes/types' +import {Feed} from '../com/Feed' +// import type {RootTabsScreenProps} from '../routes/types' import {useStores} from '../../state' -export function Home({navigation}: RootTabsScreenProps<'Home'>) { +export function Home(/*{navigation}: RootTabsScreenProps<'Home'>*/) { const store = useStores() + useEffect(() => { + console.log('Fetching home feed') + store.homeFeed.fetch() + }, [store.homeFeed]) return ( - - Home -