{"version":3,"file":"useListingUrlState-DAdX0MAW.js","sources":["../../src/scripts/modules/react-modules/Listings/hooks/useListingUrlState.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { FacetProps, SortOptions } from '../types';\n\nexport interface ListingUrlState {\n  searchTerm: string;\n  orderBy: SortOptions;\n  pagination: {\n    skip: number;\n    limit: number;\n    total: number;\n  };\n  facets: FacetProps[];\n}\n\ninterface UseListingUrlStateProps {\n  defaultLimit: number;\n  initialFacets: FacetProps[];\n  initialSort?: SortOptions;\n}\n\nexport const useListingUrlState = ({\n  defaultLimit,\n  initialFacets,\n  initialSort\n}: UseListingUrlStateProps) => {\n  const urlParams = new URLSearchParams(window.location.search);\n\n  // Initialize state from URL\n  const [searchTerm, setSearchTerm] = useState(urlParams.get('search') || '');\n  const [orderBy, setOrderBy] = useState<SortOptions>(\n    (urlParams.get('sort') as SortOptions) || initialSort || SortOptions.RELEVANCE\n  );\n  const [pagination, setPagination] = useState({\n    skip: parseInt(urlParams.get('skip') || '0'),\n    limit: parseInt(urlParams.get('limit') || defaultLimit.toString()),\n    total: 0\n  });\n\n  // Initialize facets with URL values\n  const urlFacets = urlParams.get('facets') ? JSON.parse(urlParams.get('facets')!) : [];\n  const [facets, setFacets] = useState<FacetProps[]>(\n    initialFacets.map(facet => {\n      const urlFacet = urlFacets.find((f: FacetProps) => f.id === facet.id);\n      if (facet.id === 'date-range') {\n        return {\n          ...facet,\n          items: urlFacet && urlFacet.items ? urlFacet.items : facet.items,\n          value: facet.value // keep original value (likely null)\n        };\n      } else {\n        return {\n          ...facet,\n          items: facet.items || [],\n          value: urlFacet?.value !== undefined ? urlFacet.value : facet.value\n        };\n      }\n    })\n  );\n\n  const updateUrlParams = useCallback(\n    (params: {\n      searchTerm?: string;\n      facets?: FacetProps[];\n      orderBy?: SortOptions;\n      skip?: number;\n      limit?: number;\n    }) => {\n      const urlParams = new URLSearchParams(window.location.search);\n\n      if (params.searchTerm !== undefined) {\n        params.searchTerm ? urlParams.set('search', params.searchTerm) : urlParams.delete('search');\n      }\n\n      if (params.facets !== undefined) {\n        const filteredFacets = params.facets.filter(f => {\n          if (f.id === 'date-range') {\n            // Include if any item has a non-empty value\n            return f.items.some(item => item.value && item.value !== '');\n          }\n          return f.value !== null;\n        });\n        filteredFacets.length > 0\n          ? urlParams.set('facets', JSON.stringify(filteredFacets))\n          : urlParams.delete('facets');\n      }\n\n      if (params.orderBy !== undefined) {\n        params.orderBy !== SortOptions.RELEVANCE\n          ? urlParams.set('sort', params.orderBy)\n          : urlParams.delete('sort');\n      }\n\n      if (params.skip !== undefined) {\n        params.skip > 0 ? urlParams.set('skip', params.skip.toString()) : urlParams.delete('skip');\n      }\n\n      if (params.limit !== undefined && params.limit !== defaultLimit) {\n        urlParams.set('limit', params.limit.toString());\n      }\n\n      const newUrl = `${window.location.pathname}${urlParams.toString() ? '?' + urlParams.toString() : ''}`;\n      window.history.replaceState({}, '', newUrl);\n    },\n    [defaultLimit]\n  );\n\n  const handleSearchTermChange = (newSearchTerm: string) => {\n    setSearchTerm(newSearchTerm);\n    setPagination(prev => ({ ...prev, skip: 0 }));\n    updateUrlParams({ searchTerm: newSearchTerm, skip: 0 });\n  };\n\n  const handleFacetsChange = (newFacets: FacetProps[]) => {\n    setFacets(newFacets);\n    setPagination(prev => ({ ...prev, skip: 0 }));\n    updateUrlParams({ facets: newFacets, skip: 0 });\n  };\n\n  const handleOrderByChange = (newOrderBy: string) => {\n    setOrderBy(newOrderBy as SortOptions);\n    setPagination(prev => ({ ...prev, skip: 0 }));\n    updateUrlParams({ orderBy: newOrderBy as SortOptions, skip: 0 });\n  };\n\n  const handlePaginationChange = (newPagination: typeof pagination) => {\n    setPagination(newPagination);\n    updateUrlParams({ skip: newPagination.skip, limit: newPagination.limit });\n  };\n\n  return {\n    searchTerm,\n    orderBy,\n    pagination,\n    facets,\n    setFacets,\n    setPagination,\n    handleSearchTermChange,\n    handleFacetsChange,\n    handleOrderByChange,\n    handlePaginationChange\n  };\n};\n"],"names":["useListingUrlState","defaultLimit","initialFacets","initialSort","urlParams","searchTerm","setSearchTerm","useState","orderBy","setOrderBy","SortOptions","pagination","setPagination","urlFacets","facets","setFacets","facet","urlFacet","f","updateUrlParams","useCallback","params","filteredFacets","item","newUrl","newSearchTerm","prev","newFacets","newOrderBy","newPagination"],"mappings":"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"}