import { state } from "../store.js"; import { t } from "../i18n.js"; import { iconMarkup, QUICK_ACCESS_ICONS } from "../icons.js"; import { showContextMenu } from "./contextMenu.js"; import { navigateLocal, removeBookmark } from "../fsActions.js"; let lastSig = null; function item(icon, label, active, onClick) { const row = document.createElement("div"); row.className = `row ${active ? "active" : ""}`; row.innerHTML = `${iconMarkup(icon, 15)}${label}`; row.addEventListener("click", onClick); return row; } export function renderSidebar(container) { container.innerHTML = ""; const logo = document.createElement("div"); logo.className = "sidebar-logo"; logo.innerHTML = `WWherry`; container.appendChild(logo); const qaTitle = document.createElement("div"); qaTitle.className = "sidebar-section-title"; qaTitle.textContent = t("panels.localLabel"); container.appendChild(qaTitle); for (const qa of state.sidebar.quickAccess) { if (!qa.path) continue; const active = state.local.path === qa.path; container.appendChild( item(QUICK_ACCESS_ICONS[qa.name] ?? "folder", qa.name, active, () => navigateLocal(qa.path)), ); } const divider1 = document.createElement("div"); divider1.className = "sidebar-divider"; container.appendChild(divider1); const drivesTitle = document.createElement("div"); drivesTitle.className = "sidebar-section-title"; drivesTitle.textContent = t("panels.sidebarDrives"); container.appendChild(drivesTitle); container.appendChild( item("ssd", t("panels.sidebarRoot"), state.local.path === "/", () => navigateLocal("/")), ); if (state.sidebar.bookmarks.length > 0) { const divider2 = document.createElement("div"); divider2.className = "sidebar-divider"; container.appendChild(divider2); const bmTitle = document.createElement("div"); bmTitle.className = "sidebar-section-title"; bmTitle.textContent = t("panels.sidebarBookmarks"); container.appendChild(bmTitle); for (const bm of state.sidebar.bookmarks) { const row = item("star", bm.name, state.local.path === bm.path, () => navigateLocal(bm.path)); row.addEventListener("contextmenu", (e) => { e.preventDefault(); showContextMenu(e.clientX, e.clientY, [ { label: t("panels.sidebarRemoveBookmark"), icon: "trash", danger: true, onClick: () => removeBookmark(bm.id) }, ]); }); container.appendChild(row); } } const spacer = document.createElement("div"); spacer.className = "sidebar-spacer"; container.appendChild(spacer); const footer = document.createElement("div"); footer.className = "sidebar-footer"; footer.textContent = "Wherry v0.1"; container.appendChild(footer); lastSig = computeSig(); } function computeSig() { return JSON.stringify([ state.local.path, state.sidebar.bookmarks.map((b) => `${b.id}:${b.path}`), state.sidebar.quickAccess.map((q) => q.path), ]); } export function updateSidebarIfNeeded(container) { if (computeSig() === lastSig) return; renderSidebar(container); }