From ed42f9d5083fad8bd53b792dbc5f879ee804efd8 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 9 Feb 2023 17:53:58 +0000 Subject: [PATCH 1/8] refactor: expirationInput checks if predefined date --- src/lib/helpers/date.ts | 13 ++++++ .../overview/keys/expirationInput.svelte | 45 ++++++++++++------- tests/unit/helpers/date.test.ts | 33 +++++++++++++- 3 files changed, 75 insertions(+), 16 deletions(-) diff --git a/src/lib/helpers/date.ts b/src/lib/helpers/date.ts index 391abb3e7..82031c727 100644 --- a/src/lib/helpers/date.ts +++ b/src/lib/helpers/date.ts @@ -22,3 +22,16 @@ export const toLocaleDateTime = (datetime: string | number) => { return date.toLocaleDateString('en', options); }; + +export const isSameDay = (date1: Date, date2: Date) => { + return ( + date1.getFullYear() === date2.getFullYear() && + date1.getMonth() === date2.getMonth() && + date1.getDate() === date2.getDate() + ); +}; + +// Function that checks if a string is a valid date +export const isValidDate = (date: string) => { + return !isNaN(new Date(date).getTime()); +}; diff --git a/src/routes/console/project-[project]/overview/keys/expirationInput.svelte b/src/routes/console/project-[project]/overview/keys/expirationInput.svelte index 55fca9e05..532f53fd7 100644 --- a/src/routes/console/project-[project]/overview/keys/expirationInput.svelte +++ b/src/routes/console/project-[project]/overview/keys/expirationInput.svelte @@ -1,6 +1,7 @@ - - + ]; + + export let value: string | null = null; + + function initExpirationSelect() { + if (value === null || !isValidDate(value)) return null; + + let result = 'custom'; + for (const option of options) { + if (!isValidDate(option.value)) continue; + + if (isSameDay(new Date(option.value), new Date(value))) { + result = option.value; + break; + } + } + + return result; + } + let expirationSelect = initExpirationSelect(); + let expirationCustom: string | null = value ?? null; + + $: { + value = expirationSelect === 'custom' ? expirationCustom : expirationSelect; + } + + + {#if expirationSelect === 'custom'} {/if} diff --git a/tests/unit/helpers/date.test.ts b/tests/unit/helpers/date.test.ts index 4b67f4f3d..99ef7e1f6 100644 --- a/tests/unit/helpers/date.test.ts +++ b/tests/unit/helpers/date.test.ts @@ -1,5 +1,5 @@ import '@testing-library/jest-dom'; -import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date'; +import { toLocaleDate, toLocaleDateTime, isSameDay, isValidDate } from '$lib/helpers/date'; describe('local date', () => { [ @@ -22,3 +22,34 @@ describe('local date time', () => { }); }); }); + +describe('is same day', () => { + const entries: Array<[string, string, boolean]> = [ + ['2022-11-15 08:26:28', '2022-11-15 08:26:28', true], + ['2022-11-15 08:26:28', '2022-11-16 08:26:28', false], + ['2022-11-15 08:26:28', '2022-11-15 08:26:29', true], + ['2022-11-15 08:26:28', '2022-11-15 08:26:27', true] + ]; + + entries.forEach(([value1, value2, expected]) => { + it(`${value1} ${value2}`, () => { + expect(isSameDay(new Date(value1), new Date(value2))).toBe(expected); + }); + }); +}); + +describe('is valid date', () => { + const entries: Array<[string, boolean]> = [ + ['2022-11-15 08:26:28', true], + ['2022-11-15 08:26:28', true], + ['abc', false], + ['2022-11-15', true], + ['123.123.123', false] + ]; + + entries.forEach(([value, expected]) => { + it(value, () => { + expect(isValidDate(value)).toBe(expected); + }); + }); +}); From 0b8bea1ffbbfcd5a7f20008b8def39a05d84caf1 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 9 Feb 2023 18:17:17 +0000 Subject: [PATCH 2/8] fix: initial value changing on expiration input --- .../project-[project]/overview/keys/expirationInput.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/overview/keys/expirationInput.svelte b/src/routes/console/project-[project]/overview/keys/expirationInput.svelte index 532f53fd7..041554f3d 100644 --- a/src/routes/console/project-[project]/overview/keys/expirationInput.svelte +++ b/src/routes/console/project-[project]/overview/keys/expirationInput.svelte @@ -68,7 +68,9 @@ let expirationCustom: string | null = value ?? null; $: { - value = expirationSelect === 'custom' ? expirationCustom : expirationSelect; + if (!isSameDay(new Date(expirationSelect), new Date(value))) { + value = expirationSelect === 'custom' ? expirationCustom : expirationSelect; + } } From 75aac13ac023459c56b766ff6d040a9d1c8af9ab Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 9 Feb 2023 18:38:52 +0000 Subject: [PATCH 3/8] feat: expiration date alerts --- src/lib/helpers/date.ts | 6 ++++- .../keys/[key]/updateExpirationDate.svelte | 21 +++++++++++++++ tests/unit/helpers/date.test.ts | 26 ++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/lib/helpers/date.ts b/src/lib/helpers/date.ts index 82031c727..8558f315f 100644 --- a/src/lib/helpers/date.ts +++ b/src/lib/helpers/date.ts @@ -31,7 +31,11 @@ export const isSameDay = (date1: Date, date2: Date) => { ); }; -// Function that checks if a string is a valid date export const isValidDate = (date: string) => { return !isNaN(new Date(date).getTime()); }; + +export const diffDays = (date1: Date, date2: Date) => { + const diffTime = Math.abs(date2.getTime() - date1.getTime()); + return Math.floor(diffTime / (1000 * 60 * 60 * 24)); +}; diff --git a/src/routes/console/project-[project]/overview/keys/[key]/updateExpirationDate.svelte b/src/routes/console/project-[project]/overview/keys/[key]/updateExpirationDate.svelte index 9fa7c7703..241359280 100644 --- a/src/routes/console/project-[project]/overview/keys/[key]/updateExpirationDate.svelte +++ b/src/routes/console/project-[project]/overview/keys/[key]/updateExpirationDate.svelte @@ -1,12 +1,14 @@
@@ -44,6 +51,20 @@ Update Expiration Date

Set a date after which your API Key will expire.

+ {#if isExpired} + (alertsDismissed = true)}> + Your API Key has expired +

+ For security reasons, we recommend you delete your expired key and create a + new one. +

+
+ {:else if isExpiring} + (alertsDismissed = true)}> + Your API Key is about to expire +

Update the expiration date to keep the key active

+
+ {/if} diff --git a/tests/unit/helpers/date.test.ts b/tests/unit/helpers/date.test.ts index 99ef7e1f6..16b5ff3f4 100644 --- a/tests/unit/helpers/date.test.ts +++ b/tests/unit/helpers/date.test.ts @@ -1,5 +1,11 @@ import '@testing-library/jest-dom'; -import { toLocaleDate, toLocaleDateTime, isSameDay, isValidDate } from '$lib/helpers/date'; +import { + toLocaleDate, + toLocaleDateTime, + isSameDay, + isValidDate, + diffDays +} from '$lib/helpers/date'; describe('local date', () => { [ @@ -53,3 +59,21 @@ describe('is valid date', () => { }); }); }); + +describe('diff days', () => { + const entries: Array<[string, string, number]> = [ + ['2022-11-15 08:26:28', '2022-11-15 08:26:28', 0], + ['2022-11-15 08:26:28', '2022-11-16 08:26:28', 1], + ['2022-11-15 08:26:28', '2022-11-16 08:26:27', 0], + ['2022-11-15 08:26:28', '2022-11-14 08:26:29', 0], + ['2022-11-15 08:26:28', '2022-11-14 08:26:27', 1], + ['2022-11-15 08:26:28', '2022-11-20 08:26:29', 5], + ['2022-11-15 08:26:28', '2022-11-20 08:26:27', 4] + ]; + + entries.forEach(([value1, value2, expected]) => { + it(`${value1} ${value2}`, () => { + expect(diffDays(new Date(value1), new Date(value2))).toBe(expected); + }); + }); +}); From 2a87d3fa5cbc875976bde75d5b1736488de916fa Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 9 Feb 2023 18:46:25 +0000 Subject: [PATCH 4/8] feat: expiration helper --- src/lib/elements/forms/inputSelect.svelte | 2 ++ .../overview/keys/expirationInput.svelte | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/lib/elements/forms/inputSelect.svelte b/src/lib/elements/forms/inputSelect.svelte index 2ed1f0670..f0cf489bf 100644 --- a/src/lib/elements/forms/inputSelect.svelte +++ b/src/lib/elements/forms/inputSelect.svelte @@ -61,5 +61,7 @@ {#if error} {error} + {:else} + {/if} diff --git a/src/routes/console/project-[project]/overview/keys/expirationInput.svelte b/src/routes/console/project-[project]/overview/keys/expirationInput.svelte index 041554f3d..39c5bdef0 100644 --- a/src/routes/console/project-[project]/overview/keys/expirationInput.svelte +++ b/src/routes/console/project-[project]/overview/keys/expirationInput.svelte @@ -1,7 +1,8 @@ - + + + {#if expirationSelect !== 'custom'} + Your key will expire in {toLocaleDate(value)} + {/if} + + {#if expirationSelect === 'custom'} {/if} From 3e06e21116eb99cdde84335c2770102c5a41ffc8 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 9 Feb 2023 18:56:41 +0000 Subject: [PATCH 5/8] fix: scopes missing singular case --- .../console/project-[project]/overview/keys/scopes.svelte | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/routes/console/project-[project]/overview/keys/scopes.svelte b/src/routes/console/project-[project]/overview/keys/scopes.svelte index 4f3b44036..2adef6e1d 100644 --- a/src/routes/console/project-[project]/overview/keys/scopes.svelte +++ b/src/routes/console/project-[project]/overview/keys/scopes.svelte @@ -96,8 +96,11 @@ {category}
- ({allScopes.filter((n) => n.category === category && scopes.includes(n.scope)) - .length} Scopes) + {@const scopesLength = allScopes.filter( + (n) => n.category === category && scopes.includes(n.scope) + ).length} + ({scopesLength} + {scopesLength === 1 ? 'Scope' : 'Scopes'})
From 43abe03ac1d93925f8db6d7f1aa3fa6340900c8e Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Fri, 10 Feb 2023 12:04:48 +0000 Subject: [PATCH 6/8] fix: expiration input showing helper text when value is null --- .../project-[project]/overview/keys/expirationInput.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/overview/keys/expirationInput.svelte b/src/routes/console/project-[project]/overview/keys/expirationInput.svelte index 39c5bdef0..01ec1e2e8 100644 --- a/src/routes/console/project-[project]/overview/keys/expirationInput.svelte +++ b/src/routes/console/project-[project]/overview/keys/expirationInput.svelte @@ -77,7 +77,7 @@ - {#if expirationSelect !== 'custom'} + {#if expirationSelect !== 'custom' && expirationSelect !== null} Your key will expire in {toLocaleDate(value)} {/if} From 7c85da3a0b32d3ae26bc1da084771de11821de4c Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Fri, 10 Feb 2023 12:07:44 +0000 Subject: [PATCH 7/8] refactor: small design changes --- .../keys/[key]/+page@project-[project].svelte | 2 +- .../project-[project]/overview/keys/scopes.svelte | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte index ae2389e79..3f385e20d 100644 --- a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte +++ b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte @@ -63,7 +63,7 @@ trackEvent('submit_key_update_scopes'); addNotification({ type: 'success', - message: 'API Key scopes has been updated' + message: 'API Key scopes have been updated' }); } catch (error) { addNotification({ diff --git a/src/routes/console/project-[project]/overview/keys/scopes.svelte b/src/routes/console/project-[project]/overview/keys/scopes.svelte index 2adef6e1d..ac9ae7c86 100644 --- a/src/routes/console/project-[project]/overview/keys/scopes.svelte +++ b/src/routes/console/project-[project]/overview/keys/scopes.svelte @@ -77,10 +77,15 @@ } -
- - -
+
    +
  • + +
  • +
  • + +
  • +
+ {#each [Category.Auth, Category.Database, Category.Functions, Category.Storage, Category.Other] as category} {@const checked = categoryState(category, scopes)} From 259adb44c614126bb6da9f9186bdc2ddca7ba3ec Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Fri, 10 Feb 2023 12:19:57 +0000 Subject: [PATCH 8/8] chore: organize imports --- .../overview/keys/[key]/updateExpirationDate.svelte | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/routes/console/project-[project]/overview/keys/[key]/updateExpirationDate.svelte b/src/routes/console/project-[project]/overview/keys/[key]/updateExpirationDate.svelte index 241359280..dab38a083 100644 --- a/src/routes/console/project-[project]/overview/keys/[key]/updateExpirationDate.svelte +++ b/src/routes/console/project-[project]/overview/keys/[key]/updateExpirationDate.svelte @@ -1,13 +1,9 @@