83 lines
2.0 KiB
JavaScript
83 lines
2.0 KiB
JavaScript
/** Progress 0–100 for logo loader during setup wizard. */
|
||
|
||
const STEP_WEIGHTS = {
|
||
theme: 10,
|
||
welcome: 5,
|
||
device: 12,
|
||
network: 18,
|
||
sync: 18,
|
||
users: 22,
|
||
hardware: 10,
|
||
kiosk: 10,
|
||
bootstrap: 25,
|
||
done: 8,
|
||
};
|
||
|
||
const FLOWS = {
|
||
server: ["theme", "welcome", "device", "network", "users", "done"],
|
||
client: ["theme", "welcome", "device", "sync", "hardware", "kiosk", "bootstrap", "done"],
|
||
};
|
||
|
||
export function getFlow(deviceRole) {
|
||
return FLOWS[deviceRole] || FLOWS.server;
|
||
}
|
||
|
||
export function createSetupOrchestrator() {
|
||
let deviceRole = "server";
|
||
let currentStep = "welcome";
|
||
let extraPercent = 0;
|
||
|
||
function flow() {
|
||
return getFlow(deviceRole);
|
||
}
|
||
|
||
function basePercent() {
|
||
const steps = flow();
|
||
const idx = steps.indexOf(currentStep);
|
||
if (idx < 0) return 0;
|
||
let total = 0;
|
||
for (const s of steps) total += STEP_WEIGHTS[s] || 10;
|
||
let done = 0;
|
||
for (let i = 0; i < idx; i += 1) done += STEP_WEIGHTS[steps[i]] || 10;
|
||
const curWeight = STEP_WEIGHTS[currentStep] || 10;
|
||
return Math.min(100, Math.round(((done + curWeight * 0.35) / total) * 100));
|
||
}
|
||
|
||
return {
|
||
get percent() {
|
||
return Math.min(100, Math.max(basePercent(), extraPercent));
|
||
},
|
||
get currentStep() {
|
||
return currentStep;
|
||
},
|
||
get deviceRole() {
|
||
return deviceRole;
|
||
},
|
||
setDeviceRole(role) {
|
||
deviceRole = role;
|
||
},
|
||
setStep(step) {
|
||
currentStep = step;
|
||
extraPercent = 0;
|
||
},
|
||
bumpExtra(delta) {
|
||
extraPercent = Math.min(100, extraPercent + delta);
|
||
},
|
||
setBootstrapProgress(p) {
|
||
const steps = flow();
|
||
const idx = steps.indexOf("bootstrap");
|
||
if (idx < 0) return;
|
||
let total = 0;
|
||
let before = 0;
|
||
for (let i = 0; i < steps.length; i += 1) {
|
||
const w = STEP_WEIGHTS[steps[i]] || 10;
|
||
if (i < idx) before += w;
|
||
total += w;
|
||
}
|
||
const w = STEP_WEIGHTS.bootstrap || 25;
|
||
extraPercent = Math.round(((before + w * Math.min(1, p)) / total) * 100);
|
||
},
|
||
flow,
|
||
};
|
||
}
|