import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import styles from './StickerPacks.module.css'; import { stickerService } from '../services/stickerService'; import { getCurrentUserId } from '../constants/user'; import NotificationModal from '../components/shared/NotificationModal'; import customAnalyticsService from '../services/customAnalyticsService'; import { getTranslation } from '../constants/translations'; // Функция для удаления дописанной части из названия стикерпака const cleanPackTitle = (title: string): string => { // Ищем часть "| by @username" и удаляем её const parts = title.split(' | by @'); return parts[0]; // Возвращаем только первую часть (оригинальное название) }; interface StickerPack { name: string; title: string; thumbnail_url?: string | null; share_url?: string; stickers: Array<{ id?: number; file_id: string; emoji: string; position: number; file_url?: string | null; }>; } const StickerPacks: React.FC = () => { const navigate = useNavigate(); const [stickerPacks, setStickerPacks] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [selectedPack, setSelectedPack] = useState(null); const [packToDelete, setPackToDelete] = useState(null); const [isDeleting, setIsDeleting] = useState(false); const [stickerToDelete, setStickerToDelete] = useState(null); const [isDeletingSticker, setIsDeletingSticker] = useState(false); useEffect(() => { const fetchStickerPacks = async () => { try { setLoading(true); const stickerSets = await stickerService.getUserStickerPacks(getCurrentUserId().toString()); // Для каждого стикерпака получаем детальную информацию, обрабатывая ошибки отдельно const packsDetails: StickerPack[] = []; for (const stickerSet of stickerSets) { try { const packDetails = await stickerService.getStickerPack(stickerSet.set_name); packsDetails.push(packDetails); } catch (packError) { console.warn(`Не удалось загрузить стикерпак ${stickerSet.set_name}:`, packError); // Продолжаем загрузку других стикерпаков } } setStickerPacks(packsDetails); setError(null); } catch (err) { console.error('Ошибка при загрузке стикерпаков:', err); setError(getTranslation('stickerpacks_error')); } finally { setLoading(false); } }; fetchStickerPacks(); }, []); const handleCreateStickerPack = () => { // Отслеживаем событие нажатия на кнопку "Создать стикерпак" customAnalyticsService.trackEvent({ telegram_id: getCurrentUserId(), event_category: 'sticker_packs', event_name: 'create_sticker_pack_click', unit: 'from_sticker_packs' }); navigate('/create-sticker-pack'); }; const handleSelectPack = (pack: StickerPack) => { setSelectedPack(pack); }; const handleCloseDetails = () => { setSelectedPack(null); }; const handleDeletePack = (packName: string) => { setPackToDelete(packName); }; const handleConfirmDelete = async () => { if (packToDelete) { try { setIsDeleting(true); await stickerService.deleteStickerPack(packToDelete); // Отслеживаем событие удаления стикерпака customAnalyticsService.trackEvent({ telegram_id: getCurrentUserId(), event_category: 'sticker_packs', event_name: 'sticker_pack_deleted', unit: packToDelete }); setStickerPacks(prevPacks => prevPacks.filter(pack => pack.name !== packToDelete)); setSelectedPack(null); setIsDeleting(false); setPackToDelete(null); } catch (err) { console.error('Ошибка при удалении стикерпака:', err); alert(getTranslation('stickerpacks_delete_pack_error')); setIsDeleting(false); } } }; const handleOpenInTelegram = () => { if (selectedPack && selectedPack.share_url) { window.open(selectedPack.share_url, '_blank'); } }; const handleDeleteSticker = (fileId: string) => { if (!fileId) { alert(getTranslation('stickerpacks_sticker_id_error')); return; } setStickerToDelete(fileId); }; const handleConfirmDeleteSticker = async () => { if (stickerToDelete) { try { setIsDeletingSticker(true); await stickerService.deleteStickerByFileId(stickerToDelete); // Обновляем список стикеров в выбранном стикерпаке if (selectedPack) { const updatedPack = await stickerService.getStickerPack(selectedPack.name); setSelectedPack(updatedPack); // Также обновляем стикерпак в общем списке setStickerPacks(prevPacks => prevPacks.map(pack => pack.name === selectedPack.name ? updatedPack : pack ) ); } setIsDeletingSticker(false); setStickerToDelete(null); } catch (err) { console.error('Ошибка при удалении стикера:', err); alert(getTranslation('stickerpacks_delete_sticker_error')); setIsDeletingSticker(false); } } }; return (

{getTranslation('stickerpacks_title')}

{getTranslation('stickerpacks_subtitle')}

{loading && (

{getTranslation('stickerpacks_loading')}

)} {error && (

{getTranslation('stickerpacks_error')}

)} {!loading && !error && stickerPacks.length === 0 && (
📦

{getTranslation('stickerpacks_empty')}

)} {!loading && !error && stickerPacks.length > 0 && !selectedPack && ( <>
{stickerPacks.map((pack, index) => (
handleSelectPack(pack)} >

{getTranslation('stickerpacks_pack_title_prefix')}: {cleanPackTitle(pack.title)}

{getTranslation('stickerpacks_pack_stats', pack.stickers ? pack.stickers.length : 0)}

{pack.stickers && pack.stickers.map((sticker, idx) => (
{sticker.file_url ? ( {getTranslation('stickerpacks_sticker_alt', ) : (
🖼️
)}
))}
{/* Кнопка удаления стикерпака */}
))}
)} {selectedPack && (

{cleanPackTitle(selectedPack.title)}

{/* Перемещенный блок с кнопками */}
{selectedPack.stickers && selectedPack.stickers.map((sticker, index) => (
{sticker.file_url ? ( {getTranslation('stickerpacks_sticker_alt', ) : (
🖼️
)}
{sticker.emoji}
{/* Кнопка удаления стикера */}
))}
)} {/* Модальное окно подтверждения удаления стикерпака */} setPackToDelete(null)} isPrimaryGalleryButton={false} /> {/* Модальное окно подтверждения удаления стикера */} setStickerToDelete(null)} isPrimaryGalleryButton={false} />
); }; export default StickerPacks;