diff --git a/src/core/menu/components/Popup.mjs b/src/core/menu/components/Popup.mjs index c49ffad..b9057bf 100644 --- a/src/core/menu/components/Popup.mjs +++ b/src/core/menu/components/Popup.mjs @@ -46,21 +46,23 @@ function Popup({ trigger, onopen, onclose, onbeforeclose }, ...children) { }; $popup.querySelectorAll("[tabindex]").forEach(($el) => ($el.tabIndex = -1)); - extendProps(trigger, { - onclick: $popup.show, - onkeydown(event) { - if (event.key === "Enter") $popup.show(); - }, - }); - useState(["rerender"], () => { - if ($popup.hasAttribute("open")) $popup.hide(); - }); + if (trigger) { + extendProps(trigger, { + onclick: $popup.show, + onkeydown(event) { + if (event.key === "Enter") $popup.show(); + }, + }); + } document.addEventListener("click", (event) => { if (!$popup.hasAttribute("open")) return; if ($popup.contains(event.target) || $popup === event.target) return; - if (trigger.contains(event.target) || trigger === event.target) return; + if (trigger?.contains(event.target) || trigger === event.target) return; $popup.hide(); }); + useState(["rerender"], () => { + if ($popup.hasAttribute("open")) $popup.hide(); + }); return $popup; } diff --git a/src/core/menu/islands/Profiles.mjs b/src/core/menu/islands/Profiles.mjs index cfa5fb0..ed5522e 100644 --- a/src/core/menu/islands/Profiles.mjs +++ b/src/core/menu/islands/Profiles.mjs @@ -24,17 +24,37 @@ function Profile({ id }) { }, setName = async (name) => { // name only has effect in menu - // doesn't need reload triggered + // doesn't need to trigger reload await profile.set("profileName", name); - }; - - const isActive = async () => id === (await getProfile()), + }, + isActive = async () => { + return id === (await getProfile()); + }, setActive = async () => { await db.set("activeProfile", id); setState({ rerender: true, databaseUpdated: true }); }; - const uploadProfile = (event) => { + const $successName = html``, + $success = html`<${Popup} + onopen=${async () => ($successName.innerText = await getName())} + > +
+ The profile ${$successName} has been updated successfully. +
+ />`, + $error = html`<${Popup}> ++ An error was encountered attempting to parse the uploaded file. +
+ />`, + uploadProfile = (event) => { const file = event.target.files[0], reader = new FileReader(); reader.onload = async (progress) => { @@ -45,8 +65,11 @@ function Profile({ id }) { profileName: await getName(), }); setState({ rerender: true, databaseUpdated: true }); + $success.show(); + setTimeout(() => $success.hide(), 2000); } catch (err) { - console.error(err); + $error.show(); + setTimeout(() => $error.hide(), 2000); } }; reader.readAsText(file); @@ -87,25 +110,22 @@ function Profile({ id }) { } else setState({ rerender: true }); }; - const $name = html``, - $delete = html``, + $confirmName = $successName.cloneNode(true), $confirm = html`<${Popup} trigger=${$delete} - onopen=${async () => ($name.innerText = await getName())} + onopen=${async () => ($confirmName.innerText = await getName())} > -- Are you sure you want to delete the profile ${$name} permanently? +
+ Are you sure you want to delete the profile ${$confirmName} permanently?
-