84 lines
2.6 KiB
TypeScript
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,
|
|
};
|
|
}
|