diff --git a/frontend/src/App.css b/frontend/src/App.css index 2355ec8..3475243 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -159,3 +159,13 @@ h2 { .actions button.danger:hover { background: #e74c3c; } + +.vpn-block { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + font-size: 2rem; + font-family: system-ui, -apple-system, sans-serif; + color: #333; +} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2b4cb10..8a6a4d8 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -190,6 +190,16 @@ function parseHash(): { view: "list" | "project"; projectId: number | null } { function App() { const [view, setView] = useState<"list" | "project">(parseHash().view); const [projectId, setProjectId] = useState(parseHash().projectId); + const [vpnCheck, setVpnCheck] = useState<"loading" | "ok" | "vpn">("loading"); + + useEffect(() => { + fetch("https://api.ipify.org?format=json") + .then((r) => r.json()) + .then((data: { ip: string }) => { + setVpnCheck(data.ip === "95.165.73.140" ? "ok" : "vpn"); + }) + .catch(() => setVpnCheck("ok")); + }, []); useEffect(() => { const onHashChange = () => { @@ -209,6 +219,11 @@ function App() { } }; + if (vpnCheck === "loading") return null; + if (vpnCheck === "vpn") { + return
Выключи VPN
; + } + return (
{view === "list" ? (