useBattery.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { computed, onMounted, reactive, toRefs } from 'vue';
  2. interface Battery {
  3. charging: boolean; // 当前电池是否正在充电
  4. chargingTime: number; // 距离充电完毕还需多少秒,如果为0则充电完毕
  5. dischargingTime: number; // 代表距离电池耗电至空且挂起需要多少秒
  6. level: number; // 代表电量的放大等级,这个值在 0.0 至 1.0 之间
  7. [key: string]: any;
  8. }
  9. export const useBattery = () => {
  10. const state = reactive({
  11. battery: {
  12. charging: false,
  13. chargingTime: 0,
  14. dischargingTime: 0,
  15. level: 100,
  16. },
  17. });
  18. // 更新电池使用状态
  19. const updateBattery = (target) => {
  20. for (const key in state.battery) {
  21. state.battery[key] = target[key];
  22. }
  23. state.battery.level = state.battery.level * 100;
  24. };
  25. // 计算电池剩余可用时间
  26. const calcDischargingTime = computed(() => {
  27. const hour = state.battery.dischargingTime / 3600;
  28. const minute = (state.battery.dischargingTime / 60) % 60;
  29. return `${~~hour}小时${~~minute}分钟`;
  30. });
  31. // 计算电池充满剩余时间
  32. const calcChargingTime = computed(() => {
  33. const hour = state.battery.chargingTime / 3600;
  34. const minute = (state.battery.chargingTime / 60) % 60;
  35. return `${~~hour}小时${~~minute}分钟`;
  36. });
  37. // 电池状态
  38. const batteryStatus = computed(() => {
  39. if (state.battery.charging && state.battery.level >= 100) {
  40. return '已充满';
  41. } else if (state.battery.charging) {
  42. return '充电中';
  43. } else {
  44. return '已断开电源';
  45. }
  46. });
  47. onMounted(async () => {
  48. const BatteryManager: Battery = await (window.navigator as any).getBattery();
  49. updateBattery(BatteryManager);
  50. // 电池充电状态更新时被调用
  51. BatteryManager.onchargingchange = ({ target }) => {
  52. updateBattery(target);
  53. };
  54. // 电池充电时间更新时被调用
  55. BatteryManager.onchargingtimechange = ({ target }) => {
  56. updateBattery(target);
  57. };
  58. // 电池断开充电时间更新时被调用
  59. BatteryManager.ondischargingtimechange = ({ target }) => {
  60. updateBattery(target);
  61. };
  62. // 电池电量更新时被调用
  63. BatteryManager.onlevelchange = ({ target }) => {
  64. updateBattery(target);
  65. };
  66. // new Intl.DateTimeFormat('zh', {
  67. // year: 'numeric',
  68. // month: '2-digit',
  69. // day: '2-digit',
  70. // hour: '2-digit',
  71. // minute: '2-digit',
  72. // second: '2-digit',
  73. // hour12: false
  74. // }).format(new Date())
  75. });
  76. return {
  77. ...toRefs(state),
  78. batteryStatus,
  79. calcDischargingTime,
  80. calcChargingTime,
  81. };
  82. };