vue-use-wake-lock
Version:
useWakeLock is the lightweight Vue 3 hook for managing the Wake Lock API — prevents your device from going to sleep.
2 lines (1 loc) • 1.43 kB
JavaScript
import{ref as n,onMounted as f,onUnmounted as k,computed as o,watch as L}from"vue";const r=l=>l==="visible",b=()=>{if(typeof document>"u")return{documentVisible:n(!1)};const l=n(r(document.visibilityState)),e=()=>{l.value=r(document.visibilityState)};return f(()=>{document.addEventListener("visibilitychange",e)}),k(()=>{document.removeEventListener("visibilitychange",e)}),{documentVisible:l}},g=()=>{if(typeof navigator>"u"||!("wakeLock"in navigator))return{active:o(()=>!1),supported:!1,wakeLockSentinel:n(null),request:()=>Promise.resolve(),forceRequest:()=>Promise.resolve(),release:()=>Promise.resolve()};const{documentVisible:l}=b(),e=n(null),u=n(null),t=n(null),c=o(()=>!!e.value),m=async(a="screen")=>{l.value?t.value?await t.value:await s(a):u.value=a},d=async(a="screen")=>{t.value&&i(),await s(a)},s=async a=>t.value=new Promise(async(y,w)=>{try{e.value&&await e.value.release(),e.value=await navigator.wakeLock.request(a),u.value=null,e.value.addEventListener("release",v,{once:!0,passive:!0}),y(e.value)}catch(p){w(p)}finally{t.value=null}}),i=async()=>{u.value=null;const a=await(t.value??Promise.resolve(e.value));a&&(a.removeEventListener("release",v),await a.release(),e.value===a&&(e.value=null))},v=()=>{e.value&&(u.value=e.value.type,e.value=null)};return L(l,a=>{a&&u.value&&!t.value&&s(u.value)}),{active:c,wakeLockSentinel:e,supported:!0,request:m,forceRequest:d,release:i}};export{g as useWakeLock};