Files
soft/frontend-patient/src/services/auth.service.ts
MingNian 435af55c4a Initial commit: HealthManager full-stack health management platform
Backend: .NET 10 + PostgreSQL + EF Core + JWT + SignalR
Frontend patient: React 19 + TypeScript + Vite (mobile H5)
Frontend doctor: React 19 + TypeScript + Vite (desktop web)
2026-05-20 16:18:56 +08:00

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');
}