Backend: .NET 10 + PostgreSQL + EF Core + JWT + SignalR Frontend patient: React 19 + TypeScript + Vite (mobile H5) Frontend doctor: React 19 + TypeScript + Vite (desktop web)
91 lines
2.6 KiB
TypeScript
91 lines
2.6 KiB
TypeScript
import { api, type ApiResponse } from './api-client';
|
|
import type { User } from '@/types';
|
|
|
|
interface AuthResponseData {
|
|
userId: string;
|
|
name: string;
|
|
role: string;
|
|
accessToken: string;
|
|
refreshToken: string;
|
|
}
|
|
|
|
function mapUser(data: AuthResponseData): User {
|
|
return {
|
|
id: data.userId,
|
|
phone: '',
|
|
nickname: data.name,
|
|
avatar: '',
|
|
gender: 'unknown',
|
|
birthday: '',
|
|
height: 0,
|
|
weight: 0,
|
|
medicalHistory: [],
|
|
stentImplantDate: '',
|
|
createdAt: new Date().toISOString(),
|
|
};
|
|
}
|
|
|
|
export async function login(phone: string, smsCode: string): Promise<{ token: string; user: User }> {
|
|
const res: ApiResponse<AuthResponseData> = await api.post('/api/auth/login', {
|
|
phone,
|
|
smsCode,
|
|
});
|
|
return { token: res.data.accessToken, user: mapUser(res.data) };
|
|
}
|
|
|
|
export async function register(phone: string, smsCode: string, nickname: string): Promise<{ token: string; user: User }> {
|
|
const res: ApiResponse<AuthResponseData> = await api.post('/api/auth/register', {
|
|
phone,
|
|
smsCode,
|
|
name: nickname,
|
|
});
|
|
return { token: res.data.accessToken, user: mapUser(res.data) };
|
|
}
|
|
|
|
export async function sendSmsCode(phone: string): Promise<boolean> {
|
|
await api.post('/api/auth/send-sms', { phone });
|
|
return true;
|
|
}
|
|
|
|
export async function getProfile(): Promise<User> {
|
|
const res = await api.get<{
|
|
id: string; name: string; phone: string; role: string;
|
|
gender: string; birthday: string; heightCm: number; weightKg: number;
|
|
medicalHistory: string[]; stentDate: string; stentType: string;
|
|
department: string; title: string; specialty: string[]; introduction: string;
|
|
}>('/api/auth/me');
|
|
|
|
// Update stored user info
|
|
try {
|
|
const raw = localStorage.getItem('hrt_auth');
|
|
if (raw) {
|
|
const state = JSON.parse(raw);
|
|
if (state?.state) {
|
|
state.state.user = {
|
|
...state.state.user,
|
|
id: res.data.id,
|
|
phone: res.data.phone,
|
|
nickname: res.data.name,
|
|
gender: res.data.gender || 'unknown',
|
|
birthday: res.data.birthday || '',
|
|
height: res.data.heightCm || 0,
|
|
weight: res.data.weightKg || 0,
|
|
medicalHistory: res.data.medicalHistory || [],
|
|
stentImplantDate: res.data.stentDate || '',
|
|
};
|
|
localStorage.setItem('hrt_auth', JSON.stringify(state));
|
|
}
|
|
}
|
|
} catch { /* ignore */ }
|
|
|
|
return res.data as unknown as User;
|
|
}
|
|
|
|
export async function updateProfile(data: Record<string, unknown>): Promise<void> {
|
|
await api.put('/api/auth/me', data);
|
|
}
|
|
|
|
export async function logout(): Promise<void> {
|
|
localStorage.removeItem('hrt_auth');
|
|
}
|