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>
This commit is contained in:
207
frontend/src/hooks/usePlatformEmailAddresses.ts
Normal file
207
frontend/src/hooks/usePlatformEmailAddresses.ts
Normal file
@@ -0,0 +1,207 @@
|
||||
/**
|
||||
* 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] });
|
||||
},
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user