Skip to content

Commit d8064fa

Browse files
committed
Fetch semester data from APIs and validate course submissions
1 parent fcf7f57 commit d8064fa

16 files changed

Lines changed: 366 additions & 295 deletions

File tree

src/modules/courseTable/components/CourseDataForm.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,16 @@ export const CourseDataForm = (props: CourseFormProps) => {
182182
});
183183
return;
184184
}
185+
if (!props.onSubmit && (!semester || !year)) {
186+
Modal.show({
187+
title: '提示',
188+
children: '学期信息尚未加载,请稍后重试',
189+
mode: 'middle',
190+
showCancel: false,
191+
confirmText: '确定',
192+
});
193+
return;
194+
}
185195

186196
setLoading(true);
187197
try {
@@ -193,18 +203,14 @@ export const CourseDataForm = (props: CourseFormProps) => {
193203
// default create behavior
194204
const data = {
195205
...formData,
196-
semester: semester || '1',
197-
year: year || new Date().getFullYear().toString(),
206+
semester,
207+
year,
198208
is_official: false, // 自主添加而非教务系统的课
199209
} as any;
200210

201211
await addCourse(data);
202212

203-
createAndCacheCourse(
204-
formData,
205-
semester || '1',
206-
year || new Date().getFullYear().toString()
207-
);
213+
createAndCacheCourse(formData, semester, year);
208214

209215
Modal.show({
210216
title: '成功',

src/modules/courseTable/components/WeekSelector.tsx

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import {
1010

1111
import Modal from '@/components/modal';
1212

13-
import useTimeStore, { computeSemesterAndYear } from '@/store/time';
1413
import useVisualScheme from '@/store/visualScheme';
1514

1615
import { commonStyles } from '@/styles/common';
1716
import { log } from '@/utils/logger';
17+
import { calculateSemesterWeekCount } from '@/utils/semesterWeeks';
1818

1919
import { WeekSelectorProps } from './courseTable/type';
2020

@@ -32,19 +32,12 @@ const WeekSelector: FC<WeekSelectorProps> = ({
3232
year,
3333
semester,
3434
semesterOptions,
35+
currentSemester,
36+
actualCurrentWeek,
3537
onApply,
3638
isLoading = false,
3739
}) => {
3840
const currentStyle = useVisualScheme(state => state.currentStyle);
39-
const getCurrentWeek = useTimeStore(state => state.getCurrentWeek);
40-
const schoolTime = useTimeStore(state => state.schoolTime);
41-
42-
// 根据 schoolTime 推算真实当前学期
43-
const actualSemester = useMemo(
44-
() => (schoolTime ? computeSemesterAndYear(schoolTime) : null),
45-
[schoolTime]
46-
);
47-
4841
// 本地预选学期状态(箭头切换只改这里,不立即请求)
4942
const [pendingYear, setPendingYear] = useState(year);
5043
const [pendingSemester, setPendingSemester] = useState(semester);
@@ -69,15 +62,24 @@ const WeekSelector: FC<WeekSelectorProps> = ({
6962
pendingIndex >= 0 && pendingIndex < semesterOptions.length - 1;
7063
const canGoNext = pendingIndex > 0;
7164

65+
const pendingTotalWeeks = useMemo(() => {
66+
if (pendingIndex < 0) return totalWeeks;
67+
const option = semesterOptions[pendingIndex];
68+
return calculateSemesterWeekCount(
69+
option.startTimestamp,
70+
option.endTimestamp
71+
);
72+
}, [pendingIndex, semesterOptions, totalWeeks]);
73+
7274
// 预选学期是否与当前学期不同
7375
const hasSemesterChanged =
7476
pendingYear !== year || pendingSemester !== semester;
7577

7678
// 预选学期是否为真实当前学期(用于决定是否渲染「当前周」标识)
7779
const isCurrentSemester =
78-
actualSemester !== null &&
79-
pendingYear === actualSemester.year &&
80-
pendingSemester === actualSemester.semester;
80+
currentSemester !== null &&
81+
pendingYear === currentSemester.year &&
82+
pendingSemester === currentSemester.semester;
8183

8284
// 向前切换(更早的学期)—— 只改本地状态
8385
const handlePrev = useCallback(() => {
@@ -257,7 +259,7 @@ const WeekSelector: FC<WeekSelectorProps> = ({
257259
</View>
258260
{/* 周次选择区域 */}
259261
<View style={styles.weekGrid}>
260-
{Array.from({ length: totalWeeks }).map((_, i) => (
262+
{Array.from({ length: pendingTotalWeeks }).map((_, i) => (
261263
<Pressable
262264
key={i}
263265
onPress={() => handleWeekSelect(i + 1)}
@@ -280,7 +282,7 @@ const WeekSelector: FC<WeekSelectorProps> = ({
280282
color:
281283
!hasSemesterChanged && currentWeek === i + 1
282284
? '#FFFFFF'
283-
: isCurrentSemester && getCurrentWeek() === i + 1
285+
: isCurrentSemester && actualCurrentWeek === i + 1
284286
? '#7878F8'
285287
: currentStyle?.schedule_text_style?.color ||
286288
'#000000',
@@ -289,7 +291,7 @@ const WeekSelector: FC<WeekSelectorProps> = ({
289291
>
290292
{i + 1}
291293
</Text>
292-
{isCurrentSemester && getCurrentWeek() === i + 1 && (
294+
{isCurrentSemester && actualCurrentWeek === i + 1 && (
293295
<Text
294296
style={[
295297
commonStyles.fontSmall,
@@ -319,7 +321,7 @@ const WeekSelector: FC<WeekSelectorProps> = ({
319321

320322
const styles = StyleSheet.create({
321323
loadingOverlay: {
322-
...StyleSheet.absoluteFillObject,
324+
...StyleSheet.absoluteFill,
323325
justifyContent: 'center',
324326
alignItems: 'center',
325327
},

src/modules/courseTable/components/courseTable/type.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55
PanGestureHandlerEventPayload,
66
} from 'react-native-gesture-handler';
77
import { StyleProps } from 'react-native-reanimated';
8+
9+
import type { SemesterOptionBase } from '@/utils/generateSemesterOptions';
810
export type courseType = {
911
class_when: string;
1012
classname: string;
@@ -46,11 +48,7 @@ export interface CourseTransferType {
4648
is_official: boolean; // 是否为教务系统课程
4749
}
4850

49-
export interface SemesterOption {
50-
label: string;
51-
year: string;
52-
semester: string;
53-
}
51+
export type SemesterOption = SemesterOptionBase;
5452

5553
/** 学期 + 周次 应用参数 */
5654
export interface SemesterWeekParams {
@@ -71,6 +69,10 @@ export interface WeekSelectorProps {
7169
semester: string;
7270
/** 可选学期列表 */
7371
semesterOptions: SemesterOption[];
72+
/** 后端返回的真实当前学期 */
73+
currentSemester: Pick<SemesterOption, 'year' | 'semester'> | null;
74+
/** 真实当前学期的当前周 */
75+
actualCurrentWeek: number;
7476
/** 应用学期/周次变更并关闭,由父组件负责更新状态、拉取课表、关闭弹窗 */
7577
onApply: (params: SemesterWeekParams) => void | Promise<void>;
7678
/** 拉取课表数据中,遮罩层显示 loading */

0 commit comments

Comments
 (0)