From 33bcd9f34ea1e0c9917e9bfe4c2f271f1e683d89 Mon Sep 17 00:00:00 2001 From: Nate Kelley Date: Thu, 16 Jan 2025 16:40:02 -0700 Subject: [PATCH] prefetch on demand --- .../datasets/permissions/queryRequests.ts | 8 +- web/src/api/createReactQuery.ts | 3 + .../permissions/PermissionAppSegments.tsx | 89 ++++++++++++++----- .../permissions/PermissionsAppContainer.tsx | 6 +- .../PermissionDatasetGroups.tsx | 2 +- ...PermissionListPermissionGroupContainer.tsx | 16 ++-- 6 files changed, 92 insertions(+), 32 deletions(-) diff --git a/web/src/api/busterv2/datasets/permissions/queryRequests.ts b/web/src/api/busterv2/datasets/permissions/queryRequests.ts index 7087eb24a..a45b9f008 100644 --- a/web/src/api/busterv2/datasets/permissions/queryRequests.ts +++ b/web/src/api/busterv2/datasets/permissions/queryRequests.ts @@ -46,7 +46,7 @@ export const useDatasetListPermissionGroups = (dataset_id: string) => { return useCreateReactQuery({ queryKey: [PERMISSION_GROUP_QUERY_KEY, dataset_id], queryFn, - staleTime: 1000 * 5 // 5 seconds + enabled: !!dataset_id }); }; @@ -81,7 +81,8 @@ export const useDatasetListDatasetGroups = (dataset_id: string) => { return useCreateReactQuery({ queryKey: [LIST_DATASET_GROUPS_QUERY_KEY, dataset_id], - queryFn + queryFn, + enabled: !!dataset_id }); }; @@ -90,7 +91,8 @@ export const useDatasetListPermissionUsers = (dataset_id: string) => { return useCreateReactQuery({ queryKey: ['list_permission_users', dataset_id], - queryFn + queryFn, + enabled: !!dataset_id }); }; diff --git a/web/src/api/createReactQuery.ts b/web/src/api/createReactQuery.ts index dd1eb003a..d90955b1f 100644 --- a/web/src/api/createReactQuery.ts +++ b/web/src/api/createReactQuery.ts @@ -27,6 +27,8 @@ interface CreateQueryProps extends UseQueryOptions { useErrorNotification?: boolean; } +export const STALE_TIME = 1000 * 10; + export const useCreateReactQuery = ({ queryKey, queryFn, @@ -50,6 +52,7 @@ export const useCreateReactQuery = ({ retry: 1, refetchOnWindowFocus, refetchOnMount, + staleTime: STALE_TIME, ...rest }); diff --git a/web/src/app/app/datasets/[datasetId]/permissions/PermissionAppSegments.tsx b/web/src/app/app/datasets/[datasetId]/permissions/PermissionAppSegments.tsx index 6488d649e..5e1f3b708 100644 --- a/web/src/app/app/datasets/[datasetId]/permissions/PermissionAppSegments.tsx +++ b/web/src/app/app/datasets/[datasetId]/permissions/PermissionAppSegments.tsx @@ -1,39 +1,64 @@ 'use client'; -import React from 'react'; +import React, { useState } from 'react'; import { AppSegmented } from '@/components'; import { PermissionApps } from './config'; -import { useMemoizedFn } from 'ahooks'; +import { useMemoizedFn, useSet } from 'ahooks'; import { SegmentedValue } from 'antd/es/segmented'; import { Divider } from 'antd'; - -const options: { label: string; value: PermissionApps }[] = [ - { - label: 'Overview', - value: PermissionApps.OVERVIEW - }, - { - label: 'Permission Groups', - value: PermissionApps.PERMISSION_GROUPS - }, - { - label: 'Dataset Groups', - value: PermissionApps.DATASET_GROUPS - }, - { - label: 'Users', - value: PermissionApps.USERS - } -]; +import { + useDatasetListDatasetGroups, + useDatasetListPermissionGroups, + useDatasetListPermissionUsers +} from '@/api/busterv2'; export const PermissionAppSegments: React.FC<{ selectedApp: PermissionApps; setSelectedApp: (app: PermissionApps) => void; -}> = React.memo(({ selectedApp, setSelectedApp }) => { + datasetId: string; +}> = React.memo(({ selectedApp, setSelectedApp, datasetId }) => { + const [prefetchedRoutes, setPrefetchedRoutes] = useSet(); + + useDatasetListDatasetGroups(prefetchedRoutes.has(PermissionApps.DATASET_GROUPS) ? datasetId : ''); + useDatasetListPermissionUsers(prefetchedRoutes.has(PermissionApps.USERS) ? datasetId : ''); + useDatasetListPermissionGroups( + prefetchedRoutes.has(PermissionApps.PERMISSION_GROUPS) ? datasetId : '' + ); + const handleSelect = useMemoizedFn((app: SegmentedValue) => { setSelectedApp(app as PermissionApps); }); + const onHoverRoute = useMemoizedFn((route: string) => { + setPrefetchedRoutes.add(route); + }); + + const options = React.useMemo( + () => + [ + { + label: 'Overview', + value: PermissionApps.OVERVIEW + }, + { + label: 'Permission Groups', + value: PermissionApps.PERMISSION_GROUPS + }, + { + label: 'Dataset Groups', + value: PermissionApps.DATASET_GROUPS + }, + { + label: 'Users', + value: PermissionApps.USERS + } + ].map((option) => ({ + ...option, + label: + })), + [] + ); + return (
@@ -43,3 +68,23 @@ export const PermissionAppSegments: React.FC<{ }); PermissionAppSegments.displayName = 'PermissionAppSegments'; + +const PrefetchRouteSegmentItem = React.memo( + ({ + value, + label, + onHover + }: { + value: PermissionApps; + label: string; + onHover: (route: PermissionApps) => void; + }) => { + return ( + onHover(value)}> + {label} + + ); + } +); + +PrefetchRouteSegmentItem.displayName = 'PrefetchRouteSegmentItem'; diff --git a/web/src/app/app/datasets/[datasetId]/permissions/PermissionsAppContainer.tsx b/web/src/app/app/datasets/[datasetId]/permissions/PermissionsAppContainer.tsx index df36d47eb..c0893f1d6 100644 --- a/web/src/app/app/datasets/[datasetId]/permissions/PermissionsAppContainer.tsx +++ b/web/src/app/app/datasets/[datasetId]/permissions/PermissionsAppContainer.tsx @@ -30,7 +30,11 @@ export const PermissionsAppContainer: React.FC<{ datasetId: string }> = React.me return ( <> - + diff --git a/web/src/app/app/datasets/[datasetId]/permissions/_PermissionDatasetGroups/PermissionDatasetGroups.tsx b/web/src/app/app/datasets/[datasetId]/permissions/_PermissionDatasetGroups/PermissionDatasetGroups.tsx index b8aba8226..2f8addc38 100644 --- a/web/src/app/app/datasets/[datasetId]/permissions/_PermissionDatasetGroups/PermissionDatasetGroups.tsx +++ b/web/src/app/app/datasets/[datasetId]/permissions/_PermissionDatasetGroups/PermissionDatasetGroups.tsx @@ -1,4 +1,4 @@ -import { useDatasetListDatasetGroups, useListDatasetGroups } from '@/api/busterv2'; +import { useDatasetListDatasetGroups } from '@/api/busterv2'; import React, { useState } from 'react'; import { useDebounceSearch } from '../useDebounceSearch'; import { useMemoizedFn } from 'ahooks'; diff --git a/web/src/app/app/datasets/[datasetId]/permissions/_PermissionPermissionGroup/PermissionListPermissionGroupContainer.tsx b/web/src/app/app/datasets/[datasetId]/permissions/_PermissionPermissionGroup/PermissionListPermissionGroupContainer.tsx index bfc8afe0d..1b92bb39d 100644 --- a/web/src/app/app/datasets/[datasetId]/permissions/_PermissionPermissionGroup/PermissionListPermissionGroupContainer.tsx +++ b/web/src/app/app/datasets/[datasetId]/permissions/_PermissionPermissionGroup/PermissionListPermissionGroupContainer.tsx @@ -119,11 +119,7 @@ export const PermissionListPermissionGroupContainer: React.FC<{ showSelectAll={false} selectedRowKeys={selectedRowKeys} onSelectChange={setSelectedRowKeys} - emptyState={ -
- No permission groups found -
- } + emptyState={} />
); @@ -180,3 +176,13 @@ const PermissionGroupAssignedCell = React.memo( ); PermissionGroupAssignedCell.displayName = 'PermissionGroupAssignedCell'; + +const EmptyState = React.memo(() => { + return ( +
+ No permission groups found +
+ ); +}); + +EmptyState.displayName = 'EmptyState';