import React, { PropsWithChildren, useEffect, useRef } from 'react' import { DefaultLoading } from '../components/page/loading' import { useChatContext } from '../contexts/chat_context' import { useApiGet, useOrganization } from '../hooks' import { currentPersonRequestArgs } from '../hooks/use_current_person' import { AgeCheckRequiredScreen } from '../screens/age_check/age_check_required_screen' import { AgeCheckUnderageScreen } from '../screens/age_check/age_check_underage_screen' import { AgeQualificationStatus, CurrentPersonResource } from '../types' export function ChatAccessGate({ children }: PropsWithChildren) { const { data: person, isFetched } = useApiGet(currentPersonRequestArgs) const { data: organization } = useOrganization() const ageQualificationStatus = person?.ageQualificationStatus const contactEmail = organization?.contactEmail useAgeDisqualification(ageQualificationStatus, contactEmail) if (!isFetched) { return } if (!person) { throw new Error('Current person not found') } if (ageQualificationStatus === AgeQualificationStatus.DISQUALIFIED) { return } if (ageQualificationStatus === AgeQualificationStatus.UNKNOWN) { return } return <>{children} } /** * Helper hook that handles the age disqualification logic. * * If a host app provides an onAgeDisqualification callback, it will be called * when a user is found to be disqualified by their age. */ function useAgeDisqualification( ageQualificationStatus: CurrentPersonResource['ageQualificationStatus'], contactEmail: string | undefined ) { const { onAgeDisqualification } = useChatContext() const hasCalledCallbackRef = useRef(false) useEffect(() => { if ( ageQualificationStatus === AgeQualificationStatus.DISQUALIFIED && !hasCalledCallbackRef.current ) { hasCalledCallbackRef.current = true onAgeDisqualification({ contactEmail: contactEmail || '' }) } }, [ageQualificationStatus, onAgeDisqualification, contactEmail]) }