mirror of
https://github.com/jeffvli/feishin.git
synced 2026-06-18 09:24:19 +02:00
74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
import isElectron from 'is-electron';
|
|
import React, { useCallback, useEffect } from 'react';
|
|
|
|
import { usePlayerStatus, useSettingsStore, useWindowSettings } from '/@/renderer/store';
|
|
import { PlayerStatus } from '/@/shared/types/types';
|
|
|
|
const ipc = isElectron() ? window.api.ipc : null;
|
|
|
|
export const usePowerSaveBlocker = () => {
|
|
const status = usePlayerStatus();
|
|
const { preventSleepOnPlayback, preventSuspendOnPlayback } = useWindowSettings();
|
|
|
|
const startPowerSaveBlocker = useCallback(async () => {
|
|
if (!ipc) return;
|
|
|
|
try {
|
|
await ipc.invoke('power-save-blocker-start', { full: preventSleepOnPlayback });
|
|
} catch (error) {
|
|
console.error('Failed to start power save blocker:', error);
|
|
}
|
|
}, [preventSleepOnPlayback]);
|
|
|
|
const stopPowerSaveBlocker = useCallback(async () => {
|
|
if (!ipc) return;
|
|
|
|
try {
|
|
await ipc.invoke('power-save-blocker-stop');
|
|
} catch (error) {
|
|
console.error('Failed to stop power save blocker:', error);
|
|
}
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
if (!preventSleepOnPlayback || !preventSuspendOnPlayback) return;
|
|
|
|
if (status === PlayerStatus.PLAYING) {
|
|
startPowerSaveBlocker();
|
|
} else {
|
|
stopPowerSaveBlocker();
|
|
}
|
|
}, [
|
|
status,
|
|
preventSleepOnPlayback,
|
|
startPowerSaveBlocker,
|
|
stopPowerSaveBlocker,
|
|
preventSuspendOnPlayback,
|
|
]);
|
|
|
|
useEffect(() => {
|
|
return () => {
|
|
stopPowerSaveBlocker();
|
|
};
|
|
}, [stopPowerSaveBlocker]);
|
|
};
|
|
|
|
const PowerSaveBlockerHookInner = () => {
|
|
usePowerSaveBlocker();
|
|
return null;
|
|
};
|
|
|
|
export const PowerSaveBlockerHook = () => {
|
|
const isElectronEnv = isElectron();
|
|
const preventSleepOnPlayback = useSettingsStore((state) => state.window.preventSleepOnPlayback);
|
|
const preventSuspendOnPlayback = useSettingsStore(
|
|
(state) => state.window.preventSuspendOnPlayback,
|
|
);
|
|
|
|
if (!isElectronEnv || !preventSleepOnPlayback || !preventSuspendOnPlayback) {
|
|
return null;
|
|
}
|
|
|
|
return React.createElement(PowerSaveBlockerHookInner);
|
|
};
|