mirror of
https://github.com/tooot-app/app
synced 2025-06-05 22:19:13 +02:00
Fix #613
This commit is contained in:
@ -99,7 +99,10 @@ export type TabSharedStackParamList = {
|
||||
}
|
||||
'Tab-Shared-Account-In-Lists': { account: Pick<Mastodon.Account, 'id' | 'username'> }
|
||||
'Tab-Shared-Attachments': { account: Mastodon.Account; queryKey?: QueryKeyTimeline }
|
||||
'Tab-Shared-Hashtag': { hashtag: Mastodon.Tag['name']; queryKey?: QueryKeyTimeline }
|
||||
'Tab-Shared-Filter':
|
||||
| { source: 'status'; status: Mastodon.Status }
|
||||
| { source: 'hashtag'; tag_name: Mastodon.Tag['name'] }
|
||||
'Tab-Shared-Hashtag': { tag_name: Mastodon.Tag['name']; queryKey?: QueryKeyTimeline }
|
||||
'Tab-Shared-History': { status: Mastodon.Status; detectedLanguage: string }
|
||||
'Tab-Shared-Report': {
|
||||
account: Pick<Mastodon.Account, 'id' | 'acct' | 'username' | 'url'>
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import haptics from '@components/haptics'
|
||||
import { QueryFunctionContext, useMutation, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
@ -28,6 +29,73 @@ const useFilterQuery = ({
|
||||
})
|
||||
}
|
||||
|
||||
/* ----- */
|
||||
|
||||
type MutationVarsFilter = { filter: Mastodon.Filter<'v2'> } & (
|
||||
| { source: 'status'; action: 'add'; status: Mastodon.Status }
|
||||
| { source: 'status'; action: 'remove'; status: Mastodon.Status }
|
||||
| { source: 'keyword'; action: 'add'; keyword: string }
|
||||
| { source: 'keyword'; action: 'remove'; keyword: string }
|
||||
)
|
||||
|
||||
const mutationFunction = async (params: MutationVarsFilter) => {
|
||||
switch (params.source) {
|
||||
case 'status':
|
||||
switch (params.action) {
|
||||
case 'add':
|
||||
return apiInstance({
|
||||
method: 'post',
|
||||
version: 'v2',
|
||||
url: `filters/${params.filter.id}/statuses`,
|
||||
body: { status_id: params.status.id }
|
||||
})
|
||||
case 'remove':
|
||||
for (const status of params.filter.statuses) {
|
||||
if (status.status_id === params.status.id) {
|
||||
await apiInstance({
|
||||
method: 'delete',
|
||||
version: 'v2',
|
||||
url: `filters/statuses/${status.id}`
|
||||
})
|
||||
}
|
||||
}
|
||||
return Promise.resolve()
|
||||
}
|
||||
break
|
||||
case 'keyword':
|
||||
switch (params.action) {
|
||||
case 'add':
|
||||
return apiInstance({
|
||||
method: 'post',
|
||||
version: 'v2',
|
||||
url: `filters/${params.filter.id}/keywords`,
|
||||
body: { keyword: params.keyword, whole_word: true }
|
||||
})
|
||||
case 'remove':
|
||||
for (const keyword of params.filter.keywords) {
|
||||
if (keyword.keyword === params.keyword) {
|
||||
await apiInstance({
|
||||
method: 'delete',
|
||||
version: 'v2',
|
||||
url: `filters/keywords/${keyword.id}`
|
||||
})
|
||||
}
|
||||
}
|
||||
return Promise.resolve()
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
const useFilterMutation = () => {
|
||||
return useMutation<any, AxiosError, MutationVarsFilter>(mutationFunction, {
|
||||
onSuccess: () => haptics('Light'),
|
||||
onError: () => haptics('Error')
|
||||
})
|
||||
}
|
||||
|
||||
/* ----- */
|
||||
|
||||
export type QueryKeyFilters = ['Filters', { version: 'v1' | 'v2' }]
|
||||
|
||||
const filtersQueryFunction = async <T extends 'v1' | 'v2' = 'v1'>({
|
||||
@ -54,4 +122,4 @@ const useFiltersQuery = <T extends 'v1' | 'v2' = 'v1'>(params?: {
|
||||
})
|
||||
}
|
||||
|
||||
export { useFilterQuery, useFiltersQuery }
|
||||
export { useFilterQuery, useFilterMutation, useFiltersQuery }
|
||||
|
@ -60,32 +60,33 @@ const useFollowedTagsQuery = (
|
||||
)
|
||||
}
|
||||
|
||||
export type QueryKeyTags = ['Tags', { tag: string }]
|
||||
const queryFunction = async ({ queryKey }: QueryFunctionContext<QueryKeyTags>) => {
|
||||
const { tag } = queryKey[1]
|
||||
export type QueryKeyTag = ['Tag', { tag_name: string }]
|
||||
const queryFunction = async ({ queryKey }: QueryFunctionContext<QueryKeyTag>) => {
|
||||
const { tag_name } = queryKey[1]
|
||||
|
||||
const res = await apiInstance<Mastodon.Tag>({ method: 'get', url: `tags/${tag}` })
|
||||
const res = await apiInstance<Mastodon.Tag>({ method: 'get', url: `tags/${tag_name}` })
|
||||
return res.body
|
||||
}
|
||||
const useTagsQuery = ({
|
||||
options,
|
||||
...queryKeyParams
|
||||
}: QueryKeyTags[1] & {
|
||||
const useTagQuery = ({
|
||||
tag_name,
|
||||
options
|
||||
}: {
|
||||
tag_name: Mastodon.Tag['name']
|
||||
options?: UseQueryOptions<Mastodon.Tag, AxiosError>
|
||||
}) => {
|
||||
const queryKey: QueryKeyTags = ['Tags', { ...queryKeyParams }]
|
||||
const queryKey: QueryKeyTag = ['Tag', { tag_name }]
|
||||
return useQuery(queryKey, queryFunction, options)
|
||||
}
|
||||
|
||||
type MutationVarsAnnouncement = { tag: string; to: boolean }
|
||||
const mutationFunction = async ({ tag, to }: MutationVarsAnnouncement) => {
|
||||
type MutationVarsTag = { tag_name: Mastodon.Tag['name']; to: boolean }
|
||||
const mutationFunction = async ({ tag_name, to }: MutationVarsTag) => {
|
||||
return apiInstance<{}>({
|
||||
method: 'post',
|
||||
url: `tags/${tag}/${to ? 'follow' : 'unfollow'}`
|
||||
url: `tags/${tag_name}/${to ? 'follow' : 'unfollow'}`
|
||||
})
|
||||
}
|
||||
const useTagsMutation = (options: UseMutationOptions<{}, AxiosError, MutationVarsAnnouncement>) => {
|
||||
const useTagMutation = (options: UseMutationOptions<{}, AxiosError, MutationVarsTag>) => {
|
||||
return useMutation(mutationFunction, options)
|
||||
}
|
||||
|
||||
export { useFollowedTagsQuery, useTagsQuery, useTagsMutation }
|
||||
export { useFollowedTagsQuery, useTagQuery, useTagMutation }
|
||||
|
@ -33,7 +33,7 @@ export type QueryKeyTimeline = [
|
||||
}
|
||||
| {
|
||||
page: 'Hashtag'
|
||||
hashtag: Mastodon.Tag['name']
|
||||
tag_name: Mastodon.Tag['name']
|
||||
}
|
||||
| {
|
||||
page: 'List'
|
||||
@ -219,7 +219,7 @@ export const queryFunctionTimeline = async ({
|
||||
case 'Hashtag':
|
||||
return apiInstance<Mastodon.Status[]>({
|
||||
method: 'get',
|
||||
url: `timelines/tag/${page.hashtag}`,
|
||||
url: `timelines/tag/${page.tag_name}`,
|
||||
params
|
||||
})
|
||||
|
||||
|
Reference in New Issue
Block a user