fix bug and errors

This commit is contained in:
SlimusMinus
2026-10-06 01:00:10 +03:00
parent 73e3634ec4
commit d94a6782a4
50 changed files with 937 additions and 2642 deletions

View File

@@ -1,10 +1,17 @@
import { useCallback, useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { whenYmapsReady } from "../utils/ymapsApi";
const YANDEX_GEOCODER_API_KEY = process.env.REACT_APP_YANDEX_GEOCODER_KEY;
const DEFAULT_CENTER = [55.751574, 37.573856];
export function useYandexMap(enabled, initialCoords = null, initialAddress = "") {
const { t } = useTranslation();
// tRef читается из эффекта инициализации карты. Добавлять t в его deps нельзя:
// смена языка тогда пересоздавала бы карту и теряла бы выбранную метку.
const tRef = useRef(t);
tRef.current = t;
const mapRef = useRef(null);
const ymapRef = useRef(null);
const placemarkRef = useRef(null);
@@ -16,6 +23,8 @@ export function useYandexMap(enabled, initialCoords = null, initialAddress = "")
const [address, setAddress] = useState(initialAddress ?? "");
const addressRef = useRef(initialAddress ?? "");
const [loading, setLoading] = useState(false);
// Ошибка загрузки API карт: без неё пользователь смотрел бы в вечный спиннер.
const [loadError, setLoadError] = useState("");
// Всегда хранит последние координаты, чтобы при повторной инициализации
// карты (например, при повторном открытии модалки) маркер появлялся там,
// где пользователь его оставил, а не сбрасывался на initialCoords.
@@ -127,13 +136,30 @@ export function useYandexMap(enabled, initialCoords = null, initialAddress = "")
useEffect(() => {
if (!enabled || !mapRef.current) return;
if (initializedRef.current) return; // уже инициализировали
initializedRef.current = true;
if (window.ymaps?.ready) {
window.ymaps.ready(init);
}
let cancelled = false;
// Сбрасываем прошлую ошибку на новой попытке, иначе после успешной
// загрузки карты старая плашка об ошибке осталась бы на экране.
setLoadError("");
whenYmapsReady()
.then((ymaps) => {
if (cancelled) return;
initializedRef.current = true;
ymaps.ready(init);
})
.catch((e) => {
if (cancelled) return;
// API карт так и не подгрузился: сбрасываем флаг, чтобы следующая
// попытка открытия карты её повторила, и гасим бесконечный спиннер.
initializedRef.current = false;
setLoadError(tRef.current("post.mapLoadFailed"));
console.warn("Yandex Maps API failed to load:", e);
});
return () => {
cancelled = true;
ymapRef.current?.destroy();
ymapRef.current = null;
placemarkRef.current = null;
@@ -146,5 +172,5 @@ export function useYandexMap(enabled, initialCoords = null, initialAddress = "")
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [enabled, init]);
return { mapRef, coords, address, addressRef, loading, moveTo };
return { mapRef, coords, address, addressRef, loading, loadError, moveTo };
}