'use client' import { useState, useTransition } from 'react' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/Alert' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Checkbox } from '@/components/ui/Checkbox' import { Field, FieldContent, FieldDescription, FieldLabel } from '@/components/ui/field' import { Spinner } from '@/components/ui/Spinner' import { CAMPAIGN_PUSH_CONSENT_UNCONFIGURED_MESSAGE, CAMPAIGN_PUSH_ENV_MISSING_MESSAGE, CAMPAIGN_PUSH_UNSUPPORTED_MESSAGE, } from '@/lib/campaignNotificationCopy' import { activateCampaignPushOnDevice, deactivateCampaignPushOnDevice, isIosSafari, isStandaloneDisplay, supportsCampaignPush, } from '@/utilities/campaignPushClient' type CampaignPushNotificationsCardProps = { pushConsentConfigured: boolean vapidPublicKey: string | null } export const CampaignPushNotificationsCard = ({ pushConsentConfigured, vapidPublicKey, }: CampaignPushNotificationsCardProps) => { const [message, setMessage] = useState(null) const [error, setError] = useState(null) const [consentAccepted, setConsentAccepted] = useState(false) const [isPending, startTransition] = useTransition() const handleEnable = () => { setMessage(null) setError(null) // Synchronous guards first, then `requestPermission` INSIDE the click // gesture: a permission request arriving outside the gesture (e.g. after a // `startTransition` async boundary) is auto-denied by Chrome without ever // showing the native prompt — the "Permissão de notificação negada" no-op. if (!pushConsentConfigured) { setError(CAMPAIGN_PUSH_CONSENT_UNCONFIGURED_MESSAGE) return } if (!vapidPublicKey) { setError(CAMPAIGN_PUSH_ENV_MISSING_MESSAGE) return } if (!consentAccepted) { setError('Aceite o consentimento para ativar os avisos push.') return } if (isIosSafari() && !isStandaloneDisplay()) { setError('No iPhone, instale o app na tela inicial antes de ativar os avisos push.') return } if (!supportsCampaignPush()) { setError(CAMPAIGN_PUSH_UNSUPPORTED_MESSAGE) return } const permissionRequest = Notification.requestPermission() startTransition(async () => { const permission = await permissionRequest const result = await activateCampaignPushOnDevice({ pushConsentConfigured, vapidPublicKey, permission, }) if (result.status === 'success') { setMessage(result.message) } else { setError(result.message) } }) } const handleDisable = () => { setMessage(null) setError(null) startTransition(async () => { const result = await deactivateCampaignPushOnDevice() if (result.status === 'success') { setMessage(result.message) } else { setError(result.message) } }) } return ( Avisos push Receba alertas da campanha mesmo com o app fechado. No iPhone, só funciona com o app instalado na tela inicial. {!pushConsentConfigured ? ( Consentimento não configurado O texto LGPD ainda não foi cadastrado no admin. A ativação de push fica bloqueada até a assessoria publicar a chave campanha-notificacoes-push. ) : ( setConsentAccepted(checked === true) } disabled={isPending} /> Aceito receber avisos push da campanha Você pode desativar a qualquer momento nesta tela ou nas configurações do navegador. )}
{message ? (

{message}

) : null} {error ? (

{error}

) : null}
) }