@mapfirst.ai/react 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,197 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { BaseMapFirstOptions, MapFirstCore, MapState, Property, PropertyType, MapLibreNamespace, GoogleMapsNamespace, MapboxNamespace, MapFirstOptions } from '@mapfirst.ai/core';
4
+
5
+ /**
6
+ * Hook that creates a MapFirstCore instance that can be initialized before maps are ready.
7
+ * Supports two-phase initialization: create SDK first, attach map later.
8
+ * Returns the instance and reactive state that updates when SDK state changes.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * // Phase 1: Create SDK instance with location data
13
+ * const { mapFirst, state } = useMapFirstCore({
14
+ * initialLocationData: {
15
+ * city: "New York",
16
+ * country: "United States",
17
+ * currency: "USD"
18
+ * }
19
+ * });
20
+ *
21
+ * // Access reactive state
22
+ * console.log(state.properties); // Updates when properties change
23
+ * console.log(state.isSearching); // Updates when search state changes
24
+ *
25
+ * // Phase 2: Attach map when ready
26
+ * useEffect(() => {
27
+ * if (mapLibreInstance && mapFirst) {
28
+ * mapFirst.attachMap(mapLibreInstance, {
29
+ * platform: "maplibre",
30
+ * maplibregl: maplibregl,
31
+ * onMarkerClick: (marker) => console.log(marker)
32
+ * });
33
+ * }
34
+ * }, [mapLibreInstance, mapFirst]);
35
+ * ```
36
+ */
37
+ declare function useMapFirstCore(options: BaseMapFirstOptions): {
38
+ mapFirst: MapFirstCore | null;
39
+ state: MapState | null;
40
+ };
41
+ /**
42
+ * Hook to access reactive properties from MapFirst SDK.
43
+ * Returns the current properties array that updates when properties change.
44
+ *
45
+ * @example
46
+ * ```tsx
47
+ * const { mapFirst } = useMapFirstCore({ ... });
48
+ * const properties = useMapFirstProperties(mapFirst);
49
+ *
50
+ * return <div>Found {properties.length} properties</div>;
51
+ * ```
52
+ */
53
+ declare function useMapFirstProperties(mapFirst: MapFirstCore | null): Property[];
54
+ /**
55
+ * Hook to access the selected property ID from MapFirst SDK.
56
+ * Returns the currently selected property ID that updates when selection changes.
57
+ *
58
+ * @example
59
+ * ```tsx
60
+ * const { mapFirst } = useMapFirstCore({ ... });
61
+ * const selectedId = useMapFirstSelectedProperty(mapFirst);
62
+ *
63
+ * return <div>Selected: {selectedId || 'None'}</div>;
64
+ * ```
65
+ */
66
+ declare function useMapFirstSelectedProperty(mapFirst: MapFirstCore | null): number | null;
67
+ /**
68
+ * Hook to access and control the primary property type.
69
+ * Returns the current primary type and a setter function.
70
+ *
71
+ * @example
72
+ * ```tsx
73
+ * const { mapFirst } = useMapFirstCore({ ... });
74
+ * const [primaryType, setPrimaryType] = usePrimaryType(mapFirst);
75
+ *
76
+ * return (
77
+ * <select value={primaryType} onChange={(e) => setPrimaryType(e.target.value as PropertyType)}>
78
+ * <option value="Accommodation">Hotels</option>
79
+ * <option value="Restaurant">Restaurants</option>
80
+ * <option value="Attraction">Attractions</option>
81
+ * </select>
82
+ * );
83
+ * ```
84
+ */
85
+ declare function usePrimaryType(mapFirst: MapFirstCore | null): [PropertyType, (type: PropertyType) => void];
86
+ /**
87
+ * Hook to access and control the selected marker.
88
+ * Returns the current selected marker ID and a setter function.
89
+ *
90
+ * @example
91
+ * ```tsx
92
+ * const { mapFirst } = useMapFirstCore({ ... });
93
+ * const [selectedMarker, setSelectedMarker] = useSelectedMarker(mapFirst);
94
+ *
95
+ * return (
96
+ * <div>
97
+ * <p>Selected: {selectedMarker || 'None'}</p>
98
+ * <button onClick={() => setSelectedMarker(null)}>Clear Selection</button>
99
+ * </div>
100
+ * );
101
+ * ```
102
+ */
103
+ declare function useSelectedMarker(mapFirst: MapFirstCore | null): [number | null, (id: number | null) => void];
104
+ /**
105
+ * Hook for MapLibre GL JS integration.
106
+ * Automatically attaches the map when both the SDK instance and map are available.
107
+ *
108
+ * @example
109
+ * ```tsx
110
+ * const { mapFirst, state } = useMapFirstCore({ initialLocationData: { city: "Paris", country: "France" } });
111
+ * const mapRef = useRef<maplibregl.Map | null>(null);
112
+ *
113
+ * useMapLibreAttachment({
114
+ * mapFirst,
115
+ * map: mapRef.current,
116
+ * maplibregl: maplibregl,
117
+ * onMarkerClick: (marker) => console.log(marker)
118
+ * });
119
+ *
120
+ * // Access reactive state
121
+ * console.log(state?.properties);
122
+ * ```
123
+ */
124
+ declare function useMapLibreAttachment({ mapFirst, map, maplibregl, onMarkerClick, }: {
125
+ mapFirst: MapFirstCore | null;
126
+ map: any | null;
127
+ maplibregl: MapLibreNamespace;
128
+ onMarkerClick?: (marker: Property) => void;
129
+ }): void;
130
+ /**
131
+ * Hook for Google Maps integration.
132
+ * Automatically attaches the map when both the SDK instance and map are available.
133
+ *
134
+ * @example
135
+ * ```tsx
136
+ * const { mapFirst, state } = useMapFirstCore({ initialLocationData: { city: "Tokyo", country: "Japan" } });
137
+ * const mapRef = useRef<google.maps.Map | null>(null);
138
+ *
139
+ * useGoogleMapsAttachment({
140
+ * mapFirst,
141
+ * map: mapRef.current,
142
+ * google: window.google,
143
+ * onMarkerClick: (marker) => console.log(marker)
144
+ * });
145
+ *
146
+ * // Access reactive state
147
+ * console.log(state?.isSearching);
148
+ * ```
149
+ */
150
+ declare function useGoogleMapsAttachment({ mapFirst, map, google, onMarkerClick, }: {
151
+ mapFirst: MapFirstCore | null;
152
+ map: any | null;
153
+ google: GoogleMapsNamespace;
154
+ onMarkerClick?: (marker: Property) => void;
155
+ }): void;
156
+ /**
157
+ * Hook for Mapbox GL JS integration.
158
+ * Automatically attaches the map when both the SDK instance and map are available.
159
+ *
160
+ * @example
161
+ * ```tsx
162
+ * const { mapFirst, state } = useMapFirstCore({ initialLocationData: { city: "London", country: "United Kingdom" } });
163
+ * const mapRef = useRef<mapboxgl.Map | null>(null);
164
+ *
165
+ * useMapboxAttachment({
166
+ * mapFirst,
167
+ * map: mapRef.current,
168
+ * mapboxgl: mapboxgl,
169
+ * onMarkerClick: (marker) => console.log(marker)
170
+ * });
171
+ *
172
+ * // Access reactive state
173
+ * console.log(state?.filters);
174
+ * ```
175
+ */
176
+ declare function useMapboxAttachment({ mapFirst, map, mapboxgl, onMarkerClick, }: {
177
+ mapFirst: MapFirstCore | null;
178
+ map: any | null;
179
+ mapboxgl: MapboxNamespace;
180
+ onMarkerClick?: (marker: Property) => void;
181
+ }): void;
182
+ /**
183
+ * Legacy hook that creates the MapFirstCore instance with a map immediately.
184
+ * Use useMapFirstCore + useMap*Attachment hooks for better control.
185
+ *
186
+ * @deprecated Use useMapFirstCore and platform-specific attachment hooks instead
187
+ */
188
+ declare function useMapFirst(options: MapFirstOptions | null): React.RefObject<MapFirstCore | null>;
189
+ /**
190
+ * Helper component that simply renders the markers it receives so non-React environments
191
+ * can verify data flows before wiring the SDK into a map.
192
+ */
193
+ declare function MarkerDebugList({ markers }: {
194
+ markers: Property[];
195
+ }): react_jsx_runtime.JSX.Element;
196
+
197
+ export { MarkerDebugList, useGoogleMapsAttachment, useMapFirst, useMapFirstCore, useMapFirstProperties, useMapFirstSelectedProperty, useMapLibreAttachment, useMapboxAttachment, usePrimaryType, useSelectedMarker };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";var S=Object.create;var d=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var m=(e,n)=>{for(var r in n)d(e,r,{get:n[r],enumerable:!0})},C=(e,n,r,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of b(n))!k.call(e,a)&&a!==r&&d(e,a,{get:()=>n[a],enumerable:!(o=h(n,a))||o.enumerable});return e};var x=(e,n,r)=>(r=e!=null?S(P(e)):{},C(n||!e||!e.__esModule?d(r,"default",{value:e,enumerable:!0}):r,e)),R=e=>C(d({},"__esModule",{value:!0}),e);var w={};m(w,{MarkerDebugList:()=>G,useGoogleMapsAttachment:()=>O,useMapFirst:()=>B,useMapFirstCore:()=>T,useMapFirstProperties:()=>E,useMapFirstSelectedProperty:()=>L,useMapLibreAttachment:()=>N,useMapboxAttachment:()=>I,usePrimaryType:()=>F,useSelectedMarker:()=>A});module.exports=R(w);var s=x(require("react")),M=require("@mapfirst.ai/core"),p=require("react/jsx-runtime");function T(e){let n=s.default.useRef(null),[r,o]=s.default.useState(null),a=s.default.useRef(e);return s.default.useEffect(()=>{a.current=e}),s.default.useEffect(()=>{let f=a.current,y={adapter:null,...f,callbacks:{...f.callbacks,onPropertiesChange:u=>{var t,l;o(c=>c?{...c,properties:u}:null),(l=(t=a.current.callbacks)==null?void 0:t.onPropertiesChange)==null||l.call(t,u)},onSelectedPropertyChange:u=>{var t,l;o(c=>c?{...c,selectedPropertyId:u}:null),(l=(t=a.current.callbacks)==null?void 0:t.onSelectedPropertyChange)==null||l.call(t,u)},onPrimaryTypeChange:u=>{var t,l;o(c=>c?{...c,primary:u}:null),(l=(t=a.current.callbacks)==null?void 0:t.onPrimaryTypeChange)==null||l.call(t,u)},onFiltersChange:u=>{var t,l;o(c=>c?{...c,filters:u}:null),(l=(t=a.current.callbacks)==null?void 0:t.onFiltersChange)==null||l.call(t,u)},onBoundsChange:u=>{var t,l;o(c=>c?{...c,bounds:u}:null),(l=(t=a.current.callbacks)==null?void 0:t.onBoundsChange)==null||l.call(t,u)},onCenterChange:(u,t)=>{var l,c;o(g=>g?{...g,center:u,zoom:t}:null),(c=(l=a.current.callbacks)==null?void 0:l.onCenterChange)==null||c.call(l,u,t)},onZoomChange:u=>{var t,l;o(c=>c?{...c,zoom:u}:null),(l=(t=a.current.callbacks)==null?void 0:t.onZoomChange)==null||l.call(t,u)},onActiveLocationChange:u=>{var t,l;o(c=>c?{...c,activeLocation:u}:null),(l=(t=a.current.callbacks)==null?void 0:t.onActiveLocationChange)==null||l.call(t,u)},onLoadingStateChange:u=>{var t,l;o(c=>c?{...c,initialLoading:u}:null),(l=(t=a.current.callbacks)==null?void 0:t.onLoadingStateChange)==null||l.call(t,u)},onSearchingStateChange:u=>{var t,l;o(c=>c?{...c,isSearching:u}:null),(l=(t=a.current.callbacks)==null?void 0:t.onSearchingStateChange)==null||l.call(t,u)}}},i=new M.MapFirstCore(y);return n.current=i,o(i.getState()),()=>{i.destroy(),n.current=null,o(null)}},[]),{mapFirst:n.current,state:r}}function E(e){let[n,r]=s.default.useState([]);return s.default.useEffect(()=>{if(!e){r([]);return}r(e.getState().properties)},[e]),n}function L(e){let[n,r]=s.default.useState(null);return s.default.useEffect(()=>{if(!e){r(null);return}r(e.getState().selectedPropertyId)},[e]),n}function F(e){let[n,r]=s.default.useState("Accommodation");s.default.useEffect(()=>{if(!e){r("Accommodation");return}r(e.getState().primary)},[e]);let o=s.default.useCallback(a=>{e&&(e.setPrimaryType(a),r(a))},[e]);return[n,o]}function A(e){let[n,r]=s.default.useState(null);s.default.useEffect(()=>{if(!e){r(null);return}r(e.getState().selectedPropertyId)},[e]);let o=s.default.useCallback(a=>{e&&(e.setSelectedMarker(a),r(a))},[e]);return[n,o]}function N({mapFirst:e,map:n,maplibregl:r,onMarkerClick:o}){let a=s.default.useRef(!1);s.default.useEffect(()=>{!e||!n||a.current||(e.attachMap(n,{platform:"maplibre",maplibregl:r,onMarkerClick:o}),a.current=!0)},[e,n,r,o])}function O({mapFirst:e,map:n,google:r,onMarkerClick:o}){let a=s.default.useRef(!1);s.default.useEffect(()=>{!e||!n||a.current||(e.attachMap(n,{platform:"google",google:r,onMarkerClick:o}),a.current=!0)},[e,n,r,o])}function I({mapFirst:e,map:n,mapboxgl:r,onMarkerClick:o}){let a=s.default.useRef(!1);s.default.useEffect(()=>{!e||!n||a.current||(e.attachMap(n,{platform:"mapbox",mapboxgl:r,onMarkerClick:o}),a.current=!0)},[e,n,r,o])}function B(e){let n=s.default.useRef(null);return s.default.useEffect(()=>{if(!e)return;let r=new M.MapFirstCore(e);return n.current=r,()=>{r.destroy(),n.current=null}},[e]),n}function G({markers:e}){return(0,p.jsxs)("div",{style:{fontFamily:"sans-serif",fontSize:14},children:[(0,p.jsx)("strong",{children:"Markers"}),(0,p.jsx)("ul",{children:e.map(n=>{var r,o,a,f,y,i;return(0,p.jsxs)("li",{children:[n.name," \u2014 ",(a=(o=(r=n.location)==null?void 0:r.lat)==null?void 0:o.toFixed(3))!=null?a:"n/a",","," ",(i=(y=(f=n.location)==null?void 0:f.lon)==null?void 0:y.toFixed(3))!=null?i:"n/a"]},String(n.tripadvisor_id))})})]})}0&&(module.exports={MarkerDebugList,useGoogleMapsAttachment,useMapFirst,useMapFirstCore,useMapFirstProperties,useMapFirstSelectedProperty,useMapLibreAttachment,useMapboxAttachment,usePrimaryType,useSelectedMarker});
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n MapFirstCore,\n type MapFirstOptions,\n type BaseMapFirstOptions,\n type Property,\n type MapLibreNamespace,\n type GoogleMapsNamespace,\n type MapboxNamespace,\n type MapState,\n type PropertyType,\n} from \"@mapfirst.ai/core\";\n\n/**\n * Hook that creates a MapFirstCore instance that can be initialized before maps are ready.\n * Supports two-phase initialization: create SDK first, attach map later.\n * Returns the instance and reactive state that updates when SDK state changes.\n *\n * @example\n * ```tsx\n * // Phase 1: Create SDK instance with location data\n * const { mapFirst, state } = useMapFirstCore({\n * initialLocationData: {\n * city: \"New York\",\n * country: \"United States\",\n * currency: \"USD\"\n * }\n * });\n *\n * // Access reactive state\n * console.log(state.properties); // Updates when properties change\n * console.log(state.isSearching); // Updates when search state changes\n *\n * // Phase 2: Attach map when ready\n * useEffect(() => {\n * if (mapLibreInstance && mapFirst) {\n * mapFirst.attachMap(mapLibreInstance, {\n * platform: \"maplibre\",\n * maplibregl: maplibregl,\n * onMarkerClick: (marker) => console.log(marker)\n * });\n * }\n * }, [mapLibreInstance, mapFirst]);\n * ```\n */\nexport function useMapFirstCore(options: BaseMapFirstOptions) {\n const instanceRef = React.useRef<MapFirstCore | null>(null);\n const [state, setState] = React.useState<MapState | null>(null);\n\n // Memoize the options to prevent recreation on every render\n const optionsRef = React.useRef(options);\n React.useEffect(() => {\n optionsRef.current = options;\n });\n\n React.useEffect(() => {\n const opts = optionsRef.current;\n\n // Create MapFirstCore instance without map using adapter-driven options\n const coreOptions: MapFirstOptions = {\n adapter: null as any, // Will be set when attachMap is called\n ...opts,\n callbacks: {\n ...opts.callbacks,\n // Add internal callbacks to trigger React re-renders\n onPropertiesChange: (properties) => {\n setState((prev) => (prev ? { ...prev, properties } : null));\n optionsRef.current.callbacks?.onPropertiesChange?.(properties);\n },\n onSelectedPropertyChange: (id) => {\n setState((prev) =>\n prev ? { ...prev, selectedPropertyId: id } : null\n );\n optionsRef.current.callbacks?.onSelectedPropertyChange?.(id);\n },\n onPrimaryTypeChange: (type) => {\n setState((prev) => (prev ? { ...prev, primary: type } : null));\n optionsRef.current.callbacks?.onPrimaryTypeChange?.(type);\n },\n onFiltersChange: (filters) => {\n setState((prev) => (prev ? { ...prev, filters } : null));\n optionsRef.current.callbacks?.onFiltersChange?.(filters);\n },\n onBoundsChange: (bounds) => {\n setState((prev) => (prev ? { ...prev, bounds } : null));\n optionsRef.current.callbacks?.onBoundsChange?.(bounds);\n },\n onCenterChange: (center, zoom) => {\n setState((prev) => (prev ? { ...prev, center, zoom } : null));\n optionsRef.current.callbacks?.onCenterChange?.(center, zoom);\n },\n onZoomChange: (zoom) => {\n setState((prev) => (prev ? { ...prev, zoom } : null));\n optionsRef.current.callbacks?.onZoomChange?.(zoom);\n },\n onActiveLocationChange: (location) => {\n setState((prev) =>\n prev ? { ...prev, activeLocation: location } : null\n );\n optionsRef.current.callbacks?.onActiveLocationChange?.(location);\n },\n onLoadingStateChange: (loading) => {\n setState((prev) =>\n prev ? { ...prev, initialLoading: loading } : null\n );\n optionsRef.current.callbacks?.onLoadingStateChange?.(loading);\n },\n onSearchingStateChange: (searching) => {\n setState((prev) =>\n prev ? { ...prev, isSearching: searching } : null\n );\n optionsRef.current.callbacks?.onSearchingStateChange?.(searching);\n },\n },\n };\n\n const instance = new MapFirstCore(coreOptions);\n instanceRef.current = instance;\n\n // Initialize state from SDK\n setState(instance.getState());\n\n return () => {\n instance.destroy();\n instanceRef.current = null;\n setState(null);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { mapFirst: instanceRef.current, state };\n}\n\n/**\n * Hook to access reactive properties from MapFirst SDK.\n * Returns the current properties array that updates when properties change.\n *\n * @example\n * ```tsx\n * const { mapFirst } = useMapFirstCore({ ... });\n * const properties = useMapFirstProperties(mapFirst);\n *\n * return <div>Found {properties.length} properties</div>;\n * ```\n */\nexport function useMapFirstProperties(\n mapFirst: MapFirstCore | null\n): Property[] {\n const [properties, setProperties] = React.useState<Property[]>([]);\n\n React.useEffect(() => {\n if (!mapFirst) {\n setProperties([]);\n return;\n }\n\n // Initialize with current state\n setProperties(mapFirst.getState().properties);\n }, [mapFirst]);\n\n return properties;\n}\n\n/**\n * Hook to access the selected property ID from MapFirst SDK.\n * Returns the currently selected property ID that updates when selection changes.\n *\n * @example\n * ```tsx\n * const { mapFirst } = useMapFirstCore({ ... });\n * const selectedId = useMapFirstSelectedProperty(mapFirst);\n *\n * return <div>Selected: {selectedId || 'None'}</div>;\n * ```\n */\nexport function useMapFirstSelectedProperty(\n mapFirst: MapFirstCore | null\n): number | null {\n const [selectedId, setSelectedId] = React.useState<number | null>(null);\n\n React.useEffect(() => {\n if (!mapFirst) {\n setSelectedId(null);\n return;\n }\n\n // Initialize with current state\n setSelectedId(mapFirst.getState().selectedPropertyId);\n }, [mapFirst]);\n\n return selectedId;\n}\n\n/**\n * Hook to access and control the primary property type.\n * Returns the current primary type and a setter function.\n *\n * @example\n * ```tsx\n * const { mapFirst } = useMapFirstCore({ ... });\n * const [primaryType, setPrimaryType] = usePrimaryType(mapFirst);\n *\n * return (\n * <select value={primaryType} onChange={(e) => setPrimaryType(e.target.value as PropertyType)}>\n * <option value=\"Accommodation\">Hotels</option>\n * <option value=\"Restaurant\">Restaurants</option>\n * <option value=\"Attraction\">Attractions</option>\n * </select>\n * );\n * ```\n */\nexport function usePrimaryType(\n mapFirst: MapFirstCore | null\n): [PropertyType, (type: PropertyType) => void] {\n const [primaryType, setPrimaryTypeState] =\n React.useState<PropertyType>(\"Accommodation\");\n\n React.useEffect(() => {\n if (!mapFirst) {\n setPrimaryTypeState(\"Accommodation\");\n return;\n }\n\n // Initialize with current state\n setPrimaryTypeState(mapFirst.getState().primary);\n }, [mapFirst]);\n\n const setPrimaryType = React.useCallback(\n (type: PropertyType) => {\n if (mapFirst) {\n mapFirst.setPrimaryType(type);\n setPrimaryTypeState(type);\n }\n },\n [mapFirst]\n );\n\n return [primaryType, setPrimaryType];\n}\n\n/**\n * Hook to access and control the selected marker.\n * Returns the current selected marker ID and a setter function.\n *\n * @example\n * ```tsx\n * const { mapFirst } = useMapFirstCore({ ... });\n * const [selectedMarker, setSelectedMarker] = useSelectedMarker(mapFirst);\n *\n * return (\n * <div>\n * <p>Selected: {selectedMarker || 'None'}</p>\n * <button onClick={() => setSelectedMarker(null)}>Clear Selection</button>\n * </div>\n * );\n * ```\n */\nexport function useSelectedMarker(\n mapFirst: MapFirstCore | null\n): [number | null, (id: number | null) => void] {\n const [selectedMarker, setSelectedMarkerState] = React.useState<\n number | null\n >(null);\n\n React.useEffect(() => {\n if (!mapFirst) {\n setSelectedMarkerState(null);\n return;\n }\n\n // Initialize with current state\n setSelectedMarkerState(mapFirst.getState().selectedPropertyId);\n }, [mapFirst]);\n\n const setSelectedMarker = React.useCallback(\n (id: number | null) => {\n if (mapFirst) {\n mapFirst.setSelectedMarker(id);\n setSelectedMarkerState(id);\n }\n },\n [mapFirst]\n );\n\n return [selectedMarker, setSelectedMarker];\n}\n\n/**\n * Hook for MapLibre GL JS integration.\n * Automatically attaches the map when both the SDK instance and map are available.\n *\n * @example\n * ```tsx\n * const { mapFirst, state } = useMapFirstCore({ initialLocationData: { city: \"Paris\", country: \"France\" } });\n * const mapRef = useRef<maplibregl.Map | null>(null);\n *\n * useMapLibreAttachment({\n * mapFirst,\n * map: mapRef.current,\n * maplibregl: maplibregl,\n * onMarkerClick: (marker) => console.log(marker)\n * });\n *\n * // Access reactive state\n * console.log(state?.properties);\n * ```\n */\nexport function useMapLibreAttachment({\n mapFirst,\n map,\n maplibregl,\n onMarkerClick,\n}: {\n mapFirst: MapFirstCore | null;\n map: any | null;\n maplibregl: MapLibreNamespace;\n onMarkerClick?: (marker: Property) => void;\n}) {\n const attachedRef = React.useRef(false);\n\n React.useEffect(() => {\n if (!mapFirst || !map || attachedRef.current) {\n return;\n }\n\n mapFirst.attachMap(map, {\n platform: \"maplibre\",\n maplibregl,\n onMarkerClick,\n });\n\n attachedRef.current = true;\n }, [mapFirst, map, maplibregl, onMarkerClick]);\n}\n\n/**\n * Hook for Google Maps integration.\n * Automatically attaches the map when both the SDK instance and map are available.\n *\n * @example\n * ```tsx\n * const { mapFirst, state } = useMapFirstCore({ initialLocationData: { city: \"Tokyo\", country: \"Japan\" } });\n * const mapRef = useRef<google.maps.Map | null>(null);\n *\n * useGoogleMapsAttachment({\n * mapFirst,\n * map: mapRef.current,\n * google: window.google,\n * onMarkerClick: (marker) => console.log(marker)\n * });\n *\n * // Access reactive state\n * console.log(state?.isSearching);\n * ```\n */\nexport function useGoogleMapsAttachment({\n mapFirst,\n map,\n google,\n onMarkerClick,\n}: {\n mapFirst: MapFirstCore | null;\n map: any | null;\n google: GoogleMapsNamespace;\n onMarkerClick?: (marker: Property) => void;\n}) {\n const attachedRef = React.useRef(false);\n\n React.useEffect(() => {\n if (!mapFirst || !map || attachedRef.current) {\n return;\n }\n\n mapFirst.attachMap(map, {\n platform: \"google\",\n google,\n onMarkerClick,\n });\n\n attachedRef.current = true;\n }, [mapFirst, map, google, onMarkerClick]);\n}\n\n/**\n * Hook for Mapbox GL JS integration.\n * Automatically attaches the map when both the SDK instance and map are available.\n *\n * @example\n * ```tsx\n * const { mapFirst, state } = useMapFirstCore({ initialLocationData: { city: \"London\", country: \"United Kingdom\" } });\n * const mapRef = useRef<mapboxgl.Map | null>(null);\n *\n * useMapboxAttachment({\n * mapFirst,\n * map: mapRef.current,\n * mapboxgl: mapboxgl,\n * onMarkerClick: (marker) => console.log(marker)\n * });\n *\n * // Access reactive state\n * console.log(state?.filters);\n * ```\n */\nexport function useMapboxAttachment({\n mapFirst,\n map,\n mapboxgl,\n onMarkerClick,\n}: {\n mapFirst: MapFirstCore | null;\n map: any | null;\n mapboxgl: MapboxNamespace;\n onMarkerClick?: (marker: Property) => void;\n}) {\n const attachedRef = React.useRef(false);\n\n React.useEffect(() => {\n if (!mapFirst || !map || attachedRef.current) {\n return;\n }\n\n mapFirst.attachMap(map, {\n platform: \"mapbox\",\n mapboxgl,\n onMarkerClick,\n });\n\n attachedRef.current = true;\n }, [mapFirst, map, mapboxgl, onMarkerClick]);\n}\n\n/**\n * Legacy hook that creates the MapFirstCore instance with a map immediately.\n * Use useMapFirstCore + useMap*Attachment hooks for better control.\n *\n * @deprecated Use useMapFirstCore and platform-specific attachment hooks instead\n */\nexport function useMapFirst(options: MapFirstOptions | null) {\n const instanceRef = React.useRef<MapFirstCore | null>(null);\n\n React.useEffect(() => {\n if (!options) {\n return undefined;\n }\n const instance = new MapFirstCore(options);\n instanceRef.current = instance;\n\n return () => {\n instance.destroy();\n instanceRef.current = null;\n };\n }, [options]);\n\n return instanceRef;\n}\n\n/**\n * Helper component that simply renders the markers it receives so non-React environments\n * can verify data flows before wiring the SDK into a map.\n */\nexport function MarkerDebugList({ markers }: { markers: Property[] }) {\n return (\n <div style={{ fontFamily: \"sans-serif\", fontSize: 14 }}>\n <strong>Markers</strong>\n <ul>\n {markers.map((marker) => (\n <li key={String(marker.tripadvisor_id)}>\n {marker.name} — {marker.location?.lat?.toFixed(3) ?? \"n/a\"},{\" \"}\n {marker.location?.lon?.toFixed(3) ?? \"n/a\"}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n"],"mappings":"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","names":["index_exports","__export","MarkerDebugList","useGoogleMapsAttachment","useMapFirst","useMapFirstCore","useMapFirstProperties","useMapFirstSelectedProperty","useMapLibreAttachment","useMapboxAttachment","usePrimaryType","useSelectedMarker","__toCommonJS","import_react","import_core","import_jsx_runtime","options","instanceRef","React","state","setState","optionsRef","opts","coreOptions","properties","_a","_b","prev","id","type","filters","bounds","center","zoom","location","loading","searching","instance","mapFirst","setProperties","selectedId","setSelectedId","primaryType","setPrimaryTypeState","setPrimaryType","selectedMarker","setSelectedMarkerState","setSelectedMarker","map","maplibregl","onMarkerClick","attachedRef","google","mapboxgl","markers","marker","_c","_d","_e","_f"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import s from"react";import{MapFirstCore as g}from"@mapfirst.ai/core";import{jsx as d,jsxs as M}from"react/jsx-runtime";function h(t){let n=s.useRef(null),[a,c]=s.useState(null),o=s.useRef(t);return s.useEffect(()=>{o.current=t}),s.useEffect(()=>{let p=o.current,f={adapter:null,...p,callbacks:{...p.callbacks,onPropertiesChange:l=>{var e,r;c(u=>u?{...u,properties:l}:null),(r=(e=o.current.callbacks)==null?void 0:e.onPropertiesChange)==null||r.call(e,l)},onSelectedPropertyChange:l=>{var e,r;c(u=>u?{...u,selectedPropertyId:l}:null),(r=(e=o.current.callbacks)==null?void 0:e.onSelectedPropertyChange)==null||r.call(e,l)},onPrimaryTypeChange:l=>{var e,r;c(u=>u?{...u,primary:l}:null),(r=(e=o.current.callbacks)==null?void 0:e.onPrimaryTypeChange)==null||r.call(e,l)},onFiltersChange:l=>{var e,r;c(u=>u?{...u,filters:l}:null),(r=(e=o.current.callbacks)==null?void 0:e.onFiltersChange)==null||r.call(e,l)},onBoundsChange:l=>{var e,r;c(u=>u?{...u,bounds:l}:null),(r=(e=o.current.callbacks)==null?void 0:e.onBoundsChange)==null||r.call(e,l)},onCenterChange:(l,e)=>{var r,u;c(y=>y?{...y,center:l,zoom:e}:null),(u=(r=o.current.callbacks)==null?void 0:r.onCenterChange)==null||u.call(r,l,e)},onZoomChange:l=>{var e,r;c(u=>u?{...u,zoom:l}:null),(r=(e=o.current.callbacks)==null?void 0:e.onZoomChange)==null||r.call(e,l)},onActiveLocationChange:l=>{var e,r;c(u=>u?{...u,activeLocation:l}:null),(r=(e=o.current.callbacks)==null?void 0:e.onActiveLocationChange)==null||r.call(e,l)},onLoadingStateChange:l=>{var e,r;c(u=>u?{...u,initialLoading:l}:null),(r=(e=o.current.callbacks)==null?void 0:e.onLoadingStateChange)==null||r.call(e,l)},onSearchingStateChange:l=>{var e,r;c(u=>u?{...u,isSearching:l}:null),(r=(e=o.current.callbacks)==null?void 0:e.onSearchingStateChange)==null||r.call(e,l)}}},i=new g(f);return n.current=i,c(i.getState()),()=>{i.destroy(),n.current=null,c(null)}},[]),{mapFirst:n.current,state:a}}function b(t){let[n,a]=s.useState([]);return s.useEffect(()=>{if(!t){a([]);return}a(t.getState().properties)},[t]),n}function P(t){let[n,a]=s.useState(null);return s.useEffect(()=>{if(!t){a(null);return}a(t.getState().selectedPropertyId)},[t]),n}function k(t){let[n,a]=s.useState("Accommodation");s.useEffect(()=>{if(!t){a("Accommodation");return}a(t.getState().primary)},[t]);let c=s.useCallback(o=>{t&&(t.setPrimaryType(o),a(o))},[t]);return[n,c]}function m(t){let[n,a]=s.useState(null);s.useEffect(()=>{if(!t){a(null);return}a(t.getState().selectedPropertyId)},[t]);let c=s.useCallback(o=>{t&&(t.setSelectedMarker(o),a(o))},[t]);return[n,c]}function x({mapFirst:t,map:n,maplibregl:a,onMarkerClick:c}){let o=s.useRef(!1);s.useEffect(()=>{!t||!n||o.current||(t.attachMap(n,{platform:"maplibre",maplibregl:a,onMarkerClick:c}),o.current=!0)},[t,n,a,c])}function R({mapFirst:t,map:n,google:a,onMarkerClick:c}){let o=s.useRef(!1);s.useEffect(()=>{!t||!n||o.current||(t.attachMap(n,{platform:"google",google:a,onMarkerClick:c}),o.current=!0)},[t,n,a,c])}function T({mapFirst:t,map:n,mapboxgl:a,onMarkerClick:c}){let o=s.useRef(!1);s.useEffect(()=>{!t||!n||o.current||(t.attachMap(n,{platform:"mapbox",mapboxgl:a,onMarkerClick:c}),o.current=!0)},[t,n,a,c])}function E(t){let n=s.useRef(null);return s.useEffect(()=>{if(!t)return;let a=new g(t);return n.current=a,()=>{a.destroy(),n.current=null}},[t]),n}function L({markers:t}){return M("div",{style:{fontFamily:"sans-serif",fontSize:14},children:[d("strong",{children:"Markers"}),d("ul",{children:t.map(n=>{var a,c,o,p,f,i;return M("li",{children:[n.name," \u2014 ",(o=(c=(a=n.location)==null?void 0:a.lat)==null?void 0:c.toFixed(3))!=null?o:"n/a",","," ",(i=(f=(p=n.location)==null?void 0:p.lon)==null?void 0:f.toFixed(3))!=null?i:"n/a"]},String(n.tripadvisor_id))})})]})}export{L as MarkerDebugList,R as useGoogleMapsAttachment,E as useMapFirst,h as useMapFirstCore,b as useMapFirstProperties,P as useMapFirstSelectedProperty,x as useMapLibreAttachment,T as useMapboxAttachment,k as usePrimaryType,m as useSelectedMarker};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n MapFirstCore,\n type MapFirstOptions,\n type BaseMapFirstOptions,\n type Property,\n type MapLibreNamespace,\n type GoogleMapsNamespace,\n type MapboxNamespace,\n type MapState,\n type PropertyType,\n} from \"@mapfirst.ai/core\";\n\n/**\n * Hook that creates a MapFirstCore instance that can be initialized before maps are ready.\n * Supports two-phase initialization: create SDK first, attach map later.\n * Returns the instance and reactive state that updates when SDK state changes.\n *\n * @example\n * ```tsx\n * // Phase 1: Create SDK instance with location data\n * const { mapFirst, state } = useMapFirstCore({\n * initialLocationData: {\n * city: \"New York\",\n * country: \"United States\",\n * currency: \"USD\"\n * }\n * });\n *\n * // Access reactive state\n * console.log(state.properties); // Updates when properties change\n * console.log(state.isSearching); // Updates when search state changes\n *\n * // Phase 2: Attach map when ready\n * useEffect(() => {\n * if (mapLibreInstance && mapFirst) {\n * mapFirst.attachMap(mapLibreInstance, {\n * platform: \"maplibre\",\n * maplibregl: maplibregl,\n * onMarkerClick: (marker) => console.log(marker)\n * });\n * }\n * }, [mapLibreInstance, mapFirst]);\n * ```\n */\nexport function useMapFirstCore(options: BaseMapFirstOptions) {\n const instanceRef = React.useRef<MapFirstCore | null>(null);\n const [state, setState] = React.useState<MapState | null>(null);\n\n // Memoize the options to prevent recreation on every render\n const optionsRef = React.useRef(options);\n React.useEffect(() => {\n optionsRef.current = options;\n });\n\n React.useEffect(() => {\n const opts = optionsRef.current;\n\n // Create MapFirstCore instance without map using adapter-driven options\n const coreOptions: MapFirstOptions = {\n adapter: null as any, // Will be set when attachMap is called\n ...opts,\n callbacks: {\n ...opts.callbacks,\n // Add internal callbacks to trigger React re-renders\n onPropertiesChange: (properties) => {\n setState((prev) => (prev ? { ...prev, properties } : null));\n optionsRef.current.callbacks?.onPropertiesChange?.(properties);\n },\n onSelectedPropertyChange: (id) => {\n setState((prev) =>\n prev ? { ...prev, selectedPropertyId: id } : null\n );\n optionsRef.current.callbacks?.onSelectedPropertyChange?.(id);\n },\n onPrimaryTypeChange: (type) => {\n setState((prev) => (prev ? { ...prev, primary: type } : null));\n optionsRef.current.callbacks?.onPrimaryTypeChange?.(type);\n },\n onFiltersChange: (filters) => {\n setState((prev) => (prev ? { ...prev, filters } : null));\n optionsRef.current.callbacks?.onFiltersChange?.(filters);\n },\n onBoundsChange: (bounds) => {\n setState((prev) => (prev ? { ...prev, bounds } : null));\n optionsRef.current.callbacks?.onBoundsChange?.(bounds);\n },\n onCenterChange: (center, zoom) => {\n setState((prev) => (prev ? { ...prev, center, zoom } : null));\n optionsRef.current.callbacks?.onCenterChange?.(center, zoom);\n },\n onZoomChange: (zoom) => {\n setState((prev) => (prev ? { ...prev, zoom } : null));\n optionsRef.current.callbacks?.onZoomChange?.(zoom);\n },\n onActiveLocationChange: (location) => {\n setState((prev) =>\n prev ? { ...prev, activeLocation: location } : null\n );\n optionsRef.current.callbacks?.onActiveLocationChange?.(location);\n },\n onLoadingStateChange: (loading) => {\n setState((prev) =>\n prev ? { ...prev, initialLoading: loading } : null\n );\n optionsRef.current.callbacks?.onLoadingStateChange?.(loading);\n },\n onSearchingStateChange: (searching) => {\n setState((prev) =>\n prev ? { ...prev, isSearching: searching } : null\n );\n optionsRef.current.callbacks?.onSearchingStateChange?.(searching);\n },\n },\n };\n\n const instance = new MapFirstCore(coreOptions);\n instanceRef.current = instance;\n\n // Initialize state from SDK\n setState(instance.getState());\n\n return () => {\n instance.destroy();\n instanceRef.current = null;\n setState(null);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { mapFirst: instanceRef.current, state };\n}\n\n/**\n * Hook to access reactive properties from MapFirst SDK.\n * Returns the current properties array that updates when properties change.\n *\n * @example\n * ```tsx\n * const { mapFirst } = useMapFirstCore({ ... });\n * const properties = useMapFirstProperties(mapFirst);\n *\n * return <div>Found {properties.length} properties</div>;\n * ```\n */\nexport function useMapFirstProperties(\n mapFirst: MapFirstCore | null\n): Property[] {\n const [properties, setProperties] = React.useState<Property[]>([]);\n\n React.useEffect(() => {\n if (!mapFirst) {\n setProperties([]);\n return;\n }\n\n // Initialize with current state\n setProperties(mapFirst.getState().properties);\n }, [mapFirst]);\n\n return properties;\n}\n\n/**\n * Hook to access the selected property ID from MapFirst SDK.\n * Returns the currently selected property ID that updates when selection changes.\n *\n * @example\n * ```tsx\n * const { mapFirst } = useMapFirstCore({ ... });\n * const selectedId = useMapFirstSelectedProperty(mapFirst);\n *\n * return <div>Selected: {selectedId || 'None'}</div>;\n * ```\n */\nexport function useMapFirstSelectedProperty(\n mapFirst: MapFirstCore | null\n): number | null {\n const [selectedId, setSelectedId] = React.useState<number | null>(null);\n\n React.useEffect(() => {\n if (!mapFirst) {\n setSelectedId(null);\n return;\n }\n\n // Initialize with current state\n setSelectedId(mapFirst.getState().selectedPropertyId);\n }, [mapFirst]);\n\n return selectedId;\n}\n\n/**\n * Hook to access and control the primary property type.\n * Returns the current primary type and a setter function.\n *\n * @example\n * ```tsx\n * const { mapFirst } = useMapFirstCore({ ... });\n * const [primaryType, setPrimaryType] = usePrimaryType(mapFirst);\n *\n * return (\n * <select value={primaryType} onChange={(e) => setPrimaryType(e.target.value as PropertyType)}>\n * <option value=\"Accommodation\">Hotels</option>\n * <option value=\"Restaurant\">Restaurants</option>\n * <option value=\"Attraction\">Attractions</option>\n * </select>\n * );\n * ```\n */\nexport function usePrimaryType(\n mapFirst: MapFirstCore | null\n): [PropertyType, (type: PropertyType) => void] {\n const [primaryType, setPrimaryTypeState] =\n React.useState<PropertyType>(\"Accommodation\");\n\n React.useEffect(() => {\n if (!mapFirst) {\n setPrimaryTypeState(\"Accommodation\");\n return;\n }\n\n // Initialize with current state\n setPrimaryTypeState(mapFirst.getState().primary);\n }, [mapFirst]);\n\n const setPrimaryType = React.useCallback(\n (type: PropertyType) => {\n if (mapFirst) {\n mapFirst.setPrimaryType(type);\n setPrimaryTypeState(type);\n }\n },\n [mapFirst]\n );\n\n return [primaryType, setPrimaryType];\n}\n\n/**\n * Hook to access and control the selected marker.\n * Returns the current selected marker ID and a setter function.\n *\n * @example\n * ```tsx\n * const { mapFirst } = useMapFirstCore({ ... });\n * const [selectedMarker, setSelectedMarker] = useSelectedMarker(mapFirst);\n *\n * return (\n * <div>\n * <p>Selected: {selectedMarker || 'None'}</p>\n * <button onClick={() => setSelectedMarker(null)}>Clear Selection</button>\n * </div>\n * );\n * ```\n */\nexport function useSelectedMarker(\n mapFirst: MapFirstCore | null\n): [number | null, (id: number | null) => void] {\n const [selectedMarker, setSelectedMarkerState] = React.useState<\n number | null\n >(null);\n\n React.useEffect(() => {\n if (!mapFirst) {\n setSelectedMarkerState(null);\n return;\n }\n\n // Initialize with current state\n setSelectedMarkerState(mapFirst.getState().selectedPropertyId);\n }, [mapFirst]);\n\n const setSelectedMarker = React.useCallback(\n (id: number | null) => {\n if (mapFirst) {\n mapFirst.setSelectedMarker(id);\n setSelectedMarkerState(id);\n }\n },\n [mapFirst]\n );\n\n return [selectedMarker, setSelectedMarker];\n}\n\n/**\n * Hook for MapLibre GL JS integration.\n * Automatically attaches the map when both the SDK instance and map are available.\n *\n * @example\n * ```tsx\n * const { mapFirst, state } = useMapFirstCore({ initialLocationData: { city: \"Paris\", country: \"France\" } });\n * const mapRef = useRef<maplibregl.Map | null>(null);\n *\n * useMapLibreAttachment({\n * mapFirst,\n * map: mapRef.current,\n * maplibregl: maplibregl,\n * onMarkerClick: (marker) => console.log(marker)\n * });\n *\n * // Access reactive state\n * console.log(state?.properties);\n * ```\n */\nexport function useMapLibreAttachment({\n mapFirst,\n map,\n maplibregl,\n onMarkerClick,\n}: {\n mapFirst: MapFirstCore | null;\n map: any | null;\n maplibregl: MapLibreNamespace;\n onMarkerClick?: (marker: Property) => void;\n}) {\n const attachedRef = React.useRef(false);\n\n React.useEffect(() => {\n if (!mapFirst || !map || attachedRef.current) {\n return;\n }\n\n mapFirst.attachMap(map, {\n platform: \"maplibre\",\n maplibregl,\n onMarkerClick,\n });\n\n attachedRef.current = true;\n }, [mapFirst, map, maplibregl, onMarkerClick]);\n}\n\n/**\n * Hook for Google Maps integration.\n * Automatically attaches the map when both the SDK instance and map are available.\n *\n * @example\n * ```tsx\n * const { mapFirst, state } = useMapFirstCore({ initialLocationData: { city: \"Tokyo\", country: \"Japan\" } });\n * const mapRef = useRef<google.maps.Map | null>(null);\n *\n * useGoogleMapsAttachment({\n * mapFirst,\n * map: mapRef.current,\n * google: window.google,\n * onMarkerClick: (marker) => console.log(marker)\n * });\n *\n * // Access reactive state\n * console.log(state?.isSearching);\n * ```\n */\nexport function useGoogleMapsAttachment({\n mapFirst,\n map,\n google,\n onMarkerClick,\n}: {\n mapFirst: MapFirstCore | null;\n map: any | null;\n google: GoogleMapsNamespace;\n onMarkerClick?: (marker: Property) => void;\n}) {\n const attachedRef = React.useRef(false);\n\n React.useEffect(() => {\n if (!mapFirst || !map || attachedRef.current) {\n return;\n }\n\n mapFirst.attachMap(map, {\n platform: \"google\",\n google,\n onMarkerClick,\n });\n\n attachedRef.current = true;\n }, [mapFirst, map, google, onMarkerClick]);\n}\n\n/**\n * Hook for Mapbox GL JS integration.\n * Automatically attaches the map when both the SDK instance and map are available.\n *\n * @example\n * ```tsx\n * const { mapFirst, state } = useMapFirstCore({ initialLocationData: { city: \"London\", country: \"United Kingdom\" } });\n * const mapRef = useRef<mapboxgl.Map | null>(null);\n *\n * useMapboxAttachment({\n * mapFirst,\n * map: mapRef.current,\n * mapboxgl: mapboxgl,\n * onMarkerClick: (marker) => console.log(marker)\n * });\n *\n * // Access reactive state\n * console.log(state?.filters);\n * ```\n */\nexport function useMapboxAttachment({\n mapFirst,\n map,\n mapboxgl,\n onMarkerClick,\n}: {\n mapFirst: MapFirstCore | null;\n map: any | null;\n mapboxgl: MapboxNamespace;\n onMarkerClick?: (marker: Property) => void;\n}) {\n const attachedRef = React.useRef(false);\n\n React.useEffect(() => {\n if (!mapFirst || !map || attachedRef.current) {\n return;\n }\n\n mapFirst.attachMap(map, {\n platform: \"mapbox\",\n mapboxgl,\n onMarkerClick,\n });\n\n attachedRef.current = true;\n }, [mapFirst, map, mapboxgl, onMarkerClick]);\n}\n\n/**\n * Legacy hook that creates the MapFirstCore instance with a map immediately.\n * Use useMapFirstCore + useMap*Attachment hooks for better control.\n *\n * @deprecated Use useMapFirstCore and platform-specific attachment hooks instead\n */\nexport function useMapFirst(options: MapFirstOptions | null) {\n const instanceRef = React.useRef<MapFirstCore | null>(null);\n\n React.useEffect(() => {\n if (!options) {\n return undefined;\n }\n const instance = new MapFirstCore(options);\n instanceRef.current = instance;\n\n return () => {\n instance.destroy();\n instanceRef.current = null;\n };\n }, [options]);\n\n return instanceRef;\n}\n\n/**\n * Helper component that simply renders the markers it receives so non-React environments\n * can verify data flows before wiring the SDK into a map.\n */\nexport function MarkerDebugList({ markers }: { markers: Property[] }) {\n return (\n <div style={{ fontFamily: \"sans-serif\", fontSize: 14 }}>\n <strong>Markers</strong>\n <ul>\n {markers.map((marker) => (\n <li key={String(marker.tripadvisor_id)}>\n {marker.name} — {marker.location?.lat?.toFixed(3) ?? \"n/a\"},{\" \"}\n {marker.location?.lon?.toFixed(3) ?? \"n/a\"}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n"],"mappings":"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","names":["React","MapFirstCore","jsx","jsxs","useMapFirstCore","options","instanceRef","state","setState","optionsRef","opts","coreOptions","properties","_a","_b","prev","id","type","filters","bounds","center","zoom","location","loading","searching","instance","useMapFirstProperties","mapFirst","setProperties","useMapFirstSelectedProperty","selectedId","setSelectedId","usePrimaryType","primaryType","setPrimaryTypeState","setPrimaryType","useSelectedMarker","selectedMarker","setSelectedMarkerState","setSelectedMarker","useMapLibreAttachment","map","maplibregl","onMarkerClick","attachedRef","useGoogleMapsAttachment","google","useMapboxAttachment","mapboxgl","useMapFirst","MarkerDebugList","markers","marker","_c","_d","_e","_f"]}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@mapfirst.ai/react",
3
+ "version": "0.0.4",
4
+ "description": "React hooks for MapFirst SDK - Reactive state management for map properties",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "EXAMPLES.md"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsup src/index.tsx --format esm,cjs --dts --sourcemap --clean",
22
+ "prepublishOnly": "pnpm build"
23
+ },
24
+ "keywords": [
25
+ "react",
26
+ "hooks",
27
+ "map",
28
+ "mapfirst",
29
+ "state-management",
30
+ "markers",
31
+ "properties"
32
+ ],
33
+ "author": "MapFirst",
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/sandeshveerani4/mapfirst-sdk.git",
38
+ "directory": "packages/react"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "peerDependencies": {
44
+ "react": ">=17 || >=18"
45
+ },
46
+ "dependencies": {
47
+ "@mapfirst.ai/core": "0.0.3"
48
+ }
49
+ }