diff options
Diffstat (limited to 'src/state')
-rw-r--r-- | src/state/models/feeds/algo/algo-item.ts | 4 | ||||
-rw-r--r-- | src/state/models/feeds/algo/saved.ts | 42 | ||||
-rw-r--r-- | src/state/models/me.ts | 4 |
3 files changed, 50 insertions, 0 deletions
diff --git a/src/state/models/feeds/algo/algo-item.ts b/src/state/models/feeds/algo/algo-item.ts index 0eaeebd39..39bc760ac 100644 --- a/src/state/models/feeds/algo/algo-item.ts +++ b/src/state/models/feeds/algo/algo-item.ts @@ -153,4 +153,8 @@ export class AlgoItemModel { }) this.data = res.data.view } + + serialize() { + return JSON.stringify(this.data) + } } diff --git a/src/state/models/feeds/algo/saved.ts b/src/state/models/feeds/algo/saved.ts index 5d2f854dc..15859fe0c 100644 --- a/src/state/models/feeds/algo/saved.ts +++ b/src/state/models/feeds/algo/saved.ts @@ -4,6 +4,7 @@ import {RootStoreModel} from '../../root-store' import {bundleAsync} from 'lib/async/bundle' import {cleanError} from 'lib/strings/errors' import {AlgoItemModel} from './algo-item' +import {hasProp, isObj} from 'lib/type-guards' const PAGE_SIZE = 30 @@ -18,6 +19,7 @@ export class SavedFeedsModel { // data feeds: AlgoItemModel[] = [] + pinned: AlgoItemModel[] = [] constructor(public rootStore: RootStoreModel) { makeAutoObservable( @@ -29,6 +31,24 @@ export class SavedFeedsModel { ) } + serialize() { + return { + pinned: this.pinned.map(f => f.serialize()), + } + } + + hydrate(v: unknown) { + if (isObj(v)) { + if (hasProp(v, 'pinned')) { + const pinnedSerialized = (v as any).pinned as string[] + const pinnedDeserialized = pinnedSerialized.map( + (s: string) => new AlgoItemModel(this.rootStore, JSON.parse(s)), + ) + this.pinned = pinnedDeserialized + } + } + } + get hasContent() { return this.feeds.length > 0 } @@ -51,6 +71,28 @@ export class SavedFeedsModel { ) } + get savedFeedsWithoutPinned() { + return this.feeds.filter( + f => !this.pinned.find(p => p.data.uri === f.data.uri), + ) + } + + togglePinnedFeed(feed: AlgoItemModel) { + if (!this.isPinned(feed)) { + this.pinned.push(feed) + } else { + this.pinned = this.pinned.filter(f => f.data.uri !== feed.data.uri) + } + } + + reorderPinnedFeeds(temp: AlgoItemModel[]) { + this.pinned = temp + } + + isPinned(feed: AlgoItemModel) { + return this.pinned.find(f => f.data.uri === feed.data.uri) ? true : false + } + // public api // = diff --git a/src/state/models/me.ts b/src/state/models/me.ts index 314e76b9c..68c89ac9b 100644 --- a/src/state/models/me.ts +++ b/src/state/models/me.ts @@ -69,6 +69,7 @@ export class MeModel { displayName: this.displayName, description: this.description, avatar: this.avatar, + savedFeeds: this.savedFeeds.serialize(), } } @@ -90,6 +91,9 @@ export class MeModel { if (hasProp(v, 'avatar') && typeof v.avatar === 'string') { avatar = v.avatar } + if (hasProp(v, 'savedFeeds') && isObj(v.savedFeeds)) { + this.savedFeeds.hydrate(v.savedFeeds) + } if (did && handle) { this.did = did this.handle = handle |