diff --git a/src/lib/helpers/prefs.ts b/src/lib/helpers/prefs.ts new file mode 100644 index 0000000000..5c684458fa --- /dev/null +++ b/src/lib/helpers/prefs.ts @@ -0,0 +1,29 @@ +export type PrefRow = { key: string; value: string }; + +export function normalizePrefs(entries: [string, string][] | PrefRow[]): [string, string][] { + return entries + .map((item): [string, string] => + Array.isArray(item) + ? [item[0], item[1]] + : [item.key, item.value] + ) + + .filter(([k, v]) => k.trim() && v.trim()) + .sort(([a], [b]) => a.localeCompare(b)); +} + +export function createPrefRow(key = '', value = ''): PrefRow { + return { key, value }; +} + +export function isAddDisabled(prefs: PrefRow[] | null): boolean { + return ( + !!prefs && + prefs.length > 0 && + !(prefs[prefs.length - 1].key && prefs[prefs.length - 1].value) + ); +} + +export function sanitizePrefs(prefs: PrefRow[]) { + return prefs.filter((p) => p.key.trim() && p.value.trim()); +} diff --git a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/updatePrefs.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/updatePrefs.svelte index 8c33d02303..18359e5ab0 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/updatePrefs.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/updatePrefs.svelte @@ -11,32 +11,39 @@ import { Icon, Layout } from '@appwrite.io/pink-svelte'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; + import deepEqual from 'deep-equal'; + import type { PrefRow } from '$lib/helpers/prefs'; + import { normalizePrefs, createPrefRow, isAddDisabled, sanitizePrefs } from '$lib/helpers/prefs'; + $: if (prefs) { - if (JSON.stringify(prefs) !== JSON.stringify(Object.entries($team.prefs))) { - if (!!prefs[prefs.length - 1][0] && !!prefs[prefs.length - 1][1]) { - arePrefsDisabled = false; - } else { - arePrefsDisabled = true; - } - } else { - arePrefsDisabled = true; - } + const currentNormalized = normalizePrefs(prefs); + const originalNormalized = normalizePrefs( + Object.entries($team.prefs as Record) + ); + + arePrefsDisabled = deepEqual(currentNormalized, originalNormalized); } - let prefs: [string, string][] = null; + let prefs: PrefRow[] = null; let arePrefsDisabled = true; onMount(async () => { - prefs = Object.entries($team.prefs as Record); - if (!prefs?.length) { - prefs.push(['', '']); - } + const entries = Object.entries($team.prefs as Record); + prefs = + entries.length > 0 + ? entries.map(([key, value]) => createPrefRow(key, value)) + : [createPrefRow()]; }); async function updatePrefs() { try { - let updatedPrefs = Object.fromEntries(prefs); + const sanitizedPrefs = sanitizePrefs(prefs); + + const updatedPrefs = + sanitizedPrefs.length === 0 + ? {} + : Object.fromEntries(sanitizedPrefs.map((pref) => [pref.key, pref.value])); await sdk .forProject(page.params.region, page.params.project) @@ -66,32 +73,36 @@ they can easily be shared across members. {#if prefs} - {#each prefs as [key, value], index} + {#each prefs as pref, index (index)} { + prefs[index].key = (e.currentTarget as HTMLInputElement).value; + prefs = [...prefs]; + }} placeholder="Enter key" label={index === 0 ? 'Key' : undefined} required /> { + prefs[index].value = (e.currentTarget as HTMLInputElement).value; + prefs = [...prefs]; + }} placeholder="Enter value" label={index === 0 ? 'Value' : undefined} required /> @@ -102,16 +113,10 @@
@@ -97,16 +110,10 @@