repetition woks

This commit is contained in:
micialware committed 2026-09-15 16:10:52 +03:00
1 parent 37b3b61f79
commit 36d2c0b48f
15 files changed
+905 -185

No files matched your search

+5 -37
View File
@@ -1,6 +1,5 @@
// Страница «Синхронизация»: токен + Скачать/Выгрузить.
// Страница «Синхронизация»: токен + Скачать.
// Скачивание: GET /download/{id} -> zstd -> проверка SQLite -> запись в OPFS.
// Выгрузка: следующий шаг (POST /upload/stream/{id}).
import {
TOKEN_LENGTH,
@@ -11,7 +10,7 @@ import {
} from './token.ts';
import { fetchBackupBytes } from './sync.ts';
import { decompressBackup } from './zstd.ts';
import { hasDatabaseFile, writeDatabaseFile } from './opfs.ts';
import { writeDatabaseFile } from './opfs.ts';
export function renderSyncPage(root: HTMLElement): void {
root.innerHTML = `
@@ -40,8 +39,7 @@ export function renderSyncPage(root: HTMLElement): void {
</div>
<div class="btn-row">
<button id="btn-download" class="btn" type="button" disabled>📥 Скачать</button>
<button id="btn-upload" class="btn btn-primary" type="button" disabled>📤 Выгрузить</button>
<button id="btn-download" class="btn btn-primary" type="button" disabled>📥 Скачать</button>
</div>
<p id="status" class="status-bar" role="status">Введите токен из 24 символов</p>
@@ -52,7 +50,6 @@ export function renderSyncPage(root: HTMLElement): void {
const tokenError = root.querySelector<HTMLElement>('#token-error')!;
const tokenCounter = root.querySelector<HTMLElement>('#token-counter')!;
const btnDownload = root.querySelector<HTMLButtonElement>('#btn-download')!;
const btnUpload = root.querySelector<HTMLButtonElement>('#btn-upload')!;
const statusEl = root.querySelector<HTMLElement>('#status')!;
function setStatus(msg: string): void {
@@ -66,15 +63,7 @@ export function renderSyncPage(root: HTMLElement): void {
function setBusy(busy: boolean): void {
btnDownload.disabled = busy || !isValidToken(currentToken());
btnUpload.disabled = true;
tokenInput.disabled = busy;
if (!busy) {
void hasDatabaseFile().then((has) => {
if (!tokenInput.disabled && isValidToken(currentToken())) {
btnUpload.disabled = !has;
}
});
}
}
function refreshUI(): void {
@@ -93,13 +82,6 @@ export function renderSyncPage(root: HTMLElement): void {
tokenError.textContent = ok ? '' : 'Только латинские буквы и цифры';
}
btnDownload.disabled = !ok;
if (ok) {
void hasDatabaseFile().then((has) => {
if (!tokenInput.disabled) btnUpload.disabled = !has;
});
} else {
btnUpload.disabled = true;
}
}
async function handleDownload(): Promise<void> {
@@ -132,7 +114,7 @@ export function renderSyncPage(root: HTMLElement): void {
tokenInput.value = token;
if (isValidToken(token)) {
saveToken(token);
setStatus('Токен сохранён локально. Можно скачивать или выгружать.');
setStatus('Токен сохранён локально. Можно скачивать.');
}
refreshUI();
});
@@ -141,26 +123,12 @@ export function renderSyncPage(root: HTMLElement): void {
void handleDownload();
});
btnUpload.addEventListener('click', () => {
const token = currentToken();
if (!isValidToken(token)) return;
saveToken(token);
setStatus('Выгрузка — следующий шаг (POST /upload/stream/{id}).');
});
const saved = loadSavedToken();
if (saved) {
tokenInput.value = saved;
}
refreshUI();
if (isValidToken(normalizeToken(saved))) {
void hasDatabaseFile().then((has) => {
setStatus(
has
? 'Токен восстановлен, локальная база на месте.'
: 'Токен восстановлен. Нажми «Скачать», чтобы получить базу.',
);
refreshUI();
});
setStatus('Токен восстановлен. Нажми «Скачать», чтобы получить базу.');
}
}