Files
Webka/frontend/composables/useKeepHostAwake.ts
2026-09-06 18:47:42 +05:00

39 lines
1.3 KiB
TypeScript

import { createScreenWakeLock, type WakeStatus } from "../utils/screenWakeLock";
import type { Ref } from "vue";
export function useKeepHostAwakePreference() {
return useCookie<boolean>("webka_keep_host_awake", {
default: () => false,
maxAge: 60 * 60 * 24 * 365,
sameSite: "lax",
path: "/",
});
}
export function useHostWakeLock(hosting: Ref<boolean>) {
const enabled = useKeepHostAwakePreference();
const status = ref<WakeStatus>("off");
let controller: ReturnType<typeof createScreenWakeLock> | undefined;
let unwatch: (() => void) | undefined;
const refresh = () => controller?.refresh();
onMounted(() => {
controller = createScreenWakeLock({
request: window.isSecureContext && navigator.wakeLock?.request
? () => navigator.wakeLock.request("screen")
: undefined,
visible: () => document.visibilityState === "visible",
status: (value) => { status.value = value; },
});
unwatch = watch([enabled, hosting], () => {
controller?.update(enabled.value === true && hosting.value);
}, { immediate: true, flush: "sync" });
document.addEventListener("visibilitychange", refresh);
});
onBeforeUnmount(() => {
unwatch?.();
document.removeEventListener("visibilitychange", refresh);
controller?.dispose();
});
return { status, retry: refresh };
}