Files
smoothschedule/frontend/src/hooks/usePlatformEmailAddresses.ts
poduck ae74b4c2ed feat: Multi-email ticketing system with platform email addresses
- Add PlatformEmailAddress model for managing platform-level email addresses
- Add TicketEmailAddress model for tenant-level email addresses
- Create MailServerService for IMAP integration with mail.talova.net
- Implement PlatformEmailReceiver for processing incoming platform emails
- Add email autoconfiguration for Mozilla, Microsoft, and Apple clients
- Add configurable email polling interval in platform settings
- Add "Check Emails" button on support page for manual refresh
- Add ticket counts to status tabs on support page
- Add platform email addresses management page
- Add Privacy Policy and Terms of Service pages
- Add robots.txt for SEO
- Restrict email addresses to smoothschedule.com domain only

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 17:49:09 -05:00

208 lines
4.7 KiB
TypeScript

/**
* React Query hooks for Platform Email Addresses
*/
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import {
getPlatformEmailAddresses,
getPlatformEmailAddress,
createPlatformEmailAddress,
updatePlatformEmailAddress,
deletePlatformEmailAddress,
removeLocalPlatformEmailAddress,
syncPlatformEmailAddress,
testImapConnection,
testSmtpConnection,
setAsDefault,
testMailServerConnection,
getMailServerAccounts,
getAvailableDomains,
getAssignableUsers,
importFromMailServer,
PlatformEmailAddressListItem,
PlatformEmailAddress,
PlatformEmailAddressCreate,
PlatformEmailAddressUpdate,
} from '../api/platformEmailAddresses';
export type { PlatformEmailAddressListItem, PlatformEmailAddress };
const QUERY_KEY = 'platformEmailAddresses';
/**
* Hook to fetch all platform email addresses
*/
export const usePlatformEmailAddresses = () => {
return useQuery({
queryKey: [QUERY_KEY],
queryFn: getPlatformEmailAddresses,
});
};
/**
* Hook to fetch a single platform email address
*/
export const usePlatformEmailAddress = (id: number) => {
return useQuery({
queryKey: [QUERY_KEY, id],
queryFn: () => getPlatformEmailAddress(id),
enabled: !!id,
});
};
/**
* Hook to create a new platform email address
*/
export const useCreatePlatformEmailAddress = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: PlatformEmailAddressCreate) => createPlatformEmailAddress(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });
},
});
};
/**
* Hook to update a platform email address
*/
export const useUpdatePlatformEmailAddress = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, data }: { id: number; data: PlatformEmailAddressUpdate }) =>
updatePlatformEmailAddress(id, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });
},
});
};
/**
* Hook to delete a platform email address (also removes from mail server)
*/
export const useDeletePlatformEmailAddress = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: number) => deletePlatformEmailAddress(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });
},
});
};
/**
* Hook to remove email address from database only (keeps mail server account)
*/
export const useRemoveLocalPlatformEmailAddress = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: number) => removeLocalPlatformEmailAddress(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });
},
});
};
/**
* Hook to sync a platform email address to the mail server
*/
export const useSyncPlatformEmailAddress = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: number) => syncPlatformEmailAddress(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });
},
});
};
/**
* Hook to test IMAP connection
*/
export const useTestImapConnection = () => {
return useMutation({
mutationFn: (id: number) => testImapConnection(id),
});
};
/**
* Hook to test SMTP connection
*/
export const useTestSmtpConnection = () => {
return useMutation({
mutationFn: (id: number) => testSmtpConnection(id),
});
};
/**
* Hook to set email address as default
*/
export const useSetAsDefault = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: number) => setAsDefault(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });
},
});
};
/**
* Hook to test mail server SSH connection
*/
export const useTestMailServerConnection = () => {
return useMutation({
mutationFn: testMailServerConnection,
});
};
/**
* Hook to get mail server accounts
*/
export const useMailServerAccounts = () => {
return useQuery({
queryKey: [QUERY_KEY, 'mailServerAccounts'],
queryFn: getMailServerAccounts,
});
};
/**
* Hook to get available email domains
*/
export const useAvailableDomains = () => {
return useQuery({
queryKey: [QUERY_KEY, 'availableDomains'],
queryFn: getAvailableDomains,
});
};
/**
* Hook to get assignable users
*/
export const useAssignableUsers = () => {
return useQuery({
queryKey: [QUERY_KEY, 'assignableUsers'],
queryFn: getAssignableUsers,
});
};
/**
* Hook to import email addresses from the mail server
*/
export const useImportFromMailServer = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: importFromMailServer,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });
},
});
};