Move onPressReply into child component (#4898)
* Move ComposePrompt to post-thread/ * Move onPressReply into child componentzio/stable
parent
85fe95c988
commit
ae25cb3391
|
@ -24,6 +24,7 @@ import {
|
||||||
} from '#/state/queries/post-thread'
|
} from '#/state/queries/post-thread'
|
||||||
import {usePreferencesQuery} from '#/state/queries/preferences'
|
import {usePreferencesQuery} from '#/state/queries/preferences'
|
||||||
import {useSession} from '#/state/session'
|
import {useSession} from '#/state/session'
|
||||||
|
import {useComposerControls} from '#/state/shell'
|
||||||
import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender'
|
import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender'
|
||||||
import {useMinimalShellFabTransform} from 'lib/hooks/useMinimalShellTransform'
|
import {useMinimalShellFabTransform} from 'lib/hooks/useMinimalShellTransform'
|
||||||
import {useSetTitle} from 'lib/hooks/useSetTitle'
|
import {useSetTitle} from 'lib/hooks/useSetTitle'
|
||||||
|
@ -34,9 +35,9 @@ import {CenteredView} from 'view/com/util/Views'
|
||||||
import {atoms as a, useTheme} from '#/alf'
|
import {atoms as a, useTheme} from '#/alf'
|
||||||
import {ListFooter, ListMaybePlaceholder} from '#/components/Lists'
|
import {ListFooter, ListMaybePlaceholder} from '#/components/Lists'
|
||||||
import {Text} from '#/components/Typography'
|
import {Text} from '#/components/Typography'
|
||||||
import {ComposePrompt} from '../composer/Prompt'
|
|
||||||
import {List, ListMethods} from '../util/List'
|
import {List, ListMethods} from '../util/List'
|
||||||
import {ViewHeader} from '../util/ViewHeader'
|
import {ViewHeader} from '../util/ViewHeader'
|
||||||
|
import {PostThreadComposePrompt} from './PostThreadComposePrompt'
|
||||||
import {PostThreadItem} from './PostThreadItem'
|
import {PostThreadItem} from './PostThreadItem'
|
||||||
import {PostThreadLoadMore} from './PostThreadLoadMore'
|
import {PostThreadLoadMore} from './PostThreadLoadMore'
|
||||||
import {PostThreadShowHiddenReplies} from './PostThreadShowHiddenReplies'
|
import {PostThreadShowHiddenReplies} from './PostThreadShowHiddenReplies'
|
||||||
|
@ -84,13 +85,7 @@ const keyExtractor = (item: RowItem) => {
|
||||||
return item._reactKey
|
return item._reactKey
|
||||||
}
|
}
|
||||||
|
|
||||||
export function PostThread({
|
export function PostThread({uri}: {uri: string | undefined}) {
|
||||||
uri,
|
|
||||||
onPressReply,
|
|
||||||
}: {
|
|
||||||
uri: string | undefined
|
|
||||||
onPressReply: () => unknown
|
|
||||||
}) {
|
|
||||||
const {hasSession, currentAccount} = useSession()
|
const {hasSession, currentAccount} = useSession()
|
||||||
const {_} = useLingui()
|
const {_} = useLingui()
|
||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
|
@ -307,6 +302,23 @@ export function PostThread({
|
||||||
setMaxReplies(prev => prev + 50)
|
setMaxReplies(prev => prev + 50)
|
||||||
}, [isFetching, maxReplies, posts.length])
|
}, [isFetching, maxReplies, posts.length])
|
||||||
|
|
||||||
|
const {openComposer} = useComposerControls()
|
||||||
|
const onPressReply = React.useCallback(() => {
|
||||||
|
if (thread?.type !== 'post') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
openComposer({
|
||||||
|
replyTo: {
|
||||||
|
uri: thread.post.uri,
|
||||||
|
cid: thread.post.cid,
|
||||||
|
text: thread.record.text,
|
||||||
|
author: thread.post.author,
|
||||||
|
embed: thread.post.embed,
|
||||||
|
},
|
||||||
|
onPost: () => refetch(),
|
||||||
|
})
|
||||||
|
}, [openComposer, thread, refetch])
|
||||||
|
|
||||||
const canReply = !error && rootPost && !rootPost.viewer?.replyDisabled
|
const canReply = !error && rootPost && !rootPost.viewer?.replyDisabled
|
||||||
const hasParents =
|
const hasParents =
|
||||||
skeleton?.highlightedPost?.type === 'post' &&
|
skeleton?.highlightedPost?.type === 'post' &&
|
||||||
|
@ -319,7 +331,9 @@ export function PostThread({
|
||||||
if (item === REPLY_PROMPT && hasSession) {
|
if (item === REPLY_PROMPT && hasSession) {
|
||||||
return (
|
return (
|
||||||
<View>
|
<View>
|
||||||
{!isMobile && <ComposePrompt onPressCompose={onPressReply} />}
|
{!isMobile && (
|
||||||
|
<PostThreadComposePrompt onPressCompose={onPressReply} />
|
||||||
|
)}
|
||||||
</View>
|
</View>
|
||||||
)
|
)
|
||||||
} else if (item === SHOW_HIDDEN_REPLIES || item === SHOW_MUTED_REPLIES) {
|
} else if (item === SHOW_HIDDEN_REPLIES || item === SHOW_MUTED_REPLIES) {
|
||||||
|
@ -487,7 +501,7 @@ function MobileComposePrompt({onPressReply}: {onPressReply: () => unknown}) {
|
||||||
bottom: clamp(safeAreaInsets.bottom, 15, 30),
|
bottom: clamp(safeAreaInsets.bottom, 15, 30),
|
||||||
},
|
},
|
||||||
]}>
|
]}>
|
||||||
<ComposePrompt onPressCompose={onPressReply} />
|
<PostThreadComposePrompt onPressCompose={onPressReply} />
|
||||||
</Animated.View>
|
</Animated.View>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,11 @@ import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
|
||||||
import {Text} from '../util/text/Text'
|
import {Text} from '../util/text/Text'
|
||||||
import {UserAvatar} from '../util/UserAvatar'
|
import {UserAvatar} from '../util/UserAvatar'
|
||||||
|
|
||||||
export function ComposePrompt({onPressCompose}: {onPressCompose: () => void}) {
|
export function PostThreadComposePrompt({
|
||||||
|
onPressCompose,
|
||||||
|
}: {
|
||||||
|
onPressCompose: () => void
|
||||||
|
}) {
|
||||||
const {currentAccount} = useSession()
|
const {currentAccount} = useSession()
|
||||||
const {data: profile} = useProfileQuery({did: currentAccount?.did})
|
const {data: profile} = useProfileQuery({did: currentAccount?.did})
|
||||||
const pal = usePalette('default')
|
const pal = usePalette('default')
|
|
@ -1,14 +1,8 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {View} from 'react-native'
|
import {View} from 'react-native'
|
||||||
import {useFocusEffect} from '@react-navigation/native'
|
import {useFocusEffect} from '@react-navigation/native'
|
||||||
import {useQueryClient} from '@tanstack/react-query'
|
|
||||||
|
|
||||||
import {
|
|
||||||
RQKEY as POST_THREAD_RQKEY,
|
|
||||||
ThreadNode,
|
|
||||||
} from '#/state/queries/post-thread'
|
|
||||||
import {useSetMinimalShellMode} from '#/state/shell'
|
import {useSetMinimalShellMode} from '#/state/shell'
|
||||||
import {useComposerControls} from '#/state/shell/composer'
|
|
||||||
import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types'
|
import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types'
|
||||||
import {makeRecordUri} from 'lib/strings/url-helpers'
|
import {makeRecordUri} from 'lib/strings/url-helpers'
|
||||||
import {s} from 'lib/styles'
|
import {s} from 'lib/styles'
|
||||||
|
@ -16,9 +10,8 @@ import {PostThread as PostThreadComponent} from '../com/post-thread/PostThread'
|
||||||
|
|
||||||
type Props = NativeStackScreenProps<CommonNavigatorParams, 'PostThread'>
|
type Props = NativeStackScreenProps<CommonNavigatorParams, 'PostThread'>
|
||||||
export function PostThreadScreen({route}: Props) {
|
export function PostThreadScreen({route}: Props) {
|
||||||
const queryClient = useQueryClient()
|
|
||||||
const setMinimalShellMode = useSetMinimalShellMode()
|
const setMinimalShellMode = useSetMinimalShellMode()
|
||||||
const {openComposer} = useComposerControls()
|
|
||||||
const {name, rkey} = route.params
|
const {name, rkey} = route.params
|
||||||
const uri = makeRecordUri(name, 'app.bsky.feed.post', rkey)
|
const uri = makeRecordUri(name, 'app.bsky.feed.post', rkey)
|
||||||
|
|
||||||
|
@ -28,33 +21,10 @@ export function PostThreadScreen({route}: Props) {
|
||||||
}, [setMinimalShellMode]),
|
}, [setMinimalShellMode]),
|
||||||
)
|
)
|
||||||
|
|
||||||
const onPressReply = React.useCallback(() => {
|
|
||||||
if (!uri) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const thread = queryClient.getQueryData<ThreadNode>(POST_THREAD_RQKEY(uri))
|
|
||||||
if (thread?.type !== 'post') {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
openComposer({
|
|
||||||
replyTo: {
|
|
||||||
uri: thread.post.uri,
|
|
||||||
cid: thread.post.cid,
|
|
||||||
text: thread.record.text,
|
|
||||||
author: thread.post.author,
|
|
||||||
embed: thread.post.embed,
|
|
||||||
},
|
|
||||||
onPost: () =>
|
|
||||||
queryClient.invalidateQueries({
|
|
||||||
queryKey: POST_THREAD_RQKEY(uri),
|
|
||||||
}),
|
|
||||||
})
|
|
||||||
}, [openComposer, queryClient, uri])
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={s.hContentRegion}>
|
<View style={s.hContentRegion}>
|
||||||
<View style={s.flex1}>
|
<View style={s.flex1}>
|
||||||
<PostThreadComponent uri={uri} onPressReply={onPressReply} />
|
<PostThreadComponent uri={uri} />
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue