mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2025-12-02 10:02:12 +00:00
load files from urls/ids once local ones are loaded
This commit is contained in:
@@ -56,43 +56,51 @@ export class GPXFileStateCollection {
|
|||||||
this._files = writable(new Map());
|
this._files = writable(new Map());
|
||||||
}
|
}
|
||||||
|
|
||||||
connectToDatabase(db: Database) {
|
connectToDatabase(db: Database): Promise<void> {
|
||||||
if (this._subscription) return;
|
return new Promise((resolve) => {
|
||||||
this._subscription = liveQuery(() => db.fileids.toArray()).subscribe((dbFileIds) => {
|
if (this._subscription) {
|
||||||
const currentFiles = get(this._files);
|
resolve();
|
||||||
// Find new files to observe
|
return;
|
||||||
let newFiles = dbFileIds
|
|
||||||
.filter((id) => !currentFiles.has(id))
|
|
||||||
.sort((a, b) => parseInt(a.split('-')[1]) - parseInt(b.split('-')[1]));
|
|
||||||
// Find deleted files to stop observing
|
|
||||||
let deletedFiles = Array.from(currentFiles.keys()).filter(
|
|
||||||
(id) => !dbFileIds.find((fileId) => fileId === id)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (newFiles.length > 0 || deletedFiles.length > 0) {
|
|
||||||
// Update the map of file states
|
|
||||||
this._files.update(($files) => {
|
|
||||||
newFiles.forEach((id) => {
|
|
||||||
const fileState = new GPXFileState(id);
|
|
||||||
fileState.connectToDatabase(db);
|
|
||||||
$files.set(id, fileState);
|
|
||||||
});
|
|
||||||
deletedFiles.forEach((id) => {
|
|
||||||
$files.get(id)?.destroy();
|
|
||||||
$files.delete(id);
|
|
||||||
});
|
|
||||||
return $files;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Update the file order
|
|
||||||
let fileOrder = get(settings.fileOrder).filter((id) => !deletedFiles.includes(id));
|
|
||||||
newFiles.forEach((id) => {
|
|
||||||
if (!fileOrder.includes(id)) {
|
|
||||||
fileOrder.push(id);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
settings.fileOrder.set(fileOrder);
|
|
||||||
}
|
}
|
||||||
|
this._subscription = liveQuery(() => db.fileids.toArray()).subscribe((dbFileIds) => {
|
||||||
|
const currentFiles = get(this._files);
|
||||||
|
// Find new files to observe
|
||||||
|
let newFiles = dbFileIds
|
||||||
|
.filter((id) => !currentFiles.has(id))
|
||||||
|
.sort((a, b) => parseInt(a.split('-')[1]) - parseInt(b.split('-')[1]));
|
||||||
|
// Find deleted files to stop observing
|
||||||
|
let deletedFiles = Array.from(currentFiles.keys()).filter(
|
||||||
|
(id) => !dbFileIds.find((fileId) => fileId === id)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (newFiles.length > 0 || deletedFiles.length > 0) {
|
||||||
|
// Update the map of file states
|
||||||
|
this._files.update(($files) => {
|
||||||
|
newFiles.forEach((id) => {
|
||||||
|
const fileState = new GPXFileState(id);
|
||||||
|
fileState.connectToDatabase(db);
|
||||||
|
$files.set(id, fileState);
|
||||||
|
});
|
||||||
|
deletedFiles.forEach((id) => {
|
||||||
|
$files.get(id)?.destroy();
|
||||||
|
$files.delete(id);
|
||||||
|
});
|
||||||
|
return $files;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update the file order
|
||||||
|
let fileOrder = get(settings.fileOrder).filter(
|
||||||
|
(id) => !deletedFiles.includes(id)
|
||||||
|
);
|
||||||
|
newFiles.forEach((id) => {
|
||||||
|
if (!fileOrder.includes(id)) {
|
||||||
|
fileOrder.push(id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
settings.fileOrder.set(fileOrder);
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,28 +32,28 @@
|
|||||||
elevationFill,
|
elevationFill,
|
||||||
} = settings;
|
} = settings;
|
||||||
|
|
||||||
onMount(() => {
|
onMount(async () => {
|
||||||
let files: string[] = JSON.parse(page.url.searchParams.get('files') || '[]');
|
|
||||||
let ids: string[] = JSON.parse(page.url.searchParams.get('ids') || '[]');
|
|
||||||
let urls: string[] = files.concat(ids.map(getURLForGoogleDriveFile));
|
|
||||||
|
|
||||||
if (urls.length > 0) {
|
|
||||||
let downloads: Promise<File | null>[] = [];
|
|
||||||
urls.forEach((url) => {
|
|
||||||
downloads.push(
|
|
||||||
fetch(url)
|
|
||||||
.then((response) => response.blob())
|
|
||||||
.then((blob) => new File([blob], url.split('/').pop() ?? ''))
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
Promise.all(downloads).then((files) => {
|
|
||||||
loadFiles(files.filter((file) => file !== null));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
settings.connectToDatabase(db);
|
settings.connectToDatabase(db);
|
||||||
fileStateCollection.connectToDatabase(db);
|
fileStateCollection.connectToDatabase(db).then(() => {
|
||||||
|
let files: string[] = JSON.parse(page.url.searchParams.get('files') || '[]');
|
||||||
|
let ids: string[] = JSON.parse(page.url.searchParams.get('ids') || '[]');
|
||||||
|
let urls: string[] = files.concat(ids.map(getURLForGoogleDriveFile));
|
||||||
|
|
||||||
|
if (urls.length > 0) {
|
||||||
|
let downloads: Promise<File | null>[] = [];
|
||||||
|
urls.forEach((url) => {
|
||||||
|
downloads.push(
|
||||||
|
fetch(url)
|
||||||
|
.then((response) => response.blob())
|
||||||
|
.then((blob) => new File([blob], url.split('/').pop() ?? ''))
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
Promise.all(downloads).then((files) => {
|
||||||
|
loadFiles(files.filter((file) => file !== null));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
onDestroy(() => {
|
onDestroy(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user