refactor(App, navigation): migrate to Expo Router and clean up navigation structure
All checks were successful
Frontend CI / build-and-push-web (push) Successful in 4m27s
Frontend CI / ota-android (push) Successful in 11m6s
Frontend CI / build-android-apk (push) Successful in 1h16m45s

- Updated App entry point to utilize Expo Router, simplifying the navigation setup.
- Removed legacy navigation components and services to streamline the codebase.
- Adjusted package.json to reflect the new entry point and updated dependencies for compatibility.
- Enhanced overall application structure by consolidating navigation logic and improving maintainability.
This commit is contained in:
lafay
2026-03-24 14:21:31 +08:00
parent b91e78c921
commit 2ddb9cadd8
111 changed files with 1829 additions and 3214 deletions

View File

@@ -145,8 +145,8 @@ class GroupManager extends CacheBus<GroupManagerSnapshot, GroupManagerEvent> {
});
}
async getGroup(groupId: number | string, forceRefresh = false): Promise<GroupResponse> {
const id = String(groupId);
async getGroup(groupId: string, forceRefresh = false): Promise<GroupResponse> {
const id = groupId;
const cached = this.groupDetailCache.get(id);
if (!forceRefresh && cached && !this.isExpired(cached) && cached.data) {
return cached.data;
@@ -204,8 +204,8 @@ class GroupManager extends CacheBus<GroupManagerSnapshot, GroupManagerEvent> {
});
}
async getMembers(groupId: number | string, page = 1, pageSize = 50, forceRefresh = false): Promise<GroupMemberListResponse> {
const id = String(groupId);
async getMembers(groupId: string, page = 1, pageSize = 50, forceRefresh = false): Promise<GroupMemberListResponse> {
const id = groupId;
const key = `${id}:${page}:${pageSize}`;
const cached = this.groupMembersCache.get(key);
if (!forceRefresh && cached && !this.isExpired(cached)) {

View File

@@ -15,10 +15,10 @@ export class NetworkCursorGroupMemberListPagedSource implements IGroupMemberList
private nextCursor: string | null = null;
private hasMoreAfterLastLoad = false;
private loadedOnce = false;
private readonly groupId: number | string;
private readonly groupId: string;
private readonly pageSize: number;
constructor(groupId: number | string, pageSize: number = GROUP_MEMBER_LIST_PAGE_SIZE) {
constructor(groupId: string, pageSize: number = GROUP_MEMBER_LIST_PAGE_SIZE) {
this.groupId = groupId;
this.pageSize = pageSize;
}
@@ -58,10 +58,10 @@ export class NetworkOffsetGroupMemberListPagedSource implements IGroupMemberList
private nextPage = 1;
private hasMoreAfterLastLoad = false;
private loadedOnce = false;
private readonly groupId: number | string;
private readonly groupId: string;
private readonly pageSize: number;
constructor(groupId: number | string, pageSize: number = GROUP_MEMBER_LIST_PAGE_SIZE) {
constructor(groupId: string, pageSize: number = GROUP_MEMBER_LIST_PAGE_SIZE) {
this.groupId = groupId;
this.pageSize = pageSize;
}
@@ -100,7 +100,7 @@ export class NetworkOffsetGroupMemberListPagedSource implements IGroupMemberList
export function createRemoteGroupMemberListSource(
kind: GroupMemberListSourceKind,
groupId: number | string,
groupId: string,
pageSize: number = GROUP_MEMBER_LIST_PAGE_SIZE
): IGroupMemberListPagedSource {
return kind === 'offset'

View File

@@ -0,0 +1,33 @@
/**
* 不可放入 URL 的路由载荷(系统消息对象、课表课程对象等)的短时缓存。
* 深链仅带 id从通知列表等入口跳转前先 stash目标屏按 id 读取。
*/
import type { SystemMessageResponse } from '../types/dto';
import type { Course } from '../types/schedule';
const systemById = new Map<string, SystemMessageResponse>();
const courseById = new Map<string, { course: Course; relatedCourses: Course[] }>();
export const routePayloadCache = {
stashSystemMessage(message: SystemMessageResponse): void {
systemById.set(message.id, message);
},
getSystemMessage(id: string): SystemMessageResponse | undefined {
return systemById.get(id);
},
stashCourseDetail(course: Course, relatedCourses: Course[]): void {
courseById.set(String(course.id), { course, relatedCourses });
},
getCourseDetail(id: string): { course: Course; relatedCourses: Course[] } | undefined {
return courseById.get(id);
},
takeCourseDetail(id: string): { course: Course; relatedCourses: Course[] } | undefined {
const v = courseById.get(id);
if (v) courseById.delete(id);
return v;
},
};