ea885339cf
* Feeds navigation on right side of desktop (#1403) * Remove home feed header on desktop * Add feeds to right sidebar * Add simple non-moving header to desktop * Improve loading state of custom feed header * Remove log Co-authored-by: Eric Bailey <git@esb.lol> * Remove dead comment --------- Co-authored-by: Eric Bailey <git@esb.lol> * Redesign feeds tab (#1439) * consolidate saved feeds and discover into one screen * Add hoverStyle behavior to <Link> * More UI work on SavedFeeds * Replace satellite icon with a hashtag * Tune My Feeds mobile ui * Handle no results in my feeds * Remove old DiscoverFeeds screen * Remove multifeed * Remove DiscoverFeeds from router * Improve loading placeholders * Small fixes * Fix types * Fix overflow issue on firefox * Add icons prompting to open feeds --------- Co-authored-by: Paul Frazee <pfrazee@gmail.com> * Merge feed prototype [WIP] (#1398) * POC WIP for the mergefeed * Add feed API wrapper and move mergefeed into it * Show feed source in mergefeed * Add lodash.random dep * Improve mergefeed sampling and reliability * Tune source ui element * Improve mergefeed edge condition handling * Remove in-place update of feeds for performance * Fix link on native * Fix bad ref * Improve variety in mergefeed sampling * Fix types * Fix rebase error * Add missing source field (got dropped in merge) * Update find more link * Simplify the right hand feeds nav * Bring back load latest button on desktop & unify impl * Add 'From' to source * Add simple headers to desktop home & notifications * Fix thread view jumping around horizontally * Add unread indicators to desktop headers * Add home feed preference for enabling the mergefeed * Add a preference for showing replies among followed users only (#1448) * Add a preference for showing replies among followed users only * Simplify the reply filter UI * Fix typo * Simplified custom feed header * Add soft reset to custom feed screen * Drop all the in-post translate links except when expanded (#1455) * Update mobile feed settings links to match desktop * Fixes to feeds screen loading states * Bolder active state of feeds tab on mobile web * Fix dark mode issue --------- Co-authored-by: Eric Bailey <git@esb.lol> Co-authored-by: Ansh <anshnanda10@gmail.com>
92 lines
2.1 KiB
TypeScript
92 lines
2.1 KiB
TypeScript
import {makeAutoObservable} from 'mobx'
|
|
import {RootStoreModel} from '../root-store'
|
|
import {FeedViewPostsSlice} from 'lib/api/feed-manip'
|
|
import {PostsFeedItemModel} from './post'
|
|
import {FeedSourceInfo} from 'lib/api/feed/types'
|
|
|
|
export class PostsFeedSliceModel {
|
|
// ui state
|
|
_reactKey: string = ''
|
|
|
|
// data
|
|
items: PostsFeedItemModel[] = []
|
|
source: FeedSourceInfo | undefined
|
|
|
|
constructor(public rootStore: RootStoreModel, slice: FeedViewPostsSlice) {
|
|
this._reactKey = slice._reactKey
|
|
this.source = slice.source
|
|
for (let i = 0; i < slice.items.length; i++) {
|
|
this.items.push(
|
|
new PostsFeedItemModel(
|
|
rootStore,
|
|
`${this._reactKey} - ${i}`,
|
|
slice.items[i],
|
|
),
|
|
)
|
|
}
|
|
makeAutoObservable(this, {rootStore: false})
|
|
}
|
|
|
|
get uri() {
|
|
if (this.isReply) {
|
|
return this.items[1].post.uri
|
|
}
|
|
return this.items[0].post.uri
|
|
}
|
|
|
|
get isThread() {
|
|
return (
|
|
this.items.length > 1 &&
|
|
this.items.every(
|
|
item => item.post.author.did === this.items[0].post.author.did,
|
|
)
|
|
)
|
|
}
|
|
|
|
get isReply() {
|
|
return this.items.length > 1 && !this.isThread
|
|
}
|
|
|
|
get rootItem() {
|
|
if (this.isReply) {
|
|
return this.items[1]
|
|
}
|
|
return this.items[0]
|
|
}
|
|
|
|
get moderation() {
|
|
// prefer the most stringent item
|
|
const topItem = this.items.find(item => item.moderation.content.filter)
|
|
if (topItem) {
|
|
return topItem.moderation
|
|
}
|
|
// otherwise just use the first one
|
|
return this.items[0].moderation
|
|
}
|
|
|
|
shouldFilter(ignoreFilterForDid: string | undefined): boolean {
|
|
const mods = this.items
|
|
.filter(item => item.post.author.did !== ignoreFilterForDid)
|
|
.map(item => item.moderation)
|
|
return !!mods.find(mod => mod.content.filter)
|
|
}
|
|
|
|
containsUri(uri: string) {
|
|
return !!this.items.find(item => item.post.uri === uri)
|
|
}
|
|
|
|
isThreadParentAt(i: number) {
|
|
if (this.items.length === 1) {
|
|
return false
|
|
}
|
|
return i < this.items.length - 1
|
|
}
|
|
|
|
isThreadChildAt(i: number) {
|
|
if (this.items.length === 1) {
|
|
return false
|
|
}
|
|
return i > 0
|
|
}
|
|
}
|