diff options
Diffstat (limited to 'src/state/models/post.ts')
-rw-r--r-- | src/state/models/post.ts | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/state/models/post.ts b/src/state/models/post.ts new file mode 100644 index 000000000..463230101 --- /dev/null +++ b/src/state/models/post.ts @@ -0,0 +1,93 @@ +import {makeAutoObservable} from 'mobx' +import {bsky, AdxUri} from '@adxp/mock-api' +import {RootStoreModel} from './root-store' + +export type PostEntities = bsky.Post.Record['entities'] +export type PostReply = bsky.Post.Record['reply'] +export class PostModel implements bsky.Post.Record { + // state + isLoading = false + hasLoaded = false + error = '' + uri: string = '' + + // data + text: string = '' + entities?: PostEntities + reply?: PostReply + createdAt: string = '' + + constructor(public rootStore: RootStoreModel, uri: string) { + makeAutoObservable( + this, + { + rootStore: false, + uri: false, + }, + {autoBind: true}, + ) + this.uri = uri + } + + get hasContent() { + return this.createdAt !== '' + } + + get hasError() { + return this.error !== '' + } + + get isEmpty() { + return this.hasLoaded && !this.hasContent + } + + // public api + // = + + async setup() { + await this._load() + } + + // state transitions + // = + + private _xLoading() { + this.isLoading = true + this.error = '' + } + + private _xIdle(err: string = '') { + this.isLoading = false + this.hasLoaded = true + this.error = err + } + + // loader functions + // = + + private async _load() { + this._xLoading() + await new Promise(r => setTimeout(r, 250)) // DEBUG + try { + const urip = new AdxUri(this.uri) + const res = await this.rootStore.api.mainPds + .repo(urip.host, false) + .collection(urip.collection) + .get('Post', urip.recordKey) + if (!res.valid) { + throw new Error(res.error) + } + this._replaceAll(res.value) + this._xIdle() + } catch (e: any) { + this._xIdle(`Failed to load post: ${e.toString()}`) + } + } + + private _replaceAll(res: bsky.Post.Record) { + this.text = res.text + this.entities = res.entities + this.reply = res.reply + this.createdAt = res.createdAt + } +} |