Add language filtering to goodstuff

zio/stable
Paul Frazee 2023-03-19 18:47:49 -05:00
parent a811c57480
commit 4787c8383d
5 changed files with 64 additions and 19 deletions

View File

@ -65,6 +65,7 @@
"he": "^1.2.0", "he": "^1.2.0",
"history": "^5.3.0", "history": "^5.3.0",
"js-sha256": "^0.9.0", "js-sha256": "^0.9.0",
"lande": "^1.0.10",
"lodash.chunk": "^4.2.0", "lodash.chunk": "^4.2.0",
"lodash.clonedeep": "^4.5.0", "lodash.clonedeep": "^4.5.0",
"lodash.debounce": "^4.0.8", "lodash.debounce": "^4.0.8",

View File

@ -1,5 +1,7 @@
import {AppBskyFeedFeedViewPost} from '@atproto/api' import {AppBskyFeedFeedViewPost} from '@atproto/api'
import lande from 'lande'
type FeedViewPost = AppBskyFeedFeedViewPost.Main type FeedViewPost = AppBskyFeedFeedViewPost.Main
import {hasProp} from '@atproto/lexicon'
export type FeedTunerFn = ( export type FeedTunerFn = (
tuner: FeedTuner, tuner: FeedTuner,
@ -178,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 { function getSelfReplyUri(item: FeedViewPost): string | undefined {

View File

@ -336,6 +336,20 @@ export class FeedModel {
return this.setup() return this.setup()
} }
private get feedTuners() {
if (this.feedType === 'goodstuff') {
return [
FeedTuner.dedupReposts,
FeedTuner.likedRepliesOnly,
FeedTuner.englishOnly,
]
}
if (this.feedType === 'home') {
return [FeedTuner.dedupReposts, FeedTuner.likedRepliesOnly]
}
return []
}
/** /**
* Load for first render * Load for first render
*/ */
@ -477,12 +491,7 @@ export class FeedModel {
} }
const res = await this._getFeed({limit: 1}) const res = await this._getFeed({limit: 1})
const currentLatestUri = this.pollCursor const currentLatestUri = this.pollCursor
const slices = this.tuner.tune( const slices = this.tuner.tune(res.data.feed, this.feedTuners)
res.data.feed,
this.feedType === 'home'
? [FeedTuner.dedupReposts, FeedTuner.likedRepliesOnly]
: [],
)
const item = slices[0]?.rootItem const item = slices[0]?.rootItem
if (!item) { if (!item) {
return return
@ -548,12 +557,7 @@ export class FeedModel {
this.loadMoreCursor = res.data.cursor this.loadMoreCursor = res.data.cursor
this.hasMore = !!this.loadMoreCursor this.hasMore = !!this.loadMoreCursor
const slices = this.tuner.tune( const slices = this.tuner.tune(res.data.feed, this.feedTuners)
res.data.feed,
this.feedType === 'home'
? [FeedTuner.dedupReposts, FeedTuner.likedRepliesOnly]
: [],
)
const toAppend: FeedSliceModel[] = [] const toAppend: FeedSliceModel[] = []
for (const slice of slices) { for (const slice of slices) {
@ -578,12 +582,7 @@ export class FeedModel {
) { ) {
this.pollCursor = res.data.feed[0]?.post.uri this.pollCursor = res.data.feed[0]?.post.uri
const slices = this.tuner.tune( const slices = this.tuner.tune(res.data.feed, this.feedTuners)
res.data.feed,
this.feedType === 'home'
? [FeedTuner.dedupReposts, FeedTuner.likedRepliesOnly]
: [],
)
const toPrepend: FeedSliceModel[] = [] const toPrepend: FeedSliceModel[] = []
for (const slice of slices) { for (const slice of slices) {

View File

@ -51,7 +51,11 @@ export const Pager = ({
onSelect: onTabBarSelect, onSelect: onTabBarSelect,
})} })}
{children.map((child, i) => ( {children.map((child, i) => (
<View style={selectedPage === i ? undefined : s.hidden}>{child}</View> <View
style={selectedPage === i ? undefined : s.hidden}
key={`page-${i}`}>
{child}
</View>
))} ))}
{tabBarPosition === 'bottom' && {tabBarPosition === 'bottom' &&
renderTabBar({ renderTabBar({

View File

@ -10492,6 +10492,13 @@ kysely@^0.22.0:
resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.22.0.tgz#8aac53942da3cadc604d7d154a746d983fe8f7b9" resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.22.0.tgz#8aac53942da3cadc604d7d154a746d983fe8f7b9"
integrity sha512-ZE3qWtnqLOalodzfK5QUEcm7AEulhxsPNuKaGFsC3XiqO92vMLm+mAHk/NnbSIOtC4RmGm0nsv700i8KDp1gfQ== integrity sha512-ZE3qWtnqLOalodzfK5QUEcm7AEulhxsPNuKaGFsC3XiqO92vMLm+mAHk/NnbSIOtC4RmGm0nsv700i8KDp1gfQ==
lande@^1.0.10:
version "1.0.10"
resolved "https://registry.yarnpkg.com/lande/-/lande-1.0.10.tgz#1f6c6542e628338eb18def22edd1038f5fce9e7a"
integrity sha512-yT52DQh+UV2pEp08jOYrA4drDv0DbjpiRyZYgl25ak9G2cVR2AimzrqkYQWrD9a7Ud+qkAcaiDDoNH9DXfHPmw==
dependencies:
toygrad "^2.6.0"
language-subtag-registry@~0.3.2: language-subtag-registry@~0.3.2:
version "0.3.22" version "0.3.22"
resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d"
@ -15679,6 +15686,11 @@ tough-cookie@^4.0.0, tough-cookie@^4.1.2:
universalify "^0.2.0" universalify "^0.2.0"
url-parse "^1.5.3" url-parse "^1.5.3"
toygrad@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/toygrad/-/toygrad-2.6.0.tgz#e814bb7da026db8e08dc7da14c7155f49cdb4d54"
integrity sha512-g4zBmlSbvzOE5FOILxYkAybTSxijKLkj1WoNqVGnbMcWDyj4wWQ+eYSr3ik7XOpIgMq/7eBcPRTJX3DM2E0YMg==
tr46@^1.0.1: tr46@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"