import { useEffect, useMemo } from "react"; import { DEFAULT_MAP_FILTERS, getMapObjectDisplayLabel, objectZoneId, } from "../../lib/locationMapUtils"; import { LocationMapLayerPanel, LocationMapOverview, MAP_DISPLAY_CONTROLS, SelectedMapObjectForm, SelectedZoneItemsPanel, UnmappedItemsPanel, } from "./LocationMapBottomSheetSections"; const EMPTY_ITEMS = []; export default function LocationMapBottomSheet({ mode, editorTool, canManage, filters, setFilters, layersOpen, setLayersOpen, selectedObject, mapObjects = [], selectedZoneItems = EMPTY_ITEMS, visibleAssignedItemCount = 0, visibleUnmappedItems = EMPTY_ITEMS, unmappedItemCount = 0, hiddenAreaCount, saving, savingAction, hasUnsavedChanges, mapState, onAddObject, onSaveDraft, onPublish, onPreviewDraft, onObjectField, onZoneLinkChange, onDuplicateObject, onDeleteObject, onShowHiddenAreas, onClearSelection, onSelectZoneItem, onSelectUnmappedItem, }) { const selectedTitle = getMapObjectDisplayLabel(selectedObject); const selectedZoneId = objectZoneId(selectedObject); const mapItems = mapState?.items || EMPTY_ITEMS; const { assignedItemCount, selectedAssignedItems } = useMemo(() => { const nextSelectedAssignedItems = []; let nextAssignedItemCount = 0; mapItems.forEach((item) => { if (!item.zone_id) return; nextAssignedItemCount += 1; if (selectedZoneId && String(item.zone_id) === selectedZoneId) { nextSelectedAssignedItems.push(item); } }); return { assignedItemCount: nextAssignedItemCount, selectedAssignedItems: nextSelectedAssignedItems, }; }, [mapItems, selectedZoneId]); const hiddenSelectedItemCount = Math.max(0, selectedAssignedItems.length - selectedZoneItems.length); const hasHiddenSelectedItems = hiddenSelectedItemCount > 0; const selectedItemCountLabel = hasHiddenSelectedItems ? `${selectedZoneItems.length} shown` : `${selectedZoneItems.length} item${selectedZoneItems.length === 1 ? "" : "s"}`; const sheetTitle = mode === "edit" ? selectedObject && editorTool === "edit" ? selectedTitle : editorTool === "edit" ? "Edit Areas" : "Move Map" : selectedObject ? selectedTitle : "Map Details"; const showHeaderItemCount = mode !== "edit" && Boolean(selectedObject); const showEditorControls = mode === "edit" && canManage; const showSelectedObjectForm = Boolean(mode === "edit" && editorTool === "edit" && selectedObject); const showUnmappedPanel = filters.showUnmapped && !selectedObject; useEffect(() => { if (selectedObject) { setLayersOpen(false); } }, [selectedObject, setLayersOpen]); const changedLayerCount = useMemo( () => MAP_DISPLAY_CONTROLS.filter(([key]) => filters[key] !== DEFAULT_MAP_FILTERS[key]).length, [filters] ); const totalAreaCount = mapObjects.length; const visibleAreaCount = filters.showZones ? Math.max(0, totalAreaCount - hiddenAreaCount) : 0; const hasNoVisibleAreas = filters.showZones && totalAreaCount > 0 && visibleAreaCount === 0 && hiddenAreaCount > 0; const showMapOverview = mode !== "edit" && !selectedObject; const unlinkedAreaCount = useMemo( () => mapObjects.filter((object) => !objectZoneId(object)).length, [mapObjects] ); const showDraftOverview = mode === "edit" && editorTool === "edit" && !selectedObject; const draftOverviewRows = [ { label: "Areas", value: totalAreaCount }, ...(hiddenAreaCount > 0 ? [{ label: "Hidden", value: hiddenAreaCount }] : []), ...(unlinkedAreaCount > 0 ? [{ label: "Unlinked", value: unlinkedAreaCount }] : []), ]; const hiddenUnmappedItemCount = Math.max(0, unmappedItemCount - visibleUnmappedItems.length); const hasHiddenUnmappedItems = filters.showUnmapped && unmappedItemCount > 0 && visibleUnmappedItems.length === 0; const hiddenAreaLabel = `Show Hidden Areas (${hiddenAreaCount})`; const showHiddenAreaAction = showEditorControls && hiddenAreaCount > 0 && filters.showZones && !hasNoVisibleAreas; const saveDraftLabel = savingAction === "save" ? "Saving..." : "Save Draft"; const publishLabel = savingAction === "publish" ? "Publishing..." : "Publish"; const mappedItemSummary = assignedItemCount === visibleAssignedItemCount ? String(assignedItemCount) : `${visibleAssignedItemCount} shown`; const unmappedItemSummary = !filters.showUnmapped && unmappedItemCount > 0 ? `${unmappedItemCount} hidden` : visibleUnmappedItems.length === unmappedItemCount ? String(unmappedItemCount) : `${visibleUnmappedItems.length} shown`; const mapOverviewRows = [ { label: "Areas", value: filters.showZones ? `${visibleAreaCount} shown` : "Hidden" }, ...(assignedItemCount > 0 ? [{ label: "Mapped items", value: mappedItemSummary }] : []), ...(unmappedItemCount > 0 ? [{ label: "Unmapped", value: unmappedItemSummary }] : []), ]; const resetLayerFilters = () => setFilters({ ...DEFAULT_MAP_FILTERS }); const showSelectedZoneItems = () => { setFilters((current) => ({ ...current, showMyItems: true, showOtherItems: true, showCompleted: true, })); }; const showUnmappedItems = () => { setFilters((current) => ({ ...current, showUnmapped: true, showMyItems: true, showOtherItems: true, showCompleted: true, })); }; const primaryDraftActions = showEditorControls ? (
) : null; const secondaryDraftActions = showEditorControls ? (
{!showSelectedObjectForm ? ( ) : null}
) : null; const editorActions = showEditorControls ? (
{primaryDraftActions} {secondaryDraftActions}
) : null; return ( ); }