feat: restore learning feedback and knowledge capabilities

This commit is contained in:
2026-07-18 00:50:11 +08:00
parent 876a23a123
commit 6bdc86e3fc
152 changed files with 30337 additions and 953 deletions
+13 -6
View File
@@ -1,10 +1,14 @@
import type { MobileIdentity, RoleKey } from '@/types/api';
import { apiRequest } from './api';
import {
hasSelectedPosition,
clearOrgPosition,
getSelectedPosition,
hasOrgPosition,
isSupervisorLearnerMode,
leaveSupervisorLearnerMode,
normalizePosition,
roleKey,
saveSelectedPosition,
saveOrgPosition,
type UserPosition
} from './auth';
@@ -20,7 +24,7 @@ export const isUserRoute = (url: string) => url.startsWith('/pages/user/');
export const isSupervisorRoute = (url: string) => url.startsWith('/pages/supervisor/');
export const routeForMobileRole = (role: RoleKey, requested: string) => {
if (role === 'supervisor' && (isUserRoute(requested) || isSupervisorRoute(requested))) {
if (role === 'supervisor' && isUserRoute(requested) && !isSupervisorLearnerMode()) {
return '/pages/supervisor/index/index';
}
if (role === 'user' && isSupervisorRoute(requested)) {
@@ -39,6 +43,7 @@ export const hydrateMobileRole = async (): Promise<RoleKey> => {
});
const role = identity.role === 'supervisor' ? 'supervisor' : 'user';
uni.setStorageSync(roleKey, role);
if (role !== 'supervisor') leaveSupervisorLearnerMode();
return role;
} catch {
// ponytail: role lookup failure fails closed; never reuse a stale supervisor cache.
@@ -66,9 +71,11 @@ export const hydratePositionFromOrg = async (): Promise<UserPosition | ''> => {
timeout: 15000,
clearAuthOnUnauthorized: false
});
return saveSelectedPosition(identity.positionName);
const officialPosition = saveOrgPosition(identity.positionName);
if (!officialPosition) clearOrgPosition();
return officialPosition;
} catch {
return '';
return hasOrgPosition() ? getSelectedPosition() : '';
}
};
@@ -78,7 +85,7 @@ export const nextUserRouteAfterLogin = async (redirect: string) => {
if (roleRoute !== redirect) return roleRoute;
if (!isUserRoute(redirect)) return redirect;
const officialPosition = await hydratePositionFromOrg();
if (normalizePosition(officialPosition) || hasSelectedPosition()) return redirect;
if (normalizePosition(officialPosition) || hasOrgPosition()) return redirect;
return positionSetupUrl(redirect);
};