UNPKG

strapi-plugin-map-box

Version:
1 lines 41.1 kB
{"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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"}