From a974fa50b0f769d726b39f308fcb7dc36eb2d802 Mon Sep 17 00:00:00 2001 From: talksik Date: Wed, 29 Apr 2026 13:29:02 -0700 Subject: [PATCH] step 5-6: compose experience --- js/desktop/src/api/types.ts | 5 + .../particles/media-particle-view.tsx | 10 +- js/mobile/app.config.ts | 22 +- js/mobile/assets/flowy.icns | Bin 0 -> 59660 bytes js/mobile/assets/flowy.ico | Bin 0 -> 6792 bytes .../assets/flowy.iconset/icon_128x128.png | Bin 0 -> 3133 bytes .../assets/flowy.iconset/icon_128x128@2x.png | Bin 0 -> 6796 bytes js/mobile/assets/flowy.iconset/icon_16x16.png | Bin 0 -> 667 bytes .../assets/flowy.iconset/icon_16x16@2x.png | Bin 0 -> 1001 bytes .../assets/flowy.iconset/icon_256x256.png | Bin 0 -> 6796 bytes .../assets/flowy.iconset/icon_256x256@2x.png | Bin 0 -> 19139 bytes js/mobile/assets/flowy.iconset/icon_32x32.png | Bin 0 -> 1001 bytes .../assets/flowy.iconset/icon_32x32@2x.png | Bin 0 -> 1693 bytes .../assets/flowy.iconset/icon_512x512.png | Bin 0 -> 19139 bytes js/mobile/assets/icon.png | Bin 0 -> 35911 bytes js/mobile/assets/icon_green.png | Bin 0 -> 36555 bytes js/mobile/assets/icon_red.png | Bin 0 -> 36464 bytes js/mobile/assets/images/FLOWY-4.svg | 3 + js/mobile/assets/sound.wav | Bin 0 -> 589902 bytes js/mobile/assets/sounds/click.mp3 | Bin 0 -> 33024 bytes js/mobile/package.json | 5 +- js/mobile/src/App.tsx | 17 +- js/mobile/src/api/types.ts | 5 + .../src/components/ComposingIndicator.tsx | 95 ++++ .../compose/AudioRecordingOverlay.tsx | 193 +++++++ .../src/features/compose/ComposeDock.tsx | 501 ++++++++++++++++++ .../src/features/compose/ReviewSheet.tsx | 148 ++++++ .../src/features/compose/TextComposeModal.tsx | 147 +++++ .../compose/VideoRecordingOverlay.tsx | 351 ++++++++++++ .../stream-view/MediaParticleView.tsx | 240 ++++++++- .../features/stream-view/ReactionSheet.tsx | 362 +++++++++++++ .../src/features/stream-view/StreamView.tsx | 137 ++++- .../features/stream-view/TextParticleView.tsx | 21 +- .../stream-view/stream-presence-context.tsx | 203 +++++++ .../features/stream-view/stream-safe-area.tsx | 28 + .../src/features/streams/NewStreamScreen.tsx | 181 +++++++ js/mobile/src/features/streams/StreamCard.tsx | 2 +- .../src/features/streams/StreamListScreen.tsx | 25 +- js/mobile/src/hooks/use-channel.ts | 85 +++ js/mobile/src/lib/pusher-client.ts | 286 ++++++++++ js/mobile/src/lib/pusher-provider.tsx | 67 +++ js/mobile/src/lib/random-name.ts | 19 + js/mobile/src/lib/upload.ts | 201 +++++++ js/mobile/src/navigation/RootNavigator.tsx | 6 + js/mobile/src/navigation/types.ts | 1 + js/mobile/yarn.lock | 14 +- 46 files changed, 3305 insertions(+), 75 deletions(-) create mode 100644 js/mobile/assets/flowy.icns create mode 100644 js/mobile/assets/flowy.ico create mode 100644 js/mobile/assets/flowy.iconset/icon_128x128.png create mode 100644 js/mobile/assets/flowy.iconset/icon_128x128@2x.png create mode 100644 js/mobile/assets/flowy.iconset/icon_16x16.png create mode 100644 js/mobile/assets/flowy.iconset/icon_16x16@2x.png create mode 100644 js/mobile/assets/flowy.iconset/icon_256x256.png create mode 100644 js/mobile/assets/flowy.iconset/icon_256x256@2x.png create mode 100644 js/mobile/assets/flowy.iconset/icon_32x32.png create mode 100644 js/mobile/assets/flowy.iconset/icon_32x32@2x.png create mode 100644 js/mobile/assets/flowy.iconset/icon_512x512.png create mode 100644 js/mobile/assets/icon.png create mode 100644 js/mobile/assets/icon_green.png create mode 100644 js/mobile/assets/icon_red.png create mode 100644 js/mobile/assets/images/FLOWY-4.svg create mode 100644 js/mobile/assets/sound.wav create mode 100644 js/mobile/assets/sounds/click.mp3 create mode 100644 js/mobile/src/components/ComposingIndicator.tsx create mode 100644 js/mobile/src/features/compose/AudioRecordingOverlay.tsx create mode 100644 js/mobile/src/features/compose/ComposeDock.tsx create mode 100644 js/mobile/src/features/compose/ReviewSheet.tsx create mode 100644 js/mobile/src/features/compose/TextComposeModal.tsx create mode 100644 js/mobile/src/features/compose/VideoRecordingOverlay.tsx create mode 100644 js/mobile/src/features/stream-view/ReactionSheet.tsx create mode 100644 js/mobile/src/features/stream-view/stream-presence-context.tsx create mode 100644 js/mobile/src/features/stream-view/stream-safe-area.tsx create mode 100644 js/mobile/src/features/streams/NewStreamScreen.tsx create mode 100644 js/mobile/src/hooks/use-channel.ts create mode 100644 js/mobile/src/lib/pusher-client.ts create mode 100644 js/mobile/src/lib/pusher-provider.tsx create mode 100644 js/mobile/src/lib/random-name.ts create mode 100644 js/mobile/src/lib/upload.ts diff --git a/js/desktop/src/api/types.ts b/js/desktop/src/api/types.ts index 42e014a..1ab02d1 100644 --- a/js/desktop/src/api/types.ts +++ b/js/desktop/src/api/types.ts @@ -123,6 +123,11 @@ export const MediaPropertiesSchema = z.object({ size_bytes: z.number(), transcript: TranscriptSchema.optional(), source: z.enum(["camera", "screen"]).optional(), + // Set by the particle processor worker once an iOS-playable MP4/m4a variant + // has been produced from a non-iOS-playable original (e.g. WebM from desktop). + // When present, clients should prefer these over object_id/mime_type for playback. + transcoded_object_id: z.string().optional(), + transcoded_mime_type: z.string().optional(), }); export type MediaProperties = z.infer; diff --git a/js/desktop/src/features/particles/media-particle-view.tsx b/js/desktop/src/features/particles/media-particle-view.tsx index d08b145..3bd8ea8 100644 --- a/js/desktop/src/features/particles/media-particle-view.tsx +++ b/js/desktop/src/features/particles/media-particle-view.tsx @@ -33,12 +33,18 @@ export const MediaParticleView = forwardRef(null); const audioRef = useRef(null); - const isAudio = particle.properties.mime_type?.startsWith("audio/"); + const isAudio = activeMime?.startsWith("audio/"); useImperativeHandle(ref, () => ({ seek(deltaSec: number) { diff --git a/js/mobile/app.config.ts b/js/mobile/app.config.ts index c775ba7..0035fd5 100644 --- a/js/mobile/app.config.ts +++ b/js/mobile/app.config.ts @@ -12,7 +12,7 @@ const config: ExpoConfig = { userInterfaceStyle: "automatic", newArchEnabled: true, splash: { - image: "./assets/splash.png", + image: "./assets/icon.png", resizeMode: "contain", backgroundColor: "#000000", }, @@ -20,10 +20,6 @@ const config: ExpoConfig = { supportsTablet: true, bundleIdentifier: "com.llink.flowy", infoPlist: { - NSCameraUsageDescription: - "Flowy uses your camera to record video messages.", - NSMicrophoneUsageDescription: - "Flowy uses your microphone to record voice and video messages.", ITSAppUsesNonExemptEncryption: false, }, }, @@ -37,6 +33,22 @@ const config: ExpoConfig = { }, ], "expo-secure-store", + [ + "expo-camera", + { + cameraPermission: + "Flowy uses your camera to record video messages.", + microphonePermission: + "Flowy uses your microphone to record voice and video messages.", + }, + ], + [ + "expo-audio", + { + microphonePermission: + "Flowy uses your microphone to record voice messages.", + }, + ], ], experiments: { typedRoutes: false, diff --git a/js/mobile/assets/flowy.icns b/js/mobile/assets/flowy.icns new file mode 100644 index 0000000000000000000000000000000000000000..310b5ef589d08012b6ee1f731f15522345432af1 GIT binary patch literal 59660 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 literal 0 HcmV?d00001 diff --git a/js/mobile/assets/flowy.ico b/js/mobile/assets/flowy.ico new file mode 100644 index 0000000000000000000000000000000000000000..f097dba266b29e0280413fe218d01951f029e301 GIT binary patch literal 6792 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 literal 0 HcmV?d00001 diff --git a/js/mobile/assets/flowy.iconset/icon_128x128.png b/js/mobile/assets/flowy.iconset/icon_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..48bed99eddf216da1e7c1d4f90292142e3cfa3b7 GIT binary patch literal 3133 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 literal 0 HcmV?d00001 diff --git a/js/mobile/assets/flowy.iconset/icon_128x128@2x.png b/js/mobile/assets/flowy.iconset/icon_128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4af368921375af6d2ea7f7bf2dbd84189c30cf0f GIT binary patch literal 6796 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 D8MW{7 literal 0 HcmV?d00001 diff --git a/js/mobile/assets/flowy.iconset/icon_16x16@2x.png b/js/mobile/assets/flowy.iconset/icon_16x16@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..67ed0d354c0f56ecc1e5bb76bf82117a0d8b45d5 GIT binary patch literal 1001 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgQIQ(qnda-upao=eFt9L6 zF@Q{91Y$czX*k=BQGg$2wA zHb~oi&afjuinG8YvY3H^TNs2H8D`CqU|?Xn?djqe62bX4?DRSzM}gcp!6r^e4sK3P zZm~5caRrmIeeV1cuWLN!Us(8`b@~nkHLjh9x@22s6dZ2aZllEix@6hLT{9)sI(F@x z>$6Ng^!c1s>)uH!zPnw2&f!4s{tzwKjJK%@0u{UNzn9;2v-0fZ_j9i8pIE>4V#c46 zO{F3Mdee1{{yCgCZM69LbDnb1jk;yeYxl<*&5?&QXBw6OW`uZ$s z&H4743Nn1w%S4WJ{JV2vYR6=z4cq-p8@k-ftmgI|vU>eilc8F=|9I+D<*0iB87KIR zKB}J$W@vD1Xy2EXWFmF4csjXT|*6H*0&HwUcihj$ZOQ-!!4Q`EfSWi~OZ- zY`pe?#RB%V2~4xMZ8`SVl<{g-sjJrgNe_QaQp)*c_;BCrvfcZ+Tc*g=?s)(1-M(}q z$rUwDef<{9 literal 0 HcmV?d00001 diff --git a/js/mobile/assets/flowy.iconset/icon_256x256.png b/js/mobile/assets/flowy.iconset/icon_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..4af368921375af6d2ea7f7bf2dbd84189c30cf0f GIT binary patch literal 6796 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 X_ZI7FzYG3VCqVtS&aM0#HlhCmnu;y| literal 0 HcmV?d00001 diff --git a/js/mobile/assets/flowy.iconset/icon_32x32.png b/js/mobile/assets/flowy.iconset/icon_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..67ed0d354c0f56ecc1e5bb76bf82117a0d8b45d5 GIT binary patch literal 1001 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgQIQ(qnda-upao=eFt9L6 zF@Q{91Y$czX*k=BQGg$2wA zHb~oi&afjuinG8YvY3H^TNs2H8D`CqU|?Xn?djqe62bX4?DRSzM}gcp!6r^e4sK3P zZm~5caRrmIeeV1cuWLN!Us(8`b@~nkHLjh9x@22s6dZ2aZllEix@6hLT{9)sI(F@x z>$6Ng^!c1s>)uH!zPnw2&f!4s{tzwKjJK%@0u{UNzn9;2v-0fZ_j9i8pIE>4V#c46 zO{F3Mdee1{{yCgCZM69LbDnb1jk;yeYxl<*&5?&QXBw6OW`uZ$s z&H4743Nn1w%S4WJ{JV2vYR6=z4cq-p8@k-ftmgI|vU>eilc8F=|9I+D<*0iB87KIR zKB}J$W@vD1Xy2EXWFmF4csjXT|*6H*0&HwUcihj$ZOQ-!!4Q`EfSWi~OZ- zY`pe?#RB%V2~4xMZ8`SVl<{g-sjJrgNe_QaQp)*c_;BCrvfcZ+Tc*g=?s)(1-M(}q z$rUwDef<{9 literal 0 HcmV?d00001 diff --git a/js/mobile/assets/flowy.iconset/icon_32x32@2x.png b/js/mobile/assets/flowy.iconset/icon_32x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d05c05314fa95043880fd59c9d29c164b6036e95 GIT binary patch literal 1693 zcmYLJdsNcd7Cs=5p#o~A(_@B$v`N%TGhZnxDTrD*6!;cR9S0e;)Tj~p-7#OO`RYNE zubYio7nN=ymameoji#1qnWiIZDT%MKReJMrac0)sz1MfXeZKSU^T%H6oXn%%?mFl# zXaIl?jY{!RGkG1FDD`?fDsEU!h)8EIX8kp1Os1JDIELwz@7uch&H30&)1+3oyQ^OIq_3zpZwi{^tp~C@4 zj{=ClJl<+v52_mLJ%6%B8SF2&S}TM9?IxFL{J&mrOBhZ}SJTE=s_$t4wDi{j14Y-3 z06^x_D9#KXY}$_=Get2fwo=k>QQlhf&HUnZxrRDEedd$!WW>?)@%37tqWf#fsyv*Y zR$fSMH7j=4q6P^^dO$vIdcVp;A?;Ob?Z+nCW}&U~dwYBP%81CwoBCl{Q6UMarMAhH=lLdviAIvr z(o!esXvBLOQh4neo9BS`?-t2<)gc0g!pEP{cmKS#OiEtvx%td(i^l8GoP!qCd)os^LBrr-J z;yn51u=G<&VGO}IMEN|n1D&-i-{YoCH;xn98y5Zb_U#*0!`l7@+qZ7jPf1BZ#i>;C zo}L05dwWZ3JC7Vw#;eT`G&nf;WNxl@a&q$Mj2Sx5)A+FYRsG7!%ANVtjPmjwgk1G> z^h6@j==iu?c4DN0aoiug)JnyN^eH@GAKZ0jJ5%1}P)iVa*0WkStWvXu?foUfm<#K7 zeRsfbYg^^^a-5tnjx z+!xp}a|8ocKNQ@scsQN~#NrPza$5ny8F2)j2ZjwVl$4Z2ejSx~+cMhP+FIV;?(x!< z>JKnKHSE)CY;63`&(vMoyUD@9rL4gF{J_Y{@|f@exKLBJ8GqIQ#+VW{&5Wshp>s!n z94#V1-2$}Ym*hsQ(=6WrIw`AH7`G|sc}Yns6YR7!$pG4o!D64x%v6t|(n1eB{G9pv z46J|Q?XR{uzz*y3dm!`$A71A=?%*OxKw=vJF{4?Q-DXxZrQdpsu_v>*c)K_ct(I*Z z9e*TA|0V5Go%Me3B=kkU-<>Ygavao{%;$6K2Tt<#R_Ptgo*Sb9%T*iYyq_WBk?>P= z*0hj&_gO>T52XZX>4d`Bzp}y%6rXY}?2I^k=1d(7%G!!?H!brf_ZMzu z&n9}_Tp;q57=cu526C>wdi{E>{?>BQq2Fsf4G$6@UoA^@Dfbg`=lcf+_P5_gCK%oe zKUAz9I_7wDLH2plZ`kH@cb62lcrF!5ZaDBcL7WR`BWU$hB(zr0S20GYPP00UVL4qo z*;N5=*_%G*5@B>D=@j1ZtDq{dc;^GwX!Vx`YN0JB-cgd$imrc}L`SxKt_yb%HETTt zBXgGmE+NZcPo12XqtlKdLe;NgC!srOFx@7RC177>%5mpftMlg7_f$z0ZxjcwFR7_51+0fnQv+C z3Xa%+4GSBZzoWy1*Y3!eBRnn#2`076UOvJyVnIYr*ke;@c>{0Xm#=DV3rv#V)!^LR z-8amKKm7^EMqO+hkrjiYe4_$9KXYM=al@>Ig+=qDnU6;dNI`jLven_DoqWDuOIHuv z7=8F44OIlJTq!C!8cR?{g5K%$N6+}9uo5cX>?pT!W z?$~$l`g`#&yw7`nKDf*7z2}}YXXZOI-_Ky z+rE8=;0wY*MOy^`zP+J7zE2AN&h=33t~LPp^8x_o82~_+VCDe;B@O_KHUJ?15dfGy z607vDgJ1aCnX21sYXgGddkO#nV*#KMVBn7ujP-xLzXRh3NQj?_J_#uTUno7)%)9`A`aJXl1L6}e000tD zzola63tJhdjAk1Q!f#AaQw!_-t)mcD*Sn6q`SUi_*IOY)%|ko}v5ePVF@CsV^ngd8 zNuYY#bJ*?!rGk!yI$M+HgAA8Ap5fRJrrs{Ed>)v6Wgq%_OZ^H(C?5rqi{h^mlc_LM zK!;l}p;2>!NSXHYgjR0_sk6c!Ig9v90AZE-KPcD z>ItW%Bb2$lI+N0h(hJ}8708{JnU}t)736*9lzA2ZWNgpxJPfhPE#AGGvob;N7}9WC zQS?!OQmUVI|5lEFu;yBjs!D^p;x)!wHphxVDiUjo2?|eET~=0BYSRn_&A8Di(%bC* zRt13tUFVQFGiaAIrCs#eooU*T%ao6f>SM>Zok_`=*x3fBGCA;lQ|5=qJAPZUEBM-g zy~0xmPyTfsSC5aCm+c*oc2{I_8t`AqPDxq_0ex6}K8@dJ*JbsogFR?aNfoyhC{LK1pQ6)MWHd zqU3gS@zdNGQUqP*JIu;W7mXFos0BRpwy(z8N&Q@Mz-nPo2SYvpLt^b5<~C7Z2rpTl zIB&0+Ow|iJ&cB;O7T+m4hva$zU%()1NgTEbo=pjMh6@$;2lTv?}a-IA=drUY0521QZNv5+%C~)H3CU5DuW?@OE^O+t%=ou^c zESp}te*IX*)kZnHiAn0XePD9*DJ2X+_vj0Tlw`L{dUWET}R8t(`-*ZN++XppA&dlPT82~)o%bHl%#iS;SM{8wC4Bj zDP?ek#PJ@(IVEpl0PLmZse-?OGNaRs%!BQ}@ltNNUi`UV(Y}YS+e8Q~h~Q`^{t@e?UU;b0n)w zNBlL14qe9$^uUmL@;odfzVSk@0Y z)DP^{Zx3Z{nMzs7N8AKph;VKja@~=*i9DN0&fI&Yi!<-|bT^BCNC^kSF)R_+itJj0??oKG z7F-BqA+TVJC?IL^V1t&}6giCOx{fCH>h?wpYIj-U4AKL?Zp8pL@=jT6nHwqNqoYU8 z{!0$qll1lPX~fPUfe;qz`PaxTZe~#n(}VmcwMz@!s!?YKeGkI!vB7X>!p$QIHLY=C zgxJ&`bjQKzMdYRt_%Q5^kj)BA9t+!07T06}1LBPFzL7mEH_i_85Gi=F7qk|DFRH7n zQ|>#a?VYjCV%fR`Zc*vEu8=s9dB^d4CuxTwu%izuUj<3$VVU%8_8|Hm4W2!7CQ#i{ zpSF8nmn6CX^7T@ne(f8J%qmtnc3CfcRf%&d{Cz_tlmjCeVZOIjZx(s_E?j9XW3*o5 zy1gnWXD4BBZ-Vva%}4l@cgMUsYb~dKRa>!@f6Ytvtv{-+52$205$oAE32DrQRQ@^K zhs$_^58b`neKEgfJXMZV@BZ7xfx0cj=F{I*Cvuwwbdke!pp4`xhO$go5(a5#Y4O#* z8-JBS2O>;DBILmbWCD&&QS3e^3+_3gK_46I;o|lx;7k^U_0GcGdfyb}tt~GfM?7qb zdi-jV!43(ClXg9Pqd4HXI#x-@ZzMcsAqW)igE&O@2#b`X82Tba5}UK z%8UviP8k&>`DArWcVWRH_rX<2kQCGAxZVE6Z{uGLcLe}nUVN6T%OVB9yMZrr9c|j# zD9E{S)zp)oPw56YlTBVM*W^i#Nr960-=D8cHe<_bzPtczLSyu%2pFZq8jdaAk74DY zCcqG$f>;1+M($3VZ&p0ZN(GkGzewyp?*dQf6WE)N(f%w&6CWn6TB0atvtc=|l>UZC7 zZ|~dH&Q6-ta8amO5(s*_)_2pnxUyHIn|dI9u%Mi`aW{O!Igo`>ZZ`VP68-TzIWVwO z(6YW)RNsF27B4tC09Fql!H;HPek@Y@B2{n#^>Rt_4s08Dy2UbYbnWX}ntUVy7eQf# zJG&QgoT9F3StWt zfdpyS_?+(q9(Hj4BFndGVmp?+& zLWJ|!90ixc6#V`DmGpBH>)(yuNQPHH7PuIN?&Lo-cb|Lu-<5n=X&f1XBSFe}ARrm^ zBU87}^V`y5SO_VG)2dU}B_le)5QeHs+~$ zpGNrJ=OqF9cZ%0SHnl)})%Gz~lsXVK_9?N>tb_yj@VK|W`)MQIF^tz7+5{=kE;FU? ze``b>+e+cL#N9vp1Kz{+X&5MykChlWz)J0*u7Z17CG3H3i@VTB zPt{L?WmUeOANqBJHq9+Y1C$C@6z+q}H26Wi&EIE=`MwQ|1+3MUFZI;BXG(XUSjTCH ze}K^D55@ZcSQR5;NF)X% zC}_>-R{1A@ODutT0ouwkEG5#72d zR{Ey4YQ#|kCZ7bec9_3bWyH91F6y+_J%5@OydX0PS=qjin{7`R9CXV%FppURke0Hv zIY($781ht*Lx6}Qf;O(tOW7AG_v>oDeq&nLWCKbl=6{qTA6x|Y41oWl=O>2^Jg=y| zpF9fKfIgj-p?18f8~siCo@WHO^?e%1dK!;<9Ui=X&diLfoEr&1GwG{lDH}lvY#Ps~ zL2`*k!<-fRqQ<5VoPYut1~q&=o*;OK>K{0XPVP!#S^=c;aj}&u!CdyR^T7W0CS;Cm z)bB^5MdWEbG^5_ht$e9G1AO^rIY%&|1GK8G)^9@^unr%1K5ygsDOhV&>CFXE5r|%ZsSBU4e|7!p=*bK`+9p^q4g|;@ra1Ob9uXHf5Sytz?B*IF zL-PcNp_)I-Xq-_VdRdwH9nJY6tW*9nKv#0t!(}1JVj6Kf2M@vCeg!d{2YM{zY{(qZTD*Af(iM@d^li)+o1yPDVp5cd=4d)dT1DpXt_aK z`5?M|IIr6r@Oa{5D14DP!{2Z!xU_#ueFo?qx`!>3sb16&Gx6!0I31GrqZedWz9zhO z87jP=Oy$5nN7(xIEgFj7a0!@^k4Bntq9`v_qznuh5OCyaRCaqpknMn|m%m?N&WbbV zb-jPn*LI!J4UV~+Rif2B{Qc9rLIij_xUNP<(@dYnv(lDYZg5~6?)yr^Rx|^!=+l%4 zfxMswZiI;jo|x0rW5MG>_UiF@AXCqH{wfJo9fUPp7~D^|{Gt0@u0r3xa^DYsYDZ*w znlUjcX5EHFMxl+AA-TtRFP=}MAP&I6ugT~S-wONnZ?7X6^=L6kZay0U0Qh9amkC=E zk$Drj5Dp`4E{AM3@WODnkf>lhRqE}qB5cQ!9g3(2r04m|r9?Q2Rz8#Cf?Jjl z^kLX{Fr5WQMaIItN<935B8Gg=VeKk%r1=N@eV=~<%BJrU0GypI*sfRqen$1U%&1PN;1pq(gv^w00L&#Pag|eA{QO?`!(6t3&0`?G(MP*DW^8{$>ZL3DNAUpW_8P@DivI(>SkAEL%XoY6-(3*y2P!rDlwP}`X=cUO3U zihI0Si5o<(426`Ld9SKZDFLT5t$&FdN%y-L>2wB}{LV~&WNaHSd~a?KVG1M`Qw)F! z2PXloGz>nYf?@1PS{tSSHZ7IDoP{poQiVR1)9BuQcLNX)QmA|N@8Uu@2OKk5@as(3 zZnOt@9o7bJK^k2Er#*GkI{14cbd*F(q_~T_{d5YvlAP=J%8Of2YVwEjy%@=~AZ9&0iUInaf=fIo z#P$pj2h+h9+T#r`Rm_KHU8JBUN+k0Ia=o^*AqB3MDxMF|R1I=qha~fj^!n>lT@CSl z0D19Mnm8GZ_jb!QqRfopS>1$&J*5B&ph(c+-v(oFC}@$p92r3VyFZ-J62Y}o+`vk` zG&GJ@YXl52lD~xQWhEr&hZh)hva~`NyPAyicMHuw&Zb)wXFL0~IU|k2z8G_1<(UEp z(J|Vf`NmvI&S6&biT9f8h>R66XA-ff5RaE~Hr}EB%Ua2BfrTYp)S`keNijfrab?Bz z5m$6yDM(=42JJtRN#q_wX=!PHo2!it*W&7GR7axR`JJ7eUw(PR-_7XYgVd&6blZ*q z_!O%sm;3_G145_I@4URc?&mbDspf8#Jd5-5ztO4ce@YO!8_M4Edfxl%f1DK+d+&8g z*4x%!G2F^f8 z*Eicd`J{WP-j%P7cA%SMc-|(RZxnG)H%Qqwtu#LvHR3eeg%1^(nsf)~ZE}NL9 zVunu~_K9^m>jzQQ{n2e{(gvb!U(RKbE;Gc^L_H8J!}OC>pAleB=^X&z|bun6BlQ}kwh#fc@_~Pv%X+FQPbw4$C zUkc!XyRN>O8sp0n$lsDO6nb?uq&)FC4=@zMW9*0{HBwZ}`+=W`Qxsk`hdDzoB>W0? z!k$@`U~CWi2pt%MJ-Tr6k+Ju@IN38aaR9oHx48BVfEM$0{h=!} zKU9g2p|HI?c?o!VU-o>o`iaeF;%5S|QmJMYhxLq9-E9feu^)8H}vn^6fuZmZz$q1TK*1HQoD>4Z(CMm9PBJ zHXQ(BmB4)2tuo@YSgwE*@VI&*ZDPinN?-Z-=8GcDj|C^Q%0WCu(jq^w z#!H=o!RyZ8 zb_`A^@T0rH!4U-l3zBR8vv~7OZbYc^J~$222APFS>HY7SCNyr2j<1A)3g3+fePhe% zRDGJAP5!xKokU_JW@`*mOOqF&gLkpuJLnDNBG z(bnNoLDLMUf3TV|oI*<%2LeRxGV`AK0JR60Gs{vGl7(<#FQ6J)Dh&m1gZyhmM~bp8 zt=`q}Bnx|Py1)W2XKB$LYeAAv*)rvglcj@J5oF}#X$q?q+)nQ9Z^)lL4nyw5`VpR^ zw#@xTCp+V;gXQG?xA`N{6V#F0m!iL662M{+-(ZBY$0X8wu`g>r*4*tCgs~`Z?=J4i z%%38%s|yRSI+7Jx*_8rigWLVks-#-Ri-K6B{Js}~@&XKbS%1>O`Alv|q1zv`V*A^! zuC8yBF57HgvQd;LAtBlDLobnHH}>@Nr&F)Oll|2|?I?TrFuo3RF#Ln;#bdw8ZT78W zZI;vPac3Q=)wmp8Lf0rkB^D>cN+-~U7`n2VQNbzp8Pry|Md&ExDJBJh6x4eQA{k-J zHMwBZ3tDw}iv+(X(?9Qw5rfIVFd3O`CXC!NM9uVL0LPm?7bi))X`g<*Z*-X#SU2Ra zlVgOR-0N|Aj>vX_0ee5mbOTY9g#G&M@^2}Ie4zEAtjs#KX^{ipg^2->O)j7aJiNXCUo=zz zUxXDt?U?K&m>>Acl1`Q;zZD~n8c2meZ@cFrfP-9%FI2=p>;)XGp{P%B28v-oKoxk+ zX3Q8vj8P}mv6Yo_`_GjHXd&r-SECAZAPzD{jX<-X@jDWeQPv1;C^Zk>8Enipsc&eG_BRI=A zi<$T6h(;;J=jGg*<{jn|U?bn7K~enY+F%JjwEtham8OKqED9?i6T=>8r? zO$leQZ*10fULFC~RTG#D}+)E+>TB)6ob=~HJEmx8=}YV}&3!o6a9 z?Y@Blrak!UYeMcbTDYiN@(K!RU|8~qaC*|+ou;}#`P=N`TQ)R&WOb}W4jcq6m8&CH z)QFGTT?0qhA3hcPpn{hiBX+1%4_F zgk2BVU48^2)8i?38Z^k`(E(8sjx+YOOTQ|oq7?o=ROBJ=c7vjeB>L%t zDC!Un4BLBzIutL5bA!fX)e_HvsdKZR_w;OZx#3)BT*xV9w{O=57) zpA5zQ2;f&v$uvXd0Yp-F6vvALCDL96WkxZSKG*jHc7yyx?g1X(NX(DEzy8_eP zX?T<<{AK7GOpWIE$C|!<2Izh;4WnEhDb2Z~=`{8rlonu7ZHgx%SGeH%&-1$C6yoGz zoPn37anV)`ePHsaVgL3Jf)ykja~Cub0qHqtL7-?5)9 zUwj9#Q~*p2vVcawH!E^FjTi3oOhQtU;T*%@vv*-!9!Z#tl@`!|kJ~Tg=U5&;#hpR8 z%t?xi)1gqPb3hyJZNX(d1O)r%T3%hhtoIh_<>lqQJ>Q*KU!MYCFJHC4fvtds2g9rK z)0nOIQ1ll#jb5KrVIjPy7CV=j4nb*#Pn z5c!$F6-~^rwTf>Y+`Ea$ZF4C(T_a@tJPvcFwai1EWXVOW287+cQX}h=L`Fiz0?5ZpK7%2ZK}si?5sdXTQK9 z)!+hPI{-p)T})dGh#r`ff|Lk=zoVEh;mH822w8ioZd7R#9=Q-Vh_vyCbCAJ6roOgl z4q|7a_;}r$5%d7K_JfabH%(iJB%;vA-L3}HUW#v<(f{}dfOMJH!ipCTi185B2ZoSf zUia>#2lx6qMOXKSi=Rwvj3FP%CC(kf`@d4@sQk8%`gzl>#3v0?X8tLE+VNkaU2#Ud zx~e0FsGM#LFVSb_8_R$AH{Ap#A4uAp_CN1~T<$Lherqz>mLR}W?=B;dN$+exWc1Rp+QGhNG(9;zjASMTTE--c%-i)NDoaot0fErcW zP-)BSXMjoy}bzTHr+2wHOm&WQgL^L3$r##@H;qr*}oz>p`RhwD6X?v+gZwD2|* zi;y-O44Hnn?FF<{42BzwU~mdk5^NvNn*C$Ja**qDNnkwo8uoih`bHIGQOfYF93Zsw zJs1}5$8eGS8;@Ddk~I3LMCSt%j>&qq&qg$Ikj;QFr}Kwwu8A#F4qq3=L2Lj1_!4B{ zJSz0icysWqBLMQmAT8yG;tn7V=yz^X3Gfqmm9s#hMAgd7mqnZoe<&t_1N3LYH&8rp z!0V6?Nv|ilfq@i4nJ(>H|EE%-C=4&zxJE_zfU?)SU3pdLp91wVKXQvo&{o)C3#99k z4|*OL)N4?#RcEVC0}}syHb;ru4{Q8tY8*05SM=SEYiyl)4+IWUbh`>n zR1mT%lv~nJy&T7K3T53tp3`)L$!w~e*X&Q##)&;;rft(7?kYIYD$~G1FoQHjbQt?V zb;Tjb2G}sZheY>VgG+7^Ul$Zm;xb%R!HnBgxIMgQ8eJTCu=!}?@2_s5f*N{udGE|Z z6{ImLccK+_jiM_6VYL?Ca0ohMc9`?DLuWGk_!E2(=!I2(+;-f@>%YuL5!^>g1gdrh z%%=#wDa^~Lb=9N>a-iC0#j~5yppfRp@@2Y29C#PIh-FpDeB?wauIaj4)xy^bzAF{q zbG1XCx(9%u`&ggpDocSjyS)HtFrP4}6Z7)Db{V|IbmOXg>KE0YjW-y4Q^~QoFx`Q3 zNGt#!7|Js%<^}5l)jr$i7#H17x2a#dXkjdA8el{3Eh-Z)?Q;NGWSn6$MfTDB2)dV~ zVAUY?U~8`TcVrgr!2BrVIs1nVfPpWhUZzPZm_J5JcV8nXNORv7C*X&=m3t%M_77oq z-||BFCf`FK+;DxG5mHI)5PW7L>Iww~%MUQ>>`F)eB^p^Mo!SW#l5QbM_$`!ae%3N> z3;ahsQ-djM!;=%fvyfGZUm%HQ5a=W-s2P|_5>rlD=66PRcK?E4P?MmXvzPsv6>Ni; zFavNi3NSpGhy6~qFVq5O0EDn2?q($XlbbOzEz9|uJHPk@(NdAvMmQ8IQv&hcuJ-F; z`co~<|0v3$^B`rXFuE9v{&Q~yn)l(e*u2wGjR>ftieNm2@#~ z=WQ<09QxEj9oFL$GbUyfdNwd!k`79M%HnOaJah{Z1uws>5Z-W+njuTD>lV!W#@1>s)515!Fk)COZA>J8vQU#P&b^s^(Ot9>C4yT)Smeb1^+Djb9vaeB?m+w^3j{( z>V-+3Po6ya(d(S%C}ve-nwg~fqkAb47&S`sTp&g;G?r-<{^5^}%)eUIW8esc$QY>Z&Rhf5V3} z{dhd*+IxZOT+N!tt-6cxq=~(bfzEF|&DTI*IE8&8k7}<&gQ53xH?dNW%pHlg&Hat3 z#~wyYcEvS^kP0kv&pZ+-`*W`^c>4F-=d15sPX=SaP>K1t1aHe)PaK z!)JZ6p~ATsWHR%cOOsxpnmFXWUnZ$q&af6sI6u=(lszZ&JvP*z6jo-nbcio^xAtD> zNxw*1U6w0@54`4ov{KGJYPI;`MdSOSY3I_F!NyxP`+pWx2F;&A7%n*<$Y!)JRkx3jyp>x@1*<(m8F7YdOG$kUai` z_nS-V2D5}~IqvF;#oUI@$F65?h%A0`WewO{jbyDicdwNK!63n>;KoZHH<0Pwpqq8d zIOqI_B|dCXW&H`D)doh^kF9baNEq?iuokdi44Puazm#?vq66~|(TS_(&#YVJ-RvH6 zXRRa>!0crznVeP5;%Aa7if7u{Er)!-&Sh>YFF((sQX=2Iv@N~gd?~-&s~7Bzh*+}7 zTl|!c*Kw#h-fZ0{5}^hAN#1}xKt`>?)1GENhmE_81MeP|`K;>+4O-ayZr-YNbh&Q( z^X#QL5Qk@$vZL4X?S4r4v9E7seHwnayFA?e_g6$3$Swa;l__ocydo)PT^Bfxy9qD5 zxA43?@k^Z<)-lpSghYp0GVgJbgEO`$+hKrf#5RLuWOVe0&@({;m(ju`o#v6!7Tf+H zpB!DmqoBoxK%`Lll6isgv#N|Q(n8+7Bzmk-4@7?nmMSi1j->`9I8{z*g-VQGV&2dE z{PBZxq6Obh`(oG*Rlk4HjJe+1nfHAUsSz$*&gZ`RS1>hP)%62eDv&<8BNa|lb0=E( z>jPMh*JoXhO*;RJ(WeWP;&5kww?Jy56A!_XLSgkKguZXrPV~=zkYWa=XnGD3#>BWm z&oIPR>)nfEkmSEWGWnS|=3hyviVD(ts>T+`$s@vrCKtTHQVq`FGsBbK%X1L&)RD@9 zHIYq9f_!SAUknQoTPP6_Ux23{x=9N>1b8zuYlv7E{fU@@gCOi}pl@cM-X2N>o^TN; zUH^b)3-c3vAGq<~7`M1kh0OvOM0!Z)<4a$t(nHkmgN@lwsxfA+OYr={zrvv^&cOV9AP{})VY8QP|I7FPR@x;SGD(7I?EdyI{7wDO zc_BbX;Snp{0d(sPMm=D1w&fa;BcVV&<=Zli{B0Sei46Dp?XAzO|WtRV@WDI z{@)|FQiMVvZ{(RZdZu(jLKX&dDMh9kU zZqUOGPNww&<}JwK_I~;xOHE9Mkw}nfk}b%9CZZ(f9nT5WBS9iqoH~{PD;n7uPS3!@{Y`?+@Y56Il z3RQKG8#D9Q2PX>0Bq=edT9cs~vn);Y%k|g9oX8+#^MK%0HL|ScXO;;6 zDBvVgUk`Q$eBGMsA@?9c#oTzsuy=92QXGPJ)iggqB_mB75c zqf#n{0IqqoE#?^W`zT{%yjdnCY5}vW#ZaRWRu(?9MTjFOBb(66SKX;k;MS7K0CMHs z#wxDL`)y9E+JAsx&}ahb4p5^;iyU8~ z7lMFcj1ug@Flfaak3LX_PtVTdsalKx>|?-(1)1SQR{z-wFd?-I`$g1UJ!_b=M&H*! zOK0}JG(&u;Lv>lK3$ryoebgQPC{hHJfHqjDJo!93I~#TQ6;t|82hQ=Q5R{*Q!92ke zbj|Nt;&K3-5iQ23iiTDCRuh=u=k@{xo-DXldo?2EaY${-n#zGOiDFmSjV%?4x7ZP` zrUuTk%iEqCVMGld+nwZ4I}Gq9=Nh8hBn^U7gbZh6L41 zJ(*n>a}ko9D12s>5TU53*!d`Iml~5_MWE@nq{VDXjtmdWW%mN)-YhnppnY5;a^PSy z)PPSWji35B;YF@?_Y+GLAt9^@;JSO?ti)c%Z9m>F2FhJP!*n8TaaGf;)Xv&ns!YMR zzhQa(wk!~pYgKzV@j=KW*vy1PcqSWn^~N!=2S7X@c`#2H8!mQG-rOB^U(-M8&e)rW zT`&=P;qLTvws3W9n>~`mH?|k}pL#oOh#NUGemuA2bWEEmBH-t8962!~0L(ahuZ)y# z^h4cAx&r=QGQQjyqcqJ>F*}sGQ2J)Q=ut+CnsucJrIPNH9d1bgXm#!lXB3hLd(sD- z52s>dW2F z=Q(EtaLG`!=OqXPeI~dOGWHV!r=`+qcIm}?)h9JIOU>XNH%c|(dCZe7VbsjQ*5|Cm zR4_~O+Ov=zWFvC53ppM{G9R4}>J~jImj1CaS&wMixq!I>wjC$GX6Tj@Dyl97W2;ef zbMwk8;thWw28X`_lXNuro4|(xTmJj*SPXbwf&+Vsz>L4*-Kcqg#y>$;%IhAltT3VO z8@5pKAR1I4e8&k|g7g#BEx>`-hTc_?OvAJj@23Bt+mmET?V};F%?wTN6X2XGZ z_aU7K7m8*(;ZzFTM=v^k6Jik?ux5x%-3CnkqQJIIlt)7-=?RF@ha@x<*Kdj;^|R#; zAoFr#;O9I^=|d4xdLyR}y|aChUX{vwDQXM?z)LV7ymlR|*uxliLxfE714UIP|Ftdo z!kK_fk$pvWhPsLF?ruVhP(elAD%ypTSrE{hRn<*Va-Dl}xO1$!Nb1{Mh5kR9BTtOm zgbshzE8p!P@8>de#O|{}~pN@4jQ2s~tZE#Q+~D zGezc2Sl98}Ip_@I0xQ?K6Y9O3Z(-Dc@b}Sg51S^zS^~LubyNL7Iwx8~3~9%D#tTwJ z4nzwH;q-f5jaeA) zej-aasfpX&7#SoSG(07*Pi;M24lk_ZOZH7IBu9sx1(MOH2Y)&`I;@N~+#(StMwX20 zUs1IG9Q;0gVNmt%hU)g#dWwFBs3Y6Ql_O1Q(KZtup-%0$BtSLk^gP(ALB=d*6?of( zlx^T;m-RWz`>SvxKdJjVppA36z>;RzyOd6qmtyP5T~geiHhf6?E`4eoA6Ch@e#PiX zNkKuUDB)3e0V&7e%dRM}26pGi}dUexl?x<$G*ixhN9I74N zxl~YZH57t&OuYd%>Zq6k;*XR`vZy?bpFBIXQ!x4Ii+N8+Y_7*4Vzy4f9O#I)YG&=? zXp{2k{#4l7p>FtF4ouNA_7&y5F|YLVd^(Z~Y~3>;ZB>qPpWn-Yx9b%Cs~}L^#Ic}P z2CGYz2_>sLghZXSU6+xPg_b#G!om0P4fj;~G;*wPT8qTt^gG>Hx9XKLt0eBle(lRX zOZU31`S#1Mf#FuB9-|?xUq8{DK zfZt<~s>{;6eNT$tCb0>P$ve2gC>%f3< zuq40AUkDU_zrskJ%A<~s|NMA?HXb}qF`UAmgwO^~hDWZnsMCAJoq=Q2!>2)NfHkNy zV8WnBAVhy$*3$&v~$BFhwXnw5uO14c8no*#l2|y-_$Zngn?%SWLSo2$F9{-Rpx)RgktS z7=Myoeu@fB72F~fbAt;p?U14`)I9MP->q@mI4VA5k0V+9RQtuCG_Ite>>NRhkz#$c zoRKTt{%V1=Q3)x_g$lLK9I&1V9fVj`y>sV+ZM^4SsMjR=6Ndd@$!6JE{`QgP2y;qT zT}1$h>v7&Q1JUDsBE^gf=Hf8q4r%;ZIMbqh@64fHR*F8|`lV3J;?)C)U(?INuq#jZ)ImJH7Qfy^X{@(9(~%k8x_s#v<+yvB{a`P1G^G)JqwR425kX>-|lurB0ei$j=^!SXpcEd z1S_Ktw-;(zyijJ`gzDvFVHV)Gb}%nv;^EB>6J1xs1-ACX?pMQAw>&=UP_~)ewyX+1 zIea5T=R2lD*~O|Sz`X^Y@#-ec-5BgE2wGTM;#%5rTJKyU?7s+7I%wA2U1|!dSk5N< z@C?9`y==a`EQ#q*Z@>FR-dca@@(!YHWqCPJZSTt|<+zxQq6y`dyWq)006s+xmBTji zeUpow^ZW#NNs|-~=AFWn9rmuLqUcL~4=w|lVGo=xG9ey0_19+3E#CbQ=HF%nbop(y z%MgStdDcndOJ7Z37%o8g3Zn!^+l}Ow_c*NQ(@ETq%+Jp+mrPy^=hz53k)nQj;$&eE z?_5*!T}*(z?6xDObvF(tJ z75S`;pg+Sx@fjMOLl_1oaE4e@_)J=G^{+z%`9(tR+1RN0m-V_wO`4jq!j;GSQ*UTJ z>y)eIRefOj(b7m<{)lClLa~MZep^a*s;fIc;`F}d8hCplXFMA{ANnJbzXeV z;MUH^G_@yL@DSRZ9<+ODpGZJn+Id>d9 zj(l`31gY^lj@Vt+v%aK}$${EKo0({wd|OR+nmZtu)LAUzP&~xnIr4g#A|ER)1JCC6 z@iXFf+JDjiOA0*Ta+8HzJX?WsMAtOfKz~Dq0r7gVc83aK->>YLdk#eL%p{D|u{2JX zT&k93oM1FAvZKraMwCJ$epqH zBwBYD>?vkhuLPLq)aI_9Qv25*b*pl&1k8SN*uRu=ru9M5Z7(VtiKN3orWB^G?2(;^ zH`u|WI0d2-&f5+m=4H#fU~GoI^^laKhphB_%)<oU1{nV+Bs&K+%o~! z^Soyy0(j1Az#lA=`_M#vL)uu; zQ_S}?lu{w;OrDZ*8o$9=E?#`;&U;HddLB}lNP0DvAoi6vizTzLmHOnnowL{EGth>P zEPZL#RPFQzttBZO6i=V<#U!wzV)FYJnD4O*Jb24a>2~tnA$YW{heY?w{iwa>|B2> zp(L2W_06t{5B~Je=DB*y5oVd=PG!Pz;cN!=wb<4sPB5wTKUqPxB_Yi=i_QiD=1!J(10sV;pDw=;mx}}ur|#Lf5>tY;k0dSB16D0 zs1Xw6|0;jA+jFKXrg2&ARmw8qJ~~3-Bz}V~tgrY)6oxFTD>e0Jqj;o}=ifGP$1aY} zXC4)BP%F16Vp`B$V!ksRz(_HcPvh~)HCLT0`nq#4lwV>mhj>4AKcYizq?n|kk*fRX z429iVEJq9Xz39jZPU9cS*dX1M;I--Ssv~lr<)N$l>0&{S&$v&+Gg+lUOZ+jPQTlfl zJcC-cs1af&t%S668{m%KrW#^o_hO*Py}Jf(n9pcxFJe#df@wNUuba{>qzwhwlK>{^ zRSo4A`%3XScL*O@P6qpqDpW}ht-vF5kAoOw4*jD#*OuPfrtIF{otOlV6&m+w2QFv$ zFDx?OnBaqBYT~-~7m7WLtr?v99Wk;Ox*FxpS(jW;&7})L)MWO<`!E_VivpWTrrL?j z`C~WN>DIg#$Tt@%E3 zfQ|AG=g6R}v0wOtr{Td#@yqza`#-Q%2bwJ1?&T|XR9avwMIoFu!NRpfn^tjKFJd)) zJe#ISdv0o(?1s<9&q87TOeyqH@}27E{gBY-~RGQ@C|Mto4ECY=6waa-Al@ z6`coI`QXo3wSCD!i@8D*An#gsviSIRWR29kqJLRKfU0+whv}Pgl+#8@)Vl6sF-$R6 zMa)rIzvt9Oua&jS?z=j_7OHoHK2s=&(tMGauk{HFD;rAPZ>sB`yt=}4{& zlGQiCpM2Sbe02L``kpXXq2J1IBV$SS6Pu{~_FDDM2!>&?zB~1%oe?E}#QJ_r6dO=@ zZOfk(E=e?Ap~r?qr2{;yfeQ`gMlcmQ}<3)d|bx+cf#;!q)|ChL&;g2;GzT6!ECl0;4Ii_?1%nu3X$_GgUHm z3?1j=`GB`Rm-RPYD7EX81^+yp(`-y!rNs(Hp?cS(!-@3A- zk^F9rr&YZ!E-?8z-&T6u)!o`{LbGSj8c#v*Qnvj;S)1+Yx6bCG-p=OhyUDd>0_uZ9 zoiTf^$=ePO37kitf~=Y)cLSOUyDkPX<+f%E+gH}o>)!`iHypAAr?GvG=OV@VWc(>(T0(M z>Z29xf8xBot$VO_F&%hXF^h`A?ZupeC?~x5U5-lk2yHlJK>M^I2EaKs7{AT?a`q?9 zF?jMKp>I;gQT0J*`=Y?3p1kV`sH{Jw`F8@u%<7_;F0)HrAxx}a-}NG893fb&z)L$_ zSdLD<;XgUmZO<*t@V!!xjl0gb#@D&9mVwvou}g6lpDFbQm(khm`EG9dWZP@=Q+nrw z?wJ_Bn9h~queRe0o$m&xg6!8KPuz;MjwT@a^t5Vpx~IHxa9rc-^=;KsDxUk+s)>#b zbn9G@e2;hU2^eI-z8ZKZtbAaBuidSkF5cW+7D#T)Z=KMpOF0!j2}*E~h_IcQ9-ie? z;7N%rPn=dvX!^R*b9KUD0d=KyaO))*nM_s)r+)cKCd3##v!+`_N!(=&a1C8jYQQY_|0q%UQ!# z%}!-|yYpWa6!BN^y7rn93=V}%2e~#$8&w(c?ung3EnYF-nv;=BsnY-WCA~j z%EZ`R=`;wki#c$zdpz#RYlb&euiZUhXua^nyn5Hp>R;Im3V{FryZ@_YfQ%$PRi?@y X_ZI7FzYG3VCqVtS&aM0#HlhCmnu;y| literal 0 HcmV?d00001 diff --git a/js/mobile/assets/icon.png b/js/mobile/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e96a5a9cbd946f81304ca0997e2a622957934a GIT binary patch literal 35911 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 X-jauE7Y}|z|MT?8vnTS7Ip6#rTL-~1 literal 0 HcmV?d00001 diff --git a/js/mobile/assets/icon_green.png b/js/mobile/assets/icon_green.png new file mode 100644 index 0000000000000000000000000000000000000000..009ff0ca8bd1b3ad1468454b8816a85886bb1964 GIT binary patch literal 36555 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%0DB)kgqGKbloDW#Bf4Z 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 C5k@lr literal 0 HcmV?d00001 diff --git a/js/mobile/assets/icon_red.png b/js/mobile/assets/icon_red.png new file mode 100644 index 0000000000000000000000000000000000000000..da4350598b3cf5e66aff09329142b41d5f45ac14 GIT binary patch literal 36464 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

HD*-zAcBwq1nO*4=IB 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 + + diff --git a/js/mobile/assets/sound.wav b/js/mobile/assets/sound.wav new file mode 100644 index 0000000000000000000000000000000000000000..68abf034ec52d907490ad5b8973c8d8bde1bcbc3 GIT binary patch literal 589902 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 zf65-*cP#>oz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;R zum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT7 z0*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$b zBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ zECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4N zz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV z2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&y zi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;R zum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT7 z0*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$b zBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ zECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4N zz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV z2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&y zi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;R zum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT7 z0*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$b zBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ zECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4N zz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV z2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&y zi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;R zum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT7 z0*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$b zBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ zECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4N zz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV z2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&y zi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;R zum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT7 z0*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$b zBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ zECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4N zz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV z2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&y zi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;R zum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT7 z0*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$b zBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ zECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4N zz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV z2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&y zi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;R zum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT7 z0*k;Rum~&yi@+kV2rL4Nz#^~+ECP$bBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$b kBCrT70*k;Rum~&yi@+kV2rL4Nz#^~+ECP$b-&_R#U+%{qRsaA1 literal 0 HcmV?d00001 diff --git a/js/mobile/assets/sounds/click.mp3 b/js/mobile/assets/sounds/click.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4fd472cafc324de51bf4302da2ca9280af9ab820 GIT binary patch literal 33024 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 literal 0 HcmV?d00001 diff --git a/js/mobile/package.json b/js/mobile/package.json index 2a2aa35..dce3b4d 100644 --- a/js/mobile/package.json +++ b/js/mobile/package.json @@ -5,7 +5,7 @@ "main": "index.ts", "scripts": { "start": "expo start", - "ios": "expo run:ios", + "ios": "expo run:ios --device", "android": "expo run:android", "compile": "tsc --noEmit", "lint": "expo lint" @@ -18,7 +18,10 @@ "@tanstack/react-query": "^5.90.21", "clsx": "^2.1.1", "expo": "~54.0.0", + "expo-audio": "~1.0.13", + "expo-camera": "~17.0.8", "expo-constants": "~18.0.13", + "expo-file-system": "~19.0.16", "expo-haptics": "~15.0.7", "expo-secure-store": "~15.0.8", "expo-video": "~3.0.10", diff --git a/js/mobile/src/App.tsx b/js/mobile/src/App.tsx index 53bc9ae..a65c412 100644 --- a/js/mobile/src/App.tsx +++ b/js/mobile/src/App.tsx @@ -6,6 +6,7 @@ import { NavigationContainer } from "@react-navigation/native"; import { SafeAreaProvider } from "react-native-safe-area-context"; import { Toaster } from "sonner-native"; import { createQueryClient } from "@/lib/query-client"; +import { PusherProvider } from "@/lib/pusher-provider"; import { RootNavigator } from "@/navigation/RootNavigator"; import { useAuthStore } from "@/stores/auth-store"; @@ -21,13 +22,15 @@ export default function App() { return ( - - - - - - - + + + + + + + + + ); diff --git a/js/mobile/src/api/types.ts b/js/mobile/src/api/types.ts index 42e014a..1ab02d1 100644 --- a/js/mobile/src/api/types.ts +++ b/js/mobile/src/api/types.ts @@ -123,6 +123,11 @@ export const MediaPropertiesSchema = z.object({ size_bytes: z.number(), transcript: TranscriptSchema.optional(), source: z.enum(["camera", "screen"]).optional(), + // Set by the particle processor worker once an iOS-playable MP4/m4a variant + // has been produced from a non-iOS-playable original (e.g. WebM from desktop). + // When present, clients should prefer these over object_id/mime_type for playback. + transcoded_object_id: z.string().optional(), + transcoded_mime_type: z.string().optional(), }); export type MediaProperties = z.infer; diff --git a/js/mobile/src/components/ComposingIndicator.tsx b/js/mobile/src/components/ComposingIndicator.tsx new file mode 100644 index 0000000..fcc62ea --- /dev/null +++ b/js/mobile/src/components/ComposingIndicator.tsx @@ -0,0 +1,95 @@ +import { useEffect } from "react"; +import { Text, View } from "react-native"; +import Animated, { + Easing, + useAnimatedStyle, + useSharedValue, + withRepeat, + withTiming, +} from "react-native-reanimated"; +import type { Human } from "@/api/types"; +import { resolveHumanDisplay } from "@/lib/humans"; +import type { ComposingUser } from "@/features/stream-view/stream-presence-context"; + +interface ComposingIndicatorProps { + users: ComposingUser[]; + networkHumans?: Human[]; +} + +/** + * Slim horizontal pill stack pinned just under the metadata header. Each + * pill is the typing/recording indicator for a single user. Rendered above + * the particle canvas with a translucent background so it reads on any + * media. Mobile equivalent of desktop's vertical writing-mode indicator. + */ +export function ComposingIndicator({ + users, + networkHumans, +}: ComposingIndicatorProps) { + if (users.length === 0) return null; + + return ( + + {users.map((u) => { + const { displayName } = resolveHumanDisplay(u.humanId, networkHumans); + const label = + u.mode === "recording" + ? `${displayName} is recording` + : u.mode === "screen" + ? `${displayName} is sharing` + : `${displayName} is typing`; + + return ( + + + + {label} + + + ); + })} + + ); +} + +function BouncingDots() { + return ( + + + + + + ); +} + +function Dot({ delay }: { delay: number }) { + const y = useSharedValue(0); + + useEffect(() => { + const start = setTimeout(() => { + y.value = withRepeat( + withTiming(-3, { + duration: 360, + easing: Easing.inOut(Easing.quad), + }), + -1, + true, + ); + }, delay); + return () => clearTimeout(start); + }, [delay, y]); + + const style = useAnimatedStyle(() => ({ + transform: [{ translateY: y.value }], + })); + + return ( + + ); +} diff --git a/js/mobile/src/features/compose/AudioRecordingOverlay.tsx b/js/mobile/src/features/compose/AudioRecordingOverlay.tsx new file mode 100644 index 0000000..027e21a --- /dev/null +++ b/js/mobile/src/features/compose/AudioRecordingOverlay.tsx @@ -0,0 +1,193 @@ +import { useEffect, useRef, useState } from "react"; +import { StyleSheet, Text, View } from "react-native"; +import { Mic } from "lucide-react-native"; +import { + RecordingPresets, + useAudioRecorder, + useAudioRecorderState, +} from "expo-audio"; +import Animated, { + Easing, + useAnimatedStyle, + useSharedValue, + withRepeat, + withTiming, +} from "react-native-reanimated"; +import { useEvent } from "@/hooks/use-event"; +import { logError } from "@/lib/errors"; + +const MAX_DURATION_S = 60; + +interface AudioRecordingOverlayProps { + cancelProgress: { value: number }; + onComplete: (result: { uri: string; durationMs: number }) => void; + onCancel: () => void; + onRecordingStarted: () => void; + /** + * The parent owns the gesture that drives commit/cancel. To avoid race + * conditions when the user releases right as the overlay is mounting, we + * expose a `pendingAction` prop that's flushed once recording is live. + */ + pendingAction: "commit" | "cancel" | null; +} + +/** + * Voice-only recording. Mounts an `expo-audio` recorder, kicks it off as soon + * as `prepareToRecordAsync` resolves, and waits for the parent to flush a + * commit/cancel action. The shared `cancelProgress` value lights the cancel + * hint as the user drags up. + */ +export function AudioRecordingOverlay({ + cancelProgress, + onComplete, + onCancel, + onRecordingStarted, + pendingAction, +}: AudioRecordingOverlayProps) { + const recorder = useAudioRecorder(RecordingPresets.HIGH_QUALITY); + const recorderState = useAudioRecorderState(recorder, 100); + const [elapsedMs, setElapsedMs] = useState(0); + const startedAtRef = useRef(null); + const finalizedRef = useRef<"pending" | "completed" | "cancelled">( + "pending", + ); + + const onCompleteStable = useEvent(onComplete); + const onCancelStable = useEvent(onCancel); + const onStartedStable = useEvent(onRecordingStarted); + + // Spin up the recorder. + useEffect(() => { + let cancelled = false; + (async () => { + try { + await recorder.prepareToRecordAsync(); + if (cancelled) return; + recorder.record(); + startedAtRef.current = Date.now(); + onStartedStable(); + } catch (err) { + logError(err, { scope: "compose.audio.prepare" }); + if (!cancelled) onCancelStable(); + } + })(); + return () => { + cancelled = true; + }; + // recorder identity is stable for the component's lifetime + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // Cap at 60s — match the desktop limit and the PRD. + useEffect(() => { + const interval = setInterval(() => { + if (startedAtRef.current === null) return; + const elapsed = Date.now() - startedAtRef.current; + setElapsedMs(elapsed); + if (elapsed >= MAX_DURATION_S * 1000) { + void finalize("commit"); + } + }, 100); + return () => clearInterval(interval); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const finalize = useEvent(async (kind: "commit" | "cancel") => { + if (finalizedRef.current !== "pending") return; + finalizedRef.current = kind === "commit" ? "completed" : "cancelled"; + try { + await recorder.stop(); + } catch (err) { + logError(err, { scope: "compose.audio.stop" }); + } + if (kind === "cancel") { + onCancelStable(); + return; + } + const uri = recorder.uri; + if (!uri) { + onCancelStable(); + return; + } + const durationMs = + startedAtRef.current !== null ? Date.now() - startedAtRef.current : 0; + onCompleteStable({ uri, durationMs }); + }); + + // Flush parent-issued action when it arrives. + useEffect(() => { + if (pendingAction === "commit") void finalize("commit"); + if (pendingAction === "cancel") void finalize("cancel"); + }, [pendingAction, finalize]); + + // Safety: stop recording on unmount if we never finalized. + useEffect(() => { + return () => { + if (finalizedRef.current === "pending") { + finalizedRef.current = "cancelled"; + recorder.stop().catch(() => {}); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const elapsedSec = Math.floor(elapsedMs / 1000); + const isRecording = recorderState.isRecording; + + return ( + + + + Voice message + + + {elapsedSec.toString().padStart(2, "0")}s · max {MAX_DURATION_S}s + + + + ); +} + +function PulsingMic({ active }: { active: boolean }) { + const scale = useSharedValue(1); + useEffect(() => { + if (!active) return; + scale.value = withRepeat( + withTiming(1.15, { duration: 700, easing: Easing.inOut(Easing.quad) }), + -1, + true, + ); + }, [active, scale]); + const style = useAnimatedStyle(() => ({ + transform: [{ scale: scale.value }], + })); + return ( + + + + + + ); +} + +function CancelHint({ + cancelProgress, +}: { + cancelProgress: { value: number }; +}) { + const style = useAnimatedStyle(() => { + const progress = Math.max(0, Math.min(cancelProgress.value, 1)); + return { opacity: 0.5 + progress * 0.5 }; + }); + return ( + + Slide up to cancel + + ); +} diff --git a/js/mobile/src/features/compose/ComposeDock.tsx b/js/mobile/src/features/compose/ComposeDock.tsx new file mode 100644 index 0000000..fbc13dc --- /dev/null +++ b/js/mobile/src/features/compose/ComposeDock.tsx @@ -0,0 +1,501 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { Pressable, Text, View } from "react-native"; +import { Mic, Type as TypeIcon, Video as VideoIcon } from "lucide-react-native"; +import * as Haptics from "expo-haptics"; +import { setAudioModeAsync } from "expo-audio"; +import { + useCameraPermissions, + useMicrophonePermissions, +} from "expo-camera"; +import { + Gesture, + GestureDetector, +} from "react-native-gesture-handler"; +import Animated, { + Easing, + runOnJS, + useAnimatedStyle, + useSharedValue, + withTiming, +} from "react-native-reanimated"; +import { toast } from "sonner-native"; +import { cn } from "@/lib/utils"; +import { useEvent } from "@/hooks/use-event"; +import { logError } from "@/lib/errors"; +import { useSuspendPlayback } from "@/hooks/use-suspend-playback"; +import { useAuthStore } from "@/stores/auth-store"; +import { + createTextParticle, + uploadMediaParticle, +} from "@/lib/upload"; +import type { ParticlePath } from "@/lib/particle-path"; +import { + useStreamComposingBroadcast, + type ComposingMode, +} from "@/features/stream-view/stream-presence-context"; +import { TextComposeModal } from "./TextComposeModal"; +import { VideoRecordingOverlay } from "./VideoRecordingOverlay"; +import { AudioRecordingOverlay } from "./AudioRecordingOverlay"; +import { ReviewSheet } from "./ReviewSheet"; + +type RecordingMode = "video" | "audio"; +type PendingAction = "commit" | "cancel" | null; + +type ComposeUiState = + | { kind: "idle" } + | { kind: "warming-up"; mode: RecordingMode } + | { kind: "recording"; mode: RecordingMode } + | { + kind: "review"; + mode: RecordingMode; + uri: string; + durationMs: number; + } + | { kind: "uploading" }; + +const CANCEL_THRESHOLD_PX = 120; +const SHORT_RELEASE_MS = 350; + +interface SubmitMediaParams { + fileUri: string; + mimeType: string; + durationMs: number; + source: "camera" | "screen"; +} + +interface ComposeDockProps { + networkId: string; + /** Where new particles are created. Defaults to the current stream. */ + targetPath: ParticlePath; + /** + * When true, the dock won't broadcast composing state — used by the + * new-stream screen where there's no presence channel to broadcast to. + */ + silentPresence?: boolean; + /** + * Optional: replace the default media upload logic. NewStreamScreen uses + * this to create the stream + first particle in one shot. The dock still + * owns the review-sheet / haptic / state-machine flow; only the final + * persistence step is swapped. + */ + submitMedia?: (params: SubmitMediaParams) => Promise; + /** Optional: replace the default text-particle creation. */ + submitText?: (content: string) => Promise; +} + +/** + * Bottom dock + recording orchestrator. The hold-to-record gesture lives on + * the FAB and drives every state transition. `cancelProgress` is a worklet + * shared value the overlays read for live cancel-pill animations. Playback + * is suspended via the pause-store while the dock is anything but idle. + */ +export function ComposeDock({ + networkId, + targetPath, + silentPresence = false, + submitMedia, + submitText: submitTextOverride, +}: ComposeDockProps) { + const userId = useAuthStore((s) => s.user?.id); + + const [mode, setMode] = useState("video"); + const [ui, setUi] = useState({ kind: "idle" }); + const [textOpen, setTextOpen] = useState(false); + // Both overlays read this prop to know how to finalize. It's set on release + // and cleared as the overlay unmounts. + const [pendingAction, setPendingAction] = useState(null); + + const [camPerm, requestCamPerm] = useCameraPermissions(); + const [micPerm, requestMicPerm] = useMicrophonePermissions(); + + // Suspend underlying playback whenever the dock isn't idle. Mirrors how + // desktop's compose-overlay flips the playback-pause-store. + const isComposing = ui.kind !== "idle" || textOpen; + useSuspendPlayback(isComposing, "compose"); + + // Broadcast composing state over Pusher so other viewers see the dot. + // When silentPresence is set we skip — the dock renders outside a stream + // (e.g. NewStreamScreen) where no presence channel exists yet. + useComposingBroadcast({ ui, textOpen, silent: silentPresence }); + + // Worklet-side flag the overlays read for live cancel UI. + const cancelProgress = useSharedValue(0); + // Press start time, kept on a ref so worklets can read it via runOnJS. + const pressStartedAtRef = useRef(null); + + const ensurePermissions = useCallback( + async (forVideo: boolean): Promise => { + if (forVideo) { + const cam = camPerm?.granted ? camPerm : await requestCamPerm(); + if (!cam.granted) { + toast.error("Camera permission is required to record video."); + return false; + } + } + const mic = micPerm?.granted ? micPerm : await requestMicPerm(); + if (!mic.granted) { + toast.error("Microphone permission is required to record."); + return false; + } + return true; + }, + [camPerm, micPerm, requestCamPerm, requestMicPerm], + ); + + // ----- Lifecycle handlers ----- + + const beginRecording = useEvent(async () => { + if (ui.kind !== "idle") return; + pressStartedAtRef.current = Date.now(); + const ok = await ensurePermissions(mode === "video"); + if (!ok) { + pressStartedAtRef.current = null; + return; + } + // iOS requires the audio session to allow recording before either the + // audio recorder or the camera's audio track will work. + try { + await setAudioModeAsync({ + allowsRecording: true, + playsInSilentMode: true, + }); + } catch (err) { + logError(err, { scope: "compose.audio.setMode.record" }); + } + void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + setUi({ kind: "warming-up", mode }); + }); + + // Restore the audio session to playback-only when we leave recording, + // otherwise iOS keeps routing playback through the earpiece. + const restoreAudioMode = useCallback(() => { + setAudioModeAsync({ + allowsRecording: false, + playsInSilentMode: true, + }).catch((err) => + logError(err, { scope: "compose.audio.setMode.restore" }), + ); + }, []); + + const handleRecordingStarted = useCallback(() => { + setUi((prev) => + prev.kind === "warming-up" + ? { kind: "recording", mode: prev.mode } + : prev, + ); + }, []); + + const handleRecordingComplete = useCallback( + ({ uri, durationMs }: { uri: string; durationMs: number }) => { + void Haptics.selectionAsync(); + setUi((prev) => { + const m = "mode" in prev ? prev.mode : mode; + return { kind: "review", mode: m, uri, durationMs }; + }); + setPendingAction(null); + pressStartedAtRef.current = null; + restoreAudioMode(); + }, + [mode, restoreAudioMode], + ); + + const handleRecordingCancel = useCallback(() => { + setUi({ kind: "idle" }); + setPendingAction(null); + pressStartedAtRef.current = null; + cancelProgress.value = 0; + restoreAudioMode(); + }, [cancelProgress, restoreAudioMode]); + + const finalizeFromGesture = useEvent(({ cancelled }: { cancelled: boolean }) => { + const heldMs = pressStartedAtRef.current + ? Date.now() - pressStartedAtRef.current + : 0; + + // Recording never warmed up to "recording" — drop back to idle without + // shipping anything (permission denied, or mount race). + if (ui.kind === "warming-up") { + setUi({ kind: "idle" }); + pressStartedAtRef.current = null; + cancelProgress.value = 0; + restoreAudioMode(); + return; + } + if (ui.kind !== "recording") return; + + const wantCancel = cancelled || heldMs < SHORT_RELEASE_MS; + if (wantCancel) { + void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + } + setPendingAction(wantCancel ? "cancel" : "commit"); + cancelProgress.value = 0; + }); + + // ----- Gesture: hold-to-record on FAB ----- + + const pan = Gesture.Pan() + .minDistance(0) + .activateAfterLongPress(120) + .onStart(() => { + "worklet"; + runOnJS(beginRecording)(); + }) + .onUpdate((e) => { + "worklet"; + const upPx = Math.max(0, -e.translationY); + cancelProgress.value = Math.min(upPx / CANCEL_THRESHOLD_PX, 1); + }) + .onEnd((e) => { + "worklet"; + const cancelled = e.translationY < -CANCEL_THRESHOLD_PX; + runOnJS(finalizeFromGesture)({ cancelled }); + }) + .onFinalize(() => { + "worklet"; + cancelProgress.value = 0; + }); + + // ----- Submit handlers ----- + + const sendReview = useEvent(async () => { + if (ui.kind !== "review" || !userId) return; + const captured = ui; + setUi({ kind: "uploading" }); + try { + const mimeType = + captured.mode === "audio" ? "audio/mp4" : "video/mp4"; + if (submitMedia) { + await submitMedia({ + fileUri: captured.uri, + mimeType, + durationMs: captured.durationMs, + source: "camera", + }); + } else { + await uploadMediaParticle({ + networkId, + targetPath, + fileUri: captured.uri, + mimeType, + durationMs: captured.durationMs, + source: "camera", + createdByHumanId: userId, + }); + } + void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + setUi({ kind: "idle" }); + } catch (err) { + void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); + // Restore the review sheet so the user can retry without losing their + // take. The sheet's own toast already surfaced the error message. + setUi(captured); + throw err; + } + }); + + const retake = useCallback(() => setUi({ kind: "idle" }), []); + const cancelReview = useCallback(() => setUi({ kind: "idle" }), []); + + const submitText = useEvent(async (content: string) => { + if (!userId) throw new Error("Not signed in."); + if (submitTextOverride) { + await submitTextOverride(content); + } else { + await createTextParticle({ + networkId, + targetPath, + content, + createdByHumanId: userId, + }); + } + void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + }); + + // ----- FAB animations ----- + + const fabScale = useSharedValue(1); + useEffect(() => { + const target = ui.kind === "recording" ? 1.18 : 1; + fabScale.value = withTiming(target, { + duration: 220, + easing: Easing.out(Easing.cubic), + }); + }, [ui.kind, fabScale]); + + const fabStyle = useAnimatedStyle(() => ({ + transform: [{ scale: fabScale.value }], + })); + + const ringStyle = useAnimatedStyle(() => { + const opacity = ui.kind === "recording" ? 1 : 0; + const armed = cancelProgress.value > 0.5; + return { + opacity, + borderColor: armed + ? "rgba(239, 68, 68, 0.95)" + : "rgba(255,255,255,0.95)", + }; + }); + + // ----- Render ----- + + const dockHidden = ui.kind === "review" || ui.kind === "uploading"; + + return ( + <> + {!dockHidden ? ( + + + + setMode((m) => (m === "video" ? "audio" : "video")) + } + disabled={ui.kind !== "idle"} + accessibilityLabel={`Switch to ${ + mode === "video" ? "audio" : "video" + } mode`} + className={cn( + "h-11 w-11 items-center justify-center rounded-full bg-white/15", + ui.kind !== "idle" && "opacity-40", + )} + > + {mode === "video" ? ( + + ) : ( + + )} + + + + + + + + + + + {ui.kind === "recording" + ? "Release to send · slide up to cancel" + : "Hold to record"} + + + + setTextOpen(true)} + disabled={ui.kind !== "idle"} + accessibilityLabel="Compose text" + className={cn( + "h-11 w-11 items-center justify-center rounded-full bg-white/15", + ui.kind !== "idle" && "opacity-40", + )} + > + + + + + ) : null} + + {ui.kind === "warming-up" || ui.kind === "recording" ? ( + ui.mode === "video" ? ( + + ) : ( + + ) + ) : null} + + + + setTextOpen(false)} + onSubmit={submitText} + /> + + ); +} + +/** + * Reads the dock UI state and tells the StreamPresenceContext when to start + * or stop broadcasting composing_start/composing_stop. The hook intentionally + * uses optional context access so the dock can also be hosted on the + * new-stream screen, where there's no provider above us. + */ +function useComposingBroadcast({ + ui, + textOpen, + silent, +}: { + ui: ComposeUiState; + textOpen: boolean; + silent: boolean; +}) { + // Optional consumer — `useStreamComposingBroadcast` throws when used + // outside its provider, so we trap that here. Cheap because the throw + // happens once per mount. + let broadcast: ReturnType | null; + try { + broadcast = useStreamComposingBroadcast(); + } catch { + broadcast = null; + } + + const mode: ComposingMode | null = + ui.kind === "recording" || ui.kind === "warming-up" + ? "recording" + : textOpen + ? "typing" + : null; + + useEffect(() => { + if (silent || !broadcast) return; + if (mode) { + broadcast.startComposing(mode); + return () => broadcast?.stopComposing(); + } + }, [mode, silent, broadcast]); +} diff --git a/js/mobile/src/features/compose/ReviewSheet.tsx b/js/mobile/src/features/compose/ReviewSheet.tsx new file mode 100644 index 0000000..e61ba54 --- /dev/null +++ b/js/mobile/src/features/compose/ReviewSheet.tsx @@ -0,0 +1,148 @@ +import { useEffect, useState } from "react"; +import { Modal, Pressable, Text, View } from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import { useVideoPlayer, VideoView } from "expo-video"; +import { Mic } from "lucide-react-native"; +import { toast } from "sonner-native"; +import { cn } from "@/lib/utils"; +import { toUserMessage } from "@/lib/errors"; + +interface ReviewSheetProps { + open: boolean; + /** Local file URI from the recorder. */ + uri: string | null; + mode: "video" | "audio" | null; + durationMs: number; + onSend: () => Promise; + onRetake: () => void; + onCancel: () => void; +} + +/** + * Loop-plays the just-recorded clip and offers Retake / Send. WhatsApp-style + * confirmation: any send-failure surfaces a toast and keeps the sheet open + * so the user doesn't lose their take. + */ +export function ReviewSheet({ + open, + uri, + mode, + durationMs, + onSend, + onRetake, + onCancel, +}: ReviewSheetProps) { + const player = useVideoPlayer(uri ?? "", (p) => { + p.loop = true; + p.muted = false; + }); + const [submitting, setSubmitting] = useState(false); + + useEffect(() => { + if (open && uri) { + player.play(); + } + }, [open, uri, player]); + + const handleSend = async () => { + if (submitting) return; + setSubmitting(true); + try { + await onSend(); + } catch (err) { + toast.error(toUserMessage(err)); + setSubmitting(false); + } + }; + + const seconds = Math.max(1, Math.round(durationMs / 1000)); + + return ( + + + {uri ? ( + mode === "audio" ? ( + + + + + + Voice message · {seconds}s + + + Tap send to share, or retake. + + + + + + ) : ( + + ) + ) : null} + + + + + Cancel + + + + + + + + Retake + + + + + {submitting ? "Sending..." : "Send"} + + + + + + + ); +} diff --git a/js/mobile/src/features/compose/TextComposeModal.tsx b/js/mobile/src/features/compose/TextComposeModal.tsx new file mode 100644 index 0000000..dba0ec3 --- /dev/null +++ b/js/mobile/src/features/compose/TextComposeModal.tsx @@ -0,0 +1,147 @@ +import { useEffect, useRef, useState } from "react"; +import { + KeyboardAvoidingView, + Modal, + Platform, + Pressable, + Text, + TextInput, + View, +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import { toast } from "sonner-native"; +import { cn } from "@/lib/utils"; +import { toUserMessage } from "@/lib/errors"; + +const IMMERSIVE_CHAR_LIMIT = 120; + +function getImmersiveStyle(length: number) { + if (length === 0) + return { className: "text-3xl font-semibold leading-snug" }; + if (length < 30) + return { className: "text-5xl font-semibold leading-tight" }; + if (length < 70) + return { className: "text-3xl font-semibold leading-snug" }; + return { className: "text-2xl font-normal leading-snug" }; +} + +interface TextComposeModalProps { + open: boolean; + onClose: () => void; + /** + * Submit handler — must throw if the upload fails so the modal can re-show + * the editor and the user doesn't lose their text. + */ + onSubmit: (content: string) => Promise; +} + +/** + * Immersive full-screen text editor. Mirrors desktop's `text-editor.tsx`: + * dynamic font ramp at 30/70/130 chars, no markdown preview, no gradient. + * Long messages scroll inside the multiline TextInput. Pauses upstream + * playback (the host wraps render in a useSuspendPlayback while open). + */ +export function TextComposeModal({ + open, + onClose, + onSubmit, +}: TextComposeModalProps) { + const [content, setContent] = useState(""); + const [submitting, setSubmitting] = useState(false); + const inputRef = useRef(null); + + // Reset whenever the modal opens fresh. + useEffect(() => { + if (open) { + setContent(""); + setSubmitting(false); + // Re-focus on next tick; iOS occasionally drops the autoFocus call when + // the modal animation is mid-flight. + const t = setTimeout(() => inputRef.current?.focus(), 60); + return () => clearTimeout(t); + } + }, [open]); + + const trimmed = content.trim(); + const canSend = trimmed.length > 0 && !submitting; + + const handleSend = async () => { + if (!canSend) return; + setSubmitting(true); + try { + await onSubmit(trimmed); + onClose(); + } catch (err) { + toast.error(toUserMessage(err)); + setSubmitting(false); + } + }; + + const style = getImmersiveStyle(trimmed.length); + const isImmersive = trimmed.length < IMMERSIVE_CHAR_LIMIT; + + return ( + + + + + + Cancel + + + + {submitting ? "Sending..." : "Send"} + + + + + + + + + + + ); +} diff --git a/js/mobile/src/features/compose/VideoRecordingOverlay.tsx b/js/mobile/src/features/compose/VideoRecordingOverlay.tsx new file mode 100644 index 0000000..697074c --- /dev/null +++ b/js/mobile/src/features/compose/VideoRecordingOverlay.tsx @@ -0,0 +1,351 @@ +import { useEffect, useRef, useState } from "react"; +import { Dimensions, StyleSheet, Text, View } from "react-native"; +import { CameraView, type CameraView as CameraViewRef } from "expo-camera"; +import Animated, { + Easing, + useAnimatedStyle, + useSharedValue, + withTiming, +} from "react-native-reanimated"; +import { useEvent } from "@/hooks/use-event"; +import { logError } from "@/lib/errors"; + +const MAX_DURATION_S = 60; +const FAB_BOTTOM_INSET = 96; + +// iOS race: `onCameraReady` fires before the underlying AVCaptureSession is +// fully configured to write a movie file, so the first `recordAsync` call +// can throw "Camera is not ready yet" even though we waited for the +// callback. Empirically a small settle delay + one retry covers it. +const READY_SETTLE_MS = 250; +const RETRY_DELAY_MS = 400; + +interface VideoRecordingOverlayProps { + /** 0..1 — drives the cancel-pill animation as the user drags up. */ + cancelProgress: { value: number }; + onComplete: (result: { uri: string; durationMs: number }) => void; + onCancel: () => void; + /** Fires once recordAsync has actually started writing the file. */ + onRecordingStarted: () => void; + /** + * Set by the parent on release: "commit" stops + ships, "cancel" stops + + * discards. Mirrors the audio overlay's contract so both lifecycles look + * identical to the dock. + */ + pendingAction: "commit" | "cancel" | null; +} + +/** + * Full-screen camera preview that auto-starts a recording on mount and stops + * when the parent supplies `pendingAction`. The overlay does NOT own the + * touch gesture — the ComposeDock holds the Pan that started this recording. + * We just visualize cancel progress. + */ +export function VideoRecordingOverlay({ + cancelProgress, + onComplete, + onCancel, + onRecordingStarted, + pendingAction, +}: VideoRecordingOverlayProps) { + const cameraRef = useRef(null); + const [elapsedMs, setElapsedMs] = useState(0); + const [cameraReady, setCameraReady] = useState(false); + const [warming, setWarming] = useState(true); + + // Lifecycle refs — refs over state so async closures see the latest value + // without re-running effects. + const startedAtRef = useRef(null); + const recordingActiveRef = useRef(false); + const completionRef = useRef<"pending" | "completed" | "cancelled">( + "pending", + ); + + const onCompleteStable = useEvent(onComplete); + const onCancelStable = useEvent(onCancel); + const onStartedStable = useEvent(onRecordingStarted); + + const handleCameraReady = useEvent(() => { + setCameraReady(true); + }); + + // ---- Recording lifecycle ---- + // The flow is intentionally a single effect that runs once `cameraReady` + // flips: settle, attempt, on race-error retry once. Any path back to + // failure routes through onCancelStable so the dock returns to idle. + useEffect(() => { + if (!cameraReady) return; + let cancelled = false; + + const tryStart = async () => { + // Settle delay — the AVCaptureSession needs a beat after onCameraReady. + await wait(READY_SETTLE_MS); + if (cancelled || completionRef.current !== "pending") return; + + const cam = cameraRef.current; + if (!cam) { + onCancelStable(); + return; + } + + const attempt = async (): Promise<{ uri: string } | null> => { + try { + // recordAsync resolves only when stopRecording is called (or + // maxDuration hits). We start a 100ms watchdog so the parent + // doesn't see "recording" until we know recordAsync didn't + // synchronously reject. + startedAtRef.current = Date.now(); + recordingActiveRef.current = true; + const recordPromise = cam.recordAsync({ + maxDuration: MAX_DURATION_S, + }); + + const startedTimer = setTimeout(() => { + if (completionRef.current === "pending") { + setWarming(false); + onStartedStable(); + } + }, 100); + + const result = await recordPromise; + clearTimeout(startedTimer); + return result ?? null; + } catch (err) { + recordingActiveRef.current = false; + throw err; + } + }; + + try { + const result = await attempt(); + if (cancelled) return; + finalizeWithResult(result); + } catch (err) { + const msg = (err as Error)?.message ?? ""; + const isReadyRace = + msg.includes("not ready") || + msg.includes("Camera is not ready"); + + if (!isReadyRace) { + logError(err, { scope: "compose.video.recordAsync" }); + if (!cancelled) onCancelStable(); + return; + } + + // One retry. The native session usually settles within ~400ms after + // the first throw; longer than that and it's not the ready-race. + await wait(RETRY_DELAY_MS); + if (cancelled || completionRef.current !== "pending") return; + try { + const result = await attempt(); + if (cancelled) return; + finalizeWithResult(result); + } catch (err2) { + logError(err2, { + scope: "compose.video.recordAsync.retry", + }); + if (!cancelled) onCancelStable(); + } + } + }; + + const finalizeWithResult = (result: { uri: string } | null) => { + recordingActiveRef.current = false; + if (completionRef.current === "cancelled") return; + completionRef.current = "completed"; + const durationMs = + startedAtRef.current !== null + ? Date.now() - startedAtRef.current + : 0; + if (result?.uri) { + onCompleteStable({ uri: result.uri, durationMs }); + } else { + onCancelStable(); + } + }; + + void tryStart(); + + return () => { + cancelled = true; + }; + }, [cameraReady, onCancelStable, onCompleteStable, onStartedStable]); + + // ---- Parent-issued action: commit / cancel ---- + useEffect(() => { + if (!pendingAction) return; + + if (pendingAction === "cancel") { + completionRef.current = "cancelled"; + } + + // If recording hasn't actually started yet (still warming or retrying), + // there's nothing to stop on the camera; route directly to cancel so + // the parent isn't left waiting for a recordAsync that may take + // another retry cycle to ever start. + if (!recordingActiveRef.current) { + onCancelStable(); + return; + } + + cameraRef.current?.stopRecording(); + }, [pendingAction, onCancelStable]); + + // Safety: if the overlay unmounts mid-recording, cancel the file. + useEffect(() => { + return () => { + if (completionRef.current === "pending") { + completionRef.current = "cancelled"; + if (recordingActiveRef.current) { + cameraRef.current?.stopRecording(); + } + } + }; + }, []); + + // Elapsed counter: 100ms tick. + useEffect(() => { + const interval = setInterval(() => { + if (startedAtRef.current === null) return; + setElapsedMs(Date.now() - startedAtRef.current); + }, 100); + return () => clearInterval(interval); + }, []); + + const elapsedSec = Math.floor(elapsedMs / 1000); + const elapsedRatio = Math.min(elapsedMs / (MAX_DURATION_S * 1000), 1); + + return ( + + + + + + ); +} + +function wait(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function RecChrome({ + warming, + elapsedSec, + elapsedRatio, + cancelProgress, +}: { + warming: boolean; + elapsedSec: number; + elapsedRatio: number; + cancelProgress: { value: number }; +}) { + const screenHeight = Dimensions.get("window").height; + const fabCenterY = screenHeight - FAB_BOTTOM_INSET - 36; + + const cancelPillStyle = useAnimatedStyle(() => { + const progress = Math.max(0, Math.min(cancelProgress.value, 1)); + return { + opacity: progress, + transform: [{ translateY: -40 * progress }], + }; + }); + + return ( + <> + {/* Top REC / warming indicator. */} + + {warming ? ( + + + + Getting ready… + + + ) : ( + + + + REC · {elapsedSec.toString().padStart(2, "0")}s + + + )} + + + {/* Cancel pill — slides in as user drags up. */} + + + + Slide up to cancel + + + + + {/* Tiny duration counter near the FAB. */} + {!warming ? ( + + + {Math.round(elapsedRatio * 60)}s / {MAX_DURATION_S}s + + + ) : null} + + ); +} + +function PulsingDot({ color = "white" }: { color?: string }) { + const opacity = useSharedValue(1); + useEffect(() => { + const loop = () => { + opacity.value = withTiming( + 0.3, + { duration: 600, easing: Easing.inOut(Easing.quad) }, + () => { + opacity.value = withTiming( + 1, + { duration: 600, easing: Easing.inOut(Easing.quad) }, + () => loop(), + ); + }, + ); + }; + loop(); + }, [opacity]); + const style = useAnimatedStyle(() => ({ opacity: opacity.value })); + return ( + + ); +} diff --git a/js/mobile/src/features/stream-view/MediaParticleView.tsx b/js/mobile/src/features/stream-view/MediaParticleView.tsx index a8ee79c..9de0270 100644 --- a/js/mobile/src/features/stream-view/MediaParticleView.tsx +++ b/js/mobile/src/features/stream-view/MediaParticleView.tsx @@ -1,7 +1,12 @@ -import { useEffect } from "react"; -import { Text, View } from "react-native"; +import { useEffect, useRef, useState } from "react"; +import { ActivityIndicator, Text, View } from "react-native"; import { Mic, Video as VideoIcon } from "lucide-react-native"; +import { useEventListener } from "expo"; +import { useVideoPlayer, VideoView, type VideoPlayerStatus } from "expo-video"; import type { Particle } from "@/api/types"; +import { apiClient } from "@/api/client"; +import { logError } from "@/lib/errors"; +import { useEvent } from "@/hooks/use-event"; type MediaParticle = Extract; @@ -12,43 +17,213 @@ interface MediaParticleViewProps { onProgress: (ratio: number) => void; } -// Step 4 placeholder. Step 5 replaces this with `expo-video` playback for MP4 -// (camera + audio-only mp4) and "View on desktop" for legacy WebM. For now the -// view advances on a 5s timer so the rest of the playback shell is exercisable -// against existing media particles (which would currently be desktop WebM). -const PLACEHOLDER_DURATION_S = 5; -const TICK_MS = 100; +const TICK_MS = 150; +/** + * Plays MP4 / MOV / m4a content via expo-video. Desktop currently records + * WebM, which AVPlayer can't decode; the particle processor worker produces + * an iOS-playable MP4/m4a variant and writes `transcoded_object_id` / + * `transcoded_mime_type` to the particle. While that work is in flight, we + * show a "Processing for mobile…" placeholder and let the Firestore listener + * swap us into the playable state once the worker finishes. + * + * The signed download URL is fetched lazily via apiClient.getParticleDownloadUrl + * (Orion-issued, time-limited). We show a spinner while that resolves, then + * mount the player and report progress via a 150ms tick reading the player's + * currentTime — same model as desktop's MediaParticleView. + */ export function MediaParticleView({ particle, paused, onEnded, onProgress, }: MediaParticleViewProps) { - const isAudio = particle.properties.mime_type.startsWith("audio/"); - const isMp4 = - particle.properties.mime_type === "video/mp4" || - particle.properties.mime_type === "audio/mp4"; + const activeObjectId = + particle.properties.transcoded_object_id ?? particle.properties.object_id; + const activeMime = + particle.properties.transcoded_mime_type ?? particle.properties.mime_type; + const isAudio = activeMime.startsWith("audio/"); + const isPlayable = isPlayableMime(activeMime); + // Reset progress as the active particle changes — independent of playback + // state — so the segmented bar drops back to 0 immediately. useEffect(() => { onProgress(0); }, [particle.id, onProgress]); + if (!isPlayable) { + return ; + } + + return ( + + ); +} + +function PlayableMediaView({ + particle, + activeObjectId, + isAudio, + paused, + onEnded, + onProgress, +}: { + particle: MediaParticle; + activeObjectId: string; + isAudio: boolean; + paused: boolean; + onEnded: () => void; + onProgress: (ratio: number) => void; +}) { + const [sourceUri, setSourceUri] = useState(null); + const [resolveError, setResolveError] = useState(null); + + // Fetch the signed download URL once per active object. Orion URLs are + // time-limited — we treat the URL as one-shot for this view's lifetime. + // Re-runs when the worker writes `transcoded_object_id` and the parent + // resolves a new active object id. useEffect(() => { - if (paused) return; - let elapsed = 0; + let cancelled = false; + setSourceUri(null); + setResolveError(null); + apiClient + .getParticleDownloadUrl(activeObjectId) + .then((url) => { + if (!cancelled) setSourceUri(url); + }) + .catch((err) => { + logError(err, { scope: "media.download-url" }); + if (!cancelled) setResolveError(err as Error); + }); + return () => { + cancelled = true; + }; + }, [activeObjectId, particle.id]); + + const player = useVideoPlayer(sourceUri ?? "", (p) => { + p.loop = false; + p.muted = false; + p.timeUpdateEventInterval = 0.15; + }); + + // Drive play/pause from the suspender store. The player itself is forgiving + // about extra play/pause calls so we don't gate this. + useEffect(() => { + if (!sourceUri) return; + if (paused) { + player.pause(); + } else { + player.play(); + } + }, [paused, sourceUri, player]); + + // End-of-clip → advance. We listen to status flips rather than computing + // duration ratios because video duration may be 0 for the first frame or two. + useEventListener(player, "statusChange", ({ status }) => { + if (status === ("idle" satisfies VideoPlayerStatus)) { + // ignored — happens during source swap + } + }); + + const onEndedStable = useEvent(onEnded); + const onProgressStable = useEvent(onProgress); + + // Progress tick: report currentTime / duration each TICK_MS. Bail when the + // player isn't ready yet (duration = 0). + useEffect(() => { + if (!sourceUri || paused) return; const interval = setInterval(() => { - elapsed += TICK_MS / 1000; - const ratio = Math.min(elapsed / PLACEHOLDER_DURATION_S, 1); - onProgress(ratio); - if (ratio >= 1) { + const duration = player.duration; + if (!duration || duration <= 0) return; + const ratio = Math.min(player.currentTime / duration, 1); + onProgressStable(ratio); + if (ratio >= 0.999) { clearInterval(interval); - onEnded(); + onEndedStable(); } }, TICK_MS); return () => clearInterval(interval); - }, [paused, onEnded, onProgress, particle.id]); + }, [sourceUri, paused, player, onEndedStable, onProgressStable]); + if (resolveError) { + return ( + + + Couldn't load this {isAudio ? "voice message" : "video"}. + + + Tap forward to continue. + + + ); + } + + if (!sourceUri) { + return ( + + + + ); + } + + // Audio-only: hide the (blank) video surface and show a static face. The + // VideoView still renders 0×0 so the audio track keeps playing. + if (isAudio) { + return ( + + + + + + + + + Voice message + + + ); + } + + // Video: full-bleed. The PRD calls for fit-fill (cover) so portrait mobile + // captures fill the screen — desktop pillarboxes its 4:3 captures to feel + // similarly framed. + return ( + + + + ); +} + +// Shown while the particle processor worker is producing the iOS-playable +// MP4/m4a variant. The Firestore listener will re-render this view once +// `transcoded_object_id` lands on the particle, which swaps us into +// PlayableMediaView. We deliberately do not auto-advance — the user is here +// to consume this content; if the worker is slow they can tap forward. +function ProcessingForMobilePlaceholder({ isAudio }: { isAudio: boolean }) { return ( @@ -61,11 +236,28 @@ export function MediaParticleView({ {isAudio ? "Voice message" : "Video message"} - - {isMp4 - ? "Playback wires up in step 5." - : "Recorded on desktop — view there until codecs converge."} + + + + Processing for mobile… + + + + This message will play in a moment. ); } + +function isPlayableMime(mime: string): boolean { + // expo-video uses AVPlayer on iOS — reliable for h264 in mp4 / mov / m4a. + // WebM/VP9 (the legacy desktop format) is not decodable. + return ( + mime === "video/mp4" || + mime === "video/quicktime" || + mime === "audio/mp4" || + mime === "audio/aac" || + mime === "audio/x-m4a" || + mime === "audio/mpeg" + ); +} diff --git a/js/mobile/src/features/stream-view/ReactionSheet.tsx b/js/mobile/src/features/stream-view/ReactionSheet.tsx new file mode 100644 index 0000000..547c93f --- /dev/null +++ b/js/mobile/src/features/stream-view/ReactionSheet.tsx @@ -0,0 +1,362 @@ +import { useEffect, useMemo, useState } from "react"; +import { + Dimensions, + KeyboardAvoidingView, + Modal, + Platform, + Pressable, + Text, + TextInput, + View, +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import { Send, X } from "lucide-react-native"; +import * as Haptics from "expo-haptics"; +import { + Gesture, + GestureDetector, +} from "react-native-gesture-handler"; +import Animated, { + Easing, + Extrapolation, + interpolate, + runOnJS, + useAnimatedStyle, + useSharedValue, + withSpring, + withTiming, +} from "react-native-reanimated"; +import { REACTION_EMOJIS, type Reactions } from "@/api/types"; +import type { Human } from "@/api/types"; +import { resolveHumanDisplay } from "@/lib/humans"; +import { cn } from "@/lib/utils"; +import { useSuspendPlayback } from "@/hooks/use-suspend-playback"; + +const TEXT_REACTION_MAX = 40; +const SCREEN_HEIGHT = Dimensions.get("window").height; +const ANIMATION_MS = 240; + +const EMOJI_SET = new Set(REACTION_EMOJIS); + +interface ReactionSheetProps { + open: boolean; + onClose: () => void; + reactions: Reactions; + currentHumanId: string; + humans: Human[] | undefined; + /** + * Toggle a reaction (emoji or text). Adds if the current human hasn't + * reacted, removes if they have. Mirrors desktop's `onToggle` exactly. + */ + onToggle: (key: string) => void; +} + +/** + * Slide-up reaction sheet — the mobile replacement for desktop's right-edge + * reaction stack. Tap an emoji to toggle, or send a custom text reaction + * (40-char cap). Existing reactions appear as toggleable pills at the top. + * + * Playback is suspended via `useSuspendPlayback` while the sheet is open so + * the active particle doesn't auto-advance under the user. Drag the sheet + * down past 30% of its travel to dismiss; everything else springs back. + */ +export function ReactionSheet({ + open, + onClose, + reactions, + currentHumanId, + humans, + onToggle, +}: ReactionSheetProps) { + // Suspend playback whenever the sheet is mounted-and-open. The Modal + // controls visibility so we tie the suspender to `open` directly. + useSuspendPlayback(open, "reactions-sheet"); + + // We mount the modal slightly delayed from `open` so the slide-up animation + // has its starting position rendered. Using local `mounted` state lets us + // play the close animation before unmounting. + const [mounted, setMounted] = useState(false); + const translateY = useSharedValue(SCREEN_HEIGHT); + + useEffect(() => { + if (open) { + setMounted(true); + // Schedule animation after the modal mounts + requestAnimationFrame(() => { + translateY.value = withSpring(0, { + damping: 24, + stiffness: 260, + mass: 0.7, + }); + }); + } else if (mounted) { + translateY.value = withTiming( + SCREEN_HEIGHT, + { duration: ANIMATION_MS, easing: Easing.in(Easing.cubic) }, + (finished) => { + if (finished) runOnJS(setMounted)(false); + }, + ); + } + // intentional: only react to `open`. Closing animation reads from `mounted`. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open]); + + const dismiss = () => { + onClose(); + }; + + const sheetPan = Gesture.Pan() + .activeOffsetY(10) + .failOffsetX([-25, 25]) + .onUpdate((e) => { + "worklet"; + translateY.value = Math.max(0, e.translationY); + }) + .onEnd((e) => { + "worklet"; + if (e.translationY > 120 || e.velocityY > 800) { + runOnJS(dismiss)(); + } else { + translateY.value = withSpring(0, { + damping: 24, + stiffness: 260, + mass: 0.7, + }); + } + }); + + const sheetStyle = useAnimatedStyle(() => ({ + transform: [{ translateY: translateY.value }], + })); + + const backdropStyle = useAnimatedStyle(() => { + const opacity = interpolate( + translateY.value, + [0, SCREEN_HEIGHT * 0.7], + [0.55, 0], + Extrapolation.CLAMP, + ); + return { opacity }; + }); + + // --- Existing reaction pills --- + const activeEmojis = REACTION_EMOJIS.filter( + (e) => reactions?.[e] && (reactions[e]?.length ?? 0) > 0, + ); + const activeTextKeys = useMemo( + () => + Object.keys(reactions ?? {}).filter( + (k) => + !EMOJI_SET.has(k) && (reactions?.[k]?.length ?? 0) > 0, + ), + [reactions], + ); + + // --- Text reaction input --- + const [text, setText] = useState(""); + + useEffect(() => { + if (open) setText(""); + }, [open]); + + const submitText = () => { + const trimmed = text.trim(); + if (!trimmed) return; + void Haptics.selectionAsync(); + onToggle(trimmed.slice(0, TEXT_REACTION_MAX)); + setText(""); + onClose(); + }; + + const handleEmoji = (emoji: string) => { + void Haptics.selectionAsync(); + onToggle(emoji); + onClose(); + }; + + if (!mounted) return null; + + return ( + + + + + + + + + + + + {/* Drag handle — affords downward dismissal at a glance. */} + + + + + React + + + + + + + + {/* Existing reactions row — tap a pill to toggle yours. */} + {activeEmojis.length > 0 || activeTextKeys.length > 0 ? ( + + {activeEmojis.map((emoji) => { + const reactors = reactions![emoji]; + const isMine = reactors.includes(currentHumanId); + return ( + handleEmoji(emoji)} + className={cn( + "flex-row items-center gap-1.5 rounded-full px-3 py-1.5", + isMine + ? "bg-white/25 border border-white/40" + : "bg-white/10", + )} + > + {emoji} + + {reactors.length} + + + ); + })} + + {activeTextKeys.map((key) => { + const reactors = reactions![key]; + const isMine = reactors.includes(currentHumanId); + const firstReactor = resolveHumanDisplay( + reactors[0], + humans, + ); + return ( + handleEmoji(key)} + className={cn( + "flex-row items-center gap-1.5 rounded-full px-2.5 py-1.5 max-w-[220px]", + isMine + ? "bg-white/25 border border-white/40" + : "bg-white/10", + )} + > + + + {firstReactor.initials} + + + + {key} + + {reactors.length > 1 ? ( + + {reactors.length} + + ) : null} + + ); + })} + + ) : null} + + {/* Quick-pick emoji palette — six big tappable buttons. */} + + {REACTION_EMOJIS.slice(0, 6).map((emoji) => { + const isMine = + reactions?.[emoji]?.includes(currentHumanId) ?? false; + return ( + handleEmoji(emoji)} + accessibilityLabel={`React with ${emoji}`} + className={cn( + "h-14 w-14 items-center justify-center rounded-full", + isMine ? "bg-white/25" : "bg-white/10", + )} + > + {emoji} + + ); + })} + + + {/* Text reaction input — 40-char cap matches desktop. */} + + + setText(v.slice(0, TEXT_REACTION_MAX))} + placeholder="Send a quick reply..." + placeholderTextColor="rgba(255,255,255,0.4)" + maxLength={TEXT_REACTION_MAX} + autoCapitalize="none" + autoCorrect={false} + onSubmitEditing={submitText} + returnKeyType="send" + className="text-white text-base" + /> + + + + + + + + + + + + ); +} diff --git a/js/mobile/src/features/stream-view/StreamView.tsx b/js/mobile/src/features/stream-view/StreamView.tsx index 4866531..61026ac 100644 --- a/js/mobile/src/features/stream-view/StreamView.tsx +++ b/js/mobile/src/features/stream-view/StreamView.tsx @@ -17,7 +17,13 @@ import Animated, { withTiming, } from "react-native-reanimated"; import { isParticleDeleted, type Particle } from "@/api/types"; -import { parseParticlePath, type ParticlePath } from "@/lib/particle-path"; +import { + parseParticlePath, + particlePath, + toFirestoreDocPath, + type ParticlePath, +} from "@/lib/particle-path"; +import { toggleParticleReaction } from "@/lib/firestore-particles"; import { useNetwork } from "@/hooks/use-networks"; import { useStreamPlayback } from "@/hooks/use-stream-playback"; import { useSuspendPlayback } from "@/hooks/use-suspend-playback"; @@ -25,8 +31,17 @@ import { selectIsPaused, usePlaybackPauseStore, } from "@/stores/playback-pause-store"; +import { useAuthStore } from "@/stores/auth-store"; +import { ComposeDock } from "@/features/compose/ComposeDock"; +import { ComposingIndicator } from "@/components/ComposingIndicator"; import { PlaybackPageIndicator } from "./PlaybackPageIndicator"; +import { ReactionSheet } from "./ReactionSheet"; import { StreamMetadataHeader } from "./StreamMetadataHeader"; +import { StreamSafeAreaProvider } from "./stream-safe-area"; +import { + StreamPresenceProvider, + useStreamComposing, +} from "./stream-presence-context"; import { TextParticleView } from "./TextParticleView"; import { MediaParticleView } from "./MediaParticleView"; import { DeletedParticleView } from "./DeletedParticleView"; @@ -41,6 +56,9 @@ const PREV_ZONE_RATIO = 0.28; // flick downward fast enough. const DISMISS_DISTANCE = SCREEN_HEIGHT * 0.25; const DISMISS_VELOCITY = 900; +// Swipe-up reactions commit thresholds — flick up ~80px or with enough velocity. +const REACTIONS_DISTANCE = 80; +const REACTIONS_VELOCITY = 600; interface StreamViewProps { streamParticle: Particle & { type: "stream" }; @@ -48,22 +66,67 @@ interface StreamViewProps { onExit: () => void; } -export function StreamView({ streamParticle, path, onExit }: StreamViewProps) { +export function StreamView(props: StreamViewProps) { + const { networkId } = parseParticlePath(props.path); + // The presence provider wraps the inner view so any descendant can broadcast + // composing state without re-deriving the channel id. + return ( + + + + ); +} + +function StreamViewInner({ streamParticle, path, onExit }: StreamViewProps) { const { networkId } = parseParticlePath(path); const network = useNetwork(networkId); const insets = useSafeAreaInsets(); + const { composingUsers } = useStreamComposing(); const { children, currentParticle, currentIndex, status, next, prev } = useStreamPlayback(streamParticle, path); const paused = usePlaybackPauseStore(selectIsPaused); const [progress, setProgress] = useState(0); + const userId = useAuthStore((s) => s.user?.id) ?? ""; // Local hold state drives the "touch-hold" pause suspender. We wrap the JS // setter inside a runOnJS callback dispatched from the worklet thread. const [holdActive, setHoldActive] = useState(false); useSuspendPlayback(holdActive, "touch-hold"); + // Reaction sheet — opens via swipe-up on the canvas. + const [reactionsOpen, setReactionsOpen] = useState(false); + + const reactionsOnCurrent = + currentParticle && !isParticleDeleted(currentParticle) + ? currentParticle.type === "media" || currentParticle.type === "text" + ? currentParticle.reactions + : undefined + : undefined; + + const handleToggleReaction = useCallback( + (key: string) => { + if (!userId || !currentParticle) return; + if (isParticleDeleted(currentParticle)) return; + const docPath = toFirestoreDocPath( + particlePath(networkId, [streamParticle.id, currentParticle.id]), + ); + void toggleParticleReaction( + docPath, + key, + userId, + reactionsOnCurrent, + ); + }, + [userId, currentParticle, networkId, streamParticle.id, reactionsOnCurrent], + ); + + const openReactions = useCallback(() => setReactionsOpen(true), []); + // Reset progress whenever the active particle changes. useEffect(() => { setProgress(0); @@ -93,7 +156,7 @@ export function StreamView({ streamParticle, path, onExit }: StreamViewProps) { onExit(); }, [onExit]); - const pan = Gesture.Pan() + const panDown = Gesture.Pan() .activeOffsetY(15) .failOffsetX([-30, 30]) .failOffsetY(-20) @@ -118,6 +181,22 @@ export function StreamView({ streamParticle, path, onExit }: StreamViewProps) { } }); + // Swipe-up opens the reaction sheet. Mirror the down pan's discipline — + // fail on horizontal motion so it doesn't fight the tap-zones. + const panUp = Gesture.Pan() + .activeOffsetY(-15) + .failOffsetX([-30, 30]) + .failOffsetY(20) + .onEnd((e) => { + "worklet"; + if ( + e.translationY < -REACTIONS_DISTANCE || + e.velocityY < -REACTIONS_VELOCITY + ) { + runOnJS(openReactions)(); + } + }); + // --- Tap (advance / regress) --- const tap = Gesture.Tap() .maxDuration(180) @@ -146,9 +225,13 @@ export function StreamView({ streamParticle, path, onExit }: StreamViewProps) { runOnJS(setHoldActive)(false); }); - // Pan races the tap+longPress combo: vertical drag activates pan and - // cancels the others; otherwise tap and long-press run simultaneously. - const composed = Gesture.Race(pan, Gesture.Simultaneous(tap, longPress)); + // Pan-down (dismiss), pan-up (reactions), and tap+longPress race against + // each other. The first to clear its activeOffsetY wins; the others fail. + const composed = Gesture.Race( + panDown, + panUp, + Gesture.Simultaneous(tap, longPress), + ); const containerStyle = useAnimatedStyle(() => { const opacity = interpolate( @@ -182,6 +265,12 @@ export function StreamView({ streamParticle, path, onExit }: StreamViewProps) { // --- End-of-stream countdown --- const exitRemainingMs = useExitCountdown(status, paused, exit); + // Chrome reservations: top = safe-area + segmented bar (3) + gap (12) + + // metadata row (~38) + breathing room (12). Bottom = safe-area + room for + // pause / countdown pills + the compose dock that lands in this same step. + const chromeTop = insets.top + 65; + const chromeBottom = insets.bottom + 96; + // --- Render the active particle --- const renderParticle = (particle: Particle) => { if (isParticleDeleted(particle)) { @@ -250,10 +339,14 @@ export function StreamView({ streamParticle, path, onExit }: StreamViewProps) { - {/* Particle canvas — fills the whole screen, gesture-aware. */} - - {currentParticle ? renderParticle(currentParticle) : null} - + {/* Particle canvas — fills the whole screen, gesture-aware. + StreamSafeAreaProvider tells particle views how much space the + chrome occupies so scrollable content doesn't slip under. */} + + + {currentParticle ? renderParticle(currentParticle) : null} + + {/* Top chrome: segmented bar + metadata. Painted over the canvas so the canvas can be edge-to-edge but content gets a safe-area @@ -283,6 +376,14 @@ export function StreamView({ streamParticle, path, onExit }: StreamViewProps) { particle={currentParticle} network={network ?? null} /> + {composingUsers.length > 0 ? ( + + + + ) : null} @@ -314,6 +415,22 @@ export function StreamView({ streamParticle, path, onExit }: StreamViewProps) { {/* Safe-area sentinel for top notch — kept outside GestureDetector so iOS's status-bar tap doesn't fight our gestures. */} + + {/* Compose dock + recording overlays. Sits above the GestureDetector + so its hold-FAB pan gesture isn't competed-with by the StreamView + tap zones. */} + + + {/* Reaction sheet — slides up over everything, suspends playback + internally while open. */} + setReactionsOpen(false)} + reactions={reactionsOnCurrent} + currentHumanId={userId} + humans={network?.humans} + onToggle={handleToggleReaction} + /> ); diff --git a/js/mobile/src/features/stream-view/TextParticleView.tsx b/js/mobile/src/features/stream-view/TextParticleView.tsx index a5592fd..f4aead1 100644 --- a/js/mobile/src/features/stream-view/TextParticleView.tsx +++ b/js/mobile/src/features/stream-view/TextParticleView.tsx @@ -2,6 +2,7 @@ import { useEffect, useRef } from "react"; import { ScrollView, Text, View } from "react-native"; import type { Particle } from "@/api/types"; import { cn } from "@/lib/utils"; +import { useStreamSafeArea } from "./stream-safe-area"; type TextParticle = Extract; @@ -44,6 +45,7 @@ export function TextParticleView({ const content = particle.properties.content; const durationS = computeReadDuration(content); const elapsedRef = useRef(0); + const safe = useStreamSafeArea(); // Reset when the particle changes. useEffect(() => { @@ -71,7 +73,13 @@ export function TextParticleView({ if (content.length < IMMERSIVE_CHAR_LIMIT) { const style = getImmersiveStyle(content.length); return ( - + @@ -83,9 +91,16 @@ export function TextParticleView({ // Long text: scrollable card so the reader can pace themselves; the // duration timer keeps ticking either way, which is intentional — - // long messages should still auto-advance at the 15s cap. + // long messages should still auto-advance at the 15s cap. Padding is + // pulled from the StreamSafeArea so the card never slips under chrome. return ( - + ; + composingUsers: ComposingUser[]; + startComposing: (mode: ComposingMode) => void; + stopComposing: () => void; +} + +const COMPOSING_TIMEOUT_MS = 10_000; +const COMPOSING_HEARTBEAT_MS = 5_000; +const COMPOSING_CLEANUP_INTERVAL_MS = 2_000; + +const StreamPresenceContext = createContext( + null, +); + +interface StreamPresenceProviderProps { + networkId: string; + streamId: string; + children: ReactNode; +} + +export function StreamPresenceProvider({ + networkId, + streamId, + children, +}: StreamPresenceProviderProps) { + const channelId = `stream:${networkId}:${streamId}`; + const { presence, messages, sendMessage } = useChannel(channelId); + const currentUserId = useAuthStore((s) => s.user?.id); + + const onlineHumanIds = useMemo(() => new Set(presence), [presence]); + + // --- Composing state --- + const [composingUsers, setComposingUsers] = useState([]); + const composingMapRef = useRef(new Map()); + const processedCountRef = useRef(0); + + // Process new messages incrementally — slicing the messages array means + // we don't re-scan the whole history every render. + useEffect(() => { + if (messages.length <= processedCountRef.current) return; + + const newMessages = messages.slice(processedCountRef.current); + processedCountRef.current = messages.length; + + let changed = false; + const map = composingMapRef.current; + + for (const msg of newMessages) { + const payload = msg.payload as + | { type: string; mode?: string } + | undefined; + if (!payload?.type) continue; + if (msg.humanId === currentUserId) continue; + + if (payload.type === "composing_start" && payload.mode) { + map.set(msg.humanId, { + humanId: msg.humanId, + mode: payload.mode as ComposingMode, + lastSeen: Date.now(), + }); + changed = true; + } else if (payload.type === "composing_stop") { + if (map.delete(msg.humanId)) changed = true; + } + } + + if (changed) { + setComposingUsers(Array.from(map.values())); + } + }, [messages, currentUserId]); + + // Drop composing entries when a user leaves the channel — covers the + // "they backgrounded the app without sending stop" case. + useEffect(() => { + const map = composingMapRef.current; + const onlineSet = new Set(presence); + let changed = false; + + for (const humanId of map.keys()) { + if (!onlineSet.has(humanId)) { + map.delete(humanId); + changed = true; + } + } + + if (changed) { + setComposingUsers(Array.from(map.values())); + } + }, [presence]); + + // Sweep stale composing entries (last heartbeat > 10s ago). + useEffect(() => { + const interval = setInterval(() => { + const map = composingMapRef.current; + const now = Date.now(); + let changed = false; + + for (const [humanId, entry] of map) { + if (now - entry.lastSeen > COMPOSING_TIMEOUT_MS) { + map.delete(humanId); + changed = true; + } + } + + if (changed) { + setComposingUsers(Array.from(map.values())); + } + }, COMPOSING_CLEANUP_INTERVAL_MS); + + return () => clearInterval(interval); + }, []); + + // --- Composing broadcast --- + const heartbeatRef = useRef | undefined>( + undefined, + ); + + const startComposing = useCallback( + (mode: ComposingMode) => { + sendMessage({ type: "composing_start", mode }); + if (heartbeatRef.current) clearInterval(heartbeatRef.current); + heartbeatRef.current = setInterval(() => { + sendMessage({ type: "composing_start", mode }); + }, COMPOSING_HEARTBEAT_MS); + }, + [sendMessage], + ); + + const stopComposing = useCallback(() => { + if (heartbeatRef.current) clearInterval(heartbeatRef.current); + heartbeatRef.current = undefined; + sendMessage({ type: "composing_stop" }); + }, [sendMessage]); + + useEffect(() => { + return () => { + if (heartbeatRef.current) clearInterval(heartbeatRef.current); + }; + }, []); + + const value = useMemo( + () => ({ + onlineHumanIds, + composingUsers, + startComposing, + stopComposing, + }), + [onlineHumanIds, composingUsers, startComposing, stopComposing], + ); + + return ( + + {children} + + ); +} + +function useStreamPresenceContext() { + const ctx = useContext(StreamPresenceContext); + if (!ctx) { + throw new Error( + "useStreamPresence must be used within a StreamPresenceProvider", + ); + } + return ctx; +} + +export function useStreamPresence() { + const { onlineHumanIds } = useStreamPresenceContext(); + return { onlineHumanIds }; +} + +export function useStreamComposing() { + const { composingUsers } = useStreamPresenceContext(); + return { composingUsers }; +} + +export function useStreamComposingBroadcast() { + const { startComposing, stopComposing } = useStreamPresenceContext(); + return { startComposing, stopComposing }; +} diff --git a/js/mobile/src/features/stream-view/stream-safe-area.tsx b/js/mobile/src/features/stream-view/stream-safe-area.tsx new file mode 100644 index 0000000..6e27287 --- /dev/null +++ b/js/mobile/src/features/stream-view/stream-safe-area.tsx @@ -0,0 +1,28 @@ +import { createContext, useContext, type ReactNode } from "react"; + +interface StreamSafeArea { + /** Pixels from the screen top reserved for the segmented bar + metadata. */ + top: number; + /** Pixels from the screen bottom reserved for compose dock + pills. */ + bottom: number; +} + +const Ctx = createContext({ top: 0, bottom: 0 }); + +/** + * Lets particle views know how much vertical space the chrome reserves so + * scrollable content (long text, future inboxes) doesn't slip under the + * segmented bar / compose dock. Defaults to 0/0 so views work outside the + * StreamView shell (e.g. in a preview). + */ +export function StreamSafeAreaProvider({ + top, + bottom, + children, +}: StreamSafeArea & { children: ReactNode }) { + return {children}; +} + +export function useStreamSafeArea(): StreamSafeArea { + return useContext(Ctx); +} diff --git a/js/mobile/src/features/streams/NewStreamScreen.tsx b/js/mobile/src/features/streams/NewStreamScreen.tsx new file mode 100644 index 0000000..1a1fb82 --- /dev/null +++ b/js/mobile/src/features/streams/NewStreamScreen.tsx @@ -0,0 +1,181 @@ +import { useMemo, useState } from "react"; +import { + KeyboardAvoidingView, + Platform, + Pressable, + Text, + TextInput, + View, +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import { StatusBar } from "expo-status-bar"; +import { Globe, X } from "lucide-react-native"; +import { toast } from "sonner-native"; +import { ComposeDock } from "@/features/compose/ComposeDock"; +import { useNetwork } from "@/hooks/use-networks"; +import { particlePath } from "@/lib/particle-path"; +import { generateRandomName } from "@/lib/random-name"; +import { createStreamWithFirstParticle } from "@/lib/upload"; +import { toUserMessage } from "@/lib/errors"; +import { useAuthStore } from "@/stores/auth-store"; +import type { RootStackScreenProps } from "@/navigation/types"; + +const STREAM_NAME_MAX = 60; + +/** + * Top-level stream creation. The user names the stream and composes the first + * particle in one screen — desktop's `compose-overlay → ConfigureStreamStep` + * flow collapsed into a touch-native single page. + * + * Visibility is locked to "everyone in the network" in v1; specific-people + * picker is a follow-up (PRD §12.5). Even so, the data path uses the full + * `visible_to` array so plumbing the picker later is purely additive. + */ +export function NewStreamScreen({ + route, + navigation, +}: RootStackScreenProps<"NewStream">) { + const { networkId } = route.params; + const network = useNetwork(networkId); + const userId = useAuthStore((s) => s.user?.id); + + // Random suggestion is generated once per mount so it's stable across + // renders. The user can edit it freely; on submit we use whatever is in + // the input, with the suggestion as a fallback. + const suggestion = useMemo(() => generateRandomName(), []); + const [name, setName] = useState(""); + + const effectiveName = name.trim() || suggestion; + // v1: everyone in the network. The data shape supports per-human ids + // via "human:{id}" entries — easy to extend. + const visibleTo = useMemo(() => [`network:${networkId}`], [networkId]); + + const handleStreamCreated = (streamId: string) => { + // Replace the stack so back doesn't take the user to an empty new-stream + // screen — instead they go all the way back to the stream list. + navigation.replace("StreamView", { networkId, streamId }); + }; + + const submitText = async (content: string) => { + if (!userId) throw new Error("Not signed in."); + try { + const { streamId } = await createStreamWithFirstParticle({ + networkId, + name: effectiveName, + visibleTo, + createdByHumanId: userId, + firstParticle: { type: "text", content }, + }); + handleStreamCreated(streamId); + } catch (err) { + toast.error(toUserMessage(err)); + throw err; + } + }; + + const submitMedia = async ({ + fileUri, + mimeType, + durationMs, + source, + }: { + fileUri: string; + mimeType: string; + durationMs: number; + source: "camera" | "screen"; + }) => { + if (!userId) throw new Error("Not signed in."); + try { + const { streamId } = await createStreamWithFirstParticle({ + networkId, + name: effectiveName, + visibleTo, + createdByHumanId: userId, + firstParticle: { + type: "media", + fileUri, + mimeType, + durationMs, + source, + }, + }); + handleStreamCreated(streamId); + } catch (err) { + toast.error(toUserMessage(err)); + throw err; + } + }; + + // The dock writes to this path only via the override callbacks above — + // the `targetPath` is unused in that mode but the prop is required, so we + // pass a placeholder rooted at the network. + const placeholderPath = particlePath(networkId, []); + + return ( + + + + + + navigation.goBack()} + hitSlop={12} + accessibilityLabel="Cancel" + > + + + + New stream + + + + + + + + + Name + + setName(v.slice(0, STREAM_NAME_MAX))} + placeholder={suggestion} + placeholderTextColor="rgba(255,255,255,0.35)" + autoCapitalize="none" + autoCorrect={false} + maxLength={STREAM_NAME_MAX} + className="bg-white/10 rounded-xl px-4 py-3 text-white text-lg" + /> + + + Visible to + + + + + Everyone in {network?.name ?? "this network"} + + + + + + Hold the button below to record a voice or video message — that's + the first particle in your new stream. + + + + + + + + ); +} diff --git a/js/mobile/src/features/streams/StreamCard.tsx b/js/mobile/src/features/streams/StreamCard.tsx index 09a0330..782d979 100644 --- a/js/mobile/src/features/streams/StreamCard.tsx +++ b/js/mobile/src/features/streams/StreamCard.tsx @@ -97,7 +97,7 @@ export const StreamCard = memo(function StreamCard({ onPress={onPress} android_ripple={{ color: "rgba(0,0,0,0.05)" }} className={cn( - "bg-card rounded-xl border px-3.5 py-3 flex-row items-center gap-3 active:bg-accent", + "bg-card border-b px-3.5 py-3 flex-row items-center gap-3 active:bg-accent", isUnseen ? "border-primary" : "border-border", )} > diff --git a/js/mobile/src/features/streams/StreamListScreen.tsx b/js/mobile/src/features/streams/StreamListScreen.tsx index 5c1a534..2f64a9f 100644 --- a/js/mobile/src/features/streams/StreamListScreen.tsx +++ b/js/mobile/src/features/streams/StreamListScreen.tsx @@ -2,15 +2,13 @@ import { ActivityIndicator, FlatList, Pressable, - RefreshControl, Text, View, } from "react-native"; import { SafeAreaView } from "react-native-safe-area-context"; -import { toast } from "sonner-native"; import { toUserMessage } from "@/lib/errors"; import { particlePath } from "@/lib/particle-path"; -import { useNetwork, useNetworks } from "@/hooks/use-networks"; +import { useNetwork } from "@/hooks/use-networks"; import { useStreamParticles } from "@/hooks/use-stream-particles"; import type { RootStackScreenProps } from "@/navigation/types"; import { StreamCard } from "./StreamCard"; @@ -21,15 +19,9 @@ export function StreamListScreen({ }: RootStackScreenProps<"StreamList">) { const { networkId } = route.params; const network = useNetwork(networkId); - // Re-fetching the network list is the closest stand-in for a hard refresh — - // Firestore subscriptions are already realtime, so pull-to-refresh mainly - // reassures the user and re-tries network metadata. - const { refetch: refetchNetworks, isRefetching: isRefetchingNetworks } = - useNetworks(); const path = particlePath(networkId, []); - // v1: only show open streams. Closed streams are reachable on desktop — - // an "Archived" surface is a follow-up (PRD §20). + const { streams, isLoading, error } = useStreamParticles(path, { status: "open", }); @@ -51,13 +43,7 @@ export function StreamListScreen({ s.id} - contentContainerClassName="p-3 gap-2 pb-24" - refreshControl={ - refetchNetworks()} - /> - } + contentContainerClassName="" renderItem={({ item }) => ( { - // Real compose flow lands in step 5. - toast("New stream — coming soon"); - }} + onPress={() => navigation.navigate("NewStream", { networkId })} /> ); diff --git a/js/mobile/src/hooks/use-channel.ts b/js/mobile/src/hooks/use-channel.ts new file mode 100644 index 0000000..3cbc608 --- /dev/null +++ b/js/mobile/src/hooks/use-channel.ts @@ -0,0 +1,85 @@ +import { useCallback, useEffect, useState } from "react"; +import { usePusherClient } from "@/lib/pusher-provider"; +import type { ChannelMessage } from "@/lib/pusher-client"; + +interface UseChannelResult { + /** Current set of humanIds present in the channel */ + presence: string[]; + /** Messages received on this channel (since the hook mounted) */ + messages: ChannelMessage[]; + /** Send a message to the channel */ + sendMessage: (payload: unknown) => void; +} + +/** + * Subscribe to a pusher channel. Manages presence tracking and message delivery. + * Subscribes on mount, unsubscribes on unmount. + * + * @param channelId - The channel to subscribe to, or null to skip. + */ +export function useChannel(channelId: string | null): UseChannelResult { + const client = usePusherClient(); + const [presence, setPresence] = useState([]); + const [messages, setMessages] = useState([]); + + useEffect(() => { + if (!client || !channelId) { + setPresence([]); + setMessages([]); + return; + } + + client.subscribe(channelId); + + const onSubscribed = (msg: { presence?: string[] }) => { + setPresence(msg.presence ?? []); + }; + + const onJoin = (msg: { humanId?: string }) => { + if (msg.humanId) { + setPresence((prev) => + prev.includes(msg.humanId!) ? prev : [...prev, msg.humanId!], + ); + } + }; + + const onLeave = (msg: { humanId?: string }) => { + if (msg.humanId) { + setPresence((prev) => prev.filter((id) => id !== msg.humanId)); + } + }; + + const onMessage = (msg: { humanId?: string; payload?: unknown }) => { + if (msg.humanId) { + setMessages((prev) => [ + ...prev, + { humanId: msg.humanId!, payload: msg.payload }, + ]); + } + }; + + client.on(channelId, "subscribed", onSubscribed); + client.on(channelId, "join", onJoin); + client.on(channelId, "leave", onLeave); + client.on(channelId, "message", onMessage); + + return () => { + client.off(channelId, "subscribed", onSubscribed); + client.off(channelId, "join", onJoin); + client.off(channelId, "leave", onLeave); + client.off(channelId, "message", onMessage); + client.unsubscribe(channelId); + }; + }, [client, channelId]); + + const sendMessage = useCallback( + (payload: unknown) => { + if (client && channelId) { + client.sendMessage(channelId, payload); + } + }, + [client, channelId], + ); + + return { presence, messages, sendMessage }; +} diff --git a/js/mobile/src/lib/pusher-client.ts b/js/mobile/src/lib/pusher-client.ts new file mode 100644 index 0000000..99ce04a --- /dev/null +++ b/js/mobile/src/lib/pusher-client.ts @@ -0,0 +1,286 @@ +/** + * PusherClient manages a WebSocket connection to the pusher service. + * Handles authentication, reconnection with exponential backoff, channel + * subscriptions, and event dispatching. + * + * Identical behavior to the desktop client (js/desktop/src/lib/pusher-client.ts). + * React Native ships a WebSocket polyfill, so this code runs unchanged. + */ + +import { logError, reportError } from "@/lib/errors"; + +export type ConnectionState = + | "disconnected" + | "connecting" + | "connected" + | "reconnecting"; + +export interface ChannelMessage { + humanId: string; + payload: unknown; +} + +interface ServerMessage { + type: "subscribed" | "join" | "leave" | "message" | "error"; + channel?: string; + humanId?: string; + presence?: string[]; + payload?: unknown; + message?: string; +} + +type ChannelEventType = "subscribed" | "join" | "leave" | "message"; +type ChannelEventCallback = (msg: ServerMessage) => void; + +interface PusherClientConfig { + url: string; + getToken: () => string | null; +} + +const INITIAL_RECONNECT_DELAY = 1000; +const MAX_RECONNECT_DELAY = 30000; +const PING_INTERVAL = 20000; // 20s — keeps alive through GKE gateway timeout + +export class PusherClient { + private config: PusherClientConfig; + private ws: WebSocket | null = null; + private state: ConnectionState = "disconnected"; + private stateListeners = new Set<(state: ConnectionState) => void>(); + + private listeners = new Map< + string, + Map> + >(); + + private activeSubscriptions = new Set(); + + private reconnectDelay = INITIAL_RECONNECT_DELAY; + private reconnectTimer: ReturnType | null = null; + private shouldReconnect = false; + + private pingTimer: ReturnType | null = null; + + constructor(config: PusherClientConfig) { + this.config = config; + } + + get connectionState(): ConnectionState { + return this.state; + } + + connect(): void { + if (this.ws) return; + + const token = this.config.getToken(); + if (!token) { + console.warn("[pusher] no token available, cannot connect"); + return; + } + + this.shouldReconnect = true; + this.setState( + this.state === "reconnecting" ? "reconnecting" : "connecting", + ); + + const url = `${this.config.url}?token=${encodeURIComponent(token)}`; + this.ws = new WebSocket(url); + + this.ws.onopen = () => { + this.setState("connected"); + this.reconnectDelay = INITIAL_RECONNECT_DELAY; + this.startPing(); + this.resubscribeAll(); + }; + + this.ws.onclose = () => { + this.cleanup(); + if (this.shouldReconnect) { + this.scheduleReconnect(); + } + }; + + this.ws.onerror = (event) => { + // onclose fires after onerror — reconnection is handled there. + logError(event, { scope: "pusher.ws" }); + }; + + this.ws.onmessage = (event) => { + this.handleMessage(event.data as string); + }; + } + + disconnect(): void { + this.shouldReconnect = false; + this.clearReconnectTimer(); + this.cleanup(); + this.activeSubscriptions.clear(); + this.setState("disconnected"); + } + + subscribe(channelId: string): void { + this.activeSubscriptions.add(channelId); + this.send({ type: "subscribe", channel: channelId }); + } + + unsubscribe(channelId: string): void { + this.activeSubscriptions.delete(channelId); + this.send({ type: "unsubscribe", channel: channelId }); + } + + sendMessage(channelId: string, payload: unknown): void { + this.send({ type: "message", channel: channelId, payload }); + } + + on( + channelId: string, + event: ChannelEventType, + callback: ChannelEventCallback, + ): void { + if (!this.listeners.has(channelId)) { + this.listeners.set(channelId, new Map()); + } + const channelListeners = this.listeners.get(channelId)!; + if (!channelListeners.has(event)) { + channelListeners.set(event, new Set()); + } + channelListeners.get(event)!.add(callback); + } + + off( + channelId: string, + event: ChannelEventType, + callback: ChannelEventCallback, + ): void { + const channelListeners = this.listeners.get(channelId); + if (!channelListeners) return; + const eventListeners = channelListeners.get(event); + if (!eventListeners) return; + eventListeners.delete(callback); + + if (eventListeners.size === 0) channelListeners.delete(event); + if (channelListeners.size === 0) this.listeners.delete(channelId); + } + + onStateChange(callback: (state: ConnectionState) => void): () => void { + this.stateListeners.add(callback); + return () => { + this.stateListeners.delete(callback); + }; + } + + // --- Private --- + + private send(msg: { + type: string; + channel?: string; + payload?: unknown; + }): void { + if (this.ws?.readyState === WebSocket.OPEN) { + this.ws.send(JSON.stringify(msg)); + } + } + + private handleMessage(data: string): void { + if (data === "pong") return; + + let msg: ServerMessage; + try { + msg = JSON.parse(data); + } catch (err) { + logError(err, { scope: "pusher.parse", data }); + return; + } + + if (msg.type === "error") { + logError(new Error(msg.message ?? "pusher server error"), { + scope: "pusher.server", + }); + return; + } + + if (!msg.channel) return; + + const channelListeners = this.listeners.get(msg.channel); + if (!channelListeners) return; + + const eventListeners = channelListeners.get(msg.type as ChannelEventType); + if (!eventListeners) return; + + for (const cb of eventListeners) { + try { + cb(msg); + } catch (err) { + reportError(err, { scope: "pusher.listener", channel: msg.channel }); + } + } + } + + private resubscribeAll(): void { + for (const channelId of this.activeSubscriptions) { + this.send({ type: "subscribe", channel: channelId }); + } + } + + private scheduleReconnect(): void { + this.setState("reconnecting"); + + const jitter = Math.random() * 0.5 + 0.75; + const delay = Math.min(this.reconnectDelay * jitter, MAX_RECONNECT_DELAY); + + this.reconnectTimer = setTimeout(() => { + this.reconnectDelay = Math.min( + this.reconnectDelay * 2, + MAX_RECONNECT_DELAY, + ); + this.connect(); + }, delay); + } + + private cleanup(): void { + this.stopPing(); + if (this.ws) { + this.ws.onopen = null; + this.ws.onclose = null; + this.ws.onerror = null; + this.ws.onmessage = null; + if ( + this.ws.readyState === WebSocket.OPEN || + this.ws.readyState === WebSocket.CONNECTING + ) { + this.ws.close(); + } + this.ws = null; + } + } + + private clearReconnectTimer(): void { + if (this.reconnectTimer) { + clearTimeout(this.reconnectTimer); + this.reconnectTimer = null; + } + } + + private startPing(): void { + this.stopPing(); + this.pingTimer = setInterval(() => { + if (this.ws?.readyState === WebSocket.OPEN) { + this.ws.send("ping"); + } + }, PING_INTERVAL); + } + + private stopPing(): void { + if (this.pingTimer) { + clearInterval(this.pingTimer); + this.pingTimer = null; + } + } + + private setState(state: ConnectionState): void { + if (this.state === state) return; + this.state = state; + for (const cb of this.stateListeners) { + cb(state); + } + } +} diff --git a/js/mobile/src/lib/pusher-provider.tsx b/js/mobile/src/lib/pusher-provider.tsx new file mode 100644 index 0000000..d458a2e --- /dev/null +++ b/js/mobile/src/lib/pusher-provider.tsx @@ -0,0 +1,67 @@ +import { + createContext, + useContext, + useEffect, + useRef, + useState, + type ReactNode, +} from "react"; +import { PusherClient, type ConnectionState } from "./pusher-client"; +import { useSessionStore } from "@/stores/session-store"; +import { appConfig } from "@/config/env"; + +const PusherContext = createContext(null); +const PusherStateContext = createContext("disconnected"); + +export function PusherProvider({ children }: { children: ReactNode }) { + const token = useSessionStore((s) => s.token); + const clientRef = useRef(null); + const [connectionState, setConnectionState] = + useState("disconnected"); + + useEffect(() => { + if (!token) { + if (clientRef.current) { + clientRef.current.disconnect(); + clientRef.current = null; + setConnectionState("disconnected"); + } + return; + } + + const client = new PusherClient({ + url: appConfig.pusherUrl, + getToken: () => useSessionStore.getState().token, + }); + + clientRef.current = client; + + const unsubscribeState = client.onStateChange((state) => { + setConnectionState(state); + }); + + client.connect(); + + return () => { + unsubscribeState(); + client.disconnect(); + clientRef.current = null; + }; + }, [token]); + + return ( + + + {children} + + + ); +} + +export function usePusherClient(): PusherClient | null { + return useContext(PusherContext); +} + +export function usePusherConnectionState(): ConnectionState { + return useContext(PusherStateContext); +} diff --git a/js/mobile/src/lib/random-name.ts b/js/mobile/src/lib/random-name.ts new file mode 100644 index 0000000..7053df5 --- /dev/null +++ b/js/mobile/src/lib/random-name.ts @@ -0,0 +1,19 @@ +const ADJECTIVES = [ + "amber", "bold", "calm", "crisp", "dark", "eager", "faint", "gentle", + "hasty", "icy", "jade", "keen", "lush", "misty", "nimble", "opal", + "pale", "quiet", "rapid", "sharp", "taut", "vivid", "warm", "zesty", + "bright", "clear", "deep", "fresh", "grand", "swift", +]; + +const NOUNS = [ + "arrow", "bloom", "cedar", "drift", "ember", "flint", "grove", "harbor", + "iris", "jewel", "knoll", "lake", "moss", "nova", "orbit", "petal", + "quartz", "ridge", "spark", "trail", "vale", "wave", "yarn", "zenith", + "brook", "cliff", "delta", "frost", "glow", "reef", +]; + +export function generateRandomName(): string { + const adj = ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)]; + const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)]; + return `${adj}-${noun}`; +} diff --git a/js/mobile/src/lib/upload.ts b/js/mobile/src/lib/upload.ts new file mode 100644 index 0000000..a6a571b --- /dev/null +++ b/js/mobile/src/lib/upload.ts @@ -0,0 +1,201 @@ +import { + FileSystemUploadType, + getInfoAsync, + uploadAsync, +} from "expo-file-system/legacy"; +import { apiClient } from "@/api/client"; +import { + createParticle, + createStreamParticle, +} from "@/lib/firestore-particles"; +import { + particlePath, + toFirestoreChildrenPath, + type ParticlePath, +} from "@/lib/particle-path"; + +interface UploadMediaParticleParams { + networkId: string; + /** Path of the destination container (stream — possibly with sub-segments). */ + targetPath: ParticlePath; + fileUri: string; + mimeType: string; + durationMs: number; + source: "camera" | "screen"; + createdByHumanId: string; +} + +/** + * Upload a recorded file and create the corresponding `media` particle in + * Firestore. Order matches desktop's `use-recorder` flow exactly: + * prepareUpload → PUT → confirmUpload → createParticle. + * + * Returns the new particle's id, or throws on any failure (no half-states — + * if any step fails the caller cancels and reports). + */ +export async function uploadMediaParticle({ + networkId, + targetPath, + fileUri, + mimeType, + durationMs, + source, + createdByHumanId, +}: UploadMediaParticleParams): Promise { + const info = await getInfoAsync(fileUri); + if (!info.exists || info.size === undefined) { + throw new Error("Recording file disappeared before upload."); + } + const sizeBytes = info.size; + + const namePrefix = mimeType.startsWith("audio/") ? "voice" : "video"; + const ext = extensionFromMime(mimeType); + const name = `${namePrefix}-${Date.now()}${ext}`; + + const { object_id, upload_url, upload_headers } = + await apiClient.prepareUpload({ + network_id: networkId, + name, + content_type: mimeType, + content_length: sizeBytes, + }); + + const uploadResult = await uploadAsync(upload_url, fileUri, { + httpMethod: "PUT", + uploadType: FileSystemUploadType.BINARY_CONTENT, + headers: upload_headers, + }); + + if (uploadResult.status < 200 || uploadResult.status >= 300) { + throw new Error( + `Upload to depot failed (HTTP ${uploadResult.status}).`, + ); + } + + await apiClient.confirmUpload(object_id); + + const collectionPath = toFirestoreChildrenPath(targetPath); + return createParticle( + collectionPath, + "media", + { + object_id, + mime_type: mimeType, + duration_ms: durationMs, + size_bytes: sizeBytes, + source, + }, + createdByHumanId, + ); +} + +interface CreateTextParticleParams { + networkId: string; + targetPath: ParticlePath; + content: string; + createdByHumanId: string; +} + +export async function createTextParticle({ + targetPath, + content, + createdByHumanId, +}: CreateTextParticleParams): Promise { + const collectionPath = toFirestoreChildrenPath(targetPath); + return createParticle( + collectionPath, + "text", + { content }, + createdByHumanId, + ); +} + +function extensionFromMime(mime: string): string { + if (mime === "video/mp4") return ".mp4"; + if (mime === "video/quicktime") return ".mov"; + if (mime === "audio/mp4") return ".m4a"; + if (mime === "audio/webm") return ".webm"; + return ""; +} + +// Helper kept here so callers can construct a fresh stream's child-path before +// the stream particle has been written. +export function streamChildrenPath( + networkId: string, + streamId: string, +): ParticlePath { + return particlePath(networkId, [streamId]); +} + +// --- New-stream flow --- + +interface CreateStreamWithFirstParticleParams { + networkId: string; + name: string; + /** ["network:{id}"] for everyone; ["human:{id}", ...] for specific people. */ + visibleTo: string[]; + createdByHumanId: string; + /** First particle to write into the new stream. Required — empty streams are not useful. */ + firstParticle: + | { type: "text"; content: string } + | { + type: "media"; + fileUri: string; + mimeType: string; + durationMs: number; + source: "camera" | "screen"; + }; +} + +interface CreateStreamWithFirstParticleResult { + streamId: string; +} + +/** + * Create a top-level stream particle plus its first child particle, in that + * order. Mirrors desktop's "create new stream" submit path (compose-overlay + * §handleStreamSubmit). On any failure the caller is responsible for retry — + * we don't roll back the stream particle on child failure because Firestore + * doesn't expose a multi-write transaction across these subcollections, and + * an empty stream is harmless (the user can retry composing into it). + */ +export async function createStreamWithFirstParticle({ + networkId, + name, + visibleTo, + createdByHumanId, + firstParticle, +}: CreateStreamWithFirstParticleParams): Promise { + // 1. The stream particle goes at the network root. + const rootChildrenPath = toFirestoreChildrenPath(particlePath(networkId, [])); + const streamId = await createStreamParticle( + rootChildrenPath, + { name }, + createdByHumanId, + visibleTo, + ); + + const streamPath = particlePath(networkId, [streamId]); + + // 2. The first child goes inside the new stream. + if (firstParticle.type === "text") { + await createTextParticle({ + networkId, + targetPath: streamPath, + content: firstParticle.content, + createdByHumanId, + }); + } else { + await uploadMediaParticle({ + networkId, + targetPath: streamPath, + fileUri: firstParticle.fileUri, + mimeType: firstParticle.mimeType, + durationMs: firstParticle.durationMs, + source: firstParticle.source, + createdByHumanId, + }); + } + + return { streamId }; +} diff --git a/js/mobile/src/navigation/RootNavigator.tsx b/js/mobile/src/navigation/RootNavigator.tsx index 4818d9e..0bbf270 100644 --- a/js/mobile/src/navigation/RootNavigator.tsx +++ b/js/mobile/src/navigation/RootNavigator.tsx @@ -4,6 +4,7 @@ import { useAuthStore } from "@/stores/auth-store"; import { SignInScreen } from "@/features/auth/SignInScreen"; import { NetworkListScreen } from "@/features/networks/NetworkListScreen"; import { StreamListScreen } from "@/features/streams/StreamListScreen"; +import { NewStreamScreen } from "@/features/streams/NewStreamScreen"; import { StreamViewScreen } from "@/features/stream-view/StreamViewScreen"; import { SettingsScreen } from "@/features/settings/SettingsScreen"; import { AccountScreen } from "@/features/settings/AccountScreen"; @@ -42,6 +43,11 @@ export function RootNavigator() { component={StreamViewScreen} options={{ animation: "fade", gestureEnabled: false }} /> + diff --git a/js/mobile/src/navigation/types.ts b/js/mobile/src/navigation/types.ts index a6ef175..dd11343 100644 --- a/js/mobile/src/navigation/types.ts +++ b/js/mobile/src/navigation/types.ts @@ -7,6 +7,7 @@ export type RootStackParamList = { NetworkList: undefined; StreamList: { networkId: string }; StreamView: { networkId: string; streamId: string }; + NewStream: { networkId: string }; Settings: undefined; Account: undefined; }; diff --git a/js/mobile/yarn.lock b/js/mobile/yarn.lock index d4f0e4b..fdf793a 100644 --- a/js/mobile/yarn.lock +++ b/js/mobile/yarn.lock @@ -2985,6 +2985,11 @@ expo-asset@~12.0.13: "@expo/image-utils" "^0.8.8" expo-constants "~18.0.13" +expo-audio@~1.0.13: + version "1.0.16" + resolved "https://registry.yarnpkg.com/expo-audio/-/expo-audio-1.0.16.tgz#6cee98909c5c8b641832e73d944cf0be1c16d4de" + integrity sha512-j7otyjtO+8PVbemoCoRBr2Em0Kv9to3bfz5UpI5tDVVb5gD1dkn7sjv6/W6tWNqx14WLR1Wijh/ACecVv1Py+g== + expo-build-properties@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/expo-build-properties/-/expo-build-properties-1.0.10.tgz#2c3fb4248f78828e952defa636635a653e3ad546" @@ -2993,6 +2998,13 @@ expo-build-properties@~1.0.10: ajv "^8.11.0" semver "^7.6.0" +expo-camera@~17.0.8: + version "17.0.10" + resolved "https://registry.yarnpkg.com/expo-camera/-/expo-camera-17.0.10.tgz#b3a217f0eb811a6e3522c2aff9f42be578aa6456" + integrity sha512-w1RBw83mAGVk4BPPwNrCZyFop0VLiVSRE3c2V9onWbdFwonpRhzmB4drygG8YOUTl1H3wQvALJHyMPTbgsK1Jg== + dependencies: + invariant "^2.2.4" + expo-constants@~18.0.13: version "18.0.13" resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-18.0.13.tgz#0117f1f3d43be7b645192c0f4f431fb4efc4803d" @@ -3001,7 +3013,7 @@ expo-constants@~18.0.13: "@expo/config" "~12.0.13" "@expo/env" "~2.0.8" -expo-file-system@~19.0.22: +expo-file-system@~19.0.16, expo-file-system@~19.0.22: version "19.0.22" resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-19.0.22.tgz#8e8f892b2e89a78102b2b90fc1af5bb6bad4f21b" integrity sha512-l9pgahSc7sJD0bP9vBNeXvZjy8QKDpVHVxWmei/ESQOrzmoj5BidziqLVsyZdxsi+PfdbTtttLTAmddH/JafYA==