import { useState, useEffect } from 'react'; import { useParams } from 'react-router-dom'; import { Box, Container, Paper, Typography, CircularProgress, Alert, TextField, Button, } from '@mui/material'; import { CloudUpload as CloudIcon } from '@mui/icons-material'; import ViewerModal from '../components/ViewerModal'; import type { Share, Asset } from '../types'; import api from '../services/api'; export default function ShareViewPage() { const { token } = useParams<{ token: string }>(); const [share, setShare] = useState(null); const [asset, setAsset] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [password, setPassword] = useState(''); const [needsPassword, setNeedsPassword] = useState(false); const [viewerOpen, setViewerOpen] = useState(false); useEffect(() => { if (token) { loadShare(); } }, [token]); const loadShare = async (pwd?: string) => { if (!token) return; try { setLoading(true); setError(''); const response = await api.getShare(token, pwd); setShare(response.share); if (response.asset) { setAsset(response.asset); } } catch (err: any) { if (err.response?.status === 401) { setNeedsPassword(true); setError('Требуется пароль'); } else { setError(err.response?.data?.detail || 'Ссылка недействительна или истекла'); } } finally { setLoading(false); } }; const handlePasswordSubmit = (e: React.FormEvent) => { e.preventDefault(); loadShare(password); }; const handleView = () => { setViewerOpen(true); }; return ( Общий доступ к файлу {loading && ( )} {error && !needsPassword && ( {error} )} {needsPassword && !share && (
Этот файл защищен паролем setPassword(e.target.value)} margin="normal" required autoFocus /> {error && ( {error} )} )} {!loading && share && asset && ( {asset.original_filename} Размер: {(asset.size_bytes / 1024 / 1024).toFixed(2)} MB Тип: {asset.type === 'photo' ? 'Фото' : 'Видео'} )}
{asset && ( setViewerOpen(false)} /> )}
); }