@@ -31,6 +31,11 @@ import { useComposerStore } from './hooks/useComposerStore';
3131import { Routes } from '@/src/common/constants' ;
3232import { router } from 'expo-router' ;
3333import { invalidateQuery } from '@/src/common/query/hooks/useQuery' ;
34+ import { injectReplyIntoThreadCache } from '@/src/features/post/hooks/useThread' ;
35+ import {
36+ feedQueryKeys ,
37+ injectPostIntoFeedCache ,
38+ } from '@/src/features/feed/hooks/feedCache' ;
3439
3540const MAX_ATTACHMENTS = 4 ;
3641const THUMBNAIL_SIZE = 72 ;
@@ -179,28 +184,39 @@ export function ComposeSheetInner({
179184 const event = await client . buildEvent ( content ) ;
180185
181186 const signedEvent = await client . signEvent ( event ) ;
182- // `commitEvent` persists the event locally and, when content is
183- // passed, seeds the core's content store + emits contentCreated
184- // with both signedEvent and content so feeds can decode directly.
187+
188+ const newBundle = v2 . EventBundle . create ( {
189+ signedEvent,
190+ serializedContent : { contentBytes : v2 . Content . toBinary ( content ) } ,
191+ } ) ;
192+ const identity = currentIdentityKey ?? '' ;
193+
194+ // Optimistically add the new event to the below query
195+ if ( isReply && replyTo ) {
196+ injectReplyIntoThreadCache ( replyTo . id , newBundle ) ;
197+ }
198+ injectPostIntoFeedCache ( feedQueryKeys . following ( ) , newBundle ) ;
199+ injectPostIntoFeedCache ( feedQueryKeys . identity ( identity ) , newBundle ) ;
200+ injectPostIntoFeedCache ( feedQueryKeys . explore ( identity ) , newBundle ) ;
201+
202+ // `commitEvent` persists the event locally
185203 await client . commitEvent ( signedEvent , content ) ;
186204
187- resetComposer ( ) ;
205+ setSubmitting ( false ) ;
188206 await dismissSheet ( DismissReason . PostSubmitted ) ;
207+ resetComposer ( ) ;
208+
189209 void client
190210 . sync ( )
191211 . then ( ( ) => {
192- // Force the feed observables to re-fetch from servers so the
193- // newly-synced post appears alongside whatever else changed.
194- const identity = currentIdentityKey ?? '' ;
195- invalidateQuery ( client , [ 'following_feed' ] ) ;
196- invalidateQuery ( client , [ 'identity_feed' , identity ] ) ;
197- invalidateQuery ( client , [ 'explore_feed' , identity ] ) ;
212+ // Invalidate all the caches now the post has been successfully submitted
213+ invalidateQuery ( client , feedQueryKeys . following ( ) ) ;
214+ invalidateQuery ( client , feedQueryKeys . identity ( identity ) ) ;
215+ invalidateQuery ( client , feedQueryKeys . explore ( identity ) ) ;
198216 } )
199217 . catch ( ( err ) => {
200218 console . warn ( 'compose sync failed:' , err ) ;
201219 } ) ;
202- // TODO
203- // await onPostCreatedRef.current(signedEvent);
204220 } catch ( err ) {
205221 console . error ( err ) ;
206222 const message = err instanceof Error ? err . message : String ( err ) ;
@@ -232,7 +248,7 @@ export function ComposeSheetInner({
232248 < SheetHeaderBlock
233249 title = { title }
234250 onClose = { handleClose }
235- closeDisabled = { submitting }
251+ // closeDisabled={submitting}
236252 trailing = {
237253 isWeb ? (
238254 < View style = { { minWidth : 80 } } />
@@ -251,7 +267,7 @@ export function ComposeSheetInner({
251267 />
252268 ) : (
253269 < Button
254- title = " Post"
270+ title = { ' Post' }
255271 onPress = { handlePost }
256272 variant = "primary"
257273 disabled = { ! canPost }
@@ -341,7 +357,7 @@ export function ComposeSheetInner({
341357 autoFocus
342358 value = { text }
343359 onChangeText = { setText }
344- disabled = { submitting }
360+ // disabled={submitting}
345361 maxLength = { 2000 }
346362 style = { [
347363 Atoms . px_0 ,
0 commit comments