/**
* useMPEmailLookup Hook
*
* Looks up an MP by their @parl.gc.ca email address.
* Used during signup to automatically match parliamentary emails to MP profiles.
*/
import { useState, useCallback } from 'react';
export interface MPFromEmail {
parl_mp_id: number;
name: string;
party: string;
riding: string;
photo_url?: string;
email?: string;
}
export interface UseMPEmailLookupResult {
mp: MPFromEmail | null;
loading: boolean;
error: string | null;
isParlEmail: boolean;
checkEmail: (email: string) => Promise<MPFromEmail | null>;
clearMP: () => void;
}
/**
* Hook to look up an MP by their parliamentary email address
*/
export function useMPEmailLookup(): UseMPEmailLookupResult {
const [mp, setMP] = useState<MPFromEmail | null>(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [isParlEmail, setIsParlEmail] = useState(false);
/**
* Check if an email belongs to an MP in our database
*/
const checkEmail = useCallback(async (email: string): Promise<MPFromEmail | null> => {
const normalizedEmail = email.toLowerCase().trim();
const isParliamentaryEmail = normalizedEmail.endsWith('@parl.gc.ca');
setIsParlEmail(isParliamentaryEmail);
if (!isParliamentaryEmail) {
setMP(null);
setError(null);
return null;
}
setLoading(true);
setError(null);
try {
const graphqlEndpoint = process.env.NEXT_PUBLIC_GRAPHQL_URL || 'http://localhost:4000/graphql';
const apiKey = process.env.NEXT_PUBLIC_GRAPHQL_API_KEY;
const response = await fetch(graphqlEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(apiKey ? { 'X-API-Key': apiKey } : {}),
},
body: JSON.stringify({
query: `
query GetMPByEmail($email: String!) {
mps(where: { email: $email, current: true }, options: { limit: 1 }) {
parl_mp_id
name
party
riding
photo_url
email
}
}
`,
variables: { email: normalizedEmail },
}),
});
const json = await response.json();
if (json.errors) {
throw new Error(json.errors[0]?.message || 'GraphQL query failed');
}
const foundMP = json.data?.mps?.[0] || null;
setMP(foundMP);
return foundMP;
} catch (err) {
console.error('Error looking up MP by email:', err);
const errorMessage = err instanceof Error ? err.message : 'Failed to look up MP';
setError(errorMessage);
setMP(null);
return null;
} finally {
setLoading(false);
}
}, []);
/**
* Clear the found MP (e.g., when user changes email)
*/
const clearMP = useCallback(() => {
setMP(null);
setError(null);
setIsParlEmail(false);
}, []);
return {
mp,
loading,
error,
isParlEmail,
checkEmail,
clearMP,
};
}