diff options
Diffstat (limited to 'src/state/models/feeds/algo')
-rw-r--r-- | src/state/models/feeds/algo/algo-item.ts | 4 | ||||
-rw-r--r-- | src/state/models/feeds/algo/saved.ts | 42 |
2 files changed, 46 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 // = |