feat: add default size for icon and en trasnlate for secondary name when ru language is selected
This commit is contained in:
14
.env
14
.env
@@ -1,8 +1,8 @@
|
|||||||
VITE_API_URL='https://wn.st.unprism.ru'
|
# # VITE_API_URL='https://wn.st.unprism.ru'
|
||||||
VITE_REACT_APP ='https://wn.st.unprism.ru/'
|
# # VITE_REACT_APP ='https://wn.st.unprism.ru/'
|
||||||
VITE_KRBL_MEDIA='https://wn.st.unprism.ru/media/'
|
# # VITE_KRBL_MEDIA='https://wn.st.unprism.ru/media/'
|
||||||
VITE_NEED_AUTH='true'
|
|
||||||
# VITE_API_URL='https://wn.krbl.ru'
|
|
||||||
# VITE_REACT_APP ='https://wn.krbl.ru/'
|
|
||||||
# VITE_KRBL_MEDIA='https://wn.krbl.ru/media/'
|
|
||||||
# VITE_NEED_AUTH='true'
|
# VITE_NEED_AUTH='true'
|
||||||
|
VITE_API_URL='https://wn.krbl.ru'
|
||||||
|
VITE_REACT_APP ='https://wn.krbl.ru/'
|
||||||
|
VITE_KRBL_MEDIA='https://wn.krbl.ru/media/'
|
||||||
|
VITE_NEED_AUTH='true'
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ const MapDataContext = createContext<{
|
|||||||
) => void;
|
) => void;
|
||||||
setSightIconSize: (sightId: number, size: number) => void;
|
setSightIconSize: (sightId: number, size: number) => void;
|
||||||
setFontSize: (size: number) => void;
|
setFontSize: (size: number) => void;
|
||||||
|
setRouteIconSize: (size: number) => void;
|
||||||
saveChanges: () => void;
|
saveChanges: () => void;
|
||||||
}>({
|
}>({
|
||||||
originalRouteData: undefined,
|
originalRouteData: undefined,
|
||||||
@@ -67,6 +68,7 @@ const MapDataContext = createContext<{
|
|||||||
setSightCoordinates: () => {},
|
setSightCoordinates: () => {},
|
||||||
setSightIconSize: () => {},
|
setSightIconSize: () => {},
|
||||||
setFontSize: () => {},
|
setFontSize: () => {},
|
||||||
|
setRouteIconSize: () => {},
|
||||||
saveChanges: () => {},
|
saveChanges: () => {},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -180,6 +182,16 @@ export const MapDataProvider = observer(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setRouteIconSize(size: number) {
|
||||||
|
const clamped = Math.max(1, Math.min(300, size));
|
||||||
|
setRouteChanges((prev) => {
|
||||||
|
if (prev.icon_size === clamped) {
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
return { ...prev, icon_size: clamped };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function setMapCenter(latitude: number, longitude: number) {
|
function setMapCenter(latitude: number, longitude: number) {
|
||||||
const epsilon = 1e-6;
|
const epsilon = 1e-6;
|
||||||
|
|
||||||
@@ -579,6 +591,7 @@ export const MapDataProvider = observer(
|
|||||||
setSightCoordinates,
|
setSightCoordinates,
|
||||||
setSightIconSize,
|
setSightIconSize,
|
||||||
setFontSize,
|
setFontSize,
|
||||||
|
setRouteIconSize,
|
||||||
}),
|
}),
|
||||||
[
|
[
|
||||||
originalRouteData,
|
originalRouteData,
|
||||||
@@ -594,6 +607,7 @@ export const MapDataProvider = observer(
|
|||||||
setStationIconSize,
|
setStationIconSize,
|
||||||
setSightIconSize,
|
setSightIconSize,
|
||||||
setFontSize,
|
setFontSize,
|
||||||
|
setRouteIconSize,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ export function RightSidebar() {
|
|||||||
setMapRotation,
|
setMapRotation,
|
||||||
setMapCenter,
|
setMapCenter,
|
||||||
setFontSize: updateFontSize,
|
setFontSize: updateFontSize,
|
||||||
|
setRouteIconSize: updateRouteIconSize,
|
||||||
} = useMapData();
|
} = useMapData();
|
||||||
const { rotation, rotateToAngle, scale, setScaleAtCenter } = useTransform();
|
const { rotation, rotateToAngle, scale, setScaleAtCenter } = useTransform();
|
||||||
|
|
||||||
@@ -34,6 +35,7 @@ export function RightSidebar() {
|
|||||||
const [rotationDegrees, setRotationDegrees] = useState<number>(0);
|
const [rotationDegrees, setRotationDegrees] = useState<number>(0);
|
||||||
const [isUserEditing, setIsUserEditing] = useState<boolean>(false);
|
const [isUserEditing, setIsUserEditing] = useState<boolean>(false);
|
||||||
const [fontSize, setFontSize] = useState<number>(100);
|
const [fontSize, setFontSize] = useState<number>(100);
|
||||||
|
const [defaultIconSize, setDefaultIconSize] = useState<number>(100);
|
||||||
const [isSaving, setIsSaving] = useState<boolean>(false);
|
const [isSaving, setIsSaving] = useState<boolean>(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -52,6 +54,7 @@ export function RightSidebar() {
|
|||||||
y: originalRouteData.center_longitude ?? 0,
|
y: originalRouteData.center_longitude ?? 0,
|
||||||
});
|
});
|
||||||
setFontSize(originalRouteData.font_size ?? 100);
|
setFontSize(originalRouteData.font_size ?? 100);
|
||||||
|
setDefaultIconSize(originalRouteData.icon_size ?? 100);
|
||||||
}
|
}
|
||||||
}, [originalRouteData]);
|
}, [originalRouteData]);
|
||||||
|
|
||||||
@@ -63,7 +66,7 @@ export function RightSidebar() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setRotationDegrees(
|
setRotationDegrees(
|
||||||
((Math.round((rotation * 180) / Math.PI) % 360) + 360) % 360
|
((Math.round((rotation * 180) / Math.PI) % 360) + 360) % 360,
|
||||||
);
|
);
|
||||||
}, [rotation]);
|
}, [rotation]);
|
||||||
|
|
||||||
@@ -108,6 +111,20 @@ export function RightSidebar() {
|
|||||||
setFontSize((prev) => (Math.abs(prev - next) > 0.5 ? next : prev));
|
setFontSize((prev) => (Math.abs(prev - next) > 0.5 ? next : prev));
|
||||||
}, [routeData?.font_size, originalRouteData?.font_size]);
|
}, [routeData?.font_size, originalRouteData?.font_size]);
|
||||||
|
|
||||||
|
const handleDefaultIconSizeChange = (value: number) => {
|
||||||
|
if (!Number.isFinite(value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const clamped = Math.max(1, Math.min(300, Math.round(value)));
|
||||||
|
setDefaultIconSize(clamped);
|
||||||
|
updateRouteIconSize(clamped);
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const next = routeData?.icon_size ?? originalRouteData?.icon_size ?? 100;
|
||||||
|
setDefaultIconSize((prev) => (Math.abs(prev - next) > 0.5 ? next : prev));
|
||||||
|
}, [routeData?.icon_size, originalRouteData?.icon_size]);
|
||||||
|
|
||||||
if (!routeData) {
|
if (!routeData) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -317,6 +334,33 @@ export function RightSidebar() {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<TextField
|
||||||
|
type="number"
|
||||||
|
label="Размер иконок по умолчанию (%)"
|
||||||
|
variant="filled"
|
||||||
|
value={defaultIconSize}
|
||||||
|
onChange={(e) => {
|
||||||
|
const value = Number(e.target.value);
|
||||||
|
if (!isNaN(value)) {
|
||||||
|
handleDefaultIconSizeChange(value);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
style={{ backgroundColor: "#222", borderRadius: 4 }}
|
||||||
|
sx={{
|
||||||
|
"& .MuiInputLabel-root": {
|
||||||
|
color: "#fff",
|
||||||
|
},
|
||||||
|
"& .MuiInputBase-input": {
|
||||||
|
color: "#fff",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
inputProps={{
|
||||||
|
min: 1,
|
||||||
|
max: 300,
|
||||||
|
step: 1,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
<TextField
|
<TextField
|
||||||
type="number"
|
type="number"
|
||||||
label="Поворот (в градусах)"
|
label="Поворот (в градусах)"
|
||||||
|
|||||||
@@ -2288,6 +2288,7 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const translatedStation = stationData?.[language]?.[index];
|
const translatedStation = stationData?.[language]?.[index];
|
||||||
|
const enStation = stationData?.["en"]?.[index];
|
||||||
|
|
||||||
const local = coordinatesToLocal(
|
const local = coordinatesToLocal(
|
||||||
station.latitude,
|
station.latitude,
|
||||||
@@ -2341,11 +2342,12 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
const rotationCss = `${rotationAngle}rad`;
|
const rotationCss = `${rotationAngle}rad`;
|
||||||
const counterRotationCss = `${-rotationAngle}rad`;
|
const counterRotationCss = `${-rotationAngle}rad`;
|
||||||
|
|
||||||
|
const secondaryStation =
|
||||||
|
language === "ru" ? enStation : translatedStation;
|
||||||
const showSecondary =
|
const showSecondary =
|
||||||
language !== "ru" &&
|
secondaryStation &&
|
||||||
translatedStation &&
|
secondaryStation.name &&
|
||||||
translatedStation.name &&
|
secondaryStation.name !== station.name;
|
||||||
translatedStation.name !== station.name;
|
|
||||||
|
|
||||||
const fontSizePercent =
|
const fontSizePercent =
|
||||||
routeData?.font_size ?? originalRouteData?.font_size ?? 100;
|
routeData?.font_size ?? originalRouteData?.font_size ?? 100;
|
||||||
@@ -2567,7 +2569,7 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
pointerEvents: "none",
|
pointerEvents: "none",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{translatedStation?.name}
|
{secondaryStation?.name}
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
@@ -2701,21 +2703,21 @@ export const WebGLRouteMapPrototype = observer(() => {
|
|||||||
? camera.scale /
|
? camera.scale /
|
||||||
Math.max(customSightIconBaseScaleRef.current ?? 1, 1e-6)
|
Math.max(customSightIconBaseScaleRef.current ?? 1, 1e-6)
|
||||||
: 1;
|
: 1;
|
||||||
const sightIconSizePercent =
|
const sightIconSizePercent = sight.is_default_icon === false
|
||||||
liveSightIconSizes.get(sight.id) ??
|
? (liveSightIconSizes.get(sight.id) ??
|
||||||
(typeof sight.icon_size === "number" &&
|
(typeof sight.icon_size === "number" &&
|
||||||
Number.isFinite(sight.icon_size)
|
Number.isFinite(sight.icon_size)
|
||||||
? sight.icon_size
|
? sight.icon_size
|
||||||
: (routeData?.icon_size ??
|
: 100))
|
||||||
originalRouteData?.icon_size ??
|
: (routeData?.icon_size ?? originalRouteData?.icon_size ?? 100);
|
||||||
100));
|
|
||||||
const iconSize =
|
const iconSize =
|
||||||
30 *
|
30 *
|
||||||
clamp(sightIconSizePercent / 100, 0.1, 10) *
|
clamp(sightIconSizePercent / 100, 0.1, 10) *
|
||||||
customSightIconScaleFactor;
|
customSightIconScaleFactor;
|
||||||
const showSightResizeUi =
|
const showSightResizeUi =
|
||||||
hoveredSightIconId === sight.id ||
|
sight.is_default_icon !== true &&
|
||||||
resizingSightIconId === sight.id;
|
(hoveredSightIconId === sight.id ||
|
||||||
|
resizingSightIconId === sight.id);
|
||||||
const iconLeft = cssX - iconSize;
|
const iconLeft = cssX - iconSize;
|
||||||
const iconTop = cssY - iconSize;
|
const iconTop = cssY - iconSize;
|
||||||
const labelHeight = 24;
|
const labelHeight = 24;
|
||||||
|
|||||||
Reference in New Issue
Block a user