Экран входа как гейт перед подключением, фикс matrix-engine и Android-иконки

Home теперь рендерится только когда isLoggedIn — до этого юзер видит
полноэкранный Login (анонимно/seed/Telegram), а не экран подключения; кнопка
VPN дополнительно блокируется на уровне VpnControl как defense-in-depth.
isLoggedIn — отдельный персистентный флаг, не совпадает с фактом наличия
фонового Ghost-токена (тот может тихо появиться до явного логина).

Заодно: matrix-engine в package.json указывал на путь другого пользователя
(/home/kirill/...) — поправил под текущую машину; прогнал `tauri icon`,
чтобы Android больше не показывал дефолтный логотип Tauri (иконка никогда не
генерировалась для этой платформы); dev-узел Singapore (DEV_IP) переведён на
порт 8443 вслед за прокси.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 18:21:40 +07:00
parent 0cb6ad2860
commit 79c9cb48aa
46 changed files with 201 additions and 22 deletions
+9 -2
View File
@@ -10,6 +10,7 @@ import VpnControlButton from "@/components/shared/VpnControlButton";
import { useTheme } from "@/ThemeProvider";
import { useSettingsStore } from "@/store/useSettingsStore";
import { useNodesStore } from "@/store/useNodesStore";
import { useAuthStore } from "@/store/useAuthStore";
import { getCachedToken } from "@/lib/api";
export function VpnControl() {
@@ -17,12 +18,17 @@ export function VpnControl() {
const { t } = useTranslation();
const { killSwitch, excludedApps, excludedDomains } = useSettingsStore();
const { getSelectedNode } = useNodesStore();
const isLoggedIn = useAuthStore((s) => s.isLoggedIn);
// Подключаем тему
const { isDark } = useTheme();
const currentTheme = isDark ? "dark" : "light";
const handleToggle = async () => {
// Защита на всякий случай — основной гейт на уровне роута ("/" рендерит
// Login, а не Home, пока не вошли), но кнопка не должна работать даже
// если это состояние как-то обошли.
if (!isLoggedIn) return;
try {
if (status === "idle") {
setStatus("connecting");
@@ -91,8 +97,9 @@ export function VpnControl() {
isOn={isActive}
onClick={handleToggle}
style={{
pointerEvents: status === "connecting" ? "none" : "auto",
opacity: status === "connecting" ? 0.8 : 1,
pointerEvents: status === "connecting" || !isLoggedIn ? "none" : "auto",
opacity: !isLoggedIn ? 0.4 : status === "connecting" ? 0.8 : 1,
cursor: !isLoggedIn ? "not-allowed" : undefined,
}}
/>
</div>