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

84 lines
2.6 KiB
TypeScript

import { ref } from "vue";
import { useSettingsStore } from "@/stores/settingsStore";
import { isTauriRuntime } from "@/lib/backend/tauriRuntime";
import * as api from "@/lib/backend/api";
export type AppCloseAction = "quit" | "hide";
type AppCloseRequestTarget = "settings" | "quit";
export interface AppCloseRequestOptions {
requireCloseActionChoice?: boolean;
}
interface AppCloseRequestPayload {
payload?: AppCloseRequestTarget;
}
export function useCloseActionPrompt(options: { requestClose: (action: AppCloseAction, requestOptions?: AppCloseRequestOptions) => void }) {
const settingsStore = useSettingsStore();
const showCloseActionPrompt = ref(false);
const unlistenHandles: Array<() => void> = [];
function actionForRequest(target: AppCloseRequestTarget): AppCloseAction {
if (target === "quit") return "quit";
return settingsStore.desktopSettings.quit_on_close ? "quit" : "hide";
}
async function performCloseAction(action: AppCloseAction) {
if (!isTauriRuntime()) return;
await api.completeAppClose(action);
}
function handleCloseRequest(target: AppCloseRequestTarget = "settings") {
const action = actionForRequest(target);
options.requestClose(action, {
requireCloseActionChoice: target === "settings" && !settingsStore.desktopSettings.close_action_prompted,
});
}
async function applyCloseChoice(action: AppCloseAction) {
showCloseActionPrompt.value = false;
await settingsStore.updateDesktopSettings({
quit_on_close: action === "quit",
close_action_prompted: true,
});
options.requestClose(action, { requireCloseActionChoice: false });
}
function chooseQuit() {
void applyCloseChoice("quit");
}
function chooseMinimize() {
void applyCloseChoice("hide");
}
function cancelCloseActionPrompt() {
showCloseActionPrompt.value = false;
}
function setupCloseActionPromptListener() {
if (!isTauriRuntime()) return;
void import("@tauri-apps/api/event").then(({ listen }) => {
listen<AppCloseRequestTarget>("dbx-app-close-requested", (event: AppCloseRequestPayload) => {
handleCloseRequest(event.payload === "quit" ? "quit" : "settings");
}).then((unlisten) => unlistenHandles.push(unlisten));
});
}
function cleanupCloseActionPromptListener() {
unlistenHandles.forEach((unlisten) => unlisten());
unlistenHandles.length = 0;
}
return {
showCloseActionPrompt,
chooseQuit,
chooseMinimize,
cancelCloseActionPrompt,
performCloseAction,
setupCloseActionPromptListener,
cleanupCloseActionPromptListener,
};
}