Files
digital-pilates/hooks/useMoodData.ts
richarjiang 72e75b602e feat: 更新心情记录功能和界面
- 调整启动画面中的图片宽度,提升视觉效果
- 移除引导页面相关组件,简化应用结构
- 新增心情统计页面,支持用户查看和分析心情数据
- 优化心情卡片组件,增强用户交互体验
- 更新登录页面标题,提升品牌一致性
- 新增心情日历和编辑功能,支持用户记录和管理心情
2025-08-21 17:59:22 +08:00

168 lines
3.8 KiB
TypeScript

import { useAppDispatch, useAppSelector } from '@/hooks/redux';
import { MoodType } from '@/services/moodCheckins';
import {
createMoodRecord,
deleteMoodRecord,
fetchDailyMoodCheckins,
fetchMoodHistory,
fetchMoodStatistics,
selectLatestMoodRecordByDate,
selectMoodLoading,
selectMoodRecordsByDate,
selectMoodStatistics,
updateMoodRecord
} from '@/store/moodSlice';
import dayjs from 'dayjs';
// 创建心情记录参数
export interface CreateMoodParams {
moodType: MoodType;
intensity: number;
description?: string;
checkinDate?: string;
}
// 更新心情记录参数
export interface UpdateMoodParams {
id: string;
moodType?: MoodType;
intensity?: number;
description?: string;
}
// 获取心情历史参数
export interface GetMoodHistoryParams {
startDate: string;
endDate: string;
moodType?: MoodType;
}
// 获取心情统计参数
export interface GetMoodStatisticsParams {
startDate: string;
endDate: string;
}
/**
* 心情数据管理 Hook
*/
export function useMoodData() {
const dispatch = useAppDispatch();
const loading = useAppSelector(selectMoodLoading);
const statistics = useAppSelector(selectMoodStatistics);
/**
* 获取指定日期的心情记录
*/
const getMoodRecordsByDate = (date: string) => {
return useAppSelector(selectMoodRecordsByDate(date));
};
/**
* 获取指定日期的最新心情记录
*/
const getLatestMoodRecordByDate = (date: string) => {
return useAppSelector(selectLatestMoodRecordByDate(date));
};
/**
* 获取今天的心情记录
*/
const getTodayMoodRecord = () => {
const today = dayjs().format('YYYY-MM-DD');
return useAppSelector(selectLatestMoodRecordByDate(today));
};
/**
* 获取指定日期的心情记录(异步)
*/
const fetchMoodRecords = async (date: string) => {
const result = await dispatch(fetchDailyMoodCheckins(date)).unwrap();
return result.checkins || [];
};
/**
* 获取心情历史记录
*/
const fetchMoodHistoryRecords = async (params: GetMoodHistoryParams) => {
const result = await dispatch(fetchMoodHistory(params)).unwrap();
return result.checkins || [];
};
/**
* 获取心情统计数据
*/
const fetchMoodStatisticsData = async (params: GetMoodStatisticsParams) => {
return await dispatch(fetchMoodStatistics(params)).unwrap();
};
/**
* 创建心情记录
*/
const createMood = async (params: CreateMoodParams) => {
return await dispatch(createMoodRecord(params)).unwrap();
};
/**
* 更新心情记录
*/
const updateMood = async (params: UpdateMoodParams) => {
return await dispatch(updateMoodRecord(params)).unwrap();
};
/**
* 删除心情记录
*/
const deleteMood = async (id: string) => {
return await dispatch(deleteMoodRecord({ id })).unwrap();
};
return {
// 状态
loading,
statistics,
// 选择器
getMoodRecordsByDate,
getLatestMoodRecordByDate,
getTodayMoodRecord,
// 异步操作
fetchMoodRecords,
fetchMoodHistoryRecords,
fetchMoodStatisticsData,
createMood,
updateMood,
deleteMood,
};
}
/**
* 获取指定日期心情记录的 Hook
*/
export function useMoodRecords(date: string) {
const records = useAppSelector(selectMoodRecordsByDate(date));
const latestRecord = useAppSelector(selectLatestMoodRecordByDate(date));
const loading = useAppSelector(selectMoodLoading);
const dispatch = useAppDispatch();
const fetchRecords = async () => {
return await dispatch(fetchDailyMoodCheckins(date)).unwrap();
};
return {
records,
latestRecord,
loading: loading.daily,
fetchRecords,
};
}
/**
* 获取今天心情记录的 Hook
*/
export function useTodayMood() {
const today = dayjs().format('YYYY-MM-DD');
return useMoodRecords(today);
}