diff options
Diffstat (limited to 'src/state/models/content/post-thread.ts')
-rw-r--r-- | src/state/models/content/post-thread.ts | 58 |
1 files changed, 21 insertions, 37 deletions
diff --git a/src/state/models/content/post-thread.ts b/src/state/models/content/post-thread.ts index acc9bffa9..76cab5c61 100644 --- a/src/state/models/content/post-thread.ts +++ b/src/state/models/content/post-thread.ts @@ -11,13 +11,6 @@ import * as apilib from 'lib/api/index' import {cleanError} from 'lib/strings/errors' import {updateDataOptimistically} from 'lib/async/revertible' -function* reactKeyGenerator(): Generator<string> { - let counter = 0 - while (true) { - yield `item-${counter++}` - } -} - export class PostThreadItemModel { // ui state _reactKey: string = '' @@ -55,10 +48,9 @@ export class PostThreadItemModel { constructor( public rootStore: RootStoreModel, - reactKey: string, v: AppBskyFeedDefs.ThreadViewPost, ) { - this._reactKey = reactKey + this._reactKey = `thread-${v.post.uri}` this.post = v.post if (FeedPost.isRecord(this.post.record)) { const valid = FeedPost.validateRecord(this.post.record) @@ -82,7 +74,6 @@ export class PostThreadItemModel { } assignTreeModels( - keyGen: Generator<string>, v: AppBskyFeedDefs.ThreadViewPost, higlightedPostUri: string, includeParent = true, @@ -91,22 +82,12 @@ export class PostThreadItemModel { // parents if (includeParent && v.parent) { if (AppBskyFeedDefs.isThreadViewPost(v.parent)) { - const parentModel = new PostThreadItemModel( - this.rootStore, - keyGen.next().value, - v.parent, - ) + const parentModel = new PostThreadItemModel(this.rootStore, v.parent) parentModel._depth = this._depth - 1 parentModel._showChildReplyLine = true if (v.parent.parent) { parentModel._showParentReplyLine = true //parentModel.uri !== higlightedPostUri - parentModel.assignTreeModels( - keyGen, - v.parent, - higlightedPostUri, - true, - false, - ) + parentModel.assignTreeModels(v.parent, higlightedPostUri, true, false) } this.parent = parentModel } else if (AppBskyFeedDefs.isNotFoundPost(v.parent)) { @@ -118,23 +99,13 @@ export class PostThreadItemModel { const replies = [] for (const item of v.replies) { if (AppBskyFeedDefs.isThreadViewPost(item)) { - const itemModel = new PostThreadItemModel( - this.rootStore, - keyGen.next().value, - item, - ) + const itemModel = new PostThreadItemModel(this.rootStore, item) itemModel._depth = this._depth + 1 itemModel._showParentReplyLine = itemModel.parentUri !== higlightedPostUri if (item.replies?.length) { itemModel._showChildReplyLine = true - itemModel.assignTreeModels( - keyGen, - item, - higlightedPostUri, - false, - true, - ) + itemModel.assignTreeModels(item, higlightedPostUri, false, true) } replies.push(itemModel) } else if (AppBskyFeedDefs.isNotFoundPost(item)) { @@ -241,6 +212,19 @@ export class PostThreadModel { this.params = params } + static fromPostView( + rootStore: RootStoreModel, + postView: AppBskyFeedDefs.PostView, + ) { + const model = new PostThreadModel(rootStore, {uri: postView.uri}) + model.resolvedUri = postView.uri + model.hasLoaded = true + model.thread = new PostThreadItemModel(rootStore, { + post: postView, + }) + return model + } + get hasContent() { return typeof this.thread !== 'undefined' } @@ -360,6 +344,9 @@ export class PostThreadModel { } async _load(isRefreshing = false) { + if (this.hasLoaded && !isRefreshing) { + return + } this._xLoading(isRefreshing) try { const res = await this.rootStore.agent.getPostThread( @@ -374,15 +361,12 @@ export class PostThreadModel { _replaceAll(res: GetPostThread.Response) { sortThread(res.data.thread) - const keyGen = reactKeyGenerator() const thread = new PostThreadItemModel( this.rootStore, - keyGen.next().value, res.data.thread as AppBskyFeedDefs.ThreadViewPost, ) thread._isHighlightedPost = true thread.assignTreeModels( - keyGen, res.data.thread as AppBskyFeedDefs.ThreadViewPost, thread.uri, ) |