import { Edit02Icon, FolderIcon, ImagePlusIcon, LinkExternal01Icon, PlayIcon, Save01Icon, Share07Icon, Trash01Icon } from '@untitled-theme/icons-solid'; import { type Accessor, type Setter, Show, createSignal, untrack } from 'solid-js'; import { useBeforeLeave, useNavigate } from '@solidjs/router'; import * as dialog from '@tauri-apps/plugin-dialog'; import { open } from '@tauri-apps/plugin-shell'; import { join } from 'pathe'; import ClusterCover from '../../components/game/ClusterCover'; import LoaderIcon from '../../components/game/LoaderIcon'; import Button from '../../components/base/Button'; import ScrollableContainer from '~ui/components/ScrollableContainer'; import Sidebar from '~ui/components/Sidebar'; import type { Cluster } from '~bindings'; import { secondsToWords, upperFirst } from '~utils'; import useClusterContext, { useLaunchCluster } from '~ui/hooks/useCluster'; import { bridge } from '~imports'; import TextField from '~ui/components/base/TextField'; import SettingsRow from '~ui/components/SettingsRow'; import useSettingsContext from '~ui/hooks/useSettings'; import type { ModalProps } from '~ui/components/overlay/Modal'; import Modal, { createModal } from '~ui/components/overlay/Modal'; function ClusterOverview() { const { settings } = useSettingsContext(); const [cluster, { refetch }] = useClusterContext(); const [editMode, setEditMode] = createSignal(false); const [newName, setNewName] = createSignal(''); const [newCover, setNewCover] = createSignal(''); const navigate = useNavigate(); const saveModal = createModal(props => ( )); const deleteModal = createModal(props => ( )); useBeforeLeave((e) => { if (editMode() && madeChanges()) { e.preventDefault(); saveModal.show(); } }); function getPath() { const clusterPath = cluster()?.path; const configDir = settings().config_dir; if (typeof clusterPath !== 'string' || typeof configDir !== 'string') return ''; return join(configDir, 'clusters', clusterPath); } function openPath() { open(getPath()); } async function deleteCluster() { await bridge.commands.removeCluster(cluster()!.uuid); navigate('/'); } function madeChanges() { const name = untrack(() => newName()); const cover = untrack(() => newCover()); const c = untrack(() => cluster()); if (!c) return false; const changedName = (name.length > 0 && name !== c.meta.name); const changedCover = (cover.length > 0 && (cover !== c.meta.icon_url || cover !== c.meta.icon)); return changedName || changedCover; } function toggleEditMode() { const next = !untrack(() => editMode()); if (next === false && madeChanges()) { saveModal.show(); return; } setEditMode(next); } async function pushEdits() { const c = untrack(() => cluster()); if (!c) return; await bridge.commands.editClusterMeta( c.uuid, newName().length > 0 ? newName() : null, newCover().length > 0 ? newCover() : c.meta.icon_url || c.meta.icon || null, ); refetch(); } function dontSave() { saveModal.hide(); setEditMode(false); } function save() { pushEdits(); saveModal.hide(); setEditMode(false); } return (

Overview

Folders and Files } disabled={editMode()} children={(