From af1ea68a32c2f8cf376275444092a7167297e4e9 Mon Sep 17 00:00:00 2001 From: LynithDev <61880709+LynithDev@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:30:24 +0200 Subject: [PATCH] feat: Common delete modal + delete modal when removing accounts + remove default user if the user being removed is the default --- apps/desktop/src/api/commands.rs | 1 - .../src/ui/components/overlay/Modal.tsx | 106 +++++++++++++++++- .../overlay/account/AddAccountModal.tsx | 23 +++- .../src/ui/pages/cluster/ClusterOverview.tsx | 67 +---------- apps/testing/src/main.rs | 4 +- packages/core/src/store/minecraft.rs | 5 + 6 files changed, 137 insertions(+), 69 deletions(-) diff --git a/apps/desktop/src/api/commands.rs b/apps/desktop/src/api/commands.rs index 0e49500e..542c5753 100644 --- a/apps/desktop/src/api/commands.rs +++ b/apps/desktop/src/api/commands.rs @@ -1,7 +1,6 @@ use std::path::PathBuf; use interpulse::api::minecraft::Version; -use onelauncher::constants::{NATIVE_ARCH, TARGET_OS, VERSION}; use onelauncher::data::{Loader, ManagedPackage, MinecraftCredentials, PackageData, Settings}; use onelauncher::package::content; use onelauncher::store::{Cluster, ClusterPath}; diff --git a/apps/frontend/src/ui/components/overlay/Modal.tsx b/apps/frontend/src/ui/components/overlay/Modal.tsx index 79067356..414b3d65 100644 --- a/apps/frontend/src/ui/components/overlay/Modal.tsx +++ b/apps/frontend/src/ui/components/overlay/Modal.tsx @@ -5,7 +5,7 @@ import type { Ref, Setter, } from 'solid-js'; -import { For } from 'solid-js'; +import { For, createEffect, createSignal, on } from 'solid-js'; import { mergeRefs } from '@solid-primitives/refs'; import Button from '../base/Button'; import FullscreenOverlay from './FullscreenOverlay'; @@ -67,6 +67,110 @@ Modal.Simple = function (props: ModalSimpleProps) { ); }; +type ModalDeleteProps = MakeOptional & { + onCancel?: () => void; + onDelete?: () => void; + timeLeft?: number; +}; + +Modal.Delete = function (props: ModalDeleteProps) { + const [timeLeft, setTimeLeft] = createSignal(1); + const [intervalId, setIntervalId] = createSignal(undefined); + + createEffect(on(() => props.visible(), (visible) => { + startInterval(visible); + if (visible !== true) + onCancel(); + })); + + function clearIntervalId() { + if (intervalId()) + clearInterval(intervalId()); + } + + function startInterval(visible: boolean) { + if (visible !== true) + return; + + clearIntervalId(); + setTimeLeft(props.timeLeft || 3); + + const intervalId = setInterval(() => { + setTimeLeft((prev) => { + const next = prev - 1; + + if (next <= 0) + clearIntervalId(); + + return next; + }); + }, 1000); + + setIntervalId(intervalId); + } + + function onCancel() { + if (props.visible() === true) + props.setVisible(false); + + if (props.onCancel) + props.onCancel(); + } + + function onDelete() { + if (props.visible() === true) + props.setVisible(false); + + if (props.onDelete) + props.onDelete(); + } + + return ( + , +