Add language filtering to goodstuff
parent
a811c57480
commit
4787c8383d
|
@ -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",
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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({
|
||||||
|
|
12
yarn.lock
12
yarn.lock
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue