mirror of
https://github.com/tooot-app/app
synced 2025-06-05 22:19:13 +02:00
Fixed #447
This commit is contained in:
@ -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,
|
||||
|
@ -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 }
|
||||
|
@ -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]
|
||||
|
@ -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 },
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user