Skip to content

Commit e977a00

Browse files
authored
Merge pull request #2663 from appwrite/fix-sample-data
2 parents b3b19df + 3b172e7 commit e977a00

File tree

3 files changed

+101
-55
lines changed

3 files changed

+101
-55
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import type { Columns } from '../table-[table]/store';
2+
import type { RealtimeResponse } from '$lib/stores/sdk';
3+
4+
export function setupColumnObserver() {
5+
let expectedCount = 0;
6+
let resolvePromise: () => void;
7+
let timeout: ReturnType<typeof setTimeout>;
8+
let isActive = true;
9+
10+
const availableColumns = new Set<string>();
11+
const waitPromise = new Promise<void>((resolve) => (resolvePromise = resolve));
12+
13+
const columnCreationHandler = (response: RealtimeResponse) => {
14+
if (!isActive) return;
15+
16+
const { events, payload } = response;
17+
18+
if (
19+
events.includes('databases.*.tables.*.columns.*.create') ||
20+
events.includes('databases.*.tables.*.columns.*.update')
21+
) {
22+
const asColumn = payload as Columns;
23+
const columnId = asColumn.key;
24+
const status = asColumn.status;
25+
26+
if (status === 'available') {
27+
availableColumns.add(columnId);
28+
29+
if (expectedCount > 0 && availableColumns.size >= expectedCount) {
30+
clearTimeout(timeout);
31+
cleanup();
32+
resolvePromise();
33+
}
34+
}
35+
}
36+
};
37+
38+
const cleanup = () => {
39+
isActive = false;
40+
if (timeout) clearTimeout(timeout);
41+
};
42+
43+
// return function to start waiting!
44+
const startWaiting = (count: number) => {
45+
expectedCount = count;
46+
47+
timeout = setTimeout(() => {
48+
cleanup();
49+
resolvePromise();
50+
}, 10000);
51+
52+
if (availableColumns.size >= expectedCount) {
53+
clearTimeout(timeout);
54+
cleanup();
55+
resolvePromise();
56+
}
57+
};
58+
59+
return {
60+
cleanup,
61+
waitPromise,
62+
startWaiting,
63+
columnCreationHandler
64+
};
65+
}

src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919
import { preferences } from '$lib/stores/preferences';
2020
import SpreadsheetContainer from '../table-[table]/layout/spreadsheet.svelte';
2121
import { onDestroy, onMount, tick } from 'svelte';
22-
import { sdk } from '$lib/stores/sdk';
22+
import { sdk, realtime, type RealtimeResponse } from '$lib/stores/sdk';
2323
import { page } from '$app/state';
24+
import { setupColumnObserver } from '../(observer)/columnObserver';
2425
import {
2526
type ColumnInput,
2627
mapSuggestedColumns,
@@ -125,6 +126,7 @@
125126
// let tooltipTopPosition = $state(50);
126127
let triggerColumnId = $state<string | null>(null);
127128
let hoveredColumnId = $state<string | null>(null);
129+
let columnCreationHandler: ((response: RealtimeResponse) => void) | null = null;
128130
129131
// for deleting a column + undo
130132
let undoTimer: ReturnType<typeof setTimeout> | null = $state(null);
@@ -585,7 +587,7 @@
585587
($isSmallViewport ? 14 : 17) + (!$expandTabs ? 2 : 0) - userDataRows.length
586588
);
587589
588-
onMount(async () => {
590+
onMount(() => {
589591
columnsOrder.set(preferences.getColumnOrder(tableId));
590592
columnsWidth.set(preferences.getColumnWidths(tableId));
591593
@@ -595,7 +597,13 @@
595597
}
596598
597599
requestAnimationFrame(recalcAll);
598-
await suggestColumns();
600+
suggestColumns();
601+
602+
return realtime.forProject(page.params.region, ['project', 'console'], (response) => {
603+
if (response.events.includes('databases.*.tables.*.columns.*')) {
604+
columnCreationHandler?.(response);
605+
}
606+
});
599607
});
600608
601609
function resetSuggestionsStore(fullReset: boolean = true) {
@@ -968,6 +976,14 @@
968976
}
969977
970978
try {
979+
const {
980+
startWaiting,
981+
waitPromise,
982+
columnCreationHandler: handler
983+
} = setupColumnObserver();
984+
985+
columnCreationHandler = handler;
986+
971987
const results = [];
972988
973989
for (const column of customColumns) {
@@ -1066,6 +1082,9 @@
10661082
results.push(columnResult);
10671083
}
10681084
1085+
startWaiting(customColumns.length);
1086+
await waitPromise;
1087+
10691088
await invalidate(Dependencies.TABLE);
10701089
10711090
addNotification({
@@ -1087,6 +1106,8 @@
10871106
message: error.message
10881107
});
10891108
creatingColumns = false;
1109+
} finally {
1110+
columnCreationHandler = null;
10901111
}
10911112
}
10921113

src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte

Lines changed: 12 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,10 @@
7373
import { Submit, trackEvent } from '$lib/actions/analytics';
7474
7575
import { isTabletViewport } from '$lib/stores/viewport';
76+
import { showColumnsSuggestionsModal } from '../(suggestions)';
7677
import IndexesSuggestions from '../(suggestions)/indexes.svelte';
7778
import ColumnsSuggestions from '../(suggestions)/columns.svelte';
78-
import { showColumnsSuggestionsModal } from '../(suggestions)';
79+
import { setupColumnObserver } from '../(observer)/columnObserver';
7980
8081
let editRow: EditRow;
8182
let editRelatedRow: EditRelatedRow;
@@ -276,56 +277,6 @@
276277
indexes: 700
277278
});
278279
279-
function setupColumnObserver() {
280-
let expectedCount = 0;
281-
let resolvePromise: () => void;
282-
let timeout: ReturnType<typeof setTimeout>;
283-
284-
const availableColumns = new Set<string>();
285-
const waitPromise = new Promise<void>((resolve) => (resolvePromise = resolve));
286-
287-
columnCreationHandler = (response: RealtimeResponse) => {
288-
const { events, payload } = response;
289-
290-
if (
291-
events.includes('databases.*.tables.*.columns.*.create') ||
292-
events.includes('databases.*.tables.*.columns.*.update')
293-
) {
294-
const asColumn = payload as Columns;
295-
const columnId = asColumn.key;
296-
const status = asColumn.status;
297-
298-
if (status === 'available') {
299-
availableColumns.add(columnId);
300-
301-
if (expectedCount > 0 && availableColumns.size >= expectedCount) {
302-
clearTimeout(timeout);
303-
columnCreationHandler = null;
304-
resolvePromise();
305-
}
306-
}
307-
}
308-
};
309-
310-
// return function to start waiting!
311-
const startWaiting = (count: number) => {
312-
expectedCount = count;
313-
314-
timeout = setTimeout(() => {
315-
columnCreationHandler = null;
316-
resolvePromise();
317-
}, 10000);
318-
319-
if (availableColumns.size >= expectedCount) {
320-
clearTimeout(timeout);
321-
columnCreationHandler = null;
322-
resolvePromise();
323-
}
324-
};
325-
326-
return { startWaiting, waitPromise };
327-
}
328-
329280
async function createFakeData() {
330281
isWaterfallFromFaker.set(true);
331282
@@ -338,7 +289,14 @@
338289
339290
if (!filteredColumns.length) {
340291
try {
341-
const { startWaiting, waitPromise } = setupColumnObserver();
292+
const {
293+
startWaiting,
294+
waitPromise,
295+
columnCreationHandler: handler
296+
} = setupColumnObserver();
297+
298+
columnCreationHandler = handler;
299+
342300
columns = await generateColumns($project, page.params.database, page.params.table);
343301
startWaiting(columns.length);
344302
await waitPromise;
@@ -354,6 +312,8 @@
354312
});
355313
$spreadsheetLoading = false;
356314
return;
315+
} finally {
316+
columnCreationHandler = null;
357317
}
358318
}
359319

0 commit comments

Comments
 (0)