Files
dbx/apps/desktop/src/composables/useWindowControls.ts
T

68 lines
1.9 KiB
TypeScript

import { ref, onMounted, onUnmounted } from "vue";
import { isTauriRuntime } from "@/lib/tauriRuntime";
import { isMacOS } from "@/lib/platform";
export function shouldReserveMacTrafficLightInset(isMac: boolean, isFullscreen: boolean, isDesktop = true): boolean {
return isDesktop && isMac && !isFullscreen;
}
export function useWindowControls() {
const isMaximized = ref(false);
const isFullscreen = ref(false);
const isMac = isMacOS();
const isDesktop = isTauriRuntime();
const showControls = isDesktop && !isMac;
let unlisten: (() => void) | null = null;
async function updateWindowState() {
if (!isDesktop) return;
const { getCurrentWindow } = await import("@tauri-apps/api/window");
const currentWindow = getCurrentWindow();
const [maximized, fullscreen] = await Promise.all([currentWindow.isMaximized(), currentWindow.isFullscreen()]);
isMaximized.value = maximized;
isFullscreen.value = fullscreen;
}
async function minimize() {
const { getCurrentWindow } = await import("@tauri-apps/api/window");
await getCurrentWindow().minimize();
}
async function toggleMaximize() {
const { getCurrentWindow } = await import("@tauri-apps/api/window");
await getCurrentWindow().toggleMaximize();
setTimeout(updateWindowState, 50);
}
async function close() {
const { getCurrentWindow } = await import("@tauri-apps/api/window");
await getCurrentWindow().close();
}
onMounted(async () => {
if (!isDesktop) return;
await updateWindowState();
const { getCurrentWindow } = await import("@tauri-apps/api/window");
const unlistenFn = await getCurrentWindow().onResized(() => {
void updateWindowState();
});
unlisten = unlistenFn;
});
onUnmounted(() => {
unlisten?.();
});
return {
isMac,
isDesktop,
showControls,
isMaximized,
isFullscreen,
minimize,
toggleMaximize,
close,
};
}