mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-05 11:30:04 +08:00
feat: disable high power consumption without charger (#14281)
Co-authored-by: DarkSky <darksky2048@gmail.com>
This commit is contained in:
@@ -1,10 +1,14 @@
|
||||
import { setupEvents } from './events';
|
||||
import { setupModules } from './modules';
|
||||
import { setupPowerSourceStore } from './power';
|
||||
import { setupStoreManager } from './store-manager';
|
||||
|
||||
export function setupEffects() {
|
||||
const { framework, frameworkProvider } = setupModules();
|
||||
setupStoreManager(framework);
|
||||
setupEvents(frameworkProvider);
|
||||
setupPowerSourceStore();
|
||||
return { framework, frameworkProvider };
|
||||
}
|
||||
|
||||
export { useIsOnBattery } from './power';
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
import { useSyncExternalStore } from 'react';
|
||||
|
||||
type Listener = () => void;
|
||||
|
||||
let snapshot = false;
|
||||
let teardown: (() => void) | null = null;
|
||||
const listeners = new Set<Listener>();
|
||||
|
||||
function emitChange() {
|
||||
listeners.forEach(listener => listener());
|
||||
}
|
||||
|
||||
function handlePowerSourceChange(isOnBattery: boolean) {
|
||||
if (snapshot === isOnBattery) return;
|
||||
snapshot = isOnBattery;
|
||||
emitChange();
|
||||
}
|
||||
|
||||
function ensureSubscribed() {
|
||||
if (teardown) return;
|
||||
if (typeof window === 'undefined') return;
|
||||
|
||||
const subscribePowerSource = window.__apis?.events?.power?.['power-source'];
|
||||
if (typeof subscribePowerSource !== 'function') return;
|
||||
|
||||
const unsubscribe = subscribePowerSource(handlePowerSourceChange);
|
||||
teardown = typeof unsubscribe === 'function' ? unsubscribe : null;
|
||||
}
|
||||
|
||||
function subscribe(listener: Listener) {
|
||||
listeners.add(listener);
|
||||
if (listeners.size === 1) {
|
||||
ensureSubscribed();
|
||||
}
|
||||
return () => {
|
||||
listeners.delete(listener);
|
||||
if (listeners.size === 0) {
|
||||
teardown?.();
|
||||
teardown = null;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export function setupPowerSourceStore() {
|
||||
ensureSubscribed();
|
||||
}
|
||||
|
||||
export function getIsOnBatterySnapshot() {
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
export function useIsOnBattery() {
|
||||
return useSyncExternalStore(subscribe, getIsOnBatterySnapshot, () => false);
|
||||
}
|
||||
Reference in New Issue
Block a user