strapi-plugin-map-box 0.0.3 → 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.
@@ -38,18 +38,25 @@ const ControlsContainer = styled__default.default.div`
38
38
  position: absolute;
39
39
  top: 1rem;
40
40
  left: 1rem;
41
+ right: 1rem;
41
42
  z-index: 10;
42
- width: 350px;
43
+ `;
44
+ const SearchRow = styled__default.default.div`
45
+ display: flex;
46
+ align-items: flex-start;
47
+ gap: 8px;
43
48
  `;
44
49
  const SearchWrapper = styled__default.default.div`
45
50
  position: relative;
51
+ flex: 1;
52
+ max-width: 350px;
46
53
  `;
47
54
  const SearchInputContainer = styled__default.default.div`
48
55
  display: flex;
49
56
  align-items: center;
50
57
  background: white;
51
58
  border: 1px solid #dcdce4;
52
- border-radius: 4px;
59
+ border-radius: 8px;
53
60
  overflow: hidden;
54
61
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
55
62
 
@@ -66,7 +73,7 @@ const SearchIcon = styled__default.default.div`
66
73
  `;
67
74
  const SearchInput = styled__default.default.input`
68
75
  flex: 1;
69
- padding: 10px 0;
76
+ padding: 12px 0;
70
77
  border: none;
71
78
  font-size: 14px;
72
79
  outline: none;
@@ -103,6 +110,43 @@ const LoadingSpinner = styled__default.default.div`
103
110
  animation: spin 1s linear infinite;
104
111
  }
105
112
  `;
113
+ const RefreshButton = styled__default.default.button`
114
+ width: 44px;
115
+ height: 44px;
116
+ border-radius: 8px;
117
+ background-color: ${(props) => props.$isRefreshing ? "#6c63ff" : "#4945ff"};
118
+ border: none;
119
+ cursor: pointer;
120
+ display: flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ color: white;
124
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
125
+ transition: all 0.15s ease;
126
+ flex-shrink: 0;
127
+
128
+ &:hover:not(:disabled) {
129
+ background-color: #3832e0;
130
+ }
131
+
132
+ &:active:not(:disabled) {
133
+ transform: scale(0.95);
134
+ }
135
+
136
+ &:disabled {
137
+ cursor: not-allowed;
138
+ }
139
+
140
+ @keyframes spin {
141
+ to {
142
+ transform: rotate(360deg);
143
+ }
144
+ }
145
+
146
+ svg.spinning {
147
+ animation: spin 1s linear infinite;
148
+ }
149
+ `;
106
150
  const ResultsDropdown = styled__default.default.div`
107
151
  position: absolute;
108
152
  top: calc(100% + 4px);
@@ -110,7 +154,7 @@ const ResultsDropdown = styled__default.default.div`
110
154
  right: 0;
111
155
  background: white;
112
156
  border: 1px solid #dcdce4;
113
- border-radius: 4px;
157
+ border-radius: 8px;
114
158
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
115
159
  max-height: 300px;
116
160
  overflow-y: auto;
@@ -196,7 +240,9 @@ const MapSearch = ({
196
240
  onSelectResult,
197
241
  onClear,
198
242
  showResults,
199
- setShowResults
243
+ setShowResults,
244
+ onRefresh,
245
+ isRefreshing = false
200
246
  }) => {
201
247
  const handleInputChange = (e) => {
202
248
  setSearchQuery(e.target.value);
@@ -210,41 +256,82 @@ const MapSearch = ({
210
256
  onClear();
211
257
  setShowResults(false);
212
258
  };
213
- return /* @__PURE__ */ jsxRuntime.jsx(ControlsContainer, { children: /* @__PURE__ */ jsxRuntime.jsxs(SearchWrapper, { children: [
214
- /* @__PURE__ */ jsxRuntime.jsxs(SearchInputContainer, { children: [
215
- /* @__PURE__ */ jsxRuntime.jsx(SearchIcon, { children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" }) }) }),
216
- /* @__PURE__ */ jsxRuntime.jsx(
217
- SearchInput,
218
- {
219
- type: "text",
220
- value: searchQuery,
221
- onChange: handleInputChange,
222
- onFocus: () => setShowResults(true),
223
- placeholder: "Search for a location..."
224
- }
225
- ),
226
- isSearching && /* @__PURE__ */ jsxRuntime.jsx(LoadingSpinner, { children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z" }) }) }),
227
- searchQuery && !isSearching && /* @__PURE__ */ jsxRuntime.jsx(ClearButton, { onClick: handleClear, type: "button", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) })
259
+ return /* @__PURE__ */ jsxRuntime.jsx(ControlsContainer, { children: /* @__PURE__ */ jsxRuntime.jsxs(SearchRow, { children: [
260
+ /* @__PURE__ */ jsxRuntime.jsxs(SearchWrapper, { children: [
261
+ /* @__PURE__ */ jsxRuntime.jsxs(SearchInputContainer, { children: [
262
+ /* @__PURE__ */ jsxRuntime.jsx(SearchIcon, { children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" }) }) }),
263
+ /* @__PURE__ */ jsxRuntime.jsx(
264
+ SearchInput,
265
+ {
266
+ type: "text",
267
+ value: searchQuery,
268
+ onChange: handleInputChange,
269
+ onFocus: () => setShowResults(true),
270
+ placeholder: "Search for a location..."
271
+ }
272
+ ),
273
+ isSearching && /* @__PURE__ */ jsxRuntime.jsx(LoadingSpinner, { children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z" }) }) }),
274
+ searchQuery && !isSearching && /* @__PURE__ */ jsxRuntime.jsx(ClearButton, { onClick: handleClear, type: "button", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) })
275
+ ] }),
276
+ showResults && searchQuery.length > 2 && /* @__PURE__ */ jsxRuntime.jsx(ResultsDropdown, { children: searchResults.length > 0 ? searchResults.map((result) => {
277
+ const [title, ...rest] = result.place_name.split(",");
278
+ const subtitle = rest.join(",").trim();
279
+ return /* @__PURE__ */ jsxRuntime.jsxs(
280
+ ResultItem,
281
+ {
282
+ onClick: () => handleResultClick(result),
283
+ type: "button",
284
+ children: [
285
+ /* @__PURE__ */ jsxRuntime.jsx(ResultIcon, { children: getPlaceIcon(result.place_type) }),
286
+ /* @__PURE__ */ jsxRuntime.jsxs(ResultTextContainer, { children: [
287
+ /* @__PURE__ */ jsxRuntime.jsx(ResultTitle, { children: title }),
288
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx(ResultSubtitle, { children: subtitle })
289
+ ] })
290
+ ]
291
+ },
292
+ result.id
293
+ );
294
+ }) : !isSearching ? /* @__PURE__ */ jsxRuntime.jsx(NoResults, { children: "No results found" }) : null })
228
295
  ] }),
229
- showResults && searchQuery.length > 2 && /* @__PURE__ */ jsxRuntime.jsx(ResultsDropdown, { children: searchResults.length > 0 ? searchResults.map((result) => {
230
- const [title, ...rest] = result.place_name.split(",");
231
- const subtitle = rest.join(",").trim();
232
- return /* @__PURE__ */ jsxRuntime.jsxs(
233
- ResultItem,
234
- {
235
- onClick: () => handleResultClick(result),
236
- type: "button",
237
- children: [
238
- /* @__PURE__ */ jsxRuntime.jsx(ResultIcon, { children: getPlaceIcon(result.place_type) }),
239
- /* @__PURE__ */ jsxRuntime.jsxs(ResultTextContainer, { children: [
240
- /* @__PURE__ */ jsxRuntime.jsx(ResultTitle, { children: title }),
241
- subtitle && /* @__PURE__ */ jsxRuntime.jsx(ResultSubtitle, { children: subtitle })
242
- ] })
243
- ]
244
- },
245
- result.id
246
- );
247
- }) : !isSearching ? /* @__PURE__ */ jsxRuntime.jsx(NoResults, { children: "No results found" }) : null })
296
+ onRefresh && /* @__PURE__ */ jsxRuntime.jsx(
297
+ RefreshButton,
298
+ {
299
+ onClick: onRefresh,
300
+ disabled: isRefreshing,
301
+ $isRefreshing: isRefreshing,
302
+ type: "button",
303
+ title: "Refresh to original location",
304
+ children: isRefreshing ? /* @__PURE__ */ jsxRuntime.jsx(
305
+ "svg",
306
+ {
307
+ className: "spinning",
308
+ width: "18",
309
+ height: "18",
310
+ viewBox: "0 0 24 24",
311
+ fill: "currentColor",
312
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z" })
313
+ }
314
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
315
+ "svg",
316
+ {
317
+ width: "18",
318
+ height: "18",
319
+ viewBox: "0 0 24 24",
320
+ fill: "none",
321
+ stroke: "currentColor",
322
+ strokeWidth: "2",
323
+ strokeLinecap: "round",
324
+ strokeLinejoin: "round",
325
+ children: [
326
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }),
327
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 3v5h5" }),
328
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" }),
329
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 21h5v-5" })
330
+ ]
331
+ }
332
+ )
333
+ }
334
+ )
248
335
  ] }) });
249
336
  };
250
337
  const DEFAULT_VIEW_STATE = {
@@ -382,7 +469,14 @@ function MapBoxField({ name, onChange, value, intlLabel, required }) {
382
469
  const [isSearching, setIsSearching] = react.useState(false);
383
470
  const [showResults, setShowResults] = react.useState(false);
384
471
  const [searchError, setSearchError] = react.useState(null);
472
+ const [isRefreshing, setIsRefreshing] = react.useState(false);
385
473
  const searchTimeoutRef = react.useRef(null);
474
+ const initialValueRef = react.useRef(null);
475
+ react.useEffect(() => {
476
+ if (value && initialValueRef.current === null) {
477
+ initialValueRef.current = { ...value };
478
+ }
479
+ }, [value]);
386
480
  const updateMarkerPosition = react.useCallback(
387
481
  (lng, lat, address) => {
388
482
  setMarkerPosition({ longitude: lng, latitude: lat });
@@ -465,6 +559,31 @@ function MapBoxField({ name, onChange, value, intlLabel, required }) {
465
559
  setSearchResults([]);
466
560
  setShowResults(false);
467
561
  }, []);
562
+ const handleRefresh = react.useCallback(() => {
563
+ setIsRefreshing(true);
564
+ const originalValue = initialValueRef.current;
565
+ if (originalValue) {
566
+ setViewState((prev) => ({
567
+ ...prev,
568
+ longitude: originalValue.longitude,
569
+ latitude: originalValue.latitude,
570
+ zoom: originalValue.zoom || 12,
571
+ pitch: originalValue.pitch || 0,
572
+ bearing: originalValue.bearing || 0
573
+ }));
574
+ setMarkerPosition({
575
+ longitude: originalValue.longitude,
576
+ latitude: originalValue.latitude
577
+ });
578
+ onChange({ target: { name, value: originalValue, type: "json" } });
579
+ }
580
+ setSearchQuery("");
581
+ setSearchResults([]);
582
+ setShowResults(false);
583
+ setTimeout(() => {
584
+ setIsRefreshing(false);
585
+ }, 500);
586
+ }, [name, onChange, setViewState, setMarkerPosition]);
468
587
  const handleMapClick = (event) => {
469
588
  const { lngLat } = event;
470
589
  updateMarkerPosition(lngLat.lng, lngLat.lat);
@@ -537,7 +656,9 @@ function MapBoxField({ name, onChange, value, intlLabel, required }) {
537
656
  onSelectResult: handleSelectResult,
538
657
  onClear: handleClearSearch,
539
658
  showResults,
540
- setShowResults
659
+ setShowResults,
660
+ onRefresh: handleRefresh,
661
+ isRefreshing
541
662
  }
542
663
  ),
543
664
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../admin/src/pluginId.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/custom-field/MapBoxField/MapSearch.tsx","../../admin/src/components/custom-field/MapBoxField/types.ts","../../admin/src/components/custom-field/MapBoxField/hooks.ts","../../admin/src/components/custom-field/MapBoxField/DebugInfo.tsx","../../admin/src/components/custom-field/MapBoxField/index.tsx","../../admin/src/index.ts"],"sourcesContent":["export const PLUGIN_ID = 'map-box';\n","import { useEffect, useRef } from 'react';\n\nimport { PLUGIN_ID } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (id: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const ref = useRef(setPlugin);\n\n useEffect(() => {\n ref.current(PLUGIN_ID);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst ControlsContainer = styled.div`\n position: absolute;\n top: 1rem;\n left: 1rem;\n z-index: 10;\n width: 350px;\n`;\n\nconst SearchWrapper = styled.div`\n position: relative;\n`;\n\nconst SearchInputContainer = styled.div`\n display: flex;\n align-items: center;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 4px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n\n &:focus-within {\n border-color: #4945ff;\n box-shadow: 0 0 0 2px rgba(73, 69, 255, 0.2);\n }\n`;\n\nconst SearchIcon = styled.div`\n padding: 0 12px;\n color: #8e8e93;\n display: flex;\n align-items: center;\n`;\n\nconst SearchInput = styled.input`\n flex: 1;\n padding: 10px 0;\n border: none;\n font-size: 14px;\n outline: none;\n background: transparent;\n\n &::placeholder {\n color: #8e8e93;\n }\n`;\n\nconst ClearButton = styled.button`\n padding: 8px 12px;\n background: none;\n border: none;\n cursor: pointer;\n color: #8e8e93;\n display: flex;\n align-items: center;\n\n &:hover {\n color: #666;\n }\n`;\n\nconst LoadingSpinner = styled.div`\n padding: 8px 12px;\n color: #4945ff;\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n svg {\n animation: spin 1s linear infinite;\n }\n`;\n\nconst ResultsDropdown = styled.div`\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n max-height: 300px;\n overflow-y: auto;\n`;\n\nconst ResultItem = styled.button`\n width: 100%;\n padding: 12px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n background: none;\n border: none;\n border-bottom: 1px solid #f0f0f0;\n cursor: pointer;\n text-align: left;\n transition: background-color 0.15s;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background-color: #f6f6f9;\n }\n`;\n\nconst ResultIcon = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background-color: rgba(73, 69, 255, 0.1);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: #4945ff;\n`;\n\nconst ResultTextContainer = styled.div`\n flex: 1;\n min-width: 0;\n`;\n\nconst ResultTitle = styled.div`\n font-size: 14px;\n font-weight: 500;\n color: #32324d;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst ResultSubtitle = styled.div`\n font-size: 12px;\n color: #8e8e93;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-top: 2px;\n`;\n\nconst NoResults = styled.div`\n padding: 16px;\n text-align: center;\n color: #8e8e93;\n font-size: 14px;\n`;\n\nexport interface SearchResult {\n id: string;\n place_name: string;\n center: [number, number];\n place_type: string[];\n}\n\ninterface MapSearchProps {\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n searchResults: SearchResult[];\n isSearching: boolean;\n onSelectResult: (result: SearchResult) => void;\n onClear: () => void;\n showResults: boolean;\n setShowResults: (show: boolean) => void;\n}\n\nconst getPlaceIcon = (placeType: string[]) => {\n if (placeType.includes('poi')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\" />\n </svg>\n );\n }\n if (placeType.includes('address')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\" />\n </svg>\n );\n }\n if (placeType.includes('place') || placeType.includes('locality')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z\" />\n </svg>\n );\n }\n if (placeType.includes('region') || placeType.includes('country')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\" />\n </svg>\n );\n};\n\nexport const MapSearch: React.FC<MapSearchProps> = ({\n searchQuery,\n setSearchQuery,\n searchResults,\n isSearching,\n onSelectResult,\n onClear,\n showResults,\n setShowResults,\n}) => {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n setShowResults(true);\n };\n\n const handleResultClick = (result: SearchResult) => {\n onSelectResult(result);\n setShowResults(false);\n };\n\n const handleClear = () => {\n onClear();\n setShowResults(false);\n };\n\n return (\n <ControlsContainer>\n <SearchWrapper>\n <SearchInputContainer>\n <SearchIcon>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </svg>\n </SearchIcon>\n <SearchInput\n type=\"text\"\n value={searchQuery}\n onChange={handleInputChange}\n onFocus={() => setShowResults(true)}\n placeholder=\"Search for a location...\"\n />\n {isSearching && (\n <LoadingSpinner>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\" />\n </svg>\n </LoadingSpinner>\n )}\n {searchQuery && !isSearching && (\n <ClearButton onClick={handleClear} type=\"button\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n </ClearButton>\n )}\n </SearchInputContainer>\n\n {showResults && searchQuery.length > 2 && (\n <ResultsDropdown>\n {searchResults.length > 0 ? (\n searchResults.map((result) => {\n const [title, ...rest] = result.place_name.split(',');\n const subtitle = rest.join(',').trim();\n return (\n <ResultItem\n key={result.id}\n onClick={() => handleResultClick(result)}\n type=\"button\"\n >\n <ResultIcon>{getPlaceIcon(result.place_type)}</ResultIcon>\n <ResultTextContainer>\n <ResultTitle>{title}</ResultTitle>\n {subtitle && <ResultSubtitle>{subtitle}</ResultSubtitle>}\n </ResultTextContainer>\n </ResultItem>\n );\n })\n ) : !isSearching ? (\n <NoResults>No results found</NoResults>\n ) : null}\n </ResultsDropdown>\n )}\n </SearchWrapper>\n </ControlsContainer>\n );\n};\n","export type MapBoxValue = {\n longitude: number;\n latitude: number;\n zoom: number;\n pitch: number;\n bearing: number;\n address: string;\n}\n\n\nexport interface ViewState {\n longitude: number;\n latitude: number;\n zoom: number;\n pitch: number;\n bearing: number;\n padding?: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n };\n}\n\nexport const DEFAULT_VIEW_STATE: ViewState = {\n longitude: -122.4194,\n latitude: 37.7749,\n zoom: 13,\n pitch: 0,\n bearing: 0,\n padding: {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0\n }\n};","import { type MapBoxValue, type ViewState, DEFAULT_VIEW_STATE } from './types';\n\nimport { useEffect, useState } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\n\ntype config = {\n accessToken: string;\n debugMode: boolean;\n};\n\nexport const useMapBoxSettings = () => {\n const { get } = useFetchClient();\n const [config, setConfig] = useState<config | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const fetchSettings = async () => {\n try {\n setIsLoading(true);\n const { data } = await get('/map-box/get-settings');\n console.log('data from getSettings', data);\n setConfig(data);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch MapBox settings');\n } finally {\n setIsLoading(false);\n }\n };\n fetchSettings();\n }, []);\n\n return { config, isLoading, error };\n};\n\nexport const useMapLocationHook = (initialValue?: MapBoxValue) => {\n const [viewState, setViewState] = useState<ViewState>(DEFAULT_VIEW_STATE);\n const [markerPosition, setMarkerPosition] = useState({\n longitude: DEFAULT_VIEW_STATE.longitude,\n latitude: DEFAULT_VIEW_STATE.latitude,\n });\n\n useEffect(() => {\n if (initialValue) {\n console.log('Initializing from previous value:', initialValue);\n const previousValue = initialValue;\n\n setViewState((prev) => ({\n ...prev,\n longitude: previousValue.longitude,\n latitude: previousValue.latitude,\n zoom: previousValue.zoom,\n pitch: previousValue.pitch,\n bearing: previousValue.bearing,\n }));\n\n setMarkerPosition({\n longitude: previousValue.longitude,\n latitude: previousValue.latitude,\n });\n }\n }, []);\n\n return { viewState, setViewState, markerPosition, setMarkerPosition };\n};\n\nexport const useLocationService = () => {\n const { get } = useFetchClient();\n const [searchError, setSearchError] = useState<string | null>(null);\n const [searchResults, setSearchResults] = useState<any>(null);\n\n const searchLocation = async (query: string) => {\n try {\n setSearchError(null);\n const encodedQuery = encodeURIComponent(query.trim());\n const { data } = await get(`/strapi-plugin-map-box/location-search/${encodedQuery}`);\n setSearchResults(data);\n return data;\n } catch (error) {\n setSearchError(error instanceof Error ? error.message : 'An error occurred');\n return null;\n }\n };\n\n return { searchLocation, searchError, searchResults };\n};\n","import styled from 'styled-components';\nimport { ViewState } from './types';\n\n\ninterface DebugInfoProps {\n searchResults: any;\n searchError: string | null;\n viewState: ViewState;\n markerPosition: { longitude: number; latitude: number };\n searchQuery: string;\n value?: any;\n}\n\nexport function DebugInfo({ \n searchResults, \n searchError, \n viewState,\n markerPosition,\n searchQuery,\n value \n}: DebugInfoProps) {\n return (\n <DebugContainer>\n <h4>Debug Information:</h4>\n \n <DebugSection>\n <strong>Search Results:</strong>\n <DebugPre>\n {searchResults ? JSON.stringify(searchResults, null, 2) : 'No search results yet'}\n </DebugPre>\n </DebugSection>\n\n {searchError && (\n <ErrorMessage>\n <strong>Error:</strong> {searchError}\n </ErrorMessage>\n )}\n\n <DebugSection>\n <strong>Current View State:</strong>\n <DebugPre>\n {JSON.stringify(viewState, null, 2)}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Marker Position:</strong>\n <DebugPre>\n {JSON.stringify(markerPosition, null, 2)}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Search Query:</strong>\n <DebugPre>\n {searchQuery || 'No search query'}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Current Value:</strong>\n <DebugPre>\n {value ? JSON.stringify(value, null, 2) : 'No value set'}\n </DebugPre>\n </DebugSection>\n </DebugContainer>\n );\n}\n\nconst DebugContainer = styled.div`\n margin-top: 20px;\n padding: 1rem;\n background-color: #f5f5f5;\n border-radius: 4px;\n`;\n\nconst DebugSection = styled.div`\n margin-bottom: 10px;\n`;\n\nconst DebugPre = styled.pre`\n background: #ffffff;\n padding: 10px;\n border-radius: 4px;\n max-height: 200px;\n overflow: auto;\n margin: 5px 0;\n border: 1px solid #dcdce4;\n`;\n\nconst ErrorMessage = styled.div`\n color: #d02b20;\n margin-bottom: 10px;\n padding: 10px;\n background-color: #fff5f5;\n border: 1px solid #ffd7d5;\n border-radius: 4px;\n`;","import { MapBoxValue } from './types';\nimport { Field, JSONInput } from '@strapi/design-system';\n\nimport Map, {\n FullscreenControl,\n GeolocateControl,\n Marker,\n NavigationControl,\n} from 'react-map-gl/mapbox';\n\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport { MapSearch, SearchResult } from './MapSearch';\n\nimport { useMapBoxSettings, useMapLocationHook } from './hooks';\nimport { DebugInfo } from './DebugInfo';\n\ninterface MapBoxFieldProps {\n name: string;\n onChange: (event: { target: { name: string; value: object; type: string } }) => void;\n value?: MapBoxValue;\n intlLabel?: {\n defaultMessage: string;\n };\n required?: boolean;\n}\n\nexport function MapBoxField({ name, onChange, value, intlLabel, required }: MapBoxFieldProps) {\n const { get } = useFetchClient();\n const { config, isLoading, error } = useMapBoxSettings();\n const { viewState, markerPosition, setViewState, setMarkerPosition } = useMapLocationHook(value);\n\n const { accessToken, debugMode } = config || {};\n\n const [searchQuery, setSearchQuery] = useState('');\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [isSearching, setIsSearching] = useState(false);\n const [showResults, setShowResults] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const searchTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const updateMarkerPosition = useCallback(\n (lng: number, lat: number, address?: string) => {\n setMarkerPosition({ longitude: lng, latitude: lat });\n\n const newValue = {\n longitude: lng,\n latitude: lat,\n address: address || 'Selected location',\n zoom: viewState.zoom,\n pitch: viewState.pitch,\n bearing: viewState.bearing,\n };\n\n onChange({ target: { name, value: newValue, type: 'json' } });\n },\n [name, onChange, setMarkerPosition, viewState.zoom, viewState.pitch, viewState.bearing]\n );\n\n // Debounced search as user types\n useEffect(() => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n if (searchQuery.trim().length <= 2) {\n setSearchResults([]);\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n\n searchTimeoutRef.current = setTimeout(async () => {\n try {\n setSearchError(null);\n const encodedQuery = encodeURIComponent(searchQuery.trim());\n const url = `/map-box/location-search/${encodedQuery}`;\n const { data } = await get(url);\n\n if (data.features) {\n setSearchResults(\n data.features.slice(0, 5).map((feature: any) => ({\n id: feature.id,\n place_name: feature.place_name,\n center: feature.center,\n place_type: feature.place_type,\n }))\n );\n } else if (data.error) {\n setSearchError(data.error);\n setSearchResults([]);\n } else {\n setSearchResults([]);\n }\n } catch (error) {\n console.error('Error searching location:', error);\n setSearchError(error instanceof Error ? error.message : 'An error occurred');\n setSearchResults([]);\n } finally {\n setIsSearching(false);\n }\n }, 300);\n\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n };\n }, [searchQuery, get]);\n\n const handleSelectResult = useCallback(\n (result: SearchResult) => {\n const [longitude, latitude] = result.center;\n\n setViewState((prev) => ({\n ...prev,\n longitude,\n latitude,\n zoom: 14,\n transitionDuration: 1000,\n }));\n\n updateMarkerPosition(longitude, latitude, result.place_name);\n setSearchQuery(result.place_name.split(',')[0]);\n setSearchResults([]);\n setShowResults(false);\n },\n [setViewState, updateMarkerPosition]\n );\n\n const handleClearSearch = useCallback(() => {\n setSearchQuery('');\n setSearchResults([]);\n setShowResults(false);\n }, []);\n\n const handleMapClick = (event: any) => {\n const { lngLat } = event;\n updateMarkerPosition(lngLat.lng, lngLat.lat);\n };\n\n const handleMapMove = (evt: any) => {\n setViewState(evt.viewState);\n };\n\n const handleMapMoveEnd = (evt: any) => {\n const { longitude, latitude, zoom, pitch, bearing } = evt.viewState;\n\n // Save the current view state including zoom level\n const newValue = {\n longitude: markerPosition.longitude,\n latitude: markerPosition.latitude,\n address: (value as MapBoxValue)?.address || 'Selected location',\n zoom,\n pitch,\n bearing,\n };\n\n onChange({ target: { name, value: newValue, type: 'json' } });\n };\n\n const handleMarkerDragEnd = (event: any) => {\n const { lngLat } = event;\n updateMarkerPosition(lngLat.lng, lngLat.lat);\n };\n\n const handlePositionChange = (input: string) => {\n try {\n const value = JSON.parse(input);\n setViewState((prev) => ({\n ...prev,\n longitude: value.longitude,\n latitude: value.latitude,\n zoom: value.zoom || prev.zoom,\n pitch: value.pitch || prev.pitch,\n bearing: value.bearing || prev.bearing,\n }));\n setMarkerPosition({\n longitude: value.longitude,\n latitude: value.latitude,\n });\n onChange({ target: { name, value, type: 'json' } });\n } catch {\n // Handle invalid JSON\n }\n };\n\n // Construct the final JSON value to be saved\n const finalValue: MapBoxValue = {\n longitude: markerPosition.longitude,\n latitude: markerPosition.latitude,\n zoom: viewState.zoom,\n pitch: viewState.pitch,\n bearing: viewState.bearing,\n address: (value as MapBoxValue)?.address || 'Selected location',\n };\n\n const strValue = JSON.stringify(value || finalValue, null, 2);\n\n if (!accessToken || isLoading) {\n return <div>Loading...</div>;\n }\n\n if (error) {\n return <div>Error: {error}</div>;\n }\n\n return (\n <div>\n <div style={{ position: 'relative', height: '500px', width: '100%' }}>\n <MapSearch\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n searchResults={searchResults}\n isSearching={isSearching}\n onSelectResult={handleSelectResult}\n onClear={handleClearSearch}\n showResults={showResults}\n setShowResults={setShowResults}\n />\n <Map\n {...viewState}\n onMove={handleMapMove}\n onMoveEnd={handleMapMoveEnd}\n onClick={handleMapClick}\n mapStyle=\"mapbox://styles/mapbox/streets-v12\"\n mapboxAccessToken={accessToken}\n attributionControl={false}\n style={{ height: '100%', width: '100%' }}\n >\n <FullscreenControl />\n <NavigationControl />\n <GeolocateControl />\n <Marker\n longitude={markerPosition.longitude}\n latitude={markerPosition.latitude}\n color=\"#4945ff\"\n draggable\n onDragEnd={handleMarkerDragEnd}\n />\n </Map>\n </div>\n {debugMode && (\n <Field.Root name={name} required={required}>\n <Field.Label>{intlLabel?.defaultMessage ?? 'Location'}</Field.Label>\n <JSONInput value={strValue} onChange={handlePositionChange}></JSONInput>\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n )}\n\n {debugMode && (\n <DebugInfo\n viewState={viewState}\n searchResults={searchResults}\n searchError={searchError}\n markerPosition={markerPosition}\n searchQuery={searchQuery}\n value={value}\n />\n )}\n </div>\n );\n}\n","import { getTranslation } from './utils/getTranslation';\nimport { PLUGIN_ID } from './pluginId';\nimport { Initializer } from './components/Initializer';\nimport { PinMap } from '@strapi/icons';\nimport { MapBoxField } from './components/custom-field/MapBoxField/index';\n\nexport default {\n register(app: any) {\n \n app.customFields.register({\n name: 'map-box',\n type: 'json',\n icon: PinMap,\n intlLabel: {\n id: 'custom.fields.map-box.label',\n defaultMessage: 'Map Box',\n },\n intlDescription: {\n id: 'custom.fields.map-box.description',\n defaultMessage: 'Enter geographic coordinates',\n },\n components: {\n Input: () => ({ default: MapBoxField as React.ComponentType }) as any,\n },\n });\n\n app.registerPlugin({\n id: PLUGIN_ID,\n initializer: Initializer,\n isReady: false,\n name: PLUGIN_ID,\n });\n },\n\n async registerTrads({ locales }: { locales: string[] }) {\n return Promise.all(\n locales.map(async (locale) => {\n try {\n const { default: data } = await import(`./translations/${locale}.json`);\n\n return { data, locale };\n } catch {\n return { data: {}, locale };\n }\n })\n );\n },\n};\n"],"names":["useRef","useEffect","styled","jsx","jsxs","useFetchClient","useState","useCallback","error","value","Map","FullscreenControl","NavigationControl","GeolocateControl","Marker","Field","JSONInput","PinMap"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../admin/src/pluginId.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/custom-field/MapBoxField/MapSearch.tsx","../../admin/src/components/custom-field/MapBoxField/types.ts","../../admin/src/components/custom-field/MapBoxField/hooks.ts","../../admin/src/components/custom-field/MapBoxField/DebugInfo.tsx","../../admin/src/components/custom-field/MapBoxField/index.tsx","../../admin/src/index.ts"],"sourcesContent":["export const PLUGIN_ID = 'map-box';\n","import { useEffect, useRef } from 'react';\n\nimport { PLUGIN_ID } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (id: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const ref = useRef(setPlugin);\n\n useEffect(() => {\n ref.current(PLUGIN_ID);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst ControlsContainer = styled.div`\n position: absolute;\n top: 1rem;\n left: 1rem;\n right: 1rem;\n z-index: 10;\n`;\n\nconst SearchRow = styled.div`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n`;\n\nconst SearchWrapper = styled.div`\n position: relative;\n flex: 1;\n max-width: 350px;\n`;\n\nconst SearchInputContainer = styled.div`\n display: flex;\n align-items: center;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n\n &:focus-within {\n border-color: #4945ff;\n box-shadow: 0 0 0 2px rgba(73, 69, 255, 0.2);\n }\n`;\n\nconst SearchIcon = styled.div`\n padding: 0 12px;\n color: #8e8e93;\n display: flex;\n align-items: center;\n`;\n\nconst SearchInput = styled.input`\n flex: 1;\n padding: 12px 0;\n border: none;\n font-size: 14px;\n outline: none;\n background: transparent;\n\n &::placeholder {\n color: #8e8e93;\n }\n`;\n\nconst ClearButton = styled.button`\n padding: 8px 12px;\n background: none;\n border: none;\n cursor: pointer;\n color: #8e8e93;\n display: flex;\n align-items: center;\n\n &:hover {\n color: #666;\n }\n`;\n\nconst LoadingSpinner = styled.div`\n padding: 8px 12px;\n color: #4945ff;\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n svg {\n animation: spin 1s linear infinite;\n }\n`;\n\nconst RefreshButton = styled.button<{ $isRefreshing?: boolean }>`\n width: 44px;\n height: 44px;\n border-radius: 8px;\n background-color: ${(props) => (props.$isRefreshing ? '#6c63ff' : '#4945ff')};\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: all 0.15s ease;\n flex-shrink: 0;\n\n &:hover:not(:disabled) {\n background-color: #3832e0;\n }\n\n &:active:not(:disabled) {\n transform: scale(0.95);\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n svg.spinning {\n animation: spin 1s linear infinite;\n }\n`;\n\nconst ResultsDropdown = styled.div`\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n max-height: 300px;\n overflow-y: auto;\n`;\n\nconst ResultItem = styled.button`\n width: 100%;\n padding: 12px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n background: none;\n border: none;\n border-bottom: 1px solid #f0f0f0;\n cursor: pointer;\n text-align: left;\n transition: background-color 0.15s;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background-color: #f6f6f9;\n }\n`;\n\nconst ResultIcon = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background-color: rgba(73, 69, 255, 0.1);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: #4945ff;\n`;\n\nconst ResultTextContainer = styled.div`\n flex: 1;\n min-width: 0;\n`;\n\nconst ResultTitle = styled.div`\n font-size: 14px;\n font-weight: 500;\n color: #32324d;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst ResultSubtitle = styled.div`\n font-size: 12px;\n color: #8e8e93;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-top: 2px;\n`;\n\nconst NoResults = styled.div`\n padding: 16px;\n text-align: center;\n color: #8e8e93;\n font-size: 14px;\n`;\n\nexport interface SearchResult {\n id: string;\n place_name: string;\n center: [number, number];\n place_type: string[];\n}\n\ninterface MapSearchProps {\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n searchResults: SearchResult[];\n isSearching: boolean;\n onSelectResult: (result: SearchResult) => void;\n onClear: () => void;\n showResults: boolean;\n setShowResults: (show: boolean) => void;\n onRefresh?: () => void;\n isRefreshing?: boolean;\n}\n\nconst getPlaceIcon = (placeType: string[]) => {\n if (placeType.includes('poi')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\" />\n </svg>\n );\n }\n if (placeType.includes('address')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\" />\n </svg>\n );\n }\n if (placeType.includes('place') || placeType.includes('locality')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z\" />\n </svg>\n );\n }\n if (placeType.includes('region') || placeType.includes('country')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\" />\n </svg>\n );\n};\n\nexport const MapSearch: React.FC<MapSearchProps> = ({\n searchQuery,\n setSearchQuery,\n searchResults,\n isSearching,\n onSelectResult,\n onClear,\n showResults,\n setShowResults,\n onRefresh,\n isRefreshing = false,\n}) => {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n setShowResults(true);\n };\n\n const handleResultClick = (result: SearchResult) => {\n onSelectResult(result);\n setShowResults(false);\n };\n\n const handleClear = () => {\n onClear();\n setShowResults(false);\n };\n\n return (\n <ControlsContainer>\n <SearchRow>\n <SearchWrapper>\n <SearchInputContainer>\n <SearchIcon>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </svg>\n </SearchIcon>\n <SearchInput\n type=\"text\"\n value={searchQuery}\n onChange={handleInputChange}\n onFocus={() => setShowResults(true)}\n placeholder=\"Search for a location...\"\n />\n {isSearching && (\n <LoadingSpinner>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\" />\n </svg>\n </LoadingSpinner>\n )}\n {searchQuery && !isSearching && (\n <ClearButton onClick={handleClear} type=\"button\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n </ClearButton>\n )}\n </SearchInputContainer>\n\n {showResults && searchQuery.length > 2 && (\n <ResultsDropdown>\n {searchResults.length > 0 ? (\n searchResults.map((result) => {\n const [title, ...rest] = result.place_name.split(',');\n const subtitle = rest.join(',').trim();\n return (\n <ResultItem\n key={result.id}\n onClick={() => handleResultClick(result)}\n type=\"button\"\n >\n <ResultIcon>{getPlaceIcon(result.place_type)}</ResultIcon>\n <ResultTextContainer>\n <ResultTitle>{title}</ResultTitle>\n {subtitle && <ResultSubtitle>{subtitle}</ResultSubtitle>}\n </ResultTextContainer>\n </ResultItem>\n );\n })\n ) : !isSearching ? (\n <NoResults>No results found</NoResults>\n ) : null}\n </ResultsDropdown>\n )}\n </SearchWrapper>\n\n {onRefresh && (\n <RefreshButton\n onClick={onRefresh}\n disabled={isRefreshing}\n $isRefreshing={isRefreshing}\n type=\"button\"\n title=\"Refresh to original location\"\n >\n {isRefreshing ? (\n <svg\n className=\"spinning\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\" />\n </svg>\n ) : (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 21h5v-5\" />\n </svg>\n )}\n </RefreshButton>\n )}\n </SearchRow>\n </ControlsContainer>\n );\n};\n","export type MapBoxValue = {\n longitude: number;\n latitude: number;\n zoom: number;\n pitch: number;\n bearing: number;\n address: string;\n}\n\n\nexport interface ViewState {\n longitude: number;\n latitude: number;\n zoom: number;\n pitch: number;\n bearing: number;\n padding?: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n };\n}\n\nexport const DEFAULT_VIEW_STATE: ViewState = {\n longitude: -122.4194,\n latitude: 37.7749,\n zoom: 13,\n pitch: 0,\n bearing: 0,\n padding: {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0\n }\n};","import { type MapBoxValue, type ViewState, DEFAULT_VIEW_STATE } from './types';\n\nimport { useEffect, useState } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\n\ntype config = {\n accessToken: string;\n debugMode: boolean;\n};\n\nexport const useMapBoxSettings = () => {\n const { get } = useFetchClient();\n const [config, setConfig] = useState<config | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const fetchSettings = async () => {\n try {\n setIsLoading(true);\n const { data } = await get('/map-box/get-settings');\n console.log('data from getSettings', data);\n setConfig(data);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch MapBox settings');\n } finally {\n setIsLoading(false);\n }\n };\n fetchSettings();\n }, []);\n\n return { config, isLoading, error };\n};\n\nexport const useMapLocationHook = (initialValue?: MapBoxValue) => {\n const [viewState, setViewState] = useState<ViewState>(DEFAULT_VIEW_STATE);\n const [markerPosition, setMarkerPosition] = useState({\n longitude: DEFAULT_VIEW_STATE.longitude,\n latitude: DEFAULT_VIEW_STATE.latitude,\n });\n\n useEffect(() => {\n if (initialValue) {\n console.log('Initializing from previous value:', initialValue);\n const previousValue = initialValue;\n\n setViewState((prev) => ({\n ...prev,\n longitude: previousValue.longitude,\n latitude: previousValue.latitude,\n zoom: previousValue.zoom,\n pitch: previousValue.pitch,\n bearing: previousValue.bearing,\n }));\n\n setMarkerPosition({\n longitude: previousValue.longitude,\n latitude: previousValue.latitude,\n });\n }\n }, []);\n\n return { viewState, setViewState, markerPosition, setMarkerPosition };\n};\n\nexport const useLocationService = () => {\n const { get } = useFetchClient();\n const [searchError, setSearchError] = useState<string | null>(null);\n const [searchResults, setSearchResults] = useState<any>(null);\n\n const searchLocation = async (query: string) => {\n try {\n setSearchError(null);\n const encodedQuery = encodeURIComponent(query.trim());\n const { data } = await get(`/strapi-plugin-map-box/location-search/${encodedQuery}`);\n setSearchResults(data);\n return data;\n } catch (error) {\n setSearchError(error instanceof Error ? error.message : 'An error occurred');\n return null;\n }\n };\n\n return { searchLocation, searchError, searchResults };\n};\n","import styled from 'styled-components';\nimport { ViewState } from './types';\n\n\ninterface DebugInfoProps {\n searchResults: any;\n searchError: string | null;\n viewState: ViewState;\n markerPosition: { longitude: number; latitude: number };\n searchQuery: string;\n value?: any;\n}\n\nexport function DebugInfo({ \n searchResults, \n searchError, \n viewState,\n markerPosition,\n searchQuery,\n value \n}: DebugInfoProps) {\n return (\n <DebugContainer>\n <h4>Debug Information:</h4>\n \n <DebugSection>\n <strong>Search Results:</strong>\n <DebugPre>\n {searchResults ? JSON.stringify(searchResults, null, 2) : 'No search results yet'}\n </DebugPre>\n </DebugSection>\n\n {searchError && (\n <ErrorMessage>\n <strong>Error:</strong> {searchError}\n </ErrorMessage>\n )}\n\n <DebugSection>\n <strong>Current View State:</strong>\n <DebugPre>\n {JSON.stringify(viewState, null, 2)}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Marker Position:</strong>\n <DebugPre>\n {JSON.stringify(markerPosition, null, 2)}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Search Query:</strong>\n <DebugPre>\n {searchQuery || 'No search query'}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Current Value:</strong>\n <DebugPre>\n {value ? JSON.stringify(value, null, 2) : 'No value set'}\n </DebugPre>\n </DebugSection>\n </DebugContainer>\n );\n}\n\nconst DebugContainer = styled.div`\n margin-top: 20px;\n padding: 1rem;\n background-color: #f5f5f5;\n border-radius: 4px;\n`;\n\nconst DebugSection = styled.div`\n margin-bottom: 10px;\n`;\n\nconst DebugPre = styled.pre`\n background: #ffffff;\n padding: 10px;\n border-radius: 4px;\n max-height: 200px;\n overflow: auto;\n margin: 5px 0;\n border: 1px solid #dcdce4;\n`;\n\nconst ErrorMessage = styled.div`\n color: #d02b20;\n margin-bottom: 10px;\n padding: 10px;\n background-color: #fff5f5;\n border: 1px solid #ffd7d5;\n border-radius: 4px;\n`;","import { MapBoxValue } from './types';\nimport { Field, JSONInput } from '@strapi/design-system';\n\nimport Map, {\n FullscreenControl,\n GeolocateControl,\n Marker,\n NavigationControl,\n} from 'react-map-gl/mapbox';\n\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport { MapSearch, SearchResult } from './MapSearch';\n\nimport { useMapBoxSettings, useMapLocationHook } from './hooks';\nimport { DebugInfo } from './DebugInfo';\n\ninterface MapBoxFieldProps {\n name: string;\n onChange: (event: { target: { name: string; value: object; type: string } }) => void;\n value?: MapBoxValue;\n intlLabel?: {\n defaultMessage: string;\n };\n required?: boolean;\n}\n\nexport function MapBoxField({ name, onChange, value, intlLabel, required }: MapBoxFieldProps) {\n const { get } = useFetchClient();\n const { config, isLoading, error } = useMapBoxSettings();\n const { viewState, markerPosition, setViewState, setMarkerPosition } = useMapLocationHook(value);\n\n const { accessToken, debugMode } = config || {};\n\n const [searchQuery, setSearchQuery] = useState('');\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [isSearching, setIsSearching] = useState(false);\n const [showResults, setShowResults] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const searchTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const initialValueRef = useRef<MapBoxValue | null>(null);\n\n // Store the initial value on first render\n useEffect(() => {\n if (value && initialValueRef.current === null) {\n initialValueRef.current = { ...value } as MapBoxValue;\n }\n }, [value]);\n\n const updateMarkerPosition = useCallback(\n (lng: number, lat: number, address?: string) => {\n setMarkerPosition({ longitude: lng, latitude: lat });\n\n const newValue = {\n longitude: lng,\n latitude: lat,\n address: address || 'Selected location',\n zoom: viewState.zoom,\n pitch: viewState.pitch,\n bearing: viewState.bearing,\n };\n\n onChange({ target: { name, value: newValue, type: 'json' } });\n },\n [name, onChange, setMarkerPosition, viewState.zoom, viewState.pitch, viewState.bearing]\n );\n\n // Debounced search as user types\n useEffect(() => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n if (searchQuery.trim().length <= 2) {\n setSearchResults([]);\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n\n searchTimeoutRef.current = setTimeout(async () => {\n try {\n setSearchError(null);\n const encodedQuery = encodeURIComponent(searchQuery.trim());\n const url = `/map-box/location-search/${encodedQuery}`;\n const { data } = await get(url);\n\n if (data.features) {\n setSearchResults(\n data.features.slice(0, 5).map((feature: any) => ({\n id: feature.id,\n place_name: feature.place_name,\n center: feature.center,\n place_type: feature.place_type,\n }))\n );\n } else if (data.error) {\n setSearchError(data.error);\n setSearchResults([]);\n } else {\n setSearchResults([]);\n }\n } catch (error) {\n console.error('Error searching location:', error);\n setSearchError(error instanceof Error ? error.message : 'An error occurred');\n setSearchResults([]);\n } finally {\n setIsSearching(false);\n }\n }, 300);\n\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n };\n }, [searchQuery, get]);\n\n const handleSelectResult = useCallback(\n (result: SearchResult) => {\n const [longitude, latitude] = result.center;\n\n setViewState((prev) => ({\n ...prev,\n longitude,\n latitude,\n zoom: 14,\n transitionDuration: 1000,\n }));\n\n updateMarkerPosition(longitude, latitude, result.place_name);\n setSearchQuery(result.place_name.split(',')[0]);\n setSearchResults([]);\n setShowResults(false);\n },\n [setViewState, updateMarkerPosition]\n );\n\n const handleClearSearch = useCallback(() => {\n setSearchQuery('');\n setSearchResults([]);\n setShowResults(false);\n }, []);\n\n const handleRefresh = useCallback(() => {\n setIsRefreshing(true);\n\n // Reset to original saved value (from when component first loaded)\n const originalValue = initialValueRef.current;\n if (originalValue) {\n setViewState((prev) => ({\n ...prev,\n longitude: originalValue.longitude,\n latitude: originalValue.latitude,\n zoom: originalValue.zoom || 12,\n pitch: originalValue.pitch || 0,\n bearing: originalValue.bearing || 0,\n }));\n setMarkerPosition({\n longitude: originalValue.longitude,\n latitude: originalValue.latitude,\n });\n\n // Also reset the form value to original\n onChange({ target: { name, value: originalValue, type: 'json' } });\n }\n\n // Clear search state\n setSearchQuery('');\n setSearchResults([]);\n setShowResults(false);\n\n setTimeout(() => {\n setIsRefreshing(false);\n }, 500);\n }, [name, onChange, setViewState, setMarkerPosition]);\n\n const handleMapClick = (event: any) => {\n const { lngLat } = event;\n updateMarkerPosition(lngLat.lng, lngLat.lat);\n };\n\n const handleMapMove = (evt: any) => {\n setViewState(evt.viewState);\n };\n\n const handleMapMoveEnd = (evt: any) => {\n const { longitude, latitude, zoom, pitch, bearing } = evt.viewState;\n\n // Save the current view state including zoom level\n const newValue = {\n longitude: markerPosition.longitude,\n latitude: markerPosition.latitude,\n address: (value as MapBoxValue)?.address || 'Selected location',\n zoom,\n pitch,\n bearing,\n };\n\n onChange({ target: { name, value: newValue, type: 'json' } });\n };\n\n const handleMarkerDragEnd = (event: any) => {\n const { lngLat } = event;\n updateMarkerPosition(lngLat.lng, lngLat.lat);\n };\n\n const handlePositionChange = (input: string) => {\n try {\n const value = JSON.parse(input);\n setViewState((prev) => ({\n ...prev,\n longitude: value.longitude,\n latitude: value.latitude,\n zoom: value.zoom || prev.zoom,\n pitch: value.pitch || prev.pitch,\n bearing: value.bearing || prev.bearing,\n }));\n setMarkerPosition({\n longitude: value.longitude,\n latitude: value.latitude,\n });\n onChange({ target: { name, value, type: 'json' } });\n } catch {\n // Handle invalid JSON\n }\n };\n\n // Construct the final JSON value to be saved\n const finalValue: MapBoxValue = {\n longitude: markerPosition.longitude,\n latitude: markerPosition.latitude,\n zoom: viewState.zoom,\n pitch: viewState.pitch,\n bearing: viewState.bearing,\n address: (value as MapBoxValue)?.address || 'Selected location',\n };\n\n const strValue = JSON.stringify(value || finalValue, null, 2);\n\n if (!accessToken || isLoading) {\n return <div>Loading...</div>;\n }\n\n if (error) {\n return <div>Error: {error}</div>;\n }\n\n return (\n <div>\n <div style={{ position: 'relative', height: '500px', width: '100%' }}>\n <MapSearch\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n searchResults={searchResults}\n isSearching={isSearching}\n onSelectResult={handleSelectResult}\n onClear={handleClearSearch}\n showResults={showResults}\n setShowResults={setShowResults}\n onRefresh={handleRefresh}\n isRefreshing={isRefreshing}\n />\n <Map\n {...viewState}\n onMove={handleMapMove}\n onMoveEnd={handleMapMoveEnd}\n onClick={handleMapClick}\n mapStyle=\"mapbox://styles/mapbox/streets-v12\"\n mapboxAccessToken={accessToken}\n attributionControl={false}\n style={{ height: '100%', width: '100%' }}\n >\n <FullscreenControl />\n <NavigationControl />\n <GeolocateControl />\n <Marker\n longitude={markerPosition.longitude}\n latitude={markerPosition.latitude}\n color=\"#4945ff\"\n draggable\n onDragEnd={handleMarkerDragEnd}\n />\n </Map>\n </div>\n {debugMode && (\n <Field.Root name={name} required={required}>\n <Field.Label>{intlLabel?.defaultMessage ?? 'Location'}</Field.Label>\n <JSONInput value={strValue} onChange={handlePositionChange}></JSONInput>\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n )}\n\n {debugMode && (\n <DebugInfo\n viewState={viewState}\n searchResults={searchResults}\n searchError={searchError}\n markerPosition={markerPosition}\n searchQuery={searchQuery}\n value={value}\n />\n )}\n </div>\n );\n}\n","import { getTranslation } from './utils/getTranslation';\nimport { PLUGIN_ID } from './pluginId';\nimport { Initializer } from './components/Initializer';\nimport { PinMap } from '@strapi/icons';\nimport { MapBoxField } from './components/custom-field/MapBoxField/index';\n\nexport default {\n register(app: any) {\n \n app.customFields.register({\n name: 'map-box',\n type: 'json',\n icon: PinMap,\n intlLabel: {\n id: 'custom.fields.map-box.label',\n defaultMessage: 'Map Box',\n },\n intlDescription: {\n id: 'custom.fields.map-box.description',\n defaultMessage: 'Enter geographic coordinates',\n },\n components: {\n Input: () => ({ default: MapBoxField as React.ComponentType }) as any,\n },\n });\n\n app.registerPlugin({\n id: PLUGIN_ID,\n initializer: Initializer,\n isReady: false,\n name: PLUGIN_ID,\n });\n },\n\n async registerTrads({ locales }: { locales: string[] }) {\n return Promise.all(\n locales.map(async (locale) => {\n try {\n const { default: data } = await import(`./translations/${locale}.json`);\n\n return { data, locale };\n } catch {\n return { data: {}, locale };\n }\n })\n );\n },\n};\n"],"names":["useRef","useEffect","styled","jsx","jsxs","useFetchClient","useState","useCallback","error","value","Map","FullscreenControl","NavigationControl","GeolocateControl","Marker","Field","JSONInput","PinMap"],"mappings":"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"}
@@ -34,18 +34,25 @@ const ControlsContainer = styled.div`
34
34
  position: absolute;
35
35
  top: 1rem;
36
36
  left: 1rem;
37
+ right: 1rem;
37
38
  z-index: 10;
38
- width: 350px;
39
+ `;
40
+ const SearchRow = styled.div`
41
+ display: flex;
42
+ align-items: flex-start;
43
+ gap: 8px;
39
44
  `;
40
45
  const SearchWrapper = styled.div`
41
46
  position: relative;
47
+ flex: 1;
48
+ max-width: 350px;
42
49
  `;
43
50
  const SearchInputContainer = styled.div`
44
51
  display: flex;
45
52
  align-items: center;
46
53
  background: white;
47
54
  border: 1px solid #dcdce4;
48
- border-radius: 4px;
55
+ border-radius: 8px;
49
56
  overflow: hidden;
50
57
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
51
58
 
@@ -62,7 +69,7 @@ const SearchIcon = styled.div`
62
69
  `;
63
70
  const SearchInput = styled.input`
64
71
  flex: 1;
65
- padding: 10px 0;
72
+ padding: 12px 0;
66
73
  border: none;
67
74
  font-size: 14px;
68
75
  outline: none;
@@ -99,6 +106,43 @@ const LoadingSpinner = styled.div`
99
106
  animation: spin 1s linear infinite;
100
107
  }
101
108
  `;
109
+ const RefreshButton = styled.button`
110
+ width: 44px;
111
+ height: 44px;
112
+ border-radius: 8px;
113
+ background-color: ${(props) => props.$isRefreshing ? "#6c63ff" : "#4945ff"};
114
+ border: none;
115
+ cursor: pointer;
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ color: white;
120
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
121
+ transition: all 0.15s ease;
122
+ flex-shrink: 0;
123
+
124
+ &:hover:not(:disabled) {
125
+ background-color: #3832e0;
126
+ }
127
+
128
+ &:active:not(:disabled) {
129
+ transform: scale(0.95);
130
+ }
131
+
132
+ &:disabled {
133
+ cursor: not-allowed;
134
+ }
135
+
136
+ @keyframes spin {
137
+ to {
138
+ transform: rotate(360deg);
139
+ }
140
+ }
141
+
142
+ svg.spinning {
143
+ animation: spin 1s linear infinite;
144
+ }
145
+ `;
102
146
  const ResultsDropdown = styled.div`
103
147
  position: absolute;
104
148
  top: calc(100% + 4px);
@@ -106,7 +150,7 @@ const ResultsDropdown = styled.div`
106
150
  right: 0;
107
151
  background: white;
108
152
  border: 1px solid #dcdce4;
109
- border-radius: 4px;
153
+ border-radius: 8px;
110
154
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
111
155
  max-height: 300px;
112
156
  overflow-y: auto;
@@ -192,7 +236,9 @@ const MapSearch = ({
192
236
  onSelectResult,
193
237
  onClear,
194
238
  showResults,
195
- setShowResults
239
+ setShowResults,
240
+ onRefresh,
241
+ isRefreshing = false
196
242
  }) => {
197
243
  const handleInputChange = (e) => {
198
244
  setSearchQuery(e.target.value);
@@ -206,41 +252,82 @@ const MapSearch = ({
206
252
  onClear();
207
253
  setShowResults(false);
208
254
  };
209
- return /* @__PURE__ */ jsx(ControlsContainer, { children: /* @__PURE__ */ jsxs(SearchWrapper, { children: [
210
- /* @__PURE__ */ jsxs(SearchInputContainer, { children: [
211
- /* @__PURE__ */ jsx(SearchIcon, { children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" }) }) }),
212
- /* @__PURE__ */ jsx(
213
- SearchInput,
214
- {
215
- type: "text",
216
- value: searchQuery,
217
- onChange: handleInputChange,
218
- onFocus: () => setShowResults(true),
219
- placeholder: "Search for a location..."
220
- }
221
- ),
222
- isSearching && /* @__PURE__ */ jsx(LoadingSpinner, { children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z" }) }) }),
223
- searchQuery && !isSearching && /* @__PURE__ */ jsx(ClearButton, { onClick: handleClear, type: "button", children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) })
255
+ return /* @__PURE__ */ jsx(ControlsContainer, { children: /* @__PURE__ */ jsxs(SearchRow, { children: [
256
+ /* @__PURE__ */ jsxs(SearchWrapper, { children: [
257
+ /* @__PURE__ */ jsxs(SearchInputContainer, { children: [
258
+ /* @__PURE__ */ jsx(SearchIcon, { children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" }) }) }),
259
+ /* @__PURE__ */ jsx(
260
+ SearchInput,
261
+ {
262
+ type: "text",
263
+ value: searchQuery,
264
+ onChange: handleInputChange,
265
+ onFocus: () => setShowResults(true),
266
+ placeholder: "Search for a location..."
267
+ }
268
+ ),
269
+ isSearching && /* @__PURE__ */ jsx(LoadingSpinner, { children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z" }) }) }),
270
+ searchQuery && !isSearching && /* @__PURE__ */ jsx(ClearButton, { onClick: handleClear, type: "button", children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) })
271
+ ] }),
272
+ showResults && searchQuery.length > 2 && /* @__PURE__ */ jsx(ResultsDropdown, { children: searchResults.length > 0 ? searchResults.map((result) => {
273
+ const [title, ...rest] = result.place_name.split(",");
274
+ const subtitle = rest.join(",").trim();
275
+ return /* @__PURE__ */ jsxs(
276
+ ResultItem,
277
+ {
278
+ onClick: () => handleResultClick(result),
279
+ type: "button",
280
+ children: [
281
+ /* @__PURE__ */ jsx(ResultIcon, { children: getPlaceIcon(result.place_type) }),
282
+ /* @__PURE__ */ jsxs(ResultTextContainer, { children: [
283
+ /* @__PURE__ */ jsx(ResultTitle, { children: title }),
284
+ subtitle && /* @__PURE__ */ jsx(ResultSubtitle, { children: subtitle })
285
+ ] })
286
+ ]
287
+ },
288
+ result.id
289
+ );
290
+ }) : !isSearching ? /* @__PURE__ */ jsx(NoResults, { children: "No results found" }) : null })
224
291
  ] }),
225
- showResults && searchQuery.length > 2 && /* @__PURE__ */ jsx(ResultsDropdown, { children: searchResults.length > 0 ? searchResults.map((result) => {
226
- const [title, ...rest] = result.place_name.split(",");
227
- const subtitle = rest.join(",").trim();
228
- return /* @__PURE__ */ jsxs(
229
- ResultItem,
230
- {
231
- onClick: () => handleResultClick(result),
232
- type: "button",
233
- children: [
234
- /* @__PURE__ */ jsx(ResultIcon, { children: getPlaceIcon(result.place_type) }),
235
- /* @__PURE__ */ jsxs(ResultTextContainer, { children: [
236
- /* @__PURE__ */ jsx(ResultTitle, { children: title }),
237
- subtitle && /* @__PURE__ */ jsx(ResultSubtitle, { children: subtitle })
238
- ] })
239
- ]
240
- },
241
- result.id
242
- );
243
- }) : !isSearching ? /* @__PURE__ */ jsx(NoResults, { children: "No results found" }) : null })
292
+ onRefresh && /* @__PURE__ */ jsx(
293
+ RefreshButton,
294
+ {
295
+ onClick: onRefresh,
296
+ disabled: isRefreshing,
297
+ $isRefreshing: isRefreshing,
298
+ type: "button",
299
+ title: "Refresh to original location",
300
+ children: isRefreshing ? /* @__PURE__ */ jsx(
301
+ "svg",
302
+ {
303
+ className: "spinning",
304
+ width: "18",
305
+ height: "18",
306
+ viewBox: "0 0 24 24",
307
+ fill: "currentColor",
308
+ children: /* @__PURE__ */ jsx("path", { d: "M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z" })
309
+ }
310
+ ) : /* @__PURE__ */ jsxs(
311
+ "svg",
312
+ {
313
+ width: "18",
314
+ height: "18",
315
+ viewBox: "0 0 24 24",
316
+ fill: "none",
317
+ stroke: "currentColor",
318
+ strokeWidth: "2",
319
+ strokeLinecap: "round",
320
+ strokeLinejoin: "round",
321
+ children: [
322
+ /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }),
323
+ /* @__PURE__ */ jsx("path", { d: "M3 3v5h5" }),
324
+ /* @__PURE__ */ jsx("path", { d: "M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" }),
325
+ /* @__PURE__ */ jsx("path", { d: "M16 21h5v-5" })
326
+ ]
327
+ }
328
+ )
329
+ }
330
+ )
244
331
  ] }) });
245
332
  };
246
333
  const DEFAULT_VIEW_STATE = {
@@ -378,7 +465,14 @@ function MapBoxField({ name, onChange, value, intlLabel, required }) {
378
465
  const [isSearching, setIsSearching] = useState(false);
379
466
  const [showResults, setShowResults] = useState(false);
380
467
  const [searchError, setSearchError] = useState(null);
468
+ const [isRefreshing, setIsRefreshing] = useState(false);
381
469
  const searchTimeoutRef = useRef(null);
470
+ const initialValueRef = useRef(null);
471
+ useEffect(() => {
472
+ if (value && initialValueRef.current === null) {
473
+ initialValueRef.current = { ...value };
474
+ }
475
+ }, [value]);
382
476
  const updateMarkerPosition = useCallback(
383
477
  (lng, lat, address) => {
384
478
  setMarkerPosition({ longitude: lng, latitude: lat });
@@ -461,6 +555,31 @@ function MapBoxField({ name, onChange, value, intlLabel, required }) {
461
555
  setSearchResults([]);
462
556
  setShowResults(false);
463
557
  }, []);
558
+ const handleRefresh = useCallback(() => {
559
+ setIsRefreshing(true);
560
+ const originalValue = initialValueRef.current;
561
+ if (originalValue) {
562
+ setViewState((prev) => ({
563
+ ...prev,
564
+ longitude: originalValue.longitude,
565
+ latitude: originalValue.latitude,
566
+ zoom: originalValue.zoom || 12,
567
+ pitch: originalValue.pitch || 0,
568
+ bearing: originalValue.bearing || 0
569
+ }));
570
+ setMarkerPosition({
571
+ longitude: originalValue.longitude,
572
+ latitude: originalValue.latitude
573
+ });
574
+ onChange({ target: { name, value: originalValue, type: "json" } });
575
+ }
576
+ setSearchQuery("");
577
+ setSearchResults([]);
578
+ setShowResults(false);
579
+ setTimeout(() => {
580
+ setIsRefreshing(false);
581
+ }, 500);
582
+ }, [name, onChange, setViewState, setMarkerPosition]);
464
583
  const handleMapClick = (event) => {
465
584
  const { lngLat } = event;
466
585
  updateMarkerPosition(lngLat.lng, lngLat.lat);
@@ -533,7 +652,9 @@ function MapBoxField({ name, onChange, value, intlLabel, required }) {
533
652
  onSelectResult: handleSelectResult,
534
653
  onClear: handleClearSearch,
535
654
  showResults,
536
- setShowResults
655
+ setShowResults,
656
+ onRefresh: handleRefresh,
657
+ isRefreshing
537
658
  }
538
659
  ),
539
660
  /* @__PURE__ */ jsxs(
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../admin/src/pluginId.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/custom-field/MapBoxField/MapSearch.tsx","../../admin/src/components/custom-field/MapBoxField/types.ts","../../admin/src/components/custom-field/MapBoxField/hooks.ts","../../admin/src/components/custom-field/MapBoxField/DebugInfo.tsx","../../admin/src/components/custom-field/MapBoxField/index.tsx","../../admin/src/index.ts"],"sourcesContent":["export const PLUGIN_ID = 'map-box';\n","import { useEffect, useRef } from 'react';\n\nimport { PLUGIN_ID } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (id: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const ref = useRef(setPlugin);\n\n useEffect(() => {\n ref.current(PLUGIN_ID);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst ControlsContainer = styled.div`\n position: absolute;\n top: 1rem;\n left: 1rem;\n z-index: 10;\n width: 350px;\n`;\n\nconst SearchWrapper = styled.div`\n position: relative;\n`;\n\nconst SearchInputContainer = styled.div`\n display: flex;\n align-items: center;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 4px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n\n &:focus-within {\n border-color: #4945ff;\n box-shadow: 0 0 0 2px rgba(73, 69, 255, 0.2);\n }\n`;\n\nconst SearchIcon = styled.div`\n padding: 0 12px;\n color: #8e8e93;\n display: flex;\n align-items: center;\n`;\n\nconst SearchInput = styled.input`\n flex: 1;\n padding: 10px 0;\n border: none;\n font-size: 14px;\n outline: none;\n background: transparent;\n\n &::placeholder {\n color: #8e8e93;\n }\n`;\n\nconst ClearButton = styled.button`\n padding: 8px 12px;\n background: none;\n border: none;\n cursor: pointer;\n color: #8e8e93;\n display: flex;\n align-items: center;\n\n &:hover {\n color: #666;\n }\n`;\n\nconst LoadingSpinner = styled.div`\n padding: 8px 12px;\n color: #4945ff;\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n svg {\n animation: spin 1s linear infinite;\n }\n`;\n\nconst ResultsDropdown = styled.div`\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n max-height: 300px;\n overflow-y: auto;\n`;\n\nconst ResultItem = styled.button`\n width: 100%;\n padding: 12px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n background: none;\n border: none;\n border-bottom: 1px solid #f0f0f0;\n cursor: pointer;\n text-align: left;\n transition: background-color 0.15s;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background-color: #f6f6f9;\n }\n`;\n\nconst ResultIcon = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background-color: rgba(73, 69, 255, 0.1);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: #4945ff;\n`;\n\nconst ResultTextContainer = styled.div`\n flex: 1;\n min-width: 0;\n`;\n\nconst ResultTitle = styled.div`\n font-size: 14px;\n font-weight: 500;\n color: #32324d;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst ResultSubtitle = styled.div`\n font-size: 12px;\n color: #8e8e93;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-top: 2px;\n`;\n\nconst NoResults = styled.div`\n padding: 16px;\n text-align: center;\n color: #8e8e93;\n font-size: 14px;\n`;\n\nexport interface SearchResult {\n id: string;\n place_name: string;\n center: [number, number];\n place_type: string[];\n}\n\ninterface MapSearchProps {\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n searchResults: SearchResult[];\n isSearching: boolean;\n onSelectResult: (result: SearchResult) => void;\n onClear: () => void;\n showResults: boolean;\n setShowResults: (show: boolean) => void;\n}\n\nconst getPlaceIcon = (placeType: string[]) => {\n if (placeType.includes('poi')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\" />\n </svg>\n );\n }\n if (placeType.includes('address')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\" />\n </svg>\n );\n }\n if (placeType.includes('place') || placeType.includes('locality')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z\" />\n </svg>\n );\n }\n if (placeType.includes('region') || placeType.includes('country')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\" />\n </svg>\n );\n};\n\nexport const MapSearch: React.FC<MapSearchProps> = ({\n searchQuery,\n setSearchQuery,\n searchResults,\n isSearching,\n onSelectResult,\n onClear,\n showResults,\n setShowResults,\n}) => {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n setShowResults(true);\n };\n\n const handleResultClick = (result: SearchResult) => {\n onSelectResult(result);\n setShowResults(false);\n };\n\n const handleClear = () => {\n onClear();\n setShowResults(false);\n };\n\n return (\n <ControlsContainer>\n <SearchWrapper>\n <SearchInputContainer>\n <SearchIcon>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </svg>\n </SearchIcon>\n <SearchInput\n type=\"text\"\n value={searchQuery}\n onChange={handleInputChange}\n onFocus={() => setShowResults(true)}\n placeholder=\"Search for a location...\"\n />\n {isSearching && (\n <LoadingSpinner>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\" />\n </svg>\n </LoadingSpinner>\n )}\n {searchQuery && !isSearching && (\n <ClearButton onClick={handleClear} type=\"button\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n </ClearButton>\n )}\n </SearchInputContainer>\n\n {showResults && searchQuery.length > 2 && (\n <ResultsDropdown>\n {searchResults.length > 0 ? (\n searchResults.map((result) => {\n const [title, ...rest] = result.place_name.split(',');\n const subtitle = rest.join(',').trim();\n return (\n <ResultItem\n key={result.id}\n onClick={() => handleResultClick(result)}\n type=\"button\"\n >\n <ResultIcon>{getPlaceIcon(result.place_type)}</ResultIcon>\n <ResultTextContainer>\n <ResultTitle>{title}</ResultTitle>\n {subtitle && <ResultSubtitle>{subtitle}</ResultSubtitle>}\n </ResultTextContainer>\n </ResultItem>\n );\n })\n ) : !isSearching ? (\n <NoResults>No results found</NoResults>\n ) : null}\n </ResultsDropdown>\n )}\n </SearchWrapper>\n </ControlsContainer>\n );\n};\n","export type MapBoxValue = {\n longitude: number;\n latitude: number;\n zoom: number;\n pitch: number;\n bearing: number;\n address: string;\n}\n\n\nexport interface ViewState {\n longitude: number;\n latitude: number;\n zoom: number;\n pitch: number;\n bearing: number;\n padding?: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n };\n}\n\nexport const DEFAULT_VIEW_STATE: ViewState = {\n longitude: -122.4194,\n latitude: 37.7749,\n zoom: 13,\n pitch: 0,\n bearing: 0,\n padding: {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0\n }\n};","import { type MapBoxValue, type ViewState, DEFAULT_VIEW_STATE } from './types';\n\nimport { useEffect, useState } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\n\ntype config = {\n accessToken: string;\n debugMode: boolean;\n};\n\nexport const useMapBoxSettings = () => {\n const { get } = useFetchClient();\n const [config, setConfig] = useState<config | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const fetchSettings = async () => {\n try {\n setIsLoading(true);\n const { data } = await get('/map-box/get-settings');\n console.log('data from getSettings', data);\n setConfig(data);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch MapBox settings');\n } finally {\n setIsLoading(false);\n }\n };\n fetchSettings();\n }, []);\n\n return { config, isLoading, error };\n};\n\nexport const useMapLocationHook = (initialValue?: MapBoxValue) => {\n const [viewState, setViewState] = useState<ViewState>(DEFAULT_VIEW_STATE);\n const [markerPosition, setMarkerPosition] = useState({\n longitude: DEFAULT_VIEW_STATE.longitude,\n latitude: DEFAULT_VIEW_STATE.latitude,\n });\n\n useEffect(() => {\n if (initialValue) {\n console.log('Initializing from previous value:', initialValue);\n const previousValue = initialValue;\n\n setViewState((prev) => ({\n ...prev,\n longitude: previousValue.longitude,\n latitude: previousValue.latitude,\n zoom: previousValue.zoom,\n pitch: previousValue.pitch,\n bearing: previousValue.bearing,\n }));\n\n setMarkerPosition({\n longitude: previousValue.longitude,\n latitude: previousValue.latitude,\n });\n }\n }, []);\n\n return { viewState, setViewState, markerPosition, setMarkerPosition };\n};\n\nexport const useLocationService = () => {\n const { get } = useFetchClient();\n const [searchError, setSearchError] = useState<string | null>(null);\n const [searchResults, setSearchResults] = useState<any>(null);\n\n const searchLocation = async (query: string) => {\n try {\n setSearchError(null);\n const encodedQuery = encodeURIComponent(query.trim());\n const { data } = await get(`/strapi-plugin-map-box/location-search/${encodedQuery}`);\n setSearchResults(data);\n return data;\n } catch (error) {\n setSearchError(error instanceof Error ? error.message : 'An error occurred');\n return null;\n }\n };\n\n return { searchLocation, searchError, searchResults };\n};\n","import styled from 'styled-components';\nimport { ViewState } from './types';\n\n\ninterface DebugInfoProps {\n searchResults: any;\n searchError: string | null;\n viewState: ViewState;\n markerPosition: { longitude: number; latitude: number };\n searchQuery: string;\n value?: any;\n}\n\nexport function DebugInfo({ \n searchResults, \n searchError, \n viewState,\n markerPosition,\n searchQuery,\n value \n}: DebugInfoProps) {\n return (\n <DebugContainer>\n <h4>Debug Information:</h4>\n \n <DebugSection>\n <strong>Search Results:</strong>\n <DebugPre>\n {searchResults ? JSON.stringify(searchResults, null, 2) : 'No search results yet'}\n </DebugPre>\n </DebugSection>\n\n {searchError && (\n <ErrorMessage>\n <strong>Error:</strong> {searchError}\n </ErrorMessage>\n )}\n\n <DebugSection>\n <strong>Current View State:</strong>\n <DebugPre>\n {JSON.stringify(viewState, null, 2)}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Marker Position:</strong>\n <DebugPre>\n {JSON.stringify(markerPosition, null, 2)}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Search Query:</strong>\n <DebugPre>\n {searchQuery || 'No search query'}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Current Value:</strong>\n <DebugPre>\n {value ? JSON.stringify(value, null, 2) : 'No value set'}\n </DebugPre>\n </DebugSection>\n </DebugContainer>\n );\n}\n\nconst DebugContainer = styled.div`\n margin-top: 20px;\n padding: 1rem;\n background-color: #f5f5f5;\n border-radius: 4px;\n`;\n\nconst DebugSection = styled.div`\n margin-bottom: 10px;\n`;\n\nconst DebugPre = styled.pre`\n background: #ffffff;\n padding: 10px;\n border-radius: 4px;\n max-height: 200px;\n overflow: auto;\n margin: 5px 0;\n border: 1px solid #dcdce4;\n`;\n\nconst ErrorMessage = styled.div`\n color: #d02b20;\n margin-bottom: 10px;\n padding: 10px;\n background-color: #fff5f5;\n border: 1px solid #ffd7d5;\n border-radius: 4px;\n`;","import { MapBoxValue } from './types';\nimport { Field, JSONInput } from '@strapi/design-system';\n\nimport Map, {\n FullscreenControl,\n GeolocateControl,\n Marker,\n NavigationControl,\n} from 'react-map-gl/mapbox';\n\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport { MapSearch, SearchResult } from './MapSearch';\n\nimport { useMapBoxSettings, useMapLocationHook } from './hooks';\nimport { DebugInfo } from './DebugInfo';\n\ninterface MapBoxFieldProps {\n name: string;\n onChange: (event: { target: { name: string; value: object; type: string } }) => void;\n value?: MapBoxValue;\n intlLabel?: {\n defaultMessage: string;\n };\n required?: boolean;\n}\n\nexport function MapBoxField({ name, onChange, value, intlLabel, required }: MapBoxFieldProps) {\n const { get } = useFetchClient();\n const { config, isLoading, error } = useMapBoxSettings();\n const { viewState, markerPosition, setViewState, setMarkerPosition } = useMapLocationHook(value);\n\n const { accessToken, debugMode } = config || {};\n\n const [searchQuery, setSearchQuery] = useState('');\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [isSearching, setIsSearching] = useState(false);\n const [showResults, setShowResults] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const searchTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const updateMarkerPosition = useCallback(\n (lng: number, lat: number, address?: string) => {\n setMarkerPosition({ longitude: lng, latitude: lat });\n\n const newValue = {\n longitude: lng,\n latitude: lat,\n address: address || 'Selected location',\n zoom: viewState.zoom,\n pitch: viewState.pitch,\n bearing: viewState.bearing,\n };\n\n onChange({ target: { name, value: newValue, type: 'json' } });\n },\n [name, onChange, setMarkerPosition, viewState.zoom, viewState.pitch, viewState.bearing]\n );\n\n // Debounced search as user types\n useEffect(() => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n if (searchQuery.trim().length <= 2) {\n setSearchResults([]);\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n\n searchTimeoutRef.current = setTimeout(async () => {\n try {\n setSearchError(null);\n const encodedQuery = encodeURIComponent(searchQuery.trim());\n const url = `/map-box/location-search/${encodedQuery}`;\n const { data } = await get(url);\n\n if (data.features) {\n setSearchResults(\n data.features.slice(0, 5).map((feature: any) => ({\n id: feature.id,\n place_name: feature.place_name,\n center: feature.center,\n place_type: feature.place_type,\n }))\n );\n } else if (data.error) {\n setSearchError(data.error);\n setSearchResults([]);\n } else {\n setSearchResults([]);\n }\n } catch (error) {\n console.error('Error searching location:', error);\n setSearchError(error instanceof Error ? error.message : 'An error occurred');\n setSearchResults([]);\n } finally {\n setIsSearching(false);\n }\n }, 300);\n\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n };\n }, [searchQuery, get]);\n\n const handleSelectResult = useCallback(\n (result: SearchResult) => {\n const [longitude, latitude] = result.center;\n\n setViewState((prev) => ({\n ...prev,\n longitude,\n latitude,\n zoom: 14,\n transitionDuration: 1000,\n }));\n\n updateMarkerPosition(longitude, latitude, result.place_name);\n setSearchQuery(result.place_name.split(',')[0]);\n setSearchResults([]);\n setShowResults(false);\n },\n [setViewState, updateMarkerPosition]\n );\n\n const handleClearSearch = useCallback(() => {\n setSearchQuery('');\n setSearchResults([]);\n setShowResults(false);\n }, []);\n\n const handleMapClick = (event: any) => {\n const { lngLat } = event;\n updateMarkerPosition(lngLat.lng, lngLat.lat);\n };\n\n const handleMapMove = (evt: any) => {\n setViewState(evt.viewState);\n };\n\n const handleMapMoveEnd = (evt: any) => {\n const { longitude, latitude, zoom, pitch, bearing } = evt.viewState;\n\n // Save the current view state including zoom level\n const newValue = {\n longitude: markerPosition.longitude,\n latitude: markerPosition.latitude,\n address: (value as MapBoxValue)?.address || 'Selected location',\n zoom,\n pitch,\n bearing,\n };\n\n onChange({ target: { name, value: newValue, type: 'json' } });\n };\n\n const handleMarkerDragEnd = (event: any) => {\n const { lngLat } = event;\n updateMarkerPosition(lngLat.lng, lngLat.lat);\n };\n\n const handlePositionChange = (input: string) => {\n try {\n const value = JSON.parse(input);\n setViewState((prev) => ({\n ...prev,\n longitude: value.longitude,\n latitude: value.latitude,\n zoom: value.zoom || prev.zoom,\n pitch: value.pitch || prev.pitch,\n bearing: value.bearing || prev.bearing,\n }));\n setMarkerPosition({\n longitude: value.longitude,\n latitude: value.latitude,\n });\n onChange({ target: { name, value, type: 'json' } });\n } catch {\n // Handle invalid JSON\n }\n };\n\n // Construct the final JSON value to be saved\n const finalValue: MapBoxValue = {\n longitude: markerPosition.longitude,\n latitude: markerPosition.latitude,\n zoom: viewState.zoom,\n pitch: viewState.pitch,\n bearing: viewState.bearing,\n address: (value as MapBoxValue)?.address || 'Selected location',\n };\n\n const strValue = JSON.stringify(value || finalValue, null, 2);\n\n if (!accessToken || isLoading) {\n return <div>Loading...</div>;\n }\n\n if (error) {\n return <div>Error: {error}</div>;\n }\n\n return (\n <div>\n <div style={{ position: 'relative', height: '500px', width: '100%' }}>\n <MapSearch\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n searchResults={searchResults}\n isSearching={isSearching}\n onSelectResult={handleSelectResult}\n onClear={handleClearSearch}\n showResults={showResults}\n setShowResults={setShowResults}\n />\n <Map\n {...viewState}\n onMove={handleMapMove}\n onMoveEnd={handleMapMoveEnd}\n onClick={handleMapClick}\n mapStyle=\"mapbox://styles/mapbox/streets-v12\"\n mapboxAccessToken={accessToken}\n attributionControl={false}\n style={{ height: '100%', width: '100%' }}\n >\n <FullscreenControl />\n <NavigationControl />\n <GeolocateControl />\n <Marker\n longitude={markerPosition.longitude}\n latitude={markerPosition.latitude}\n color=\"#4945ff\"\n draggable\n onDragEnd={handleMarkerDragEnd}\n />\n </Map>\n </div>\n {debugMode && (\n <Field.Root name={name} required={required}>\n <Field.Label>{intlLabel?.defaultMessage ?? 'Location'}</Field.Label>\n <JSONInput value={strValue} onChange={handlePositionChange}></JSONInput>\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n )}\n\n {debugMode && (\n <DebugInfo\n viewState={viewState}\n searchResults={searchResults}\n searchError={searchError}\n markerPosition={markerPosition}\n searchQuery={searchQuery}\n value={value}\n />\n )}\n </div>\n );\n}\n","import { getTranslation } from './utils/getTranslation';\nimport { PLUGIN_ID } from './pluginId';\nimport { Initializer } from './components/Initializer';\nimport { PinMap } from '@strapi/icons';\nimport { MapBoxField } from './components/custom-field/MapBoxField/index';\n\nexport default {\n register(app: any) {\n \n app.customFields.register({\n name: 'map-box',\n type: 'json',\n icon: PinMap,\n intlLabel: {\n id: 'custom.fields.map-box.label',\n defaultMessage: 'Map Box',\n },\n intlDescription: {\n id: 'custom.fields.map-box.description',\n defaultMessage: 'Enter geographic coordinates',\n },\n components: {\n Input: () => ({ default: MapBoxField as React.ComponentType }) as any,\n },\n });\n\n app.registerPlugin({\n id: PLUGIN_ID,\n initializer: Initializer,\n isReady: false,\n name: PLUGIN_ID,\n });\n },\n\n async registerTrads({ locales }: { locales: string[] }) {\n return Promise.all(\n locales.map(async (locale) => {\n try {\n const { default: data } = await import(`./translations/${locale}.json`);\n\n return { data, locale };\n } catch {\n return { data: {}, locale };\n }\n })\n );\n },\n};\n"],"names":["error","value"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../admin/src/pluginId.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/custom-field/MapBoxField/MapSearch.tsx","../../admin/src/components/custom-field/MapBoxField/types.ts","../../admin/src/components/custom-field/MapBoxField/hooks.ts","../../admin/src/components/custom-field/MapBoxField/DebugInfo.tsx","../../admin/src/components/custom-field/MapBoxField/index.tsx","../../admin/src/index.ts"],"sourcesContent":["export const PLUGIN_ID = 'map-box';\n","import { useEffect, useRef } from 'react';\n\nimport { PLUGIN_ID } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (id: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const ref = useRef(setPlugin);\n\n useEffect(() => {\n ref.current(PLUGIN_ID);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst ControlsContainer = styled.div`\n position: absolute;\n top: 1rem;\n left: 1rem;\n right: 1rem;\n z-index: 10;\n`;\n\nconst SearchRow = styled.div`\n display: flex;\n align-items: flex-start;\n gap: 8px;\n`;\n\nconst SearchWrapper = styled.div`\n position: relative;\n flex: 1;\n max-width: 350px;\n`;\n\nconst SearchInputContainer = styled.div`\n display: flex;\n align-items: center;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n\n &:focus-within {\n border-color: #4945ff;\n box-shadow: 0 0 0 2px rgba(73, 69, 255, 0.2);\n }\n`;\n\nconst SearchIcon = styled.div`\n padding: 0 12px;\n color: #8e8e93;\n display: flex;\n align-items: center;\n`;\n\nconst SearchInput = styled.input`\n flex: 1;\n padding: 12px 0;\n border: none;\n font-size: 14px;\n outline: none;\n background: transparent;\n\n &::placeholder {\n color: #8e8e93;\n }\n`;\n\nconst ClearButton = styled.button`\n padding: 8px 12px;\n background: none;\n border: none;\n cursor: pointer;\n color: #8e8e93;\n display: flex;\n align-items: center;\n\n &:hover {\n color: #666;\n }\n`;\n\nconst LoadingSpinner = styled.div`\n padding: 8px 12px;\n color: #4945ff;\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n svg {\n animation: spin 1s linear infinite;\n }\n`;\n\nconst RefreshButton = styled.button<{ $isRefreshing?: boolean }>`\n width: 44px;\n height: 44px;\n border-radius: 8px;\n background-color: ${(props) => (props.$isRefreshing ? '#6c63ff' : '#4945ff')};\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: all 0.15s ease;\n flex-shrink: 0;\n\n &:hover:not(:disabled) {\n background-color: #3832e0;\n }\n\n &:active:not(:disabled) {\n transform: scale(0.95);\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n svg.spinning {\n animation: spin 1s linear infinite;\n }\n`;\n\nconst ResultsDropdown = styled.div`\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n max-height: 300px;\n overflow-y: auto;\n`;\n\nconst ResultItem = styled.button`\n width: 100%;\n padding: 12px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n background: none;\n border: none;\n border-bottom: 1px solid #f0f0f0;\n cursor: pointer;\n text-align: left;\n transition: background-color 0.15s;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:hover {\n background-color: #f6f6f9;\n }\n`;\n\nconst ResultIcon = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background-color: rgba(73, 69, 255, 0.1);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: #4945ff;\n`;\n\nconst ResultTextContainer = styled.div`\n flex: 1;\n min-width: 0;\n`;\n\nconst ResultTitle = styled.div`\n font-size: 14px;\n font-weight: 500;\n color: #32324d;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst ResultSubtitle = styled.div`\n font-size: 12px;\n color: #8e8e93;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-top: 2px;\n`;\n\nconst NoResults = styled.div`\n padding: 16px;\n text-align: center;\n color: #8e8e93;\n font-size: 14px;\n`;\n\nexport interface SearchResult {\n id: string;\n place_name: string;\n center: [number, number];\n place_type: string[];\n}\n\ninterface MapSearchProps {\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n searchResults: SearchResult[];\n isSearching: boolean;\n onSelectResult: (result: SearchResult) => void;\n onClear: () => void;\n showResults: boolean;\n setShowResults: (show: boolean) => void;\n onRefresh?: () => void;\n isRefreshing?: boolean;\n}\n\nconst getPlaceIcon = (placeType: string[]) => {\n if (placeType.includes('poi')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\" />\n </svg>\n );\n }\n if (placeType.includes('address')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\" />\n </svg>\n );\n }\n if (placeType.includes('place') || placeType.includes('locality')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z\" />\n </svg>\n );\n }\n if (placeType.includes('region') || placeType.includes('country')) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\" />\n </svg>\n );\n};\n\nexport const MapSearch: React.FC<MapSearchProps> = ({\n searchQuery,\n setSearchQuery,\n searchResults,\n isSearching,\n onSelectResult,\n onClear,\n showResults,\n setShowResults,\n onRefresh,\n isRefreshing = false,\n}) => {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n setShowResults(true);\n };\n\n const handleResultClick = (result: SearchResult) => {\n onSelectResult(result);\n setShowResults(false);\n };\n\n const handleClear = () => {\n onClear();\n setShowResults(false);\n };\n\n return (\n <ControlsContainer>\n <SearchRow>\n <SearchWrapper>\n <SearchInputContainer>\n <SearchIcon>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </svg>\n </SearchIcon>\n <SearchInput\n type=\"text\"\n value={searchQuery}\n onChange={handleInputChange}\n onFocus={() => setShowResults(true)}\n placeholder=\"Search for a location...\"\n />\n {isSearching && (\n <LoadingSpinner>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\" />\n </svg>\n </LoadingSpinner>\n )}\n {searchQuery && !isSearching && (\n <ClearButton onClick={handleClear} type=\"button\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n </ClearButton>\n )}\n </SearchInputContainer>\n\n {showResults && searchQuery.length > 2 && (\n <ResultsDropdown>\n {searchResults.length > 0 ? (\n searchResults.map((result) => {\n const [title, ...rest] = result.place_name.split(',');\n const subtitle = rest.join(',').trim();\n return (\n <ResultItem\n key={result.id}\n onClick={() => handleResultClick(result)}\n type=\"button\"\n >\n <ResultIcon>{getPlaceIcon(result.place_type)}</ResultIcon>\n <ResultTextContainer>\n <ResultTitle>{title}</ResultTitle>\n {subtitle && <ResultSubtitle>{subtitle}</ResultSubtitle>}\n </ResultTextContainer>\n </ResultItem>\n );\n })\n ) : !isSearching ? (\n <NoResults>No results found</NoResults>\n ) : null}\n </ResultsDropdown>\n )}\n </SearchWrapper>\n\n {onRefresh && (\n <RefreshButton\n onClick={onRefresh}\n disabled={isRefreshing}\n $isRefreshing={isRefreshing}\n type=\"button\"\n title=\"Refresh to original location\"\n >\n {isRefreshing ? (\n <svg\n className=\"spinning\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\" />\n </svg>\n ) : (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 21h5v-5\" />\n </svg>\n )}\n </RefreshButton>\n )}\n </SearchRow>\n </ControlsContainer>\n );\n};\n","export type MapBoxValue = {\n longitude: number;\n latitude: number;\n zoom: number;\n pitch: number;\n bearing: number;\n address: string;\n}\n\n\nexport interface ViewState {\n longitude: number;\n latitude: number;\n zoom: number;\n pitch: number;\n bearing: number;\n padding?: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n };\n}\n\nexport const DEFAULT_VIEW_STATE: ViewState = {\n longitude: -122.4194,\n latitude: 37.7749,\n zoom: 13,\n pitch: 0,\n bearing: 0,\n padding: {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0\n }\n};","import { type MapBoxValue, type ViewState, DEFAULT_VIEW_STATE } from './types';\n\nimport { useEffect, useState } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\n\ntype config = {\n accessToken: string;\n debugMode: boolean;\n};\n\nexport const useMapBoxSettings = () => {\n const { get } = useFetchClient();\n const [config, setConfig] = useState<config | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const fetchSettings = async () => {\n try {\n setIsLoading(true);\n const { data } = await get('/map-box/get-settings');\n console.log('data from getSettings', data);\n setConfig(data);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch MapBox settings');\n } finally {\n setIsLoading(false);\n }\n };\n fetchSettings();\n }, []);\n\n return { config, isLoading, error };\n};\n\nexport const useMapLocationHook = (initialValue?: MapBoxValue) => {\n const [viewState, setViewState] = useState<ViewState>(DEFAULT_VIEW_STATE);\n const [markerPosition, setMarkerPosition] = useState({\n longitude: DEFAULT_VIEW_STATE.longitude,\n latitude: DEFAULT_VIEW_STATE.latitude,\n });\n\n useEffect(() => {\n if (initialValue) {\n console.log('Initializing from previous value:', initialValue);\n const previousValue = initialValue;\n\n setViewState((prev) => ({\n ...prev,\n longitude: previousValue.longitude,\n latitude: previousValue.latitude,\n zoom: previousValue.zoom,\n pitch: previousValue.pitch,\n bearing: previousValue.bearing,\n }));\n\n setMarkerPosition({\n longitude: previousValue.longitude,\n latitude: previousValue.latitude,\n });\n }\n }, []);\n\n return { viewState, setViewState, markerPosition, setMarkerPosition };\n};\n\nexport const useLocationService = () => {\n const { get } = useFetchClient();\n const [searchError, setSearchError] = useState<string | null>(null);\n const [searchResults, setSearchResults] = useState<any>(null);\n\n const searchLocation = async (query: string) => {\n try {\n setSearchError(null);\n const encodedQuery = encodeURIComponent(query.trim());\n const { data } = await get(`/strapi-plugin-map-box/location-search/${encodedQuery}`);\n setSearchResults(data);\n return data;\n } catch (error) {\n setSearchError(error instanceof Error ? error.message : 'An error occurred');\n return null;\n }\n };\n\n return { searchLocation, searchError, searchResults };\n};\n","import styled from 'styled-components';\nimport { ViewState } from './types';\n\n\ninterface DebugInfoProps {\n searchResults: any;\n searchError: string | null;\n viewState: ViewState;\n markerPosition: { longitude: number; latitude: number };\n searchQuery: string;\n value?: any;\n}\n\nexport function DebugInfo({ \n searchResults, \n searchError, \n viewState,\n markerPosition,\n searchQuery,\n value \n}: DebugInfoProps) {\n return (\n <DebugContainer>\n <h4>Debug Information:</h4>\n \n <DebugSection>\n <strong>Search Results:</strong>\n <DebugPre>\n {searchResults ? JSON.stringify(searchResults, null, 2) : 'No search results yet'}\n </DebugPre>\n </DebugSection>\n\n {searchError && (\n <ErrorMessage>\n <strong>Error:</strong> {searchError}\n </ErrorMessage>\n )}\n\n <DebugSection>\n <strong>Current View State:</strong>\n <DebugPre>\n {JSON.stringify(viewState, null, 2)}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Marker Position:</strong>\n <DebugPre>\n {JSON.stringify(markerPosition, null, 2)}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Search Query:</strong>\n <DebugPre>\n {searchQuery || 'No search query'}\n </DebugPre>\n </DebugSection>\n\n <DebugSection>\n <strong>Current Value:</strong>\n <DebugPre>\n {value ? JSON.stringify(value, null, 2) : 'No value set'}\n </DebugPre>\n </DebugSection>\n </DebugContainer>\n );\n}\n\nconst DebugContainer = styled.div`\n margin-top: 20px;\n padding: 1rem;\n background-color: #f5f5f5;\n border-radius: 4px;\n`;\n\nconst DebugSection = styled.div`\n margin-bottom: 10px;\n`;\n\nconst DebugPre = styled.pre`\n background: #ffffff;\n padding: 10px;\n border-radius: 4px;\n max-height: 200px;\n overflow: auto;\n margin: 5px 0;\n border: 1px solid #dcdce4;\n`;\n\nconst ErrorMessage = styled.div`\n color: #d02b20;\n margin-bottom: 10px;\n padding: 10px;\n background-color: #fff5f5;\n border: 1px solid #ffd7d5;\n border-radius: 4px;\n`;","import { MapBoxValue } from './types';\nimport { Field, JSONInput } from '@strapi/design-system';\n\nimport Map, {\n FullscreenControl,\n GeolocateControl,\n Marker,\n NavigationControl,\n} from 'react-map-gl/mapbox';\n\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport { MapSearch, SearchResult } from './MapSearch';\n\nimport { useMapBoxSettings, useMapLocationHook } from './hooks';\nimport { DebugInfo } from './DebugInfo';\n\ninterface MapBoxFieldProps {\n name: string;\n onChange: (event: { target: { name: string; value: object; type: string } }) => void;\n value?: MapBoxValue;\n intlLabel?: {\n defaultMessage: string;\n };\n required?: boolean;\n}\n\nexport function MapBoxField({ name, onChange, value, intlLabel, required }: MapBoxFieldProps) {\n const { get } = useFetchClient();\n const { config, isLoading, error } = useMapBoxSettings();\n const { viewState, markerPosition, setViewState, setMarkerPosition } = useMapLocationHook(value);\n\n const { accessToken, debugMode } = config || {};\n\n const [searchQuery, setSearchQuery] = useState('');\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [isSearching, setIsSearching] = useState(false);\n const [showResults, setShowResults] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const searchTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const initialValueRef = useRef<MapBoxValue | null>(null);\n\n // Store the initial value on first render\n useEffect(() => {\n if (value && initialValueRef.current === null) {\n initialValueRef.current = { ...value } as MapBoxValue;\n }\n }, [value]);\n\n const updateMarkerPosition = useCallback(\n (lng: number, lat: number, address?: string) => {\n setMarkerPosition({ longitude: lng, latitude: lat });\n\n const newValue = {\n longitude: lng,\n latitude: lat,\n address: address || 'Selected location',\n zoom: viewState.zoom,\n pitch: viewState.pitch,\n bearing: viewState.bearing,\n };\n\n onChange({ target: { name, value: newValue, type: 'json' } });\n },\n [name, onChange, setMarkerPosition, viewState.zoom, viewState.pitch, viewState.bearing]\n );\n\n // Debounced search as user types\n useEffect(() => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n if (searchQuery.trim().length <= 2) {\n setSearchResults([]);\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n\n searchTimeoutRef.current = setTimeout(async () => {\n try {\n setSearchError(null);\n const encodedQuery = encodeURIComponent(searchQuery.trim());\n const url = `/map-box/location-search/${encodedQuery}`;\n const { data } = await get(url);\n\n if (data.features) {\n setSearchResults(\n data.features.slice(0, 5).map((feature: any) => ({\n id: feature.id,\n place_name: feature.place_name,\n center: feature.center,\n place_type: feature.place_type,\n }))\n );\n } else if (data.error) {\n setSearchError(data.error);\n setSearchResults([]);\n } else {\n setSearchResults([]);\n }\n } catch (error) {\n console.error('Error searching location:', error);\n setSearchError(error instanceof Error ? error.message : 'An error occurred');\n setSearchResults([]);\n } finally {\n setIsSearching(false);\n }\n }, 300);\n\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n };\n }, [searchQuery, get]);\n\n const handleSelectResult = useCallback(\n (result: SearchResult) => {\n const [longitude, latitude] = result.center;\n\n setViewState((prev) => ({\n ...prev,\n longitude,\n latitude,\n zoom: 14,\n transitionDuration: 1000,\n }));\n\n updateMarkerPosition(longitude, latitude, result.place_name);\n setSearchQuery(result.place_name.split(',')[0]);\n setSearchResults([]);\n setShowResults(false);\n },\n [setViewState, updateMarkerPosition]\n );\n\n const handleClearSearch = useCallback(() => {\n setSearchQuery('');\n setSearchResults([]);\n setShowResults(false);\n }, []);\n\n const handleRefresh = useCallback(() => {\n setIsRefreshing(true);\n\n // Reset to original saved value (from when component first loaded)\n const originalValue = initialValueRef.current;\n if (originalValue) {\n setViewState((prev) => ({\n ...prev,\n longitude: originalValue.longitude,\n latitude: originalValue.latitude,\n zoom: originalValue.zoom || 12,\n pitch: originalValue.pitch || 0,\n bearing: originalValue.bearing || 0,\n }));\n setMarkerPosition({\n longitude: originalValue.longitude,\n latitude: originalValue.latitude,\n });\n\n // Also reset the form value to original\n onChange({ target: { name, value: originalValue, type: 'json' } });\n }\n\n // Clear search state\n setSearchQuery('');\n setSearchResults([]);\n setShowResults(false);\n\n setTimeout(() => {\n setIsRefreshing(false);\n }, 500);\n }, [name, onChange, setViewState, setMarkerPosition]);\n\n const handleMapClick = (event: any) => {\n const { lngLat } = event;\n updateMarkerPosition(lngLat.lng, lngLat.lat);\n };\n\n const handleMapMove = (evt: any) => {\n setViewState(evt.viewState);\n };\n\n const handleMapMoveEnd = (evt: any) => {\n const { longitude, latitude, zoom, pitch, bearing } = evt.viewState;\n\n // Save the current view state including zoom level\n const newValue = {\n longitude: markerPosition.longitude,\n latitude: markerPosition.latitude,\n address: (value as MapBoxValue)?.address || 'Selected location',\n zoom,\n pitch,\n bearing,\n };\n\n onChange({ target: { name, value: newValue, type: 'json' } });\n };\n\n const handleMarkerDragEnd = (event: any) => {\n const { lngLat } = event;\n updateMarkerPosition(lngLat.lng, lngLat.lat);\n };\n\n const handlePositionChange = (input: string) => {\n try {\n const value = JSON.parse(input);\n setViewState((prev) => ({\n ...prev,\n longitude: value.longitude,\n latitude: value.latitude,\n zoom: value.zoom || prev.zoom,\n pitch: value.pitch || prev.pitch,\n bearing: value.bearing || prev.bearing,\n }));\n setMarkerPosition({\n longitude: value.longitude,\n latitude: value.latitude,\n });\n onChange({ target: { name, value, type: 'json' } });\n } catch {\n // Handle invalid JSON\n }\n };\n\n // Construct the final JSON value to be saved\n const finalValue: MapBoxValue = {\n longitude: markerPosition.longitude,\n latitude: markerPosition.latitude,\n zoom: viewState.zoom,\n pitch: viewState.pitch,\n bearing: viewState.bearing,\n address: (value as MapBoxValue)?.address || 'Selected location',\n };\n\n const strValue = JSON.stringify(value || finalValue, null, 2);\n\n if (!accessToken || isLoading) {\n return <div>Loading...</div>;\n }\n\n if (error) {\n return <div>Error: {error}</div>;\n }\n\n return (\n <div>\n <div style={{ position: 'relative', height: '500px', width: '100%' }}>\n <MapSearch\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n searchResults={searchResults}\n isSearching={isSearching}\n onSelectResult={handleSelectResult}\n onClear={handleClearSearch}\n showResults={showResults}\n setShowResults={setShowResults}\n onRefresh={handleRefresh}\n isRefreshing={isRefreshing}\n />\n <Map\n {...viewState}\n onMove={handleMapMove}\n onMoveEnd={handleMapMoveEnd}\n onClick={handleMapClick}\n mapStyle=\"mapbox://styles/mapbox/streets-v12\"\n mapboxAccessToken={accessToken}\n attributionControl={false}\n style={{ height: '100%', width: '100%' }}\n >\n <FullscreenControl />\n <NavigationControl />\n <GeolocateControl />\n <Marker\n longitude={markerPosition.longitude}\n latitude={markerPosition.latitude}\n color=\"#4945ff\"\n draggable\n onDragEnd={handleMarkerDragEnd}\n />\n </Map>\n </div>\n {debugMode && (\n <Field.Root name={name} required={required}>\n <Field.Label>{intlLabel?.defaultMessage ?? 'Location'}</Field.Label>\n <JSONInput value={strValue} onChange={handlePositionChange}></JSONInput>\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n )}\n\n {debugMode && (\n <DebugInfo\n viewState={viewState}\n searchResults={searchResults}\n searchError={searchError}\n markerPosition={markerPosition}\n searchQuery={searchQuery}\n value={value}\n />\n )}\n </div>\n );\n}\n","import { getTranslation } from './utils/getTranslation';\nimport { PLUGIN_ID } from './pluginId';\nimport { Initializer } from './components/Initializer';\nimport { PinMap } from '@strapi/icons';\nimport { MapBoxField } from './components/custom-field/MapBoxField/index';\n\nexport default {\n register(app: any) {\n \n app.customFields.register({\n name: 'map-box',\n type: 'json',\n icon: PinMap,\n intlLabel: {\n id: 'custom.fields.map-box.label',\n defaultMessage: 'Map Box',\n },\n intlDescription: {\n id: 'custom.fields.map-box.description',\n defaultMessage: 'Enter geographic coordinates',\n },\n components: {\n Input: () => ({ default: MapBoxField as React.ComponentType }) as any,\n },\n });\n\n app.registerPlugin({\n id: PLUGIN_ID,\n initializer: Initializer,\n isReady: false,\n name: PLUGIN_ID,\n });\n },\n\n async registerTrads({ locales }: { locales: string[] }) {\n return Promise.all(\n locales.map(async (locale) => {\n try {\n const { default: data } = await import(`./translations/${locale}.json`);\n\n return { data, locale };\n } catch {\n return { data: {}, locale };\n }\n })\n );\n },\n};\n"],"names":["error","value"],"mappings":"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"}
@@ -14,6 +14,8 @@ interface MapSearchProps {
14
14
  onClear: () => void;
15
15
  showResults: boolean;
16
16
  setShowResults: (show: boolean) => void;
17
+ onRefresh?: () => void;
18
+ isRefreshing?: boolean;
17
19
  }
18
20
  export declare const MapSearch: React.FC<MapSearchProps>;
19
21
  export {};
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.0.3",
2
+ "version": "0.0.4",
3
3
  "keywords": [
4
4
  "mapbox",
5
5
  "map",