Files
medreport_mrb2b/components/auth-provider.tsx
2025-06-08 16:18:30 +03:00

80 lines
1.8 KiB
TypeScript

'use client';
import { useCallback } from 'react';
import type { AuthChangeEvent, Session } from '@supabase/supabase-js';
import { useMonitoring } from '@kit/monitoring/hooks';
import { useAppEvents } from '@kit/shared/events';
import { useAuthChangeListener } from '@kit/supabase/hooks/use-auth-change-listener';
import pathsConfig from '~/config/paths.config';
export function AuthProvider(props: React.PropsWithChildren) {
const dispatchEvent = useDispatchAppEventFromAuthEvent();
const onEvent = useCallback(
(event: AuthChangeEvent, session: Session | null) => {
dispatchEvent(event, session?.user.id, {
email: session?.user.email ?? '',
});
},
[dispatchEvent],
);
useAuthChangeListener({
appHomePath: pathsConfig.app.home,
onEvent,
});
return props.children;
}
function useDispatchAppEventFromAuthEvent() {
const { emit } = useAppEvents();
const monitoring = useMonitoring();
return useCallback(
(
type: AuthChangeEvent,
userId: string | undefined,
traits: Record<string, string> = {},
) => {
switch (type) {
case 'INITIAL_SESSION':
if (userId) {
emit({
type: 'user.signedIn',
payload: { userId, ...traits },
});
monitoring.identifyUser({ id: userId, ...traits });
}
break;
case 'SIGNED_IN':
if (userId) {
emit({
type: 'user.signedIn',
payload: { userId, ...traits },
});
monitoring.identifyUser({ id: userId, ...traits });
}
break;
case 'USER_UPDATED':
emit({
type: 'user.updated',
payload: { userId: userId!, ...traits },
});
break;
}
},
[emit, monitoring],
);
}