import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import type { ConfigResponse } from '../../../../../packages/api-contracts/src/index.js'; import { fetchLoginStatus, fetchRedditAccounts, fetchSettings, importRedditSession, removeRedditAccount, saveSettings, } from './settings-api.js'; import { fetchPushNotifications, savePushNotifications, sendTestPushNotification, } from './push-notifications-api.js'; export const settingsQueryKeys = { config: ['dashboard', 'config'] as const, loginStatus: ['dashboard', 'login', 'status'] as const, accounts: ['dashboard', 'reddit-accounts'] as const, pushNotifications: ['dashboard', 'push-notifications'] as const, }; export function usePushNotificationsQuery() { return useQuery({ queryKey: settingsQueryKeys.pushNotifications, queryFn: fetchPushNotifications }); } export function useSavePushNotificationsMutation() { const queryClient = useQueryClient(); return useMutation({ mutationFn: savePushNotifications, onSuccess(response) { queryClient.setQueryData(settingsQueryKeys.pushNotifications, response); }, }); } export function useTestPushNotificationMutation() { return useMutation({ mutationFn: sendTestPushNotification }); } export function useSettingsQuery() { return useQuery({ queryKey: settingsQueryKeys.config, queryFn: fetchSettings }); } export function useSaveSettingsMutation() { const queryClient = useQueryClient(); return useMutation({ mutationFn: saveSettings, onSuccess(response) { queryClient.setQueryData(settingsQueryKeys.config, (current) => ({ ...response.config, subreddits: response.subreddits, tones: current?.tones ?? [], advanced: response.advanced ?? current?.advanced, })); }, }); } export function useLoginStatusQuery() { return useQuery({ queryKey: settingsQueryKeys.loginStatus, queryFn: fetchLoginStatus }); } export function useRedditAccountsQuery() { return useQuery({ queryKey: settingsQueryKeys.accounts, queryFn: fetchRedditAccounts }); } function invalidateAccountContent(queryClient: ReturnType) { void queryClient.invalidateQueries({ queryKey: settingsQueryKeys.loginStatus }); void queryClient.invalidateQueries({ queryKey: settingsQueryKeys.accounts }); void queryClient.invalidateQueries({ queryKey: ['dashboard', 'conversations'] }); void queryClient.invalidateQueries({ queryKey: ['dashboard', 'media'] }); } export function useImportRedditSessionMutation() { const queryClient = useQueryClient(); return useMutation({ mutationFn: importRedditSession, onSuccess() { invalidateAccountContent(queryClient); }, }); } export function useRemoveRedditAccountMutation() { const queryClient = useQueryClient(); return useMutation({ mutationFn: removeRedditAccount, onSuccess() { invalidateAccountContent(queryClient); // Removal takes the account's outreach history with it, so every // account-derived view on the dashboard is now stale. void queryClient.invalidateQueries({ queryKey: ['dashboard', 'growth'] }); void queryClient.invalidateQueries({ queryKey: ['dashboard', 'stats'] }); void queryClient.invalidateQueries({ queryKey: ['performance'] }); void queryClient.invalidateQueries({ queryKey: ['outreach'] }); void queryClient.invalidateQueries({ queryKey: ['attention'] }); }, }); }