hku-class/miniprogram/pages/home/index.js
2026-05-12 23:10:05 +08:00

90 lines
3.0 KiB
JavaScript

const { get } = require("../../utils/api");
const { refreshMe, requireLogin } = require("../../utils/auth");
const { isModuleEnabled, visibleModules } = require("../../utils/modules");
const { getActiveClassId, getActiveClassName, getEnabledModules, showError } = require("../../utils/page-helpers");
Page({
data: {
className: "HKU ICB",
announcements: [],
schedules: [],
votes: [],
timelines: [],
quickModules: [],
unreadCount: 0,
loading: false
},
async onShow() {
if (!requireLogin()) return;
await this.load();
},
async load() {
this.setData({ loading: true });
try {
await refreshMe();
const app = getApp();
const user = app.globalData.user;
const classId = getActiveClassId();
const enabledModules = getEnabledModules();
const className = getActiveClassName();
this.setData({
className,
quickModules: [
...visibleModules("class", enabledModules),
...visibleModules("interact", enabledModules)
].slice(0, 4)
});
const tasks = [get("/api/notifications/unread-count").catch(() => ({ unread_count: 0 }))];
const names = ["unread"];
if (isModuleEnabled("announcements", enabledModules)) {
names.push("announcements");
tasks.push(get("/api/announcements/", { page_size: 3, class_id: classId }));
}
if (isModuleEnabled("schedule", enabledModules)) {
names.push("schedules");
tasks.push(get("/api/schedule/upcoming", { limit: 3, class_id: classId }));
}
if (isModuleEnabled("votes", enabledModules)) {
names.push("votes");
tasks.push(get("/api/votes/", { page_size: 3, class_id: classId }));
}
if (isModuleEnabled("timeline", enabledModules)) {
names.push("timelines");
tasks.push(get("/api/timeline/", { page_size: 3, class_id: classId }));
}
const results = await Promise.all(tasks);
const next = { announcements: [], schedules: [], votes: [], timelines: [] };
names.forEach((name, index) => {
const value = results[index];
if (name === "unread") next.unreadCount = value.unread_count || 0;
if (name === "announcements") next.announcements = value.items || [];
if (name === "schedules") next.schedules = value || [];
if (name === "votes") next.votes = value.items || [];
if (name === "timelines") next.timelines = value.items || [];
});
this.setData(next);
} catch (error) {
showError(error);
} finally {
this.setData({ loading: false });
}
},
openModule(event) {
const key = event.currentTarget.dataset.key;
wx.navigateTo({ url: `/pages/module/index?module=${key}` });
},
openSchedule(event) {
wx.navigateTo({ url: `/pages/schedule-detail/index?id=${event.currentTarget.dataset.id}` });
},
openTimeline(event) {
wx.navigateTo({ url: `/pages/timeline-detail/index?id=${event.currentTarget.dataset.id}` });
}
});