tooot/src/utils/queryHooks/announcement.ts

73 lines
1.7 KiB
TypeScript
Raw Normal View History

2021-02-20 19:12:44 +01:00
import apiInstance from '@api/instance'
2021-01-07 19:13:09 +01:00
import { AxiosError } from 'axios'
2021-01-11 21:36:57 +01:00
import {
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions
} from 'react-query'
2021-01-07 19:13:09 +01:00
2021-01-11 21:36:57 +01:00
type QueryKeyAnnouncement = ['Announcements', { showAll?: boolean }]
2021-01-07 19:13:09 +01:00
2021-01-11 21:36:57 +01:00
const queryFunction = ({ queryKey }: { queryKey: QueryKeyAnnouncement }) => {
2021-01-07 19:13:09 +01:00
const { showAll } = queryKey[1]
2021-02-20 19:12:44 +01:00
return apiInstance<Mastodon.Announcement[]>({
2021-01-07 19:13:09 +01:00
method: 'get',
url: `announcements`,
...(showAll && {
params: {
with_dismissed: 'true'
}
})
2021-02-11 01:33:31 +01:00
}).then(res => res.body)
2021-01-07 19:13:09 +01:00
}
2021-01-11 21:36:57 +01:00
const useAnnouncementQuery = <TData = Mastodon.Announcement[]>({
2021-01-07 19:13:09 +01:00
options,
...queryKeyParams
2021-01-11 21:36:57 +01:00
}: QueryKeyAnnouncement[1] & {
2021-01-07 19:13:09 +01:00
options?: UseQueryOptions<Mastodon.Announcement[], AxiosError, TData>
}) => {
2021-01-11 21:36:57 +01:00
const queryKey: QueryKeyAnnouncement = [
'Announcements',
{ ...queryKeyParams }
]
2021-01-07 19:13:09 +01:00
return useQuery(queryKey, queryFunction, options)
}
2021-01-11 21:36:57 +01:00
type MutationVarsAnnouncement = {
id: Mastodon.Announcement['id']
type: 'reaction' | 'dismiss'
name?: Mastodon.AnnouncementReaction['name']
me?: boolean
}
const mutationFunction = async ({
id,
type,
name,
me
}: MutationVarsAnnouncement) => {
switch (type) {
case 'reaction':
2021-02-20 19:12:44 +01:00
return apiInstance<{}>({
2021-01-11 21:36:57 +01:00
method: me ? 'delete' : 'put',
url: `announcements/${id}/reactions/${name}`
})
case 'dismiss':
2021-02-20 19:12:44 +01:00
return apiInstance<{}>({
2021-01-11 21:36:57 +01:00
method: 'post',
url: `announcements/${id}/dismiss`
})
}
}
const useAnnouncementMutation = (
options: UseMutationOptions<{}, AxiosError, MutationVarsAnnouncement>
) => {
return useMutation(mutationFunction, options)
}
export { useAnnouncementQuery, useAnnouncementMutation }