feat: Share whatsapp message

This commit is contained in:
Jose Selesan
2026-09-22 15:25:26 -03:00
parent d76c7e6200
commit 533bae021b

View File

@@ -149,6 +149,29 @@ export function GroupDetailView() {
}
};
const handleCopyMessage = async () => {
if (!whatsappMessage) return;
try {
await navigator.clipboard.writeText(whatsappMessage);
toast.success('¡Mensaje copiado al portapapeles!');
} catch {
toast.error('No se pudo copiar automáticamente. Copia el texto manualmente.');
}
};
const handleOpenWhatsApp = async () => {
if (!whatsappShareUrl) return;
try {
if (whatsappMessage) {
await navigator.clipboard.writeText(whatsappMessage);
toast.success('¡Abriendo WhatsApp! Mensaje copiado al portapapeles.');
}
} catch {
// Ignorar si clipboard falla
}
window.open(whatsappShareUrl, '_blank', 'noopener,noreferrer');
};
const handleQuickSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (!firstName.trim() || !phone.trim()) {
@@ -249,10 +272,13 @@ export function GroupDetailView() {
const validRowsCount = parsedContacts.filter((c) => c.isValid).length;
const invalidRowsCount = parsedContacts.length - validRowsCount;
const whatsappShareUrl = group && inviteTokenQuery.data?.inviteUrl
? `https://wa.me/?text=${encodeURIComponent(
`¡Hola! Te invito a unirte a nuestro grupo "${group.name}". Completa tus datos de inscripción en el siguiente enlace: ${inviteTokenQuery.data.inviteUrl}`,
)}`
const whatsappMessage =
group && inviteTokenQuery.data?.inviteUrl
? `¡Hola! 👋 Te invito a unirte al grupo *${group.name}*.\n\nCompleta tus datos de inscripción en el siguiente enlace:\n${inviteTokenQuery.data.inviteUrl}`
: '';
const whatsappShareUrl = whatsappMessage
? `https://wa.me/?text=${encodeURIComponent(whatsappMessage)}`
: '';
if (groupQuery.isPending) {
@@ -498,28 +524,42 @@ export function GroupDetailView() {
</div>
</div>
<div className="rounded-xl bg-accent-soft p-4 text-xs text-foreground/80 space-y-2 border border-accent/20">
<p className="font-semibold text-primary">Vista previa del mensaje para WhatsApp:</p>
<p className="italic">
“¡Hola! Te invito a unirte a nuestro grupo <strong>{group.name}</strong>. Completa tus datos de inscripción en el siguiente enlace: {inviteTokenQuery.data?.inviteUrl}”
</p>
<div className="rounded-xl bg-accent-soft p-4 text-xs text-foreground/80 space-y-2.5 border border-accent/20">
<div className="flex items-center justify-between gap-2">
<p className="font-semibold text-primary">Vista previa del mensaje para WhatsApp:</p>
<Button
type="button"
variant="ghost"
size="sm"
onClick={() => void handleCopyMessage()}
className="h-7 px-2 text-xs text-primary hover:text-primary/80 gap-1.5 shrink-0"
title="Copiar mensaje completo al portapapeles"
>
<Copy className="size-3.5" />
<span>Copiar mensaje</span>
</Button>
</div>
<div className="rounded-lg bg-surface/70 p-3 border border-accent/10 whitespace-pre-line font-sans text-xs leading-relaxed text-foreground">
{`¡Hola! 👋 Te invito a unirte al grupo `}
<strong>{group.name}</strong>.
{'\n\n'}
Completa tus datos de inscripción en el siguiente enlace:
{'\n'}
<span className="text-accent underline break-all">
{inviteTokenQuery.data?.inviteUrl}
</span>
</div>
</div>
<div className="flex flex-col sm:flex-row items-center gap-2.5 pt-2">
<a
href={whatsappShareUrl}
target="_blank"
rel="noopener noreferrer"
className="w-full sm:flex-1"
<Button
variant="primary"
onClick={() => void handleOpenWhatsApp()}
className="w-full sm:flex-1 gap-2 bg-[#25D366] hover:bg-[#1EBE5D] text-white border-0"
>
<Button
variant="primary"
className="w-full gap-2 bg-[#25D366] hover:bg-[#1EBE5D] text-white border-0"
>
<MessageCircle className="size-4" />
<span>Abrir en WhatsApp</span>
</Button>
</a>
<MessageCircle className="size-4" />
<span>Abrir en WhatsApp</span>
</Button>
<Button
variant="ghost"
@@ -535,6 +575,10 @@ export function GroupDetailView() {
<span>Regenerar enlace</span>
</Button>
</div>
<p className="text-[11px] text-foreground/50 text-center sm:text-left leading-normal">
💡 Al hacer clic en <strong>Abrir en WhatsApp</strong>, el mensaje completo se copia automáticamente al portapapeles. Si WhatsApp Web solo carga el enlace, puedes pegarlo directamente con <kbd className="px-1 py-0.5 rounded bg-primary-soft text-primary font-mono text-[10px]">Ctrl+V</kbd> o <kbd className="px-1 py-0.5 rounded bg-primary-soft text-primary font-mono text-[10px]">Cmd+V</kbd>.
</p>
</>
)}
</div>