- Add OAuthCredential model for storing Google/Microsoft OAuth tokens - Add email provider auto-detection endpoint (Gmail, Outlook, Yahoo, etc.) - Add EmailConfigWizard frontend component with step-by-step setup - Add OAuth flow endpoints for Google and Microsoft XOAUTH2 - Update production settings to make AWS, Sentry, Mailgun optional - Update Traefik config for wildcard subdomain routing - Add logo resize utility script 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
190 lines
4.2 KiB
TypeScript
190 lines
4.2 KiB
TypeScript
/**
|
|
* React Query hooks for ticket email settings
|
|
*/
|
|
|
|
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import {
|
|
getTicketEmailSettings,
|
|
updateTicketEmailSettings,
|
|
testImapConnection,
|
|
testSmtpConnection,
|
|
fetchEmailsNow,
|
|
getIncomingEmails,
|
|
reprocessIncomingEmail,
|
|
detectEmailProvider,
|
|
getOAuthStatus,
|
|
initiateGoogleOAuth,
|
|
initiateMicrosoftOAuth,
|
|
getOAuthCredentials,
|
|
deleteOAuthCredential,
|
|
TicketEmailSettings,
|
|
TicketEmailSettingsUpdate,
|
|
IncomingTicketEmail,
|
|
EmailProviderDetectResult,
|
|
OAuthStatusResult,
|
|
OAuthInitiateResult,
|
|
OAuthCredential,
|
|
} from '../api/ticketEmailSettings';
|
|
|
|
const QUERY_KEY = 'ticketEmailSettings';
|
|
const INCOMING_EMAILS_KEY = 'incomingTicketEmails';
|
|
|
|
/**
|
|
* Hook to fetch ticket email settings
|
|
*/
|
|
export const useTicketEmailSettings = () => {
|
|
return useQuery<TicketEmailSettings>({
|
|
queryKey: [QUERY_KEY],
|
|
queryFn: getTicketEmailSettings,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to update ticket email settings
|
|
*/
|
|
export const useUpdateTicketEmailSettings = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (data: TicketEmailSettingsUpdate) => updateTicketEmailSettings(data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });
|
|
},
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to test IMAP connection
|
|
*/
|
|
export const useTestImapConnection = () => {
|
|
return useMutation({
|
|
mutationFn: testImapConnection,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to test SMTP connection
|
|
*/
|
|
export const useTestSmtpConnection = () => {
|
|
return useMutation({
|
|
mutationFn: testSmtpConnection,
|
|
});
|
|
};
|
|
|
|
// Legacy alias
|
|
export const useTestEmailConnection = useTestImapConnection;
|
|
|
|
/**
|
|
* Hook to manually fetch emails
|
|
*/
|
|
export const useFetchEmailsNow = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: fetchEmailsNow,
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });
|
|
queryClient.invalidateQueries({ queryKey: [INCOMING_EMAILS_KEY] });
|
|
},
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to fetch incoming email audit log
|
|
*/
|
|
export const useIncomingEmails = (params?: { status?: string; ticket?: number }) => {
|
|
return useQuery<IncomingTicketEmail[]>({
|
|
queryKey: [INCOMING_EMAILS_KEY, params],
|
|
queryFn: () => getIncomingEmails(params),
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to reprocess a failed incoming email
|
|
*/
|
|
export const useReprocessIncomingEmail = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: number) => reprocessIncomingEmail(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: [INCOMING_EMAILS_KEY] });
|
|
},
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to detect email provider from email address
|
|
*/
|
|
export const useDetectEmailProvider = () => {
|
|
return useMutation({
|
|
mutationFn: (email: string) => detectEmailProvider(email),
|
|
});
|
|
};
|
|
|
|
// OAuth Hooks
|
|
const OAUTH_STATUS_KEY = 'oauthStatus';
|
|
const OAUTH_CREDENTIALS_KEY = 'oauthCredentials';
|
|
|
|
/**
|
|
* Hook to get OAuth configuration status
|
|
*/
|
|
export const useOAuthStatus = () => {
|
|
return useQuery<OAuthStatusResult>({
|
|
queryKey: [OAUTH_STATUS_KEY],
|
|
queryFn: getOAuthStatus,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to initiate Google OAuth flow
|
|
*/
|
|
export const useInitiateGoogleOAuth = () => {
|
|
return useMutation({
|
|
mutationFn: (purpose: string = 'email') => initiateGoogleOAuth(purpose),
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to initiate Microsoft OAuth flow
|
|
*/
|
|
export const useInitiateMicrosoftOAuth = () => {
|
|
return useMutation({
|
|
mutationFn: (purpose: string = 'email') => initiateMicrosoftOAuth(purpose),
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to list OAuth credentials
|
|
*/
|
|
export const useOAuthCredentials = () => {
|
|
return useQuery<OAuthCredential[]>({
|
|
queryKey: [OAUTH_CREDENTIALS_KEY],
|
|
queryFn: getOAuthCredentials,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Hook to delete OAuth credential
|
|
*/
|
|
export const useDeleteOAuthCredential = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: number) => deleteOAuthCredential(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: [OAUTH_CREDENTIALS_KEY] });
|
|
},
|
|
});
|
|
};
|
|
|
|
export type {
|
|
TicketEmailSettings,
|
|
TicketEmailSettingsUpdate,
|
|
IncomingTicketEmail,
|
|
EmailProviderDetectResult,
|
|
OAuthStatusResult,
|
|
OAuthInitiateResult,
|
|
OAuthCredential,
|
|
};
|