diff --git a/src/components/admin/remnawave/GeoCheckModal.tsx b/src/components/admin/remnawave/GeoCheckModal.tsx index 6060216..33d6fe3 100644 --- a/src/components/admin/remnawave/GeoCheckModal.tsx +++ b/src/components/admin/remnawave/GeoCheckModal.tsx @@ -5,6 +5,7 @@ import type { NodeInfo } from '@/api/adminRemnawave'; import { GeoCheckIcon, PlayIcon, WarningIcon, XCloseIcon } from '@/components/icons'; import { Spinner } from '@/components/ui/Spinner'; import { useFocusTrap } from '@/hooks/useFocusTrap'; +import { useIsTelegram } from '@/platform/hooks/usePlatform'; import { cn } from '@/lib/utils'; import { GeoCheckReport } from './GeoCheckReport'; import { buildGeoCheckRequest, isRouteReady, type GeoCheckRouteMode } from './geoCheckRoute'; @@ -27,7 +28,12 @@ export function GeoCheckModal({ node, onClose }: GeoCheckModalProps) { const { t } = useTranslation(); const [mode, setMode] = useState('default'); const [value, setValue] = useState(''); - const [fullscreen, setFullscreen] = useState(false); + const [fullscreenRequested, setFullscreenRequested] = useState(false); + + // В Mini App окно Telegram и так занимает экран целиком: отдельный + // полноэкранный режим там только снимал отступы и залезал под хром. + const canFullscreen = !useIsTelegram(); + const fullscreen = canFullscreen && fullscreenRequested; const job = useGeoCheckJob(node.uuid); const isRunning = job.phase === 'running'; @@ -35,11 +41,11 @@ export function GeoCheckModal({ node, onClose }: GeoCheckModalProps) { // Пока идёт проверка, закрывать по Escape нельзя: задача уже поставлена // в панель, и молча потерять её результат — хуже, чем подождать. const dialogRef = useFocusTrap(true, { - onEscape: isRunning ? undefined : fullscreen ? () => setFullscreen(false) : onClose, + onEscape: isRunning ? undefined : fullscreen ? () => setFullscreenRequested(false) : onClose, }); useEffect(() => { - if (job.phase !== 'done') setFullscreen(false); + if (job.phase !== 'done') setFullscreenRequested(false); }, [job.phase]); const canStart = isRouteReady(mode, value); @@ -211,7 +217,8 @@ export function GeoCheckModal({ node, onClose }: GeoCheckModalProps) { result={job.result} nodeName={node.name} fullscreen={fullscreen} - onToggleFullscreen={() => setFullscreen((v) => !v)} + canFullscreen={canFullscreen} + onToggleFullscreen={() => setFullscreenRequested((v) => !v)} onRerun={job.retry} /> )} diff --git a/src/components/admin/remnawave/GeoCheckReport.tsx b/src/components/admin/remnawave/GeoCheckReport.tsx index acd2ef0..c1894af 100644 --- a/src/components/admin/remnawave/GeoCheckReport.tsx +++ b/src/components/admin/remnawave/GeoCheckReport.tsx @@ -25,6 +25,11 @@ interface GeoCheckReportProps { result: GeoCheckResult; nodeName: string; fullscreen: boolean; + /** + * Показывать ли переключатель полного экрана. В Telegram Mini App окно и так + * во весь экран — режим лишь снимал отступы и лез под хром Telegram. + */ + canFullscreen: boolean; onToggleFullscreen: () => void; onRerun: () => void; } @@ -42,6 +47,7 @@ export function GeoCheckReport({ result, nodeName, fullscreen, + canFullscreen, onToggleFullscreen, onRerun, }: GeoCheckReportProps) { @@ -133,17 +139,23 @@ export function GeoCheckReport({
- + {canFullscreen && ( + + )}