|
14 | 14 | import EventsDataTable from '$features/events/components/table/EventsDataTable.svelte';
|
15 | 15 | import { getTableContext } from '$features/events/components/table/options.svelte';
|
16 | 16 | import TableStacksBulkActionsDropdownMenu from '$features/stacks/components/StacksBulkActionsDropdownMenu.svelte';
|
17 |
| - import { type WebSocketMessageValue } from '$features/websockets/models'; |
| 17 | + import { ChangeType, type WebSocketMessageValue } from '$features/websockets/models'; |
18 | 18 | import { useFetchClientStatus } from '$shared/api/api.svelte';
|
19 | 19 | import { persisted } from '$shared/persisted.svelte';
|
| 20 | + import { isTableEmpty, removeTableData, removeTableSelection } from '$shared/table'; |
20 | 21 | import { type FetchClientResponse, useFetchClient } from '@exceptionless/fetchclient';
|
21 | 22 | import { createTable } from '@tanstack/svelte-table';
|
22 | 23 | import { useEventListener } from 'runed';
|
23 |
| - import { debounce } from 'throttle-debounce'; |
| 24 | + import { throttle } from 'throttle-debounce'; |
24 | 25 | import IconOpenInNew from '~icons/mdi/open-in-new';
|
25 | 26 |
|
| 27 | + // TODO: Update this page to use StackSummaryModel instead of EventSummaryModel. |
26 | 28 | let selectedStackId = $state<string>();
|
27 | 29 | function rowclick(row: EventSummaryModel<SummaryTemplateKeys>) {
|
28 | 30 | selectedStackId = row.id;
|
|
94 | 96 | context.meta = clientResponse.meta;
|
95 | 97 | }
|
96 | 98 | }
|
97 |
| - const debouncedLoadData = debounce(10000, loadData); |
| 99 | + const throttledLoadData = throttle(10000, loadData); |
| 100 | +
|
| 101 | + async function onStackChanged(message: WebSocketMessageValue<'StackChanged'>) { |
| 102 | + if (message.id && message.change_type === ChangeType.Removed) { |
| 103 | + removeTableSelection(table, message.id); |
| 104 | +
|
| 105 | + if (removeTableData(table, (doc) => doc.id === message.id)) { |
| 106 | + // If the grid data is empty from all events being removed, we should refresh the data. |
| 107 | + if (isTableEmpty(table)) { |
| 108 | + await throttledLoadData(); |
| 109 | + return; |
| 110 | + } |
| 111 | + } |
| 112 | + } |
98 | 113 |
|
99 |
| - async function onPersistentEvent(message: WebSocketMessageValue<'PersistentEventChanged'>) { |
100 |
| - if (shouldRefreshPersistentEventChanged(persistedFilters.value, filter, message.organization_id, message.project_id, message.stack_id, message.id)) { |
101 |
| - await debouncedLoadData(); |
| 114 | + // Do not refresh if the filter criteria doesn't match the web socket message. |
| 115 | + if (!shouldRefreshPersistentEventChanged(persistedFilters.value, filter, message.organization_id, message.project_id, message.id)) { |
| 116 | + return; |
102 | 117 | }
|
| 118 | +
|
| 119 | + // Do not refresh if the grid has selections or grid is currently paged. |
| 120 | + if (canRefresh) { |
| 121 | + return; |
| 122 | + } |
| 123 | +
|
| 124 | + await throttledLoadData(); |
103 | 125 | }
|
104 | 126 |
|
105 | 127 | useEventListener(document, 'refresh', async () => await loadData());
|
106 |
| - useEventListener(document, 'PersistentEventChanged', async (event) => await onPersistentEvent((event as CustomEvent).detail)); |
| 128 | + useEventListener(document, 'StackChanged', async (event) => await onStackChanged((event as CustomEvent).detail)); |
107 | 129 |
|
108 | 130 | $effect(() => {
|
109 | 131 | loadData();
|
|
0 commit comments