import axios from "axios"; type UserInfo = { name: string; patreon: boolean; timezone: string | null; }; export type GuildInfo = { id: string; patreon: boolean; name: string; error?: string; }; type EmbedField = { title: string; value: string; inline: boolean; }; export type Reminder = { attachment: string | null; attachment_name: string | null; avatar: string | null; channel: string; content: string; embed_author: string; embed_author_url: string | null; embed_color: number; embed_description: string; embed_footer: string; embed_footer_url: string | null; embed_image_url: string | null; embed_thumbnail_url: string | null; embed_title: string; embed_fields: EmbedField[] | null; enabled: boolean; expires: string | null; interval_seconds: number | null; interval_days: number | null; interval_months: number | null; name: string; restartable: boolean; tts: boolean; uid: string; username: string; utc_time: string; }; export type Todo = { id: number; channel_id: string; value: string; }; export type CreateTodo = { channel_id: string; value: string; }; export type UpdateTodo = { value: string; }; export type ChannelInfo = { id: string; name: string; }; type RoleInfo = { id: string; name: string; }; type EmojiInfo = { fmt: string; name: string; }; type Template = { id: number; name: string; attachment: string | null; attachment_name: string | null; avatar: string | null; channel: string; content: string; embed_author: string; embed_author_url: string | null; embed_color: number; embed_description: string; embed_footer: string; embed_footer_url: string | null; embed_image_url: string | null; embed_thumbnail_url: string | null; embed_title: string; embed_fields: EmbedField[] | null; }; const USER_INFO_STALE_TIME = 120_000; const GUILD_INFO_STALE_TIME = 300_000; const OTHER_STALE_TIME = 120_000; export const fetchUserInfo = () => ({ queryKey: ["USER_INFO"], queryFn: () => axios.get("/dashboard/api/user").then((resp) => resp.data) as Promise, staleTime: USER_INFO_STALE_TIME, }); export const patchUserInfo = () => ({ mutationFn: (timezone: string) => axios.patch(`/dashboard/api/user`, { timezone }), }); export const fetchUserGuilds = () => ({ queryKey: ["USER_GUILDS"], queryFn: () => axios.get("/dashboard/api/user/guilds").then((resp) => resp.data) as Promise, staleTime: USER_INFO_STALE_TIME, }); export const fetchGuildInfo = (guild: string) => ({ queryKey: ["GUILD_INFO", guild], queryFn: () => axios.get(`/dashboard/api/guild/${guild}`).then((resp) => resp.data) as Promise, staleTime: GUILD_INFO_STALE_TIME, }); export const fetchGuildChannels = (guild: string) => ({ queryKey: ["GUILD_CHANNELS", guild], queryFn: () => axios .get(`/dashboard/api/guild/${guild}/channels`) .then((resp) => resp.data.sort((a: ChannelInfo, b: ChannelInfo) => a.name == b.name ? 0 : a.name > b.name ? 1 : -1, ), ) as Promise, staleTime: GUILD_INFO_STALE_TIME, }); export const fetchGuildRoles = (guild: string) => ({ queryKey: ["GUILD_ROLES", guild], queryFn: () => axios.get(`/dashboard/api/guild/${guild}/roles`).then((resp) => resp.data) as Promise< RoleInfo[] >, staleTime: GUILD_INFO_STALE_TIME, }); export const fetchGuildEmojis = (guild: string) => ({ queryKey: ["GUILD_EMOJIS", guild], queryFn: () => axios.get(`/dashboard/api/guild/${guild}/emojis`).then((resp) => resp.data) as Promise< EmojiInfo[] >, staleTime: GUILD_INFO_STALE_TIME, }); export const fetchGuildReminders = (guild: string) => ({ queryKey: ["GUILD_REMINDERS", guild], queryFn: () => axios.get(`/dashboard/api/guild/${guild}/reminders`).then((resp) => resp.data) as Promise< Reminder[] >, staleTime: OTHER_STALE_TIME, }); export const patchGuildReminder = (guild: string) => ({ mutationFn: (reminder: Reminder) => axios.patch(`/dashboard/api/guild/${guild}/reminders`, reminder), }); export const postGuildReminder = (guild: string) => ({ mutationFn: (reminder: Reminder) => axios.post(`/dashboard/api/guild/${guild}/reminders`, reminder).then((resp) => resp.data), }); export const deleteReminder = () => ({ mutationFn: (reminder: Reminder) => axios.delete(`/dashboard/api/reminders`, { data: { uid: reminder.uid, }, }), }); export const fetchGuildTemplates = (guild: string) => ({ queryKey: ["GUILD_TEMPLATES", guild], queryFn: () => axios.get(`/dashboard/api/guild/${guild}/templates`).then((resp) => resp.data) as Promise< Template[] >, staleTime: OTHER_STALE_TIME, }); export const postGuildTemplate = (guild: string) => ({ mutationFn: (reminder: Reminder) => axios.post(`/dashboard/api/guild/${guild}/templates`, reminder).then((resp) => resp.data), }); export const deleteGuildTemplate = (guild: string) => ({ mutationFn: (template: Template) => axios.delete(`/dashboard/api/guild/${guild}/templates`, { data: { id: template.id, }, }), }); export const fetchGuildTodos = (guild: string) => ({ queryKey: ["GUILD_TODOS", guild], queryFn: () => axios.get(`/dashboard/api/guild/${guild}/todos`).then((resp) => resp.data) as Promise< Todo[] >, staleTime: OTHER_STALE_TIME, }); export const patchGuildTodo = (guild: string) => ({ mutationFn: ({ id, todo }) => axios.patch(`/dashboard/api/guild/${guild}/todos/${id}`, todo), }); export const postGuildTodo = (guild: string) => ({ mutationFn: (todo: CreateTodo) => axios.post(`/dashboard/api/guild/${guild}/todos`, todo).then((resp) => resp.data), }); export const deleteGuildTodo = (guild: string) => ({ mutationFn: (todoId: number) => axios.delete(`/dashboard/api/guild/${guild}/todos/${todoId}`), }); export const fetchUserReminders = () => ({ queryKey: ["USER_REMINDERS"], queryFn: () => axios.get(`/dashboard/api/user/reminders`).then((resp) => resp.data) as Promise, staleTime: OTHER_STALE_TIME, }); export const postUserReminder = () => ({ mutationFn: (reminder: Reminder) => axios.post(`/dashboard/api/user/reminders`, reminder).then((resp) => resp.data), }); export const patchUserReminder = () => ({ mutationFn: (reminder: Reminder) => axios.patch(`/dashboard/api/user/reminders`, reminder), });