From d6772b1e3ad712bfbb71f45f621670cdb11ecd29 Mon Sep 17 00:00:00 2001 From: itoshi Date: Wed, 26 Nov 2025 21:45:59 +0300 Subject: [PATCH] feat: add loader for `saving route` and `description for stations` --- .../Route/route-preview/RightSidebar.tsx | 40 +++++++++- .../WebGLRouteMapPrototype.tsx | 75 +++++++++++++++++-- .../SightTabs/InformationTab/index.tsx | 5 +- 3 files changed, 111 insertions(+), 9 deletions(-) diff --git a/src/pages/Route/route-preview/RightSidebar.tsx b/src/pages/Route/route-preview/RightSidebar.tsx index 705201a..39c36bc 100644 --- a/src/pages/Route/route-preview/RightSidebar.tsx +++ b/src/pages/Route/route-preview/RightSidebar.tsx @@ -1,4 +1,12 @@ -import { Button, Stack, TextField, Typography, Slider } from "@mui/material"; +import { + Button, + Stack, + TextField, + Typography, + Slider, + CircularProgress, + Box, +} from "@mui/material"; import { useMapData } from "./MapDataContext"; import { useEffect, useState } from "react"; import { useTransform } from "./TransformContext"; @@ -28,6 +36,7 @@ export function RightSidebar() { const [isUserEditing, setIsUserEditing] = useState(false); const [iconSize, setIconSize] = useState(100); const [fontSize, setFontSize] = useState(100); + const [isSaving, setIsSaving] = useState(false); useEffect(() => { if (originalRouteData) { @@ -150,11 +159,19 @@ export function RightSidebar() { newMinScale = 10; } + if (newMinScale > 300) { + newMinScale = 297; + } + setMinScale(newMinScale); if (maxScale - newMinScale < 2) { let newMaxScale = newMinScale + 2; + if (newMaxScale > 300) { + newMaxScale = 300; + } + if (newMaxScale < 3) { newMaxScale = 3; setMinScale(1); @@ -443,18 +460,35 @@ export function RightSidebar() { { skipNextAutoFitRef.current = false; return; } - resetTransform(); + + const currentTransform = transformRef.current ?? lastTransformRef.current; + if (!currentTransform) { + resetTransform(); + return; + } + + const canvas = canvasRef.current; + if (!canvas || canvas.width === 0 || canvas.height === 0) { + resetTransform(); + return; + } + + const preservedScale = currentTransform.scale; + + const centerX = canvas.width / 2; + const centerY = canvas.height / 2; + + const worldCenterX = + (centerX - currentTransform.translation.x) / preservedScale; + const worldCenterY = + (centerY - currentTransform.translation.y) / preservedScale; + + const centerLat = + routeData?.center_latitude ?? originalRouteData?.center_latitude; + const centerLon = + routeData?.center_longitude ?? originalRouteData?.center_longitude; + + if (Number.isFinite(centerLat) && Number.isFinite(centerLon)) { + const local = coordinatesToLocal( + centerLat as number, + centerLon as number + ); + const baseX = local.x * UP_SCALE; + const baseY = local.y * UP_SCALE; + const cos = Math.cos(rotationAngle); + const sin = Math.sin(rotationAngle); + const rotatedX = baseX * cos - baseY * sin; + const rotatedY = baseX * sin + baseY * cos; + + const updatedTransform: Transform = { + scale: preservedScale, + translation: { + x: centerX - rotatedX * preservedScale, + y: centerY - rotatedY * preservedScale, + }, + }; + + transformRef.current = updatedTransform; + lastTransformRef.current = updatedTransform; + setTransformState(updatedTransform); + drawSceneRef.current(); + } else { + const updatedTransform: Transform = { + scale: preservedScale, + translation: { + x: centerX - worldCenterX * preservedScale, + y: centerY - worldCenterY * preservedScale, + }, + }; + + transformRef.current = updatedTransform; + lastTransformRef.current = updatedTransform; + setTransformState(updatedTransform); + drawSceneRef.current(); + } }, [ - routeVertices, - stationVertices, - canvasSize.width, - canvasSize.height, rotationAngle, + routeData?.center_latitude, + routeData?.center_longitude, + originalRouteData?.center_latitude, + originalRouteData?.center_longitude, resetTransform, ]); diff --git a/src/widgets/SightTabs/InformationTab/index.tsx b/src/widgets/SightTabs/InformationTab/index.tsx index 93b0fbc..40c4994 100644 --- a/src/widgets/SightTabs/InformationTab/index.tsx +++ b/src/widgets/SightTabs/InformationTab/index.tsx @@ -275,7 +275,10 @@ export const InformationTab = observer( {sight.common.id !== 0 && ( )}