From 85ded9a617ccfc50827fb15de619d0592635c86d Mon Sep 17 00:00:00 2001 From: kwongz Date: Tue, 11 Feb 2025 13:59:50 -0500 Subject: [PATCH] updated url params to JSON.stringify + base 64 encode + debounce slider params update --- .../lib/sdk/src/utils/svelte/useUrlParams.js | 69 ++++++++++++++++--- .../button-group/ButtonGroup.stories.svelte | 12 ++-- .../inputs/button-group/ButtonGroup.svelte | 11 ++- .../button-group/ButtonGroupItem.svelte | 5 +- .../lib/atoms/inputs/dropdown/Dropdown.svelte | 13 ++-- .../inputs/dropdown/dropdownOptionStore.js | 6 +- .../dropdown/stories/Dropdown.stories.svelte | 57 +++++++++++++++ .../lib/atoms/inputs/slider/_Slider.svelte | 31 +++++++-- .../inputs/text/TextInput.stories.svelte | 10 ++- .../pages/components/inputs/dropdown/index.md | 1 + 10 files changed, 171 insertions(+), 44 deletions(-) diff --git a/packages/lib/sdk/src/utils/svelte/useUrlParams.js b/packages/lib/sdk/src/utils/svelte/useUrlParams.js index 0d98931c04..88af091790 100644 --- a/packages/lib/sdk/src/utils/svelte/useUrlParams.js +++ b/packages/lib/sdk/src/utils/svelte/useUrlParams.js @@ -51,13 +51,10 @@ import { browser } from '$app/environment'; */ export function hydrateFromUrlParam(key, hydrate) { if (browser) { - // window.location - // onMount(() => { const url = new URL(window.location.href); - if (url.searchParams.has(key)) { - hydrate?.(url.searchParams.get(key)); - } - // }); + let _value = parseUrlValue(url.searchParams.get(key)); + console.log('hydrateFromUrlParam', key, _value); + hydrate?.(_value); } } @@ -69,13 +66,65 @@ export function hydrateFromUrlParam(key, hydrate) { export function updateUrlParam(key, value) { if (browser) { const url = new URL(window.location.href); - if (!url.searchParams.has(key) && value) { - url.searchParams.append(key, value); - } else if (value) { - url.searchParams.set(key, value); + + // if (!url.searchParams.has(key) && value) { + // url.searchParams.append(key, value); + // } else if (value) { + // url.searchParams.set(key, value); + // } else { + // url.searchParams.delete(key); + // } + + if (value !== null) { + url.searchParams.set(key, encodeUrlValue(value)); } else { url.searchParams.delete(key); } + history.replaceState(null, '', `?${url.searchParams.toString()}`); } } + +/** + * Encodes a value for a URL parameter. + * @param {any} value + * @returns {string} + */ +function encodeUrlValue(value) { + // Convert value to a JSON string + const jsonString = JSON.stringify(value); + + // Base64 encode it (btoa only works with strings) + const base64Encoded = btoa(jsonString); + + // Encode for safe URL usage + return base64Encoded; +} + +/** + * Parses a value retrieved from a URL parameter. + * @param {string | null} value + * @returns {any} + */ +function parseUrlValue(value) { + if (value === null) return null; + + let parsed; + + // Try to decode as Base64 and parse as JSON + try { + const base64Decoded = atob(value); + parsed = JSON.parse(base64Decoded); + console.log('parsed', parsed); + // Return the parsed object if it's a valid object or array + if (typeof parsed === 'object' && parsed !== null) { + return parsed; + } + } catch { + // If Base64 decoding or JSON parsing fails, simply return the value as is + console.log('Error decoding or parsing'); + } + + // Return the value as is (it could be a primitive value or non-Base64 string) + return parsed || value; +} diff --git a/packages/ui/core-components/src/lib/atoms/inputs/button-group/ButtonGroup.stories.svelte b/packages/ui/core-components/src/lib/atoms/inputs/button-group/ButtonGroup.stories.svelte index 70049c5a20..6a6ceaf2b1 100644 --- a/packages/ui/core-components/src/lib/atoms/inputs/button-group/ButtonGroup.stories.svelte +++ b/packages/ui/core-components/src/lib/atoms/inputs/button-group/ButtonGroup.stories.svelte @@ -248,10 +248,11 @@
- - - - + + + + +
@@ -275,7 +276,7 @@ }} >
- +
Current Value: {$inputStore[args.name]} @@ -314,7 +315,6 @@ Current Value: {$inputStore['buttonGroup_B']}
URL: {storyIframeURL}
-
URL: {storyIframeURL}
+
+ + + + + + + +
URL: {storyIframeURL}
+ +
+