// // Copyright 2025 DXOS.org // import { type Accessor, type JSX, type Setter, createContext, createEffect, createSignal, useContext } from 'solid-js'; import { raise } from '@dxos/debug'; import { type LatLngLiteral } from '../types.ts'; // TODO(burdon): Factor out common geometry types. export type Size = { width: number; height: number }; export type Point = { x: number; y: number }; export type Vector = [number, number, number]; export type GlobeContextType = { size: Accessor; center: Accessor; zoom: Accessor; translation: Accessor; rotation: Accessor; setCenter: Setter; setZoom: Setter; setTranslation: Setter; setRotation: Setter; }; const defaults = { center: { lat: 51, lng: 0 } as LatLngLiteral, zoom: 4, } as const; const GlobeContext = createContext(); export type GlobeContextProviderProps = { children: JSX.Element; size?: Size; center?: LatLngLiteral; zoom?: number; translation?: Point; rotation?: Vector; }; export const GlobeContextProvider = (props: GlobeContextProviderProps) => { const [size, setSize] = createSignal(props.size ?? { width: 0, height: 0 }); const [center, setCenter] = createSignal(props.center ?? defaults.center); const [zoom, setZoom] = createSignal(props.zoom ?? defaults.zoom); const [translation, setTranslation] = createSignal(props.translation); const [rotation, setRotation] = createSignal(props.rotation); // Update size when prop changes createEffect(() => { if (props.size) { setSize(props.size); } }); return ( {props.children} ); }; export const useGlobeContext = () => { return useContext(GlobeContext) ?? raise(new Error('Missing GlobeContext')); };