fix bug and errors
This commit is contained in:
@@ -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 };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user