feat: disable high power consumption without charger (#14281)

Co-authored-by: DarkSky <darksky2048@gmail.com>
This commit is contained in:
Akshaj Rawat
2026-01-27 02:16:16 +05:30
committed by GitHub
parent 3b4b0bad22
commit b8f626513f
9 changed files with 143 additions and 5 deletions
@@ -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);
}