From c57a8d291844cbe63090e0d0573233ef855f70ad Mon Sep 17 00:00:00 2001
From: Steven Nguyen
Date: Thu, 6 Jul 2023 16:57:50 -0700
Subject: [PATCH 1/4] Show user's last activity
---
src/lib/helpers/date.ts | 10 ++++++++++
.../console/project-[project]/auth/+page.svelte | 15 +++++++++++++--
.../auth/user-[user]/dangerZone.svelte | 5 +++++
.../auth/user-[user]/updateStatus.svelte | 6 +++++-
tests/unit/helpers/date.test.ts | 8 ++++++++
5 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/src/lib/helpers/date.ts b/src/lib/helpers/date.ts
index 8558f315f..68f9c31a7 100644
--- a/src/lib/helpers/date.ts
+++ b/src/lib/helpers/date.ts
@@ -1,5 +1,10 @@
export const toLocaleDate = (datetime: string) => {
const date = new Date(datetime);
+
+ if (isNaN(date.getTime())) {
+ return 'n/a';
+ }
+
const options: Intl.DateTimeFormatOptions = {
year: 'numeric',
month: 'short',
@@ -11,6 +16,11 @@ export const toLocaleDate = (datetime: string) => {
export const toLocaleDateTime = (datetime: string | number) => {
const date = new Date(datetime);
+
+ if (isNaN(date.getTime())) {
+ return 'n/a';
+ }
+
const options: Intl.DateTimeFormatOptions = {
year: 'numeric',
month: 'short',
diff --git a/src/routes/console/project-[project]/auth/+page.svelte b/src/routes/console/project-[project]/auth/+page.svelte
index 0063f7ea1..830d43793 100644
--- a/src/routes/console/project-[project]/auth/+page.svelte
+++ b/src/routes/console/project-[project]/auth/+page.svelte
@@ -19,7 +19,7 @@
TableRowLink
} from '$lib/elements/table';
import { Pill } from '$lib/elements';
- import { toLocaleDateTime } from '$lib/helpers/date';
+ import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date';
import { Container } from '$lib/layout';
import { base } from '$app/paths';
import { goto } from '$app/navigation';
@@ -29,6 +29,13 @@
export let data: PageData;
+ // TODO: Remove this when the console SDK is updated
+ const users = data.users.users.map((user) => {
+ const labels: string[] = [];
+ const accessedAt = '';
+ return { accessedAt, labels, ...user };
+ });
+
let showCreate = false;
const projectId = $page.params.project;
async function userCreated(event: CustomEvent>>) {
@@ -50,9 +57,10 @@
Status
ID
Joined
+ Last Activity
- {#each data.users.users as user}
+ {#each users as user}
@@ -105,6 +113,9 @@
{toLocaleDateTime(user.registration)}
+
+ {user.accessedAt ? toLocaleDate(user.accessedAt) : 'never'}
+
{/each}
diff --git a/src/routes/console/project-[project]/auth/user-[user]/dangerZone.svelte b/src/routes/console/project-[project]/auth/user-[user]/dangerZone.svelte
index 8fa2ff05d..a04d1cfc0 100644
--- a/src/routes/console/project-[project]/auth/user-[user]/dangerZone.svelte
+++ b/src/routes/console/project-[project]/auth/user-[user]/dangerZone.svelte
@@ -1,10 +1,14 @@
@@ -42,6 +46,7 @@
? [$user.email, $user.phone].join(',')
: $user.email || $user.phone}
+ Last activity: {accessedAt ? toLocaleDate(accessedAt) : 'never'}
diff --git a/src/routes/console/project-[project]/auth/user-[user]/updateStatus.svelte b/src/routes/console/project-[project]/auth/user-[user]/updateStatus.svelte
index 60a2189d1..80fe968c8 100644
--- a/src/routes/console/project-[project]/auth/user-[user]/updateStatus.svelte
+++ b/src/routes/console/project-[project]/auth/user-[user]/updateStatus.svelte
@@ -5,7 +5,7 @@
import { Dependencies } from '$lib/constants';
import { Pill } from '$lib/elements';
import { Button } from '$lib/elements/forms';
- import { toLocaleDateTime } from '$lib/helpers/date';
+ import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
import { user } from './store';
@@ -71,6 +71,9 @@
trackError(error, Submit.UserUpdateStatus);
}
}
+
+ // TODO: Remove this when the console SDK is updated
+ $: accessedAt = ($user as unknown as { accessedAt: string }).accessedAt;
@@ -100,6 +103,7 @@
{$user.phone}
{/if}
Joined: {toLocaleDateTime($user.registration)}
+ Last activity: {accessedAt ? toLocaleDate(accessedAt) : 'never'}
{#if !$user.status}
blocked
diff --git a/tests/unit/helpers/date.test.ts b/tests/unit/helpers/date.test.ts
index 16b5ff3f4..fab13619a 100644
--- a/tests/unit/helpers/date.test.ts
+++ b/tests/unit/helpers/date.test.ts
@@ -16,6 +16,10 @@ describe('local date', () => {
expect(toLocaleDate(value)).toBe(expected);
});
});
+
+ it('invalid date', () => {
+ expect(toLocaleDate('')).toBe('n/a');
+ });
});
describe('local date time', () => {
@@ -27,6 +31,10 @@ describe('local date time', () => {
expect(toLocaleDateTime(value)).toBe(expected);
});
});
+
+ it('invalid date', () => {
+ expect(toLocaleDateTime('')).toBe('n/a');
+ });
});
describe('is same day', () => {
From 28b4b9984737e94264b0a2d003b4cbc6164130ba Mon Sep 17 00:00:00 2001
From: Steven Nguyen
Date: Fri, 21 Jul 2023 13:42:55 -0700
Subject: [PATCH 2/4] Update API Key Last Accessed to omit time
Since accessedAt is only updated once in the last 24 hours,
showing the time can cause confusion.
---
.../console/project-[project]/overview/keys/+page.svelte | 4 ++--
.../overview/keys/[key]/+page@project-[project].svelte | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/routes/console/project-[project]/overview/keys/+page.svelte b/src/routes/console/project-[project]/overview/keys/+page.svelte
index 714ccea79..92cc16287 100644
--- a/src/routes/console/project-[project]/overview/keys/+page.svelte
+++ b/src/routes/console/project-[project]/overview/keys/+page.svelte
@@ -9,7 +9,7 @@
TableHeader,
TableRowLink
} from '$lib/elements/table';
- import { toLocaleDateTime } from '$lib/helpers/date';
+ import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date';
import { wizard } from '$lib/stores/wizard';
import type { PageData } from './$types';
import Wizard from './wizard.svelte';
@@ -46,7 +46,7 @@
{key.name}
- {key.accessedAt ? toLocaleDateTime(key.accessedAt) : 'never'}
+ {key.accessedAt ? toLocaleDate(key.accessedAt) : 'never'}
{key.expire ? toLocaleDateTime(key.expire) : 'never'}
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 e82edaeb4..62d563158 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
@@ -5,7 +5,7 @@
import { Dependencies } from '$lib/constants';
import { Button, Form, FormList, InputText } from '$lib/elements/forms';
import { symmetricDifference } from '$lib/helpers/array';
- import { toLocaleDateTime } from '$lib/helpers/date';
+ import { toLocaleDate } from '$lib/helpers/date';
import { Container } from '$lib/layout';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
@@ -83,7 +83,7 @@
- {@const accessedAt = $key.accessedAt ? toLocaleDateTime($key.accessedAt) : 'never'}
+ {@const accessedAt = $key.accessedAt ? toLocaleDate($key.accessedAt) : 'never'}
{$key.name}
From ac757e398900f2e1db62085ae6dbe4a1b30dee7e Mon Sep 17 00:00:00 2001
From: Steven Nguyen
Date: Wed, 26 Jul 2023 15:40:01 -0700
Subject: [PATCH 3/4] Clear wizard interceptor on wizard start and close
Without doing this, an interceptor from a different wizard can run
when a new wizard is opened causing incorrect validation.
---
src/lib/stores/wizard.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/lib/stores/wizard.ts b/src/lib/stores/wizard.ts
index 355eb7afc..3e0ed9ecc 100644
--- a/src/lib/stores/wizard.ts
+++ b/src/lib/stores/wizard.ts
@@ -24,6 +24,7 @@ function createWizardStore() {
update((n) => {
n.show = true;
n.component = component;
+ n.interceptor = null;
n.media = media;
trackEvent('wizard_start');
return n;
@@ -39,6 +40,7 @@ function createWizardStore() {
update((n) => {
n.show = false;
n.component = null;
+ n.interceptor = null;
n.media = null;
return n;
From 7d1c041c973ed935870e18f9ed57dd5956f80a2d Mon Sep 17 00:00:00 2001
From: Steven Nguyen
Date: Wed, 26 Jul 2023 16:17:46 -0700
Subject: [PATCH 4/4] Fix wizard component type
Before this, we kept getting warnings like:
Type 'typeof Wizard__SvelteComponent_' is missing the
following properties from type 'SvelteComponentDev'
---
src/lib/stores/wizard.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/lib/stores/wizard.ts b/src/lib/stores/wizard.ts
index 3e0ed9ecc..0eccf0be0 100644
--- a/src/lib/stores/wizard.ts
+++ b/src/lib/stores/wizard.ts
@@ -1,11 +1,11 @@
import { trackEvent } from '$lib/actions/analytics';
-import type { SvelteComponent } from 'svelte';
+import type { ComponentType } from 'svelte';
import { writable } from 'svelte/store';
export type WizardStore = {
show: boolean;
media?: string;
- component?: typeof SvelteComponent;
+ component?: ComponentType;
interceptor?: () => Promise;
};
@@ -20,7 +20,7 @@ function createWizardStore() {
return {
subscribe,
set,
- start: (component: typeof SvelteComponent, media: string = null) =>
+ start: (component: ComponentType, media: string = null) =>
update((n) => {
n.show = true;
n.component = component;