1
0
mirror of https://github.com/tooot-app/app synced 2025-06-05 22:19:13 +02:00
This commit is contained in:
xmflsct
2022-12-14 23:37:41 +01:00
parent 7f8a8de898
commit 4a35e910c1
23 changed files with 425 additions and 302 deletions

View File

@ -133,8 +133,11 @@ const instancesMigration = {
11: (state: { instances: InstanceV10[] }): { instances: InstanceV11[] } => {
return {
instances: state.instances.map(instance => {
delete instance.timelinesLookback
return {
...instance,
followingPage: { showBoosts: true, showReplies: true },
mePage: { ...instance.mePage, followedTags: { shown: false } },
notifications_filter: {
...instance.notifications_filter,

View File

@ -1,5 +1,4 @@
import { ComposeStateDraft } from '@screens/Compose/utils/types'
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
export type InstanceV11 = {
active: boolean
@ -42,11 +41,9 @@ export type InstanceV11 = {
private?: string // legacy
}
}
timelinesLookback?: {
[key: string]: {
queryKey: QueryKeyTimeline
ids: Mastodon.Status['id'][]
}
followingPage: {
showBoosts: boolean
showReplies: boolean
}
mePage: {
followedTags: { shown: boolean }

View File

@ -18,25 +18,66 @@ import updateStatusProperty from './timeline/updateStatusProperty'
export type QueryKeyTimeline = [
'Timeline',
{
page: App.Pages
hashtag?: Mastodon.Tag['name']
list?: Mastodon.List['id']
toot?: Mastodon.Status['id']
account?: Mastodon.Account['id']
}
(
| {
page: Exclude<App.Pages, 'Following' | 'Hashtag' | 'List' | 'Toot' | 'Account'>
}
| {
page: 'Following'
showBoosts: boolean
showReplies: boolean
}
| {
page: 'Hashtag'
hashtag: Mastodon.Tag['name']
}
| {
page: 'List'
list: Mastodon.List['id']
}
| {
page: 'Toot'
toot: Mastodon.Status['id']
}
| {
page: 'Account'
account: Mastodon.Account['id']
exclude_reblogs: boolean
only_media: boolean
}
)
]
const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext<QueryKeyTimeline>) => {
const { page, account, hashtag, list, toot } = queryKey[1]
let params: { [key: string]: string } = { ...pageParam }
const page = queryKey[1]
let params: { [key: string]: string } = { ...pageParam, limit: 40 }
switch (page) {
switch (page.page) {
case 'Following':
return apiInstance<Mastodon.Status[]>({
method: 'get',
url: 'timelines/home',
params
}).then(res => {
if (!page.showBoosts || !page.showReplies) {
return {
...res,
body: res.body
.filter(status => {
if (!page.showBoosts && status.reblog) {
return null
}
if (!page.showReplies && status.in_reply_to_id?.length) {
return null
}
return status
})
.filter(s => s)
}
} else {
return res
}
})
case 'Local':
@ -91,62 +132,57 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext<Query
}
})
case 'Account_Default':
if (pageParam && pageParam.hasOwnProperty('max_id')) {
case 'Account':
if (page.exclude_reblogs) {
if (pageParam && pageParam.hasOwnProperty('max_id')) {
return apiInstance<Mastodon.Status[]>({
method: 'get',
url: `accounts/${page.account}/statuses`,
params: {
exclude_replies: 'true',
...params
}
})
} else {
const res1 = await apiInstance<(Mastodon.Status & { _pinned: boolean })[]>({
method: 'get',
url: `accounts/${page.account}/statuses`,
params: {
pinned: 'true'
}
})
res1.body = res1.body.map(status => {
status._pinned = true
return status
})
const res2 = await apiInstance<Mastodon.Status[]>({
method: 'get',
url: `accounts/${page.account}/statuses`,
params: {
exclude_replies: 'true'
}
})
return {
body: uniqBy([...res1.body, ...res2.body], 'id'),
...(res2.links.next && { links: { next: res2.links.next } })
}
}
} else {
return apiInstance<Mastodon.Status[]>({
method: 'get',
url: `accounts/${account}/statuses`,
url: `accounts/${page.account}/statuses`,
params: {
exclude_replies: 'true',
...params
...params,
exclude_replies: page.exclude_reblogs.toString(),
only_media: page.only_media.toString()
}
})
} else {
const res1 = await apiInstance<(Mastodon.Status & { _pinned: boolean })[]>({
method: 'get',
url: `accounts/${account}/statuses`,
params: {
pinned: 'true'
}
})
res1.body = res1.body.map(status => {
status._pinned = true
return status
})
const res2 = await apiInstance<Mastodon.Status[]>({
method: 'get',
url: `accounts/${account}/statuses`,
params: {
exclude_replies: 'true'
}
})
return {
body: uniqBy([...res1.body, ...res2.body], 'id'),
...(res2.links.next && { links: { next: res2.links.next } })
}
}
case 'Account_All':
return apiInstance<Mastodon.Status[]>({
method: 'get',
url: `accounts/${account}/statuses`,
params
})
case 'Account_Attachments':
return apiInstance<Mastodon.Status[]>({
method: 'get',
url: `accounts/${account}/statuses`,
params: {
only_media: 'true',
...params
}
})
case 'Hashtag':
return apiInstance<Mastodon.Status[]>({
method: 'get',
url: `timelines/tag/${hashtag}`,
url: `timelines/tag/${page.hashtag}`,
params
})
@ -174,21 +210,21 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext<Query
case 'List':
return apiInstance<Mastodon.Status[]>({
method: 'get',
url: `timelines/list/${list}`,
url: `timelines/list/${page.list}`,
params
})
case 'Toot':
const res1_1 = await apiInstance<Mastodon.Status>({
method: 'get',
url: `statuses/${toot}`
url: `statuses/${page.toot}`
})
const res2_1 = await apiInstance<{
ancestors: Mastodon.Status[]
descendants: Mastodon.Status[]
}>({
method: 'get',
url: `statuses/${toot}/context`
url: `statuses/${page.toot}/context`
})
return {
body: [...res2_1.body.ancestors, res1_1.body, ...res2_1.body.descendants]

View File

@ -107,7 +107,10 @@ const addInstance = createAsyncThunk(
},
keys: { auth: undefined, public: undefined, private: undefined }
},
timelinesLookback: {},
followingPage: {
showBoosts: true,
showReplies: true
},
mePage: {
followedTags: { shown: false },
lists: { shown: false },

View File

@ -81,16 +81,15 @@ const instancesSlice = createSlice({
return newInstance
})
},
updateInstanceTimelineLookback: (
updateInstanceFollowingPage: (
{ instances },
action: PayloadAction<InstanceLatest['timelinesLookback']>
action: PayloadAction<Partial<InstanceLatest['followingPage']>>
) => {
const activeIndex = findInstanceActive(instances)
instances[activeIndex] &&
(instances[activeIndex].timelinesLookback = {
...instances[activeIndex].timelinesLookback,
...action.payload
})
instances[activeIndex].followingPage = {
...instances[activeIndex].followingPage,
...action.payload
}
},
updateInstanceMePage: (
{ instances },
@ -360,8 +359,8 @@ export const getInstanceNotificationsFilter = ({ instances: { instances } }: Roo
export const getInstancePush = ({ instances: { instances } }: RootState) =>
instances[findInstanceActive(instances)]?.push
export const getInstanceTimelinesLookback = ({ instances: { instances } }: RootState) =>
instances[findInstanceActive(instances)]?.timelinesLookback
export const getInstanceFollowingPage = ({ instances: { instances } }: RootState) =>
instances[findInstanceActive(instances)]?.followingPage
export const getInstanceMePage = ({ instances: { instances } }: RootState) =>
instances[findInstanceActive(instances)]?.mePage
@ -379,7 +378,7 @@ export const {
updateInstanceDraft,
removeInstanceDraft,
disableAllPushes,
updateInstanceTimelineLookback,
updateInstanceFollowingPage,
updateInstanceMePage,
countInstanceEmoji
} = instancesSlice.actions