as-app/src/containers/Map/MapView.js
2026-01-12 18:27:57 +01:00

57 lines
1.6 KiB
JavaScript

import React from "react";
import Maplibre from "@maplibre/maplibre-react-native";
import env from "~/env";
import { Alignments } from "./constants";
import { useColorScheme } from "~/theme";
import { useParamsState, paramsActions } from "~/stores";
export default function MapView({
mapRef,
children,
contentInset = Alignments.Center,
compassViewPosition,
compassViewMargin,
...mapViewProps
}) {
const colorScheme = useColorScheme();
const { mapColorScheme } = useParamsState(["mapColorScheme"]);
const scheme = mapColorScheme === "auto" ? colorScheme : mapColorScheme;
const mapStyleUrl =
scheme === "dark" ? env.MAPVIEW_DARK_STYLE_URL : env.MAPVIEW_STYLE_URL;
return (
<Maplibre.MapView
style={styles.mapView}
// A11y: the map surface should not become a focus trap and should not
// expose internal native nodes to screen readers.
accessible={false}
accessibilityElementsHidden
importantForAccessibility="no-hide-descendants"
attributionEnabled={false}
logoEnabled={false}
styleURL={`${mapStyleUrl}?cache=123456789`}
zoomEnabled
pitchEnabled
compassEnabled
compassViewPosition={compassViewPosition} // 0: TopLeft, 1: TopRight, 2: BottomLeft, 3: BottomRigh
compassViewMargins={compassViewMargin}
// surfaceView
contentInset={contentInset}
ref={(ref) => (mapRef.current = ref)}
regionDidChangeDebounceTime={300}
regionWillChangeDebounceTime={300}
followHeading={compassViewPosition}
{...mapViewProps}
>
{children}
</Maplibre.MapView>
);
}
const styles = {
mapView: {
flex: 1,
},
};