From 56cf890debeb9872f791ccb992a5587f2c05fd9e Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Mon, 13 Mar 2023 16:01:43 -0500 Subject: Move to expo and react-navigation (#288) * WIP - adding expo * WIP - adding expo 2 * Fix tsc * Finish adding expo * Disable the 'require cycle' warning * Tweak plist * Modify some dependency versions to make expo happy * Fix icon fill * Get Web compiling for expo * 1.7 * Switch to react-navigation in expo2 (#287) * WIP Switch to react-navigation * WIP Switch to react-navigation 2 * WIP Switch to react-navigation 3 * Convert all screens to react navigation * Update BottomBar for react navigation * Update mobile menu to be react-native drawer * Fixes to drawer and bottombar * Factor out some helpers * Replace the navigation model with react-navigation * Restructure the shell folder and fix the header positioning * Restore the error boundary * Fix tsc * Implement not-found page * Remove react-native-gesture-handler (no longer used) * Handle notifee card presses * Handle all navigations from the state layer * Fix drawer behaviors * Fix two linking issues * Switch to our react-native-progress fork to fix an svg rendering issue * Get Web working with react-navigation * Refactor routes and navigation for a bit more clarity * Remove dead code * Rework Web shell to left/right nav to make this easier * Fix ViewHeader for desktop web * Hide profileheader back btn on desktop web * Move the compose button to the left nav * Implement reply prompt in threads for desktop web * Composer refactors * Factor out all platform-specific text input behaviors from the composer * Small fix * Update the web build to use tiptap for the composer * Tune up the mention autocomplete dropdown * Simplify the default avatar and banner * Fixes to link cards in web composer * Fix dropdowns on web * Tweak load latest on desktop * Add web beta message and feedback link * Fix up links in desktop web --- src/view/screens/PostThread.tsx | 78 +++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 41 deletions(-) (limited to 'src/view/screens/PostThread.tsx') diff --git a/src/view/screens/PostThread.tsx b/src/view/screens/PostThread.tsx index 0b6829735..0e9feae0b 100644 --- a/src/view/screens/PostThread.tsx +++ b/src/view/screens/PostThread.tsx @@ -1,58 +1,45 @@ -import React, {useEffect, useMemo} from 'react' +import React, {useMemo} from 'react' import {StyleSheet, View} from 'react-native' +import {useFocusEffect} from '@react-navigation/native' +import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types' import {makeRecordUri} from 'lib/strings/url-helpers' import {ViewHeader} from '../com/util/ViewHeader' import {PostThread as PostThreadComponent} from '../com/post-thread/PostThread' import {ComposePrompt} from 'view/com/composer/Prompt' import {PostThreadViewModel} from 'state/models/post-thread-view' -import {ScreenParams} from '../routes' import {useStores} from 'state/index' import {s} from 'lib/styles' import {useSafeAreaInsets} from 'react-native-safe-area-context' import {clamp} from 'lodash' +import {isDesktopWeb} from 'platform/detection' const SHELL_FOOTER_HEIGHT = 44 -export const PostThread = ({navIdx, visible, params}: ScreenParams) => { +type Props = NativeStackScreenProps +export const PostThreadScreen = ({route}: Props) => { const store = useStores() const safeAreaInsets = useSafeAreaInsets() - const {name, rkey} = params + const {name, rkey} = route.params const uri = makeRecordUri(name, 'app.bsky.feed.post', rkey) const view = useMemo( () => new PostThreadViewModel(store, {uri}), [store, uri], ) - useEffect(() => { - let aborted = false - const threadCleanup = view.registerListeners() - const setTitle = () => { - const author = view.thread?.post.author - const niceName = author?.handle || name - store.nav.setTitle(navIdx, `Post by ${niceName}`) - } - if (!visible) { - return threadCleanup - } - setTitle() - store.shell.setMinimalShellMode(false) - if (!view.hasLoaded && !view.isLoading) { - view.setup().then( - () => { - if (!aborted) { - setTitle() - } - }, - err => { + useFocusEffect( + React.useCallback(() => { + const threadCleanup = view.registerListeners() + store.shell.setMinimalShellMode(false) + if (!view.hasLoaded && !view.isLoading) { + view.setup().catch(err => { store.log.error('Failed to fetch thread', err) - }, - ) - } - return () => { - aborted = true - threadCleanup() - } - }, [visible, store.nav, store.log, store.shell, name, navIdx, view]) + }) + } + return () => { + threadCleanup() + } + }, [store, view]), + ) const onPressReply = React.useCallback(() => { if (!view.thread) { @@ -77,15 +64,24 @@ export const PostThread = ({navIdx, visible, params}: ScreenParams) => { - - - - + + {!isDesktopWeb && ( + + + + )} ) } -- cgit 1.4.1