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'; // Функция для удаления дописанной части из названия стикерпака 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); 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('Не удалось загрузить список стикерпаков'); } finally { setLoading(false); } }; fetchStickerPacks(); }, []); const handleCreateStickerPack = () => { navigate('/create-sticker-pack'); }; const handleSelectPack = (pack: StickerPack) => { setSelectedPack(pack); }; const handleCloseDetails = () => { setSelectedPack(null); }; const handleDeletePack = async (packName: string) => { if (!confirm('Вы уверены, что хотите удалить этот стикерпак?')) { return; } try { await stickerService.deleteStickerPack(packName); setStickerPacks(prevPacks => prevPacks.filter(pack => pack.name !== packName)); setSelectedPack(null); } catch (err) { console.error('Ошибка при удалении стикерпака:', err); alert('Не удалось удалить стикерпак'); } }; const handleOpenInTelegram = () => { if (selectedPack && selectedPack.share_url) { window.open(selectedPack.share_url, '_blank'); } }; const handleDeleteSticker = async (fileId: string) => { if (!fileId) { alert('Не удалось определить ID стикера'); return; } if (!confirm('Вы уверены, что хотите удалить этот стикер?')) { return; } try { await stickerService.deleteStickerByFileId(fileId); // Обновляем список стикеров в выбранном стикерпаке if (selectedPack) { const updatedPack = await stickerService.getStickerPack(selectedPack.name); setSelectedPack(updatedPack); // Также обновляем стикерпак в общем списке setStickerPacks(prevPacks => prevPacks.map(pack => pack.name === selectedPack.name ? updatedPack : pack ) ); } } catch (err) { console.error('Ошибка при удалении стикера:', err); alert('Не удалось удалить стикер'); } }; return (

Мои стикерпаки

Создавайте и публикуйте наборы стикеров в Telegram

{loading && (

Загрузка стикерпаков...

)} {error && (

{error}

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

У вас пока нет стикерпаков

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

Стикерпак: {cleanPackTitle(pack.title)}

{pack.stickers ? pack.stickers.length : 0} / 49 стикеров

{pack.stickers && pack.stickers.map((sticker, idx) => (
{sticker.file_url ? ( {`Стикер ) : (
🖼️
)}
))}
))}
)} {selectedPack && (

{cleanPackTitle(selectedPack.title)}

{selectedPack.stickers && selectedPack.stickers.map((sticker, index) => (
{sticker.file_url ? ( {`Стикер ) : (
🖼️
)}
{sticker.emoji}
{/* Кнопка удаления стикера */}
))}
)}
); }; export default StickerPacks;