UNPKG

@oxyhq/services

Version:

OxyHQ Expo/React Native SDK — UI components, screens, and native features

185 lines (175 loc) 5.03 kB
"use strict"; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { queryKeys, invalidateSessionQueries } from "../queries/queryKeys.js"; import { useOxy } from "../../context/OxyContext.js"; import { toast } from '../../../lib/sonner'; /** * Switch active session */ export const useSwitchSession = () => { const { switchSession, activeSessionId } = useOxy(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async sessionId => { return await switchSession(sessionId); }, onSuccess: user => { // Invalidate all session queries invalidateSessionQueries(queryClient); // Update current user query queryClient.setQueryData(queryKeys.accounts.current(), user); // Invalidate account queries queryClient.invalidateQueries({ queryKey: queryKeys.accounts.all }); }, onError: error => { toast.error(error instanceof Error ? error.message : 'Failed to switch session'); } }); }; /** * Logout from a session */ export const useLogoutSession = () => { const { oxyServices, activeSessionId, sessions } = useOxy(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async targetSessionId => { if (!activeSessionId) { throw new Error('No active session'); } const sessionToLogout = targetSessionId || activeSessionId; await oxyServices.logoutSession(activeSessionId, sessionToLogout); return sessionToLogout; }, onMutate: async targetSessionId => { // Cancel outgoing queries await queryClient.cancelQueries({ queryKey: queryKeys.sessions.all }); // Snapshot previous sessions const previousSessions = queryClient.getQueryData(queryKeys.sessions.list()); // Optimistically remove session if (previousSessions) { const sessionToLogout = targetSessionId || activeSessionId; const updatedSessions = previousSessions.filter(s => s.sessionId !== sessionToLogout); queryClient.setQueryData(queryKeys.sessions.list(), updatedSessions); } return { previousSessions }; }, onError: (error, targetSessionId, context) => { // Rollback on error if (context?.previousSessions) { queryClient.setQueryData(queryKeys.sessions.list(), context.previousSessions); } toast.error(error instanceof Error ? error.message : 'Failed to logout'); }, onSuccess: () => { // Invalidate all session queries invalidateSessionQueries(queryClient); }, onSettled: () => { queryClient.invalidateQueries({ queryKey: queryKeys.sessions.all }); } }); }; /** * Logout from all sessions */ export const useLogoutAll = () => { const { oxyServices, activeSessionId, clearSessionState } = useOxy(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async () => { if (!activeSessionId) { throw new Error('No active session'); } await oxyServices.logoutAllSessions(activeSessionId); await clearSessionState(); }, onSuccess: () => { // Clear all queries queryClient.clear(); toast.success('Logged out from all sessions'); }, onError: error => { toast.error(error instanceof Error ? error.message : 'Failed to logout from all sessions'); } }); }; /** * Update device name */ export const useUpdateDeviceName = () => { const { oxyServices, activeSessionId } = useOxy(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async deviceName => { if (!activeSessionId) { throw new Error('No active session'); } return await oxyServices.updateDeviceName(activeSessionId, deviceName); }, onSuccess: () => { // Invalidate device and session queries queryClient.invalidateQueries({ queryKey: queryKeys.devices.all }); queryClient.invalidateQueries({ queryKey: queryKeys.sessions.all }); toast.success('Device name updated'); }, onError: error => { toast.error(error instanceof Error ? error.message : 'Failed to update device name'); } }); }; /** * Remove a device */ export const useRemoveDevice = () => { const { oxyServices } = useOxy(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async deviceId => { await oxyServices.removeDevice(deviceId); return deviceId; }, onSuccess: () => { // Invalidate device queries queryClient.invalidateQueries({ queryKey: queryKeys.devices.all }); queryClient.invalidateQueries({ queryKey: queryKeys.sessions.all }); toast.success('Device removed'); }, onError: error => { toast.error(error instanceof Error ? error.message : 'Failed to remove device'); } }); }; //# sourceMappingURL=useServicesMutations.js.map