mirror of
https://github.com/TheRealOwenRees/echecsfrance.git
synced 2026-07-22 20:16:57 +00:00
Use better touch gestures
This commit is contained in:
@@ -25,6 +25,7 @@
|
|||||||
"jotai": "^2.6.1",
|
"jotai": "^2.6.1",
|
||||||
"leaflet": "^1.9.4",
|
"leaflet": "^1.9.4",
|
||||||
"leaflet-defaulticon-compatibility": "^0.1.2",
|
"leaflet-defaulticon-compatibility": "^0.1.2",
|
||||||
|
"leaflet-gesture-handling": "^1.2.2",
|
||||||
"leaflet.markercluster": "^1.5.3",
|
"leaflet.markercluster": "^1.5.3",
|
||||||
"leaflet.smooth_marker_bouncing": "^3.0.3",
|
"leaflet.smooth_marker_bouncing": "^3.0.3",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
|
|||||||
@@ -2,11 +2,21 @@ import { useEffect, useTransition } from "react";
|
|||||||
|
|
||||||
import { useSetAtom } from "jotai";
|
import { useSetAtom } from "jotai";
|
||||||
import L from "leaflet";
|
import L from "leaflet";
|
||||||
import { useMapEvent } from "react-leaflet";
|
import { GestureHandling } from "leaflet-gesture-handling";
|
||||||
|
import "leaflet-gesture-handling/dist/leaflet-gesture-handling.css";
|
||||||
|
import "leaflet/dist/leaflet.css";
|
||||||
|
import { useLocale, useTranslations } from "next-intl";
|
||||||
|
import { useMap, useMapEvent } from "react-leaflet";
|
||||||
|
|
||||||
import { mapBoundsAtom } from "@/atoms";
|
import { mapBoundsAtom } from "@/atoms";
|
||||||
|
|
||||||
|
// Add Leaflet.GestureHandling for improved desktop and mobile touch gestures
|
||||||
|
L.Map.addInitHook("addHandler", "gestureHandling", GestureHandling);
|
||||||
|
|
||||||
const MapEvents = () => {
|
const MapEvents = () => {
|
||||||
|
const locale = useLocale();
|
||||||
|
const t = useTranslations("Map");
|
||||||
|
const map = useMap();
|
||||||
const setMapBounds = useSetAtom(mapBoundsAtom);
|
const setMapBounds = useSetAtom(mapBoundsAtom);
|
||||||
const [isPending, startTransition] = useTransition();
|
const [isPending, startTransition] = useTransition();
|
||||||
|
|
||||||
@@ -16,7 +26,7 @@ const MapEvents = () => {
|
|||||||
L.latLng(51.17, 9.53),
|
L.latLng(51.17, 9.53),
|
||||||
);
|
);
|
||||||
|
|
||||||
const map = useMapEvent("moveend", () => {
|
useMapEvent("moveend", () => {
|
||||||
// Set the map bounds atoms when the user pans/zooms
|
// Set the map bounds atoms when the user pans/zooms
|
||||||
startTransition(() => {
|
startTransition(() => {
|
||||||
setMapBounds(map.getBounds());
|
setMapBounds(map.getBounds());
|
||||||
@@ -28,7 +38,30 @@ const MapEvents = () => {
|
|||||||
map.setView(franceBounds.getCenter(), map.getBoundsZoom(franceBounds));
|
map.setView(franceBounds.getCenter(), map.getBoundsZoom(franceBounds));
|
||||||
map.setMaxBounds(worldBounds);
|
map.setMaxBounds(worldBounds);
|
||||||
map.options.maxBoundsViscosity = 1.0; // Prevents going past bounds while dragging
|
map.options.maxBoundsViscosity = 1.0; // Prevents going past bounds while dragging
|
||||||
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
||||||
|
map.addHandler("gestureHandling", GestureHandling);
|
||||||
|
|
||||||
|
// @ts-expect-error Typescript does not see additional handler here
|
||||||
|
map.gestureHandling.enable();
|
||||||
|
}, [map]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log("setting map language", locale);
|
||||||
|
// @ts-expect-error Typescript does not see additional handler here
|
||||||
|
map.options.gestureHandlingOptions.text = {
|
||||||
|
touch: t("touch"),
|
||||||
|
scroll: t("scroll"),
|
||||||
|
scrollMac: t("scrollMac"),
|
||||||
|
};
|
||||||
|
|
||||||
|
// We need to toggle the handler to update the text on prod. No idea why.
|
||||||
|
|
||||||
|
// @ts-expect-error Typescript does not see additional handler here
|
||||||
|
map.gestureHandling.disable();
|
||||||
|
|
||||||
|
// @ts-expect-error Typescript does not see additional handler here
|
||||||
|
map.gestureHandling.enable();
|
||||||
|
}, [map, locale]);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -59,6 +59,12 @@
|
|||||||
"getInvolved": "Echecs France is completely free, open source and open to contributions. Find us on <link>GitHub</link> if you want to get involved."
|
"getInvolved": "Echecs France is completely free, open source and open to contributions. Find us on <link>GitHub</link> if you want to get involved."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"Map": {
|
||||||
|
"touch": "Use two fingers to move the map",
|
||||||
|
"scroll": "Use ctrl + scroll to zoom the map",
|
||||||
|
"scrollMac": "Use \u2318 + scroll to zoom the map"
|
||||||
|
},
|
||||||
|
|
||||||
"Tournaments": {
|
"Tournaments": {
|
||||||
"loading": "Loading...",
|
"loading": "Loading...",
|
||||||
"searchLabel": "Search",
|
"searchLabel": "Search",
|
||||||
|
|||||||
@@ -58,6 +58,12 @@
|
|||||||
"getInvolved": "Échecs France est complètement gratuit, open source et ouvert aux contributions. Retrouvez-nous sur <link>GitHub</link> si vous souhaitez vous impliquer."
|
"getInvolved": "Échecs France est complètement gratuit, open source et ouvert aux contributions. Retrouvez-nous sur <link>GitHub</link> si vous souhaitez vous impliquer."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"Map": {
|
||||||
|
"touch": "Utilisez deux doigts pour déplacer la carte",
|
||||||
|
"scroll": "Utilisez ctrl + défilement pour zoomer sur la carte",
|
||||||
|
"scrollMac": "Utilisez \u2318 + défilement pour zoomer sur la carte"
|
||||||
|
},
|
||||||
|
|
||||||
"Tournaments": {
|
"Tournaments": {
|
||||||
"loading": "Téléchargement...",
|
"loading": "Téléchargement...",
|
||||||
"searchLabel": "Rechercher",
|
"searchLabel": "Rechercher",
|
||||||
|
|||||||
@@ -3965,6 +3965,11 @@ leaflet-defaulticon-compatibility@^0.1.2:
|
|||||||
resolved "https://registry.yarnpkg.com/leaflet-defaulticon-compatibility/-/leaflet-defaulticon-compatibility-0.1.2.tgz#f5e1a5841aeab9d1682d17887348855a741b3c2a"
|
resolved "https://registry.yarnpkg.com/leaflet-defaulticon-compatibility/-/leaflet-defaulticon-compatibility-0.1.2.tgz#f5e1a5841aeab9d1682d17887348855a741b3c2a"
|
||||||
integrity sha512-IrKagWxkTwzxUkFIumy/Zmo3ksjuAu3zEadtOuJcKzuXaD76Gwvg2Z1mLyx7y52ykOzM8rAH5ChBs4DnfdGa6Q==
|
integrity sha512-IrKagWxkTwzxUkFIumy/Zmo3ksjuAu3zEadtOuJcKzuXaD76Gwvg2Z1mLyx7y52ykOzM8rAH5ChBs4DnfdGa6Q==
|
||||||
|
|
||||||
|
leaflet-gesture-handling@^1.2.2:
|
||||||
|
version "1.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/leaflet-gesture-handling/-/leaflet-gesture-handling-1.2.2.tgz#ea10afb94f2d477d77d47beb21e409ed327df07a"
|
||||||
|
integrity sha512-Blf5V4PoNphWkzL7Y1qge+Spkd4OCQ2atjwUNhMhLIcjKzPcBH++x/lwOinaR9jSqLWqJ6oKYO8d0XdTffy4hQ==
|
||||||
|
|
||||||
leaflet.markercluster@^1.5.3:
|
leaflet.markercluster@^1.5.3:
|
||||||
version "1.5.3"
|
version "1.5.3"
|
||||||
resolved "https://registry.yarnpkg.com/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz#9cdb52a4eab92671832e1ef9899669e80efc4056"
|
resolved "https://registry.yarnpkg.com/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz#9cdb52a4eab92671832e1ef9899669e80efc4056"
|
||||||
@@ -5211,8 +5216,16 @@ streamsearch@^1.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
|
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
|
||||||
integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
|
integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
|
||||||
|
|
||||||
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
|
"string-width-cjs@npm:string-width@^4.2.0":
|
||||||
name string-width-cjs
|
version "4.2.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||||
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
|
dependencies:
|
||||||
|
emoji-regex "^8.0.0"
|
||||||
|
is-fullwidth-code-point "^3.0.0"
|
||||||
|
strip-ansi "^6.0.1"
|
||||||
|
|
||||||
|
string-width@^4.1.0:
|
||||||
version "4.2.3"
|
version "4.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
@@ -5285,8 +5298,14 @@ stringify-object@^3.3.0:
|
|||||||
is-obj "^1.0.1"
|
is-obj "^1.0.1"
|
||||||
is-regexp "^1.0.0"
|
is-regexp "^1.0.0"
|
||||||
|
|
||||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
||||||
name strip-ansi-cjs
|
version "6.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
|
dependencies:
|
||||||
|
ansi-regex "^5.0.1"
|
||||||
|
|
||||||
|
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
|
|||||||
Reference in New Issue
Block a user