OneLauncher-Cracked/apps/onelauncher/old_frontend/src/ui/components/WindowFrame.tsx
2025-05-11 20:34:30 +02:00

70 lines
2.3 KiB
TypeScript

import type { ComponentProps, JSX } from 'solid-js';
import { Window } from '@tauri-apps/api/window';
import { ChevronLeftIcon, Maximize02Icon, MinusIcon, XCloseIcon } from '@untitled-theme/icons-solid';
import useSettings from '~ui/hooks/useSettings';
import { onMount, Show } from 'solid-js';
import Button from './base/Button';
import Modal, { createModal } from './overlay/Modal';
interface TitlebarButtonProps {
icon: (props: ComponentProps<'svg'>) => JSX.Element;
onClick: (event: MouseEvent) => void;
danger?: boolean;
}
function TitlebarButton(props: TitlebarButtonProps) {
return (
<button class="group h-8 w-8 flex items-center justify-center" onClick={e => props.onClick(e)}>
<div class="rounded-lg p-1 group-hover:bg-page">
<props.icon class={`w-[18px] h-[18px] stroke-slate ${props.danger ? 'group-hover:stroke-danger' : 'group-hover:stroke-white'}`} />
</div>
</button>
);
}
const maximize = () => Window.getCurrent().toggleMaximize();
const minimize = () => Window.getCurrent().minimize();
const quit = () => Window.getCurrent().close();
const kill = () => Window.getCurrent().destroy();
function WindowFrame() {
const { settings } = useSettings();
const modal = createModal(props => (
<Modal.Simple
{...props}
buttons={[
<Button buttonStyle="secondary" onClick={() => props.hide()}>No</Button>,
<Button buttonStyle="danger" onClick={() => kill()}>Yes</Button>,
]}
title="Close OneLauncher?"
/>
));
onMount(() => {
Window.getCurrent().onCloseRequested((event) => {
if (settings().hide_close_prompt !== true) {
event.preventDefault();
modal.show();
}
});
});
return (
<Show when={settings().custom_frame}>
<div class="z-[99999] h-8 w-screen flex flex-row items-center justify-between gap-0.5 bg-page-elevated py-0.5" data-tauri-drag-region>
<div class="flex flex-row items-center">
<TitlebarButton icon={ChevronLeftIcon} onClick={() => history.back()} />
</div>
<div class="flex flex-row items-center justify-end">
<TitlebarButton icon={MinusIcon} onClick={() => minimize()} />
<TitlebarButton icon={Maximize02Icon} onClick={() => maximize()} />
<TitlebarButton danger icon={XCloseIcon} onClick={() => quit()} />
</div>
</div>
</Show>
);
}
export default WindowFrame;