Files
MyClub/frontend/src/pages/NewsletterUnsubscribePage.tsx
T
Tomáš Dvořák 12cba639b9 upload
2025-10-16 13:32:05 +02:00

121 lines
3.3 KiB
TypeScript

import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import {
Box,
Button,
Container,
Heading,
Text,
useToast,
VStack,
Spinner
} from '@chakra-ui/react';
import { unsubscribeFromNewsletter } from '../services/contact';
import { trackEvent } from '../utils/umami';
export default function NewsletterUnsubscribePage() {
const { email: encodedEmail } = useParams<{ email: string }>();
const [isLoading, setIsLoading] = useState(true);
const [isSuccess, setIsSuccess] = useState(false);
const [error, setError] = useState<string | null>(null);
const toast = useToast();
const navigate = useNavigate();
useEffect(() => {
const processUnsubscribe = async () => {
if (!encodedEmail) {
setError('Neplatný odhlašovací odkaz');
setIsLoading(false);
return;
}
try {
const email = decodeURIComponent(encodedEmail);
await unsubscribeFromNewsletter(email);
setIsSuccess(true);
// Track successful unsubscribe
trackEvent('Newsletter Unsubscribe', {
success: true,
source: 'email_link'
});
} catch (err) {
const errorMessage = err instanceof Error ? err.message : 'Při odhlašování z newsletteru došlo k chybě';
setError(errorMessage);
toast({
title: 'Chyba',
description: errorMessage,
status: 'error',
duration: 5000,
isClosable: true,
});
} finally {
setIsLoading(false);
}
};
processUnsubscribe();
}, [encodedEmail, toast]);
const handleBackToHome = () => {
navigate('/');
};
if (isLoading) {
return (
<Container maxW="container.md" py={10}>
<VStack spacing={6} textAlign="center">
<Spinner size="xl" />
<Text>Zpracovávám vaši žádost o odhlášení...</Text>
</VStack>
</Container>
);
}
if (error) {
return (
<Container maxW="container.md" py={10}>
<VStack spacing={6} textAlign="center">
<Heading as="h1" size="xl" color="red.500">Chyba při odhlašování</Heading>
<Text fontSize="lg">{error}</Text>
<Button colorScheme="blue" onClick={handleBackToHome}>
Zpět na úvodní stránku
</Button>
</VStack>
</Container>
);
}
if (isSuccess) {
return (
<Container maxW="container.md" py={10}>
<VStack spacing={6} textAlign="center">
<Box>
<Heading as="h1" size="xl" color="green.500" mb={4}>
Byl jste úspěšně odhlášen
</Heading>
<Text fontSize="lg">
Je nám líto, že odcházíte. Vaše e-mailová adresa byla odebrána z našeho seznamu odběratelů.
</Text>
</Box>
<Text color="gray.600">
Pokud jste se odhlásili omylem, můžete se znovu přihlásit k odběru na našich webových stránkách.
</Text>
<Button
colorScheme="blue"
onClick={handleBackToHome}
data-umami-event="Back to Home"
data-umami-event-from="unsubscribe"
>
Zpět na úvodní stránku
</Button>
</VStack>
</Container>
);
}
return null;
}