@@ -2,7 +2,10 @@ import AsyncStorage from '@react-native-async-storage/async-storage';
22import { create } from 'zustand' ;
33import { createJSONStorage , persist } from 'zustand/middleware' ;
44
5- import useCourse from './course' ;
5+ import {
6+ calculateSemesterWeekCount ,
7+ clampWeekToSemester ,
8+ } from '@/utils/semesterWeeks' ;
69
710/**
811 * 根据开学时间戳计算当前学期和学年
@@ -34,32 +37,48 @@ interface TimeState {
3437 setYear : ( _year : string ) => void ;
3538 selectedWeek : number ;
3639 setSelectedWeek : ( _week : number ) => void ;
40+ holidayTime : number ;
41+ setHolidayTime : ( _time : number ) => void ;
42+ schoolTime : number ;
43+ setSchoolTime : ( _time : number ) => void ;
3744 showWeekPicker : boolean ;
3845 setShowWeekPicker : ( _opened : boolean ) => void ;
3946 getCurrentWeek : ( ) => number ;
47+ getSemesterWeekCount : ( ) => number ;
4048 /** 根据开学时间戳计算并更新 semester/year */
4149 computeAndSetSemester : ( _startTimestamp : number ) => void ;
4250}
4351
4452const useTimeStore = create < TimeState > ( ) (
4553 persist (
46- set => {
54+ ( set , get ) => {
4755 return {
4856 semester : '' ,
4957 setSemester : ( semester : string ) => set ( { semester } ) ,
5058 year : '' ,
5159 setYear : ( year : string ) => set ( { year } ) ,
5260 selectedWeek : 1 ,
53- setSelectedWeek : ( week : number ) => set ( { selectedWeek : week } ) ,
61+ setSelectedWeek : ( week : number ) => {
62+ const totalWeeks = get ( ) . getSemesterWeekCount ( ) ;
63+ set ( { selectedWeek : clampWeekToSemester ( week , totalWeeks ) } ) ;
64+ } ,
65+ holidayTime : 0 ,
66+ setHolidayTime : ( _time : number ) => set ( { holidayTime : _time } ) ,
67+ schoolTime : 0 ,
68+ setSchoolTime : ( _time : number ) => set ( { schoolTime : _time } ) ,
5469 showWeekPicker : false ,
5570 setShowWeekPicker : ( showWeekPicker : boolean ) =>
5671 set ( { showWeekPicker : showWeekPicker } ) ,
5772 getCurrentWeek : ( ) => {
58- const startTimestamp = useCourse . getState ( ) . schoolTime * 1000 ;
73+ const startTimestamp = get ( ) . schoolTime * 1000 ;
5974 const diffTime = new Date ( ) . getTime ( ) - startTimestamp ;
6075 const diffDays = Math . floor ( diffTime / ( 1000 * 60 * 60 * 24 ) ) ;
6176 return Math . floor ( diffDays / 7 ) + 1 ;
6277 } ,
78+ getSemesterWeekCount : ( ) => {
79+ const { schoolTime, holidayTime } = get ( ) ;
80+ return calculateSemesterWeekCount ( schoolTime , holidayTime ) ;
81+ } ,
6382 computeAndSetSemester : ( startTimestamp : number ) => {
6483 const { semester, year } = computeSemesterAndYear ( startTimestamp ) ;
6584 set ( { semester, year } ) ;
0 commit comments