UNPKG

stateful-params

Version:

A lightweight and intuitive React hook for managing URL query parameters with ease. Stateful-params enables seamless CRUD operations on URL query parameters while keeping your UI in sync with the URL state. Perfect for building dynamic, stateful, and shar

1 lines 6.33 kB
{"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"}