training.js 1.59 KB
import { defineStore } from 'pinia';
import { ref, toRefs } from 'vue';
import { cloneDeep } from 'lodash-es';

// 默认训练状态
const defaultTraining = {
  isTraining: false,       // 是否正在训练
  isMinimized: false,      // 是否最小化
  exerciseId: null,        // 训练的动作ID
  unitType: null,          // 类型
  totalSeconds: 0,         // 计时秒数
  isTiming: false,         // 是否正在计时
  setsList: [],            // 训练组数据
  trainName: '',           // 训练名称
};

// 训练状态管理(专门用于最小化、悬浮球、后台运行)
const useTrainingStore = defineStore(
  'training',
  () => {
    // 训练状态
    const trainingInfo = ref(cloneDeep(defaultTraining));

    // 开始训练 / 保存训练数据
    const startTraining = (data) => {
      trainingInfo.value = {
        ...trainingInfo.value,
        ...data,
        isTraining: true,
      };
    };

    // 最小化训练
    const minimize = () => {
      trainingInfo.value.isMinimized = true;
    };

    // 恢复训练
    const restore = () => {
      trainingInfo.value.isMinimized = false;
    };

    // 结束训练(清空数据)
    const finishTraining = () => {
      trainingInfo.value = cloneDeep(defaultTraining);
    };

    // 暴露出去
    return {
      ...toRefs({ trainingInfo }),
      startTraining,
      minimize,
      restore,
      finishTraining,
    };
  },
  {
    // 持久化:关闭APP再进来,训练还在!
    persist: {
      enabled: true,
      strategies: [{ key: 'training-store' }],
    },
  },
);

export default useTrainingStore;