From 4e251311b6613325d44a53ff3223e7678aca4b2b Mon Sep 17 00:00:00 2001 From: Konstantin Wohlwend Date: Wed, 18 Dec 2024 22:45:56 -0800 Subject: [PATCH] Don't fetch users table twice --- .../src/components/data-table/user-table.tsx | 24 ++++++++++++------- packages/stack-shared/src/utils/caches.tsx | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/apps/dashboard/src/components/data-table/user-table.tsx b/apps/dashboard/src/components/data-table/user-table.tsx index 912d73e7f..e4d84e003 100644 --- a/apps/dashboard/src/components/data-table/user-table.tsx +++ b/apps/dashboard/src/components/data-table/user-table.tsx @@ -1,6 +1,7 @@ 'use client'; import { useAdminApp } from '@/app/(main)/(protected)/projects/[projectId]/use-admin-app'; import { ServerUser } from '@stackframe/stack'; +import { deepPlainEquals } from '@stackframe/stack-shared/dist/utils/objects'; import { deindent } from '@stackframe/stack-shared/dist/utils/strings'; import { ActionCell, ActionDialog, AvatarCell, BadgeCell, CopyField, DataTableColumnHeader, DataTableManualPagination, DateCell, SearchToolbarItem, SimpleTooltip, TextCell, Typography } from "@stackframe/stack-ui"; import { ColumnDef, ColumnFiltersState, Row, SortingState, Table } from "@tanstack/react-table"; @@ -170,8 +171,8 @@ const columns: ColumnDef[] = [ }, ]; -export function extendUsers(users: ServerUser[]): ExtendedServerUser[] { - return users.map((user) => ({ +export function extendUsers(users: ServerUser[] & { nextCursor: string | null }): ExtendedServerUser[] & { nextCursor: string | null } { + const extended = users.map((user) => ({ ...user, authTypes: [ ...user.otpAuthEnabled ? ["otp"] : [], @@ -180,6 +181,7 @@ export function extendUsers(users: ServerUser[]): ExtendedServerUser[] { ], emailVerified: user.primaryEmailVerified ? "verified" : "unverified", } satisfies ExtendedServerUser)).sort((a, b) => a.signedUpAt > b.signedUpAt ? -1 : 1); + return Object.assign(extended, { nextCursor: users.nextCursor }); } export function UserTable() { @@ -194,7 +196,7 @@ export function UserTable() { columnFilters: ColumnFiltersState, globalFilters: any, }) => { - let filters: Parameters[0] = { + let newFilters: Parameters[0] = { cursor: options.cursor, limit: options.limit, query: options.globalFilters, @@ -204,13 +206,19 @@ export function UserTable() { signedUpAt: "signedUpAt", } as const; if (options.sorting.length > 0 && options.sorting[0].id in orderMap) { - filters.orderBy = orderMap[options.sorting[0].id as keyof typeof orderMap]; - filters.desc = options.sorting[0].desc; + newFilters.orderBy = orderMap[options.sorting[0].id as keyof typeof orderMap]; + newFilters.desc = options.sorting[0].desc; } - setFilters(filters); - const users = await stackAdminApp.listUsers(filters); - return { nextCursor: users.nextCursor }; + console.log("AAAAAAAAA", newFilters, filters, deepPlainEquals(newFilters, filters, { ignoreUndefinedValues: true })); + if (deepPlainEquals(newFilters, filters, { ignoreUndefinedValues: true })) { + // save ourselves a request if the filters didn't change + return { nextCursor: users.nextCursor }; + } else { + setFilters(newFilters); + const users = await stackAdminApp.listUsers(newFilters); + return { nextCursor: users.nextCursor }; + } }; return { }); this._unsubscribers.push(unsubscribe); } + console.log("add", this._subscriptionsCount, new Date().toISOString()); let hasUnsubscribed = false; return { @@ -201,6 +202,7 @@ class AsyncValueCache { if (hasUnsubscribed) return; hasUnsubscribed = true; storeObj.unsubscribe(); + console.log("remove", this._subscriptionsCount - 1, new Date().toISOString()); if (--this._subscriptionsCount === 0) { for (const unsubscribe of this._unsubscribers) { unsubscribe();