kingkont 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/renderer/board.js +3 -0
- package/renderer/cloudProjects.js +56 -1
package/package.json
CHANGED
package/renderer/board.js
CHANGED
|
@@ -949,6 +949,9 @@ async function closeProject() {
|
|
|
949
949
|
// Помечаем что юзер вышел явно — на следующем старте autoload пропускается.
|
|
950
950
|
// Cmd+R после close = welcome, а не реоткрытие.
|
|
951
951
|
try { localStorage.setItem('welcomeOnNextStart', '1'); } catch {}
|
|
952
|
+
// Чат привязан к одному проекту — чистим историю при выходе чтобы
|
|
953
|
+
// не путал контекст следующего открытого проекта.
|
|
954
|
+
if (window.kingChat?.clear) window.kingChat.clear();
|
|
952
955
|
stopExternalWatcher();
|
|
953
956
|
// Сбрасываем UI таймлайна/превью — иначе при возврате через welcome
|
|
954
957
|
// в новый проект остаётся фрейм/дорожки прошлого.
|
|
@@ -196,7 +196,46 @@
|
|
|
196
196
|
async function openCloudProject(projectId, suggestedName, opts = {}) {
|
|
197
197
|
const s = await getSettings();
|
|
198
198
|
if (!isLoggedIn(s)) { alert('Войдите в KingKont'); return; }
|
|
199
|
-
|
|
199
|
+
|
|
200
|
+
// 0. Если этот cloud-проект ранее был сохранён ИЗ папочного — открываем
|
|
201
|
+
// оригинальную папку (с уже скачанными файлами) и не качаем ничего.
|
|
202
|
+
// Mapping cloudFolder:<projectId> → folderName ставит saveCloudProject.
|
|
203
|
+
// Папка должна быть granted в FSAH (юзер раз дал — handle живёт в IDB).
|
|
204
|
+
if (!opts.forceRefresh) {
|
|
205
|
+
try {
|
|
206
|
+
const folderName = await idbGet(`cloudFolder:${projectId}`);
|
|
207
|
+
if (folderName) {
|
|
208
|
+
const folderHandle = await idbGet(`handle:${folderName}`);
|
|
209
|
+
if (folderHandle) {
|
|
210
|
+
// Verify permission still granted (без user-gesture не запрашиваем).
|
|
211
|
+
let g = 'prompt';
|
|
212
|
+
try { g = await folderHandle.queryPermission({ mode: 'readwrite' }); } catch {}
|
|
213
|
+
if (g === 'granted') {
|
|
214
|
+
// Дополнительно проверим что в папке лежит meta с тем же cloudProjectId
|
|
215
|
+
// (юзер мог перенести/изменить — тогда fallback на download).
|
|
216
|
+
try {
|
|
217
|
+
const metaFh = await folderHandle.getFileHandle('.kingkont-meta.json');
|
|
218
|
+
const metaTxt = await (await metaFh.getFile()).text();
|
|
219
|
+
const meta = JSON.parse(metaTxt);
|
|
220
|
+
if (meta.cloudProjectId === projectId) {
|
|
221
|
+
state.cloudProjectId = projectId;
|
|
222
|
+
state.cloudDirty = false;
|
|
223
|
+
touchCloudOpened(projectId);
|
|
224
|
+
await openFilm(folderHandle);
|
|
225
|
+
setCloudButtonsVisibility();
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
} catch {}
|
|
229
|
+
// Permission granted но meta не совпала — обнуляем mapping
|
|
230
|
+
// (idbSet(null) — простой способ без отдельного idbDel).
|
|
231
|
+
try { await idbSet(`cloudFolder:${projectId}`, null); } catch {}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
} catch {}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// 1. Проверяем синхронизирован ли уже в userData/cloud-projects/<id>/.
|
|
200
239
|
if (window.cloudFs) {
|
|
201
240
|
try {
|
|
202
241
|
const metaText = await window.cloudFs.readText(projectId, '.kingkont-meta.json');
|
|
@@ -489,6 +528,22 @@
|
|
|
489
528
|
});
|
|
490
529
|
}
|
|
491
530
|
|
|
531
|
+
// 5) Если это ПАПОЧНЫЙ проект (не cloud-shim), запоминаем mapping
|
|
532
|
+
// cloudProjectId → folderName в IDB. Когда юзер позже откроет
|
|
533
|
+
// этот же cloud-проект из welcome, openCloudProject подхватит
|
|
534
|
+
// оригинальную папку (с уже скачанными файлами) и НЕ будет
|
|
535
|
+
// качать всё заново. Mapping живёт в той же IDB-схеме что
|
|
536
|
+
// handle:<name>: cloudFolder:<projectId> = name.
|
|
537
|
+
if (!window.cloudFsShim?.isCloudHandle?.(state.filmHandle)) {
|
|
538
|
+
try {
|
|
539
|
+
await idbSet(`cloudFolder:${projectId}`, state.filmHandle.name);
|
|
540
|
+
// Также запоминаем cloudProjectId на текущей сессии — чтобы
|
|
541
|
+
// следующий save без перезахода не ловил «папочный → новый cloud».
|
|
542
|
+
state.cloudProjectId = projectId;
|
|
543
|
+
if (window.cloudProjects?.setVisibility) window.cloudProjects.setVisibility();
|
|
544
|
+
} catch {}
|
|
545
|
+
}
|
|
546
|
+
|
|
492
547
|
PROGRESS.hide();
|
|
493
548
|
markClean();
|
|
494
549
|
const stats = reused
|