From ce26e6fdbc44ca6f17ae09d79baac62f2436a818 Mon Sep 17 00:00:00 2001 From: pavel444-byte Date: Wed, 7 Oct 2026 11:10:29 +0500 Subject: [PATCH] Improve authentication recovery and mobile gameplay --- .../1-1728.jpg | Bin 0 -> 75586 bytes app/account.css | 7 + app/auth/callback/route.ts | 6 +- app/layout.tsx | 10 +- app/mobile-game.css | 192 ++++++++++++++++++ components/AccountSettings.tsx | 2 +- components/Game.tsx | 86 ++++---- components/GuessMap.tsx | 4 + components/LegacyPasswordNotice.tsx | 147 ++++++++++++++ components/Panorama.tsx | 16 +- components/ReportContent.tsx | 7 +- components/SignIn.tsx | 31 +-- lib/account-api.ts | 59 ++++-- scripts/test-initial-password-sql.mjs | 71 +++++++ shared/account.ts | 6 +- shared/database.ts | 2 + shared/initial-password.ts | 28 +++ shared/locales/ru.json | 20 +- supabase/.temp/cli-latest | 2 +- .../20261007055439_legacy_password_claims.sql | 50 +++++ tests/initial-password.test.ts | 112 ++++++++++ tsconfig.tsbuildinfo | 2 +- 22 files changed, 763 insertions(+), 97 deletions(-) create mode 100644 .codex-remote-attachments/01a11089-f830-7442-857d-9e4559b01bc2/5e9df3a4-4f87-4069-b63e-6e5570c635da/1-1728.jpg create mode 100644 app/mobile-game.css create mode 100644 components/LegacyPasswordNotice.tsx create mode 100644 scripts/test-initial-password-sql.mjs create mode 100644 shared/initial-password.ts create mode 100644 supabase/migrations/20261007055439_legacy_password_claims.sql create mode 100644 tests/initial-password.test.ts diff --git a/.codex-remote-attachments/01a11089-f830-7442-857d-9e4559b01bc2/5e9df3a4-4f87-4069-b63e-6e5570c635da/1-1728.jpg b/.codex-remote-attachments/01a11089-f830-7442-857d-9e4559b01bc2/5e9df3a4-4f87-4069-b63e-6e5570c635da/1-1728.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afcd2659465939dc122713cbd459d133a26acef6 GIT binary patch literal 75586 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 svg { color: var(--green); } +.legacy-password-dialog h2 { margin-top: 16px; } +.legacy-password-dialog .field input { width: 100%; font: 14px monospace; padding: 12px; background: var(--bg); color: var(--text); border: 1px solid var(--line); } +.legacy-password-dialog > .text-link { margin-top: 18px; } +.password-saved { display: flex; gap: 10px; align-items: flex-start; margin: 20px 0; } +.password-saved input { flex-shrink: 0; margin-top: 5px; accent-color: var(--green); } diff --git a/app/auth/callback/route.ts b/app/auth/callback/route.ts index 0b264e6..ab77b64 100644 --- a/app/auth/callback/route.ts +++ b/app/auth/callback/route.ts @@ -11,11 +11,13 @@ export async function GET(request: NextRequest) { const legacyToken = request.nextUrl.searchParams.get("legacy_recovery_token"); const type = request.nextUrl.searchParams.get("type"); const next = authDestination(request.nextUrl.searchParams.get("next")); + if (type === "magiclink") + return NextResponse.redirect(new URL("/log-in?auth=failed", origin)); if ( code || legacyToken || (tokenHash && - (type === "email" || type === "recovery" || type === "magiclink")) + (type === "email" || type === "signup" || type === "recovery")) ) { const client = await authClient(); let { data, error } = code @@ -24,7 +26,7 @@ export async function GET(request: NextRequest) { ? await client.auth.exchangeCodeForSession(legacyToken) : await client.auth.verifyOtp({ token_hash: tokenHash!, - type: type as "email" | "recovery" | "magiclink", + type: type as "email" | "signup" | "recovery", }); // Older email templates could place a recovery token hash in /code=... // instead of a PKCE code. Only Supabase can decide whether it is valid. diff --git a/app/layout.tsx b/app/layout.tsx index e7289db..c419231 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -12,8 +12,11 @@ import { SiteCursor } from "@/components/SiteCursor"; import { I18nProvider } from "@/components/I18nProvider"; import { getI18n } from "@/lib/i18n"; import "./polish.css"; +import "./mobile-game.css"; import { SiteSettingsProvider } from "@/components/SiteSettingsProvider"; import { initialSiteSettings } from "@/lib/site-settings"; +import { user } from "@/lib/supabase"; +import { LegacyPasswordNotice } from "@/components/LegacyPasswordNotice"; export async function generateMetadata(): Promise { const { t } = await getI18n(); return { @@ -31,10 +34,8 @@ export default async function RootLayout({ }: { children: React.ReactNode; }) { - const [{ locale, preference, detectedLocale }, settings] = await Promise.all([ - getI18n(), - initialSiteSettings(), - ]); + const [{ locale, preference, detectedLocale }, settings, account] = + await Promise.all([getI18n(), initialSiteSettings(), user()]); return ( @@ -46,6 +47,7 @@ export default async function RootLayout({ {children} + diff --git a/app/mobile-game.css b/app/mobile-game.css new file mode 100644 index 0000000..bb548bf --- /dev/null +++ b/app/mobile-game.css @@ -0,0 +1,192 @@ +.mobile-map-toggle, +.report-icon { + display: none; +} +@media (max-width: 700px) { + .game-page { + min-height: 0; + } + .game-header { + display: grid; + grid-template-columns: minmax(0, 1fr) 44px; + gap: 8px; + padding: max(10px, env(safe-area-inset-top)) + max(10px, env(safe-area-inset-right)) 12px + max(10px, env(safe-area-inset-left)); + } + .game-header .brand { + font-size: 17px; + white-space: nowrap; + gap: 6px; + } + .game-header .brand-cube { + flex-shrink: 0; + } + .game-header .report-trigger { + width: 44px; + height: 44px; + padding: 0; + } + .game-header .report-trigger > span { + display: none; + } + .game-header .report-icon { + display: block; + } + .game-info { + grid-column: 1 / -1; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + width: 100%; + gap: 8px; + padding: 8px; + border-radius: 10px; + } + .game-info > div { + min-width: 0; + } + .game-info small { + white-space: nowrap; + font-size: 8px; + letter-spacing: 0; + } + .game-info strong { + white-space: nowrap; + font-size: 17px; + line-height: 1.4; + } + .panorama-controls { + top: calc(max(10px, env(safe-area-inset-top)) + 112px); + left: max(10px, env(safe-area-inset-left)); + gap: 6px; + } + .panorama-controls button { + width: 44px; + height: 44px; + padding: 0; + } + .game-page .game-map, + .game-page .game-map.expanded { + right: max(8px, env(safe-area-inset-right)); + left: max(8px, env(safe-area-inset-left)); + bottom: max(10px, env(safe-area-inset-bottom)); + width: auto; + max-width: none; + box-shadow: 0 8px 24px #0006; + } + .game-map:not(.expanded) .game-map-content { + position: absolute; + bottom: 100%; + left: 0; + right: 0; + visibility: hidden; + pointer-events: none; + } + .mobile-map-toggle { + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + width: 100%; + min-height: 56px; + padding: 12px; + border: 0; + color: #fff1d0; + background: #241e18; + font: 14px var(--font-pixel, monospace); + } + .mobile-map-toggle small { + font: 11px monospace; + } + .game-map.expanded .mobile-map-toggle { + display: none; + } + .game-map .map-topline { + min-height: 44px; + padding: 0 8px 0 12px; + } + .game-map .map-topline button { + display: grid; + place-items: center; + width: 44px; + height: 44px; + } + .game-page .game-map .map-surface { + height: min(46dvh, 360px); + border-width: 12px; + border-image-width: 12px; + } + .game-map .map-actions { + padding: 8px 10px 10px; + } + .game-map .map-actions .button { + min-height: 48px; + padding: 10px 12px; + font-size: 13px; + white-space: nowrap; + } + .game-map .map-actions small { + margin-bottom: 8px; + } + .game-map .leaflet-bar a { + width: 40px; + height: 40px; + line-height: 40px; + } + .look-help { + display: none; + } + .round-result { + max-width: calc(100% - 24px); + max-height: calc(100dvh - 140px); + overflow-y: auto; + padding: 20px; + } + html[lang] .round-result h2 { + font-size: 21px; + } + .round-result .score { + font-size: 42px; + } +} +@media (max-height: 500px) and (max-width: 950px) { + .game-page { + min-height: 0; + } + .game-header { + display: flex; + padding: 8px 12px; + gap: 10px; + } + .game-header .brand { + font-size: 16px; + } + .game-header .report-trigger { + order: 3; + } + .game-info { + width: auto; + flex: 1; + max-width: 300px; + margin-left: auto; + gap: 16px; + padding: 6px 10px; + } + .panorama-controls { + top: 72px; + left: 12px; + } + .game-page .game-map, + .game-page .game-map.expanded { + left: auto; + width: min(440px, calc(100vw - 80px)); + right: 8px; + bottom: max(8px, env(safe-area-inset-bottom)); + } + .game-page .game-map .map-surface { + height: max(100px, calc(100dvh - 190px)); + } + .round-result { + max-height: calc(100dvh - 80px); + } +} diff --git a/components/AccountSettings.tsx b/components/AccountSettings.tsx index 3d723bc..a9f9dc7 100644 --- a/components/AccountSettings.tsx +++ b/components/AccountSettings.tsx @@ -134,7 +134,7 @@ export function AccountSettings({ )}
-

{t("Signed up with an email link?")}

+

{t("Forgot your password?")}

{t( "Set your first password, or recover a forgotten one, using a link sent to your account email.", diff --git a/components/Game.tsx b/components/Game.tsx index 30e3bee..22d11f0 100644 --- a/components/Game.tsx +++ b/components/Game.tsx @@ -9,6 +9,7 @@ import { MousePointer2, Move, MapPin, + Map as MapIcon, } from "lucide-react"; import { Brand } from "./Brand"; import { Panorama } from "./Panorama"; @@ -174,6 +175,7 @@ export function Game({ id }: { id: string }) { setSession(null); setResult(null); setPin(null); + setExpanded(false); setLoaded({ panorama: false, map: false }); timingOut.current = false; setError(""); @@ -228,40 +230,56 @@ export function Game({ id }: { id: string }) {

{session && (
-
- {t("↑ N · PLACE YOUR GUESS")} - -
- -
- - {pin - ? `X ${Math.round(pin.x)} · Z ${Math.round(pin.z)}` - : t("Click the map to drop a pin")} - - + +
+
+ {t("↑ N · PLACE YOUR GUESS")} + +
+ +
+ + {pin + ? `X ${Math.round(pin.x)} · Z ${Math.round(pin.z)}` + : t("Click the map to drop a pin")} + + +
)} diff --git a/components/GuessMap.tsx b/components/GuessMap.tsx index f04e14c..b9523e4 100644 --- a/components/GuessMap.tsx +++ b/components/GuessMap.tsx @@ -59,7 +59,11 @@ export function GuessMap({ zoomSnap: 0, maxBounds: b.pad(0.15), attributionControl: false, + zoomControl: false, }); + L.control + .zoom({ zoomInTitle: t("Zoom in"), zoomOutTitle: t("Zoom out") }) + .addTo(m); // Install cleanup immediately, including when later initialization fails. let observer: ResizeObserver | undefined; cleanup = () => { diff --git a/components/LegacyPasswordNotice.tsx b/components/LegacyPasswordNotice.tsx new file mode 100644 index 0000000..b3be33e --- /dev/null +++ b/components/LegacyPasswordNotice.tsx @@ -0,0 +1,147 @@ +"use client"; +import { useEffect, useRef, useState } from "react"; +import { usePathname } from "next/navigation"; +import { Copy, KeyRound } from "lucide-react"; +import { useI18n } from "./I18nProvider"; +import { api } from "@/lib/client-api"; +import { generateInitialPassword } from "@/shared/initial-password"; + +export function LegacyPasswordNotice({ enabled }: { enabled: boolean }) { + const { t } = useI18n(); + const pathname = usePathname(); + const dialog = useRef(null); + const [needed, setNeeded] = useState(false); + const [password, setPassword] = useState(""); + const [busy, setBusy] = useState(false); + const [saved, setSaved] = useState(false); + const [copied, setCopied] = useState(false); + const [error, setError] = useState(""); + useEffect(() => { + if (!enabled || pathname?.startsWith("/auth/") || password) return; + let active = true; + api<{ needed: boolean }>("auth/initial-password") + .then((data) => { + if (active) setNeeded(data.needed); + }) + .catch(() => {}); + return () => { + active = false; + }; + }, [enabled, pathname, password]); + useEffect(() => { + if (!needed) return; + const element = dialog.current; + element?.showModal(); + return () => { + element?.close(); + }; + }, [needed]); + async function generate() { + if (busy) return; + setBusy(true); + setError(""); + const generated = generateInitialPassword(); + try { + await api("auth/initial-password", { password: generated }); + // Only keep the confirmed password in this mounted dialog's memory. + setPassword(generated); + } catch (e) { + setError((e as Error).message); + } finally { + setBusy(false); + } + } + function dismiss() { + setNeeded(false); + setPassword(""); + setSaved(false); + setCopied(false); + setError(""); + } + async function copy() { + try { + await navigator.clipboard.writeText(password); + setCopied(true); + } catch { + setError("Select the password and copy it manually."); + } + } + if (!needed) return null; + return ( + { + if (password || busy) event.preventDefault(); + else dismiss(); + }} + > + + ); +} diff --git a/components/Panorama.tsx b/components/Panorama.tsx index 11c34b8..2b4a411 100644 --- a/components/Panorama.tsx +++ b/components/Panorama.tsx @@ -39,21 +39,21 @@ export function Panorama({ const element = mount.current!; view.current = { yaw: 0, pitch: 0, fov: 80 }; const down = (e: PointerEvent) => { - if (e.button !== 0) return; + if (e.button !== 0 || drag) return; element.setPointerCapture(e.pointerId); - drag = { x: e.clientX, y: e.clientY }; + drag = { x: e.clientX, y: e.clientY, pointerId: e.pointerId }; }, move = (e: PointerEvent) => { - if (!drag) return; + if (!drag || drag.pointerId !== e.pointerId) return; view.current.yaw -= (e.clientX - drag.x) * 0.003; view.current.pitch = Math.max( -1.5, Math.min(1.5, view.current.pitch + (e.clientY - drag.y) * 0.003), ); - drag = { x: e.clientX, y: e.clientY }; + drag = { x: e.clientX, y: e.clientY, pointerId: e.pointerId }; }, - up = () => { - drag = null; + up = (e: PointerEvent) => { + if (drag?.pointerId === e.pointerId) drag = null; }, wheel = (e: WheelEvent) => { if (!zoom) return; @@ -70,7 +70,7 @@ export function Panorama({ "The panorama graphics context was lost. Reconnect to restore the view.", ); }; - let drag: { x: number; y: number } | null = null; + let drag: { x: number; y: number; pointerId: number } | null = null; if (urls.length !== 6) { callbacks.current.onError( "This panorama is missing one or more of its six faces.", @@ -133,6 +133,7 @@ export function Panorama({ element.addEventListener("pointermove", move); element.addEventListener("pointerup", up); element.addEventListener("pointercancel", up); + element.addEventListener("lostpointercapture", up); element.addEventListener("wheel", wheel, { passive: false }); callbacks.current.onReady(); }) @@ -150,6 +151,7 @@ export function Panorama({ element.removeEventListener("pointermove", move); element.removeEventListener("pointerup", up); element.removeEventListener("pointercancel", up); + element.removeEventListener("lostpointercapture", up); element.removeEventListener("wheel", wheel); geometry?.dispose(); material?.dispose(); diff --git a/components/ReportContent.tsx b/components/ReportContent.tsx index 55d9594..1be4324 100644 --- a/components/ReportContent.tsx +++ b/components/ReportContent.tsx @@ -4,6 +4,7 @@ import { useI18n } from "@/components/I18nProvider"; import { useEffect, useRef, useState } from "react"; import { api } from "./StartGame"; import { reportCategories } from "@/shared/moderation"; +import { Flag } from "lucide-react"; export function ReportContent({ datasetId, @@ -66,14 +67,16 @@ export function ReportContent({ return ( <> {message && (

diff --git a/components/SignIn.tsx b/components/SignIn.tsx index 20996f4..160e5a6 100644 --- a/components/SignIn.tsx +++ b/components/SignIn.tsx @@ -7,7 +7,7 @@ import { ArrowRight, Compass, Mail, ShieldCheck } from "lucide-react"; import { api } from "./StartGame"; import { authActionSchema, authDestination } from "@/shared/account"; -type Mode = "login" | "signup" | "recover" | "magic"; +type Mode = "login" | "signup" | "recover"; export function SignIn({ next = "/dashboard", initialError = "", @@ -41,9 +41,7 @@ export function SignIn({ ? { action: mode, email, password, displayName: name, next } : mode === "login" ? { action: mode, email, password, next } - : mode === "magic" - ? { action: mode, email, next } - : { action: mode, email }; + : { action: mode, email }; const valid = authActionSchema.safeParse(body); if (!valid.success) { setError(valid.error.issues[0].message); @@ -75,7 +73,6 @@ export function SignIn({ login: "Welcome back.", signup: "Make yourself at home.", recover: "Find your way back.", - magic: "An email, a way in.", }[mode]; return (

@@ -132,11 +129,7 @@ export function SignIn({ ? t("Choose the name people will see on your maps.") : mode === "recover" ? t("We’ll email you a link to set a new password.") - : mode === "magic" - ? t( - "For existing accounts. Open the link on this device to continue.", - ) - : t("Log in with your email and password.")} + : t("Log in with your email and password.")}

{mode === "signup" && ( @@ -230,7 +223,7 @@ export function SignIn({

)}
- {mode === "login" && ( -
- {t("Already use email links?")} - -
- )} - {(mode === "recover" || mode === "magic") && ( + {mode === "recover" && (