!disabled && onSelectChartType(id)}
diff --git a/web/src/hooks/useSet.ts b/web/src/hooks/useSet.ts
index 790b830ae..036e06863 100644
--- a/web/src/hooks/useSet.ts
+++ b/web/src/hooks/useSet.ts
@@ -1,66 +1,51 @@
-'use client';
+import { useState } from 'react';
+import { useMemoizedFn } from './useMemoizedFn';
-import { useState, useCallback } from 'react';
+function useSet(initialValue?: Iterable) {
+ const getInitValue = () => new Set(initialValue);
+ const [set, setSet] = useState>(getInitValue);
-/**
- * A hook that provides a stateful Set with methods to modify it.
- * @template T The type of elements in the Set
- * @returns A tuple containing the Set and methods to modify it
- */
-export function useSet(initialValues: T[] = []): [
- Set,
- {
- add: (value: T) => void;
- remove: (value: T) => void;
- toggle: (value: T) => void;
- clear: () => void;
- has: (value: T) => boolean;
- }
-] {
- const [set, setSet] = useState>(() => new Set(initialValues));
-
- const add = useCallback((value: T) => {
+ const add = (key: K) => {
+ if (set.has(key)) {
+ return;
+ }
setSet((prevSet) => {
- const newSet = new Set(prevSet);
- newSet.add(value);
- return newSet;
+ const temp = new Set(prevSet);
+ temp.add(key);
+ return temp;
});
- }, []);
+ };
- const remove = useCallback((value: T) => {
+ const remove = (key: K) => {
+ if (!set.has(key)) {
+ return;
+ }
setSet((prevSet) => {
- const newSet = new Set(prevSet);
- newSet.delete(value);
- return newSet;
+ const temp = new Set(prevSet);
+ temp.delete(key);
+ return temp;
});
- }, []);
+ };
- const toggle = useCallback((value: T) => {
- setSet((prevSet) => {
- const newSet = new Set(prevSet);
- if (newSet.has(value)) {
- newSet.delete(value);
- } else {
- newSet.add(value);
- }
- return newSet;
- });
- }, []);
+ const reset = () => setSet(getInitValue());
- const clear = useCallback(() => {
- setSet(new Set());
- }, []);
+ const has = (key: K) => set.has(key);
- const has = useCallback((value: T) => set.has(value), [set]);
+ const size = () => set.size;
+
+ const replace = (newSet: K[]) => setSet(new Set(newSet));
return [
set,
{
- add,
- remove,
- toggle,
- clear,
- has
+ add: useMemoizedFn(add),
+ replace: useMemoizedFn(replace),
+ remove: useMemoizedFn(remove),
+ reset: useMemoizedFn(reset),
+ has: useMemoizedFn(has),
+ size: useMemoizedFn(size)
}
- ];
+ ] as const;
}
+
+export { useSet };
diff --git a/web/src/mocks/MOCK_DASHBOARD.ts b/web/src/mocks/MOCK_DASHBOARD.ts
index 450160eda..2ed93d5fa 100644
--- a/web/src/mocks/MOCK_DASHBOARD.ts
+++ b/web/src/mocks/MOCK_DASHBOARD.ts
@@ -17,9 +17,12 @@ const createMockDashboardRow = (startIndex: number, metrics: string[], columnSiz
items: metrics.map((metricId) => ({ id: metricId }))
});
-export const generateMockDashboard = (numMetrics: number): DashboardMockResponse => {
+export const generateMockDashboard = (
+ numMetrics: number,
+ dashboardId: string = '123'
+): DashboardMockResponse => {
// Generate the specified number of metrics
- const metrics = Array.from({ length: numMetrics }, (_, i) => createMockMetric(`number${i + 1}`));
+ const metrics = Array.from({ length: numMetrics }, (_, i) => createMockMetric(`${i + 1}`));
const metricIds = metrics.map((metric) => metric.id);
// Create rows based on number of metrics
@@ -71,7 +74,7 @@ export const generateMockDashboard = (numMetrics: number): DashboardMockResponse
}
const dashboard: BusterDashboard = {
- id: '123',
+ id: dashboardId,
name: 'Mock Dashboard',
file: `title: Mock Dashboard
description: A sample dashboard configuration
diff --git a/web/src/mocks/metric.ts b/web/src/mocks/metric.ts
index 7e5fb452a..d628a33ec 100644
--- a/web/src/mocks/metric.ts
+++ b/web/src/mocks/metric.ts
@@ -200,9 +200,9 @@ export const mockMetric30 = createMockMetric('number30');
export const createMockListMetric = (id: string): BusterMetricListItem => ({
id,
- title: faker.lorem.words({ min: 2, max: 6 }),
+ title: faker.commerce.productName(),
last_edited: faker.date.recent().toISOString(),
- dataset_name: faker.lorem.words({ min: 2, max: 6 }),
+ dataset_name: faker.commerce.productName(),
dataset_uuid: faker.string.uuid(),
created_by_id: faker.string.uuid(),
created_by_name: faker.person.fullName(),