Add custom feeds selector, rework search, simplify onboarding (#325)

* Get home screen's swipable pager working with the drawer

* Add tab bar to pager

* Implement popular & following views on home screen

* Visual tune-up

* Move the feed selector to the footer

* Fix to 'new posts' poll

* Add the view header as a feed item

* Use the native driver on the tabbar indicator to improve perf

* Reduce home polling to the currently active page; also reuse some code

* Add soft reset on tap selected in tab bar

* Remove explicit 'onboarding' flow

* Choose good stuff based on service

* Add foaf-based follow discovery

* Fall back to who to follow

* Fix backgrounds

* Switch to the off-spec goodstuff route

* 1.8

* Fix for dev & staging

* Swap the tab bar items and rename suggested to what's hot

* Go to whats-hot by default if you have no follows

* Implement pager and tabbar for desktop web

* Pin deps to make expo happy

* Add language filtering to goodstuff
This commit is contained in:
Paul Frazee 2023-03-19 18:53:57 -05:00 committed by GitHub
parent c31ffdac1b
commit 1de724b24b
33 changed files with 1634 additions and 692 deletions

View file

@ -1,5 +1,7 @@
import {AppBskyFeedFeedViewPost} from '@atproto/api'
import lande from 'lande'
type FeedViewPost = AppBskyFeedFeedViewPost.Main
import {hasProp} from '@atproto/lexicon'
export type FeedTunerFn = (
tuner: FeedTuner,
@ -140,7 +142,8 @@ export class FeedTuner {
for (const item of slice.items) {
this.seenUris.add(item.post.uri)
}
slice.logSelf()
// DEBUG uncomment to get a quick view of the data
// slice.logSelf()
}
return slices
@ -177,6 +180,33 @@ export class FeedTuner {
}
}
}
static englishOnly(tuner: FeedTuner, slices: FeedViewPostsSlice[]) {
// TEMP
// remove slices with no english in them
// we very soon need to get the local user's language and filter
// according to their preferences, but for the moment
// we're just rolling with english
// -prf
for (let i = slices.length - 1; i >= 0; i--) {
let hasEnglish = false
for (const item of slices[i].items) {
if (
hasProp(item.post.record, 'text') &&
typeof item.post.record.text === 'string'
) {
const res = lande(item.post.record.text)
if (res[0][0] === 'eng') {
hasEnglish = true
break
}
}
}
if (!hasEnglish) {
slices.splice(i, 1)
}
}
}
}
function getSelfReplyUri(item: FeedViewPost): string | undefined {