- 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>
208 lines
4.7 KiB
TypeScript
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] });
|
|
},
|
|
});
|
|
};
|