diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/state/models/post-thread-view.ts | 23 | ||||
-rw-r--r-- | src/view/com/post-thread/PostThread.tsx | 3 | ||||
-rw-r--r-- | src/view/com/post-thread/PostThreadItem.tsx | 15 | ||||
-rw-r--r-- | src/view/routes/index.tsx | 18 |
4 files changed, 43 insertions, 16 deletions
diff --git a/src/state/models/post-thread-view.ts b/src/state/models/post-thread-view.ts index 27a10cb8e..2e545a2a4 100644 --- a/src/state/models/post-thread-view.ts +++ b/src/state/models/post-thread-view.ts @@ -24,6 +24,7 @@ export class PostThreadViewPostModel implements bsky.PostThreadView.Post { | bsky.PostThreadView.RecordEmbed | bsky.PostThreadView.ExternalEmbed | bsky.PostThreadView.UnknownEmbed + parent?: PostThreadViewPostModel replyCount: number = 0 replies?: PostThreadViewPostModel[] repostCount: number = 0 @@ -34,11 +35,25 @@ export class PostThreadViewPostModel implements bsky.PostThreadView.Post { makeAutoObservable(this) this._reactKey = reactKey if (v) { - Object.assign(this, _omit(v, 'replies')) // copy everything but the replies + Object.assign(this, _omit(v, 'parent', 'replies')) // copy everything but the replies and the parent } } - setReplies(keyGen: Generator<string>, v: bsky.PostThreadView.Post) { + assignTreeModels(keyGen: Generator<string>, v: bsky.PostThreadView.Post) { + // parents + if (v.parent) { + // TODO: validate .record + const parentModel = new PostThreadViewPostModel( + keyGen.next().value, + v.parent, + ) + parentModel._depth = this._depth - 1 + if (v.parent.parent) { + parentModel.assignTreeModels(keyGen, v.parent) + } + this.parent = parentModel + } + // replies if (v.replies) { const replies = [] for (const item of v.replies) { @@ -46,7 +61,7 @@ export class PostThreadViewPostModel implements bsky.PostThreadView.Post { const itemModel = new PostThreadViewPostModel(keyGen.next().value, item) itemModel._depth = this._depth + 1 if (item.replies) { - itemModel.setReplies(keyGen, item) + itemModel.assignTreeModels(keyGen, item) } replies.push(itemModel) } @@ -161,7 +176,7 @@ export class PostThreadViewModel implements bsky.PostThreadView.Response { const keyGen = reactKeyGenerator() const thread = new PostThreadViewPostModel(keyGen.next().value, res.thread) thread._isHighlightedPost = true - thread.setReplies(keyGen, res.thread) + thread.assignTreeModels(keyGen, res.thread) this.thread = thread } } diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx index 7bbad36be..9622ceb49 100644 --- a/src/view/com/post-thread/PostThread.tsx +++ b/src/view/com/post-thread/PostThread.tsx @@ -78,6 +78,9 @@ export const PostThread = observer(function PostThread({ function* flattenThread( post: PostThreadViewPostModel, ): Generator<PostThreadViewPostModel, void> { + if (post.parent) { + yield* flattenThread(post.parent) + } yield post if (post.replies?.length) { for (const reply of post.replies) { diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 985d11dfa..2b72b7e4b 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -8,7 +8,7 @@ import { TouchableOpacity, View, } from 'react-native' -import {bsky} from '@adxp/mock-api' +import {bsky, AdxUri} from '@adxp/mock-api' import moment from 'moment' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {OnNavigateContent} from '../../routes/types' @@ -31,7 +31,8 @@ function iter<T>(n: number, fn: (i: number) => T): Array<T> { } export const PostThreadItem = observer(function PostThreadItem({ - item, // onNavigateContent, + item, + onNavigateContent, }: { item: PostThreadViewPostModel onNavigateContent: OnNavigateContent @@ -39,12 +40,16 @@ export const PostThreadItem = observer(function PostThreadItem({ const record = item.record as unknown as bsky.Post.Record const hasEngagement = item.likeCount || item.repostCount const onPressOuter = () => { - // TODO onNavigateContent + const urip = new AdxUri(item.uri) + onNavigateContent('PostThread', { + name: item.author.name, + recordKey: urip.recordKey, + }) } return ( <TouchableOpacity style={styles.outer} onPress={onPressOuter}> <View style={styles.layout}> - {iter(item._depth, () => ( + {iter(Math.abs(item._depth), () => ( <View style={styles.replyBar} /> ))} <View style={styles.layoutAvi}> @@ -143,7 +148,7 @@ const styles = StyleSheet.create({ }, replyBar: { width: 5, - backgroundColor: '#d4f0ff', + backgroundColor: 'gray', marginRight: 2, }, layoutAvi: { diff --git a/src/view/routes/index.tsx b/src/view/routes/index.tsx index 112452196..24d47a93c 100644 --- a/src/view/routes/index.tsx +++ b/src/view/routes/index.tsx @@ -54,20 +54,24 @@ const tabBarScreenOptions = ({ route: RouteProp<ParamListBase, string> }) => ({ headerShown: false, - tabBarIcon: (_state: {focused: boolean; color: string; size: number}) => { + tabBarIcon: (state: {focused: boolean; color: string; size: number}) => { switch (route.name) { case 'Home': - return <FontAwesomeIcon icon="house" /> + return <FontAwesomeIcon icon="house" style={{color: state.color}} /> case 'Search': - return <FontAwesomeIcon icon="magnifying-glass" /> + return ( + <FontAwesomeIcon + icon="magnifying-glass" + style={{color: state.color}} + /> + ) case 'Notifications': - return <FontAwesomeIcon icon="bell" /> + return <FontAwesomeIcon icon="bell" style={{color: state.color}} /> case 'Menu': - return <FontAwesomeIcon icon="bars" /> + return <FontAwesomeIcon icon="bars" style={{color: state.color}} /> default: - return <FontAwesomeIcon icon="bars" /> + return <FontAwesomeIcon icon="bars" style={{color: state.color}} /> } - // return <Text>{route.name?.[0] || ''}</Text> }, }) |