{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { useState, useEffect } from \"react\"\n\n/**\n * Hook for managing URL query parameters\n * @template TParams - The shape of the query parameters.\n * @param {object} [options] - Configuration options.\n * @param {boolean} [options.deleteFalseValues=false] - Whether to delete the parameter if the parameter value is a false value.\n * @param {'replace' | 'push'} [options.method='push'] - Method to use for history updates.\n * @returns {object} - An object containing methods to set, append, get, delete query parameters and searchParams.\n */\nexport const useStatefulParams = <TParams extends Record<string, any>>(\n  options: {\n    method?: \"replace\" | \"push\"\n    deleteFalseValues?: boolean\n  } = {}\n) => {\n  const { method = \"push\", deleteFalseValues = true } = options\n  const [searchParams, setSearchParams] = useState<URLSearchParams>(() => {\n    return new URLSearchParams(window.location.search)\n  })\n\n  useEffect(() => {\n    const handlePopState = () => {\n      const newParams = new URLSearchParams(window.location.search)\n      setSearchParams(newParams)\n    }\n    window.addEventListener(\"popstate\", handlePopState)\n    return () => window.removeEventListener(\"popstate\", handlePopState)\n  }, [])\n\n  const updateUrl = (newParams: URLSearchParams) => {\n    const newParamsString = newParams.toString()\n    const currentParamsString = searchParams.toString()\n\n    if (newParamsString !== currentParamsString) {\n      const newUrl = new URL(window.location.href)\n      newUrl.search = newParamsString\n\n      if (method === \"replace\") {\n        window.history.replaceState(null, \"\", newUrl)\n      } else {\n        window.history.pushState(null, \"\", newUrl)\n      }\n\n      setSearchParams(newParams)\n    }\n  }\n\n  const set = (params: Partial<TParams>) => {\n    const newSearchParams = new URLSearchParams(searchParams.toString())\n\n    for (const [key, value] of Object.entries(params)) {\n      if (\n        value === null ||\n        value === undefined ||\n        (deleteFalseValues && !value)\n      ) {\n        newSearchParams.delete(key)\n      } else if (Array.isArray(value)) {\n        newSearchParams.delete(key)\n        value.forEach(val => newSearchParams.append(key, String(val)))\n      } else {\n        newSearchParams.set(key, String(value))\n      }\n    }\n\n    updateUrl(newSearchParams)\n    return Object.fromEntries(newSearchParams.entries())\n  }\n\n  const append = (params: Partial<TParams>) => {\n    const newSearchParams = new URLSearchParams(searchParams.toString())\n\n    for (const [key, value] of Object.entries(params)) {\n      if (Array.isArray(value)) {\n        value.forEach(val => newSearchParams.append(key, String(val)))\n      } else {\n        newSearchParams.append(key, String(value))\n      }\n    }\n\n    updateUrl(newSearchParams)\n    return Object.fromEntries(newSearchParams.entries())\n  }\n\n  const deleteParam = (keys: keyof TParams | (keyof TParams)[]) => {\n    const newSearchParams = new URLSearchParams(searchParams.toString())\n\n    if (Array.isArray(keys)) {\n      keys.forEach(key => newSearchParams.delete(key as string))\n    } else {\n      newSearchParams.delete(keys as string)\n    }\n\n    updateUrl(newSearchParams)\n    return Object.fromEntries(newSearchParams.entries())\n  }\n\n  const clear = () => {\n    const newSearchParams = new URLSearchParams()\n    updateUrl(newSearchParams)\n    return Object.fromEntries(newSearchParams.entries())\n  }\n\n  const get = <K extends keyof TParams>(key: K): TParams[K] | null => {\n    return searchParams.get(key as string) as TParams[K] | null\n  }\n\n  const searchParamsObj = Object.fromEntries(searchParams.entries()) as TParams\n\n  return {\n    set,\n    append,\n    deleteParam,\n    clear,\n    get,\n    searchParams: searchParamsObj\n  }\n}\n"],"names":["useStatefulParams","options","_a","method","_b","deleteFalseValues","_c","useState","URLSearchParams","window","location","search","searchParams","setSearchParams","useEffect","handlePopState","newParams","addEventListener","removeEventListener","updateUrl","newParamsString","toString","newUrl","URL","href","history","replaceState","pushState","set","params","newSearchParams","_loop_1","key","value","delete","Array","isArray","forEach","val","append","String","_i","Object","entries","length","fromEntries","_loop_2","deleteParam","keys","clear","get"],"mappings":"gDAUO,IAAMA,EAAoB,SAC/BC,QAAA,IAAAA,IAAAA,EAGM,CAAA,GAEE,IAAAC,EAA8CD,EAAOE,OAArDA,aAAS,OAAMD,EAAEE,EAA6BH,EAALI,kBAAxBA,OAAoB,IAAAD,KACvCE,EAAkCC,GAA0B,WAChE,OAAO,IAAIC,gBAAgBC,OAAOC,SAASC,OAC7C,IAFOC,OAAcC,OAIrBC,GAAU,WACR,IAAMC,EAAiB,WACrB,IAAMC,EAAY,IAAIR,gBAAgBC,OAAOC,SAASC,QACtDE,EAAgBG,EACjB,EAED,OADAP,OAAOQ,iBAAiB,WAAYF,GAC7B,WAAM,OAAAN,OAAOS,oBAAoB,WAAYH,EAAe,CACpE,GAAE,IAEH,IAAMI,EAAY,SAACH,GACjB,IAAMI,EAAkBJ,EAAUK,WAGlC,GAAID,IAFwBR,EAAaS,WAEI,CAC3C,IAAMC,EAAS,IAAIC,IAAId,OAAOC,SAASc,MACvCF,EAAOX,OAASS,EAED,YAAXjB,EACFM,OAAOgB,QAAQC,aAAa,KAAM,GAAIJ,GAEtCb,OAAOgB,QAAQE,UAAU,KAAM,GAAIL,GAGrCT,EAAgBG,GAEnB,EAgED,MAAO,CACLY,IA/DU,SAACC,GAGX,IAFA,IAAMC,EAAkB,IAAItB,gBAAgBI,EAAaS,YAE7CU,EAAA,SAAAC,EAAKC,GAEbA,SAEC5B,IAAsB4B,EAEvBH,EAAgBI,OAAOF,GACdG,MAAMC,QAAQH,IACvBH,EAAgBI,OAAOF,GACvBC,EAAMI,SAAQ,SAAAC,GAAO,OAAAR,EAAgBS,OAAOP,EAAKQ,OAAOF,GAAK,KAE7DR,EAAgBF,IAAII,EAAKQ,OAAOP,KAXaQ,EAAA,EAAtBvC,EAAAwC,OAAOC,QAAQd,GAAfY,EAAsBvC,EAAA0C,OAAtBH,IAAsB,CAAtC,IAAArC,OAAC2B,EAAG3B,EAAA,GAAOA,EAAA,GAarB,CAGD,OADAe,EAAUW,GACHY,OAAOG,YAAYf,EAAgBa,UAC3C,EA4CCJ,OA1Ca,SAACV,GAGd,IAFA,IAAMC,EAAkB,IAAItB,gBAAgBI,EAAaS,YAE7CyB,EAAA,SAAAd,EAAKC,GACXE,MAAMC,QAAQH,GAChBA,EAAMI,SAAQ,SAAAC,GAAO,OAAAR,EAAgBS,OAAOP,EAAKQ,OAAOF,GAAK,IAE7DR,EAAgBS,OAAOP,EAAKQ,OAAOP,KAJUQ,EAAA,EAAtBvC,EAAAwC,OAAOC,QAAQd,GAAfY,EAAsBvC,EAAA0C,OAAtBH,IAAsB,CAAtC,IAAArC,OAAC0C,EAAG1C,EAAA,GAAOA,EAAA,GAMrB,CAGD,OADAe,EAAUW,GACHY,OAAOG,YAAYf,EAAgBa,UAC3C,EA8BCI,YA5BkB,SAACC,GACnB,IAAMlB,EAAkB,IAAItB,gBAAgBI,EAAaS,YASzD,OAPIc,MAAMC,QAAQY,GAChBA,EAAKX,SAAQ,SAAAL,GAAO,OAAAF,EAAgBI,OAAOF,MAE3CF,EAAgBI,OAAOc,GAGzB7B,EAAUW,GACHY,OAAOG,YAAYf,EAAgBa,UAC3C,EAkBCM,MAhBY,WACZ,IAAMnB,EAAkB,IAAItB,gBAE5B,OADAW,EAAUW,GACHY,OAAOG,YAAYf,EAAgBa,UAC3C,EAaCO,IAXU,SAA0BlB,GACpC,OAAOpB,EAAasC,IAAIlB,EACzB,EAUCpB,aARsB8B,OAAOG,YAAYjC,EAAa+B,WAU1D"}