Files
Evergreen-Health-Mobile/src/services/health.ts
T
2026-09-22 15:40:58 +08:00

247 lines
5.9 KiB
TypeScript

import http from './http'
export type HealthUser = {
id: number
phone: string
displayName: string
avatarUrl?: string
}
export type AuthOutput = {
accessToken: string
refreshToken: string
user: HealthUser
}
export type HealthProfile = {
birthday?: string
gender?: string
heightCm?: number
weightKg?: number
averageSleepHours?: number
dailyExerciseMinutes?: number
dietPreference?: string
healthGoal?: string
}
export type PlanItem = {
moduleCode: string
title: string
target: string
advice: string
}
export type HealthPlan = {
id: number
version: number
title: string
summary: string
createTime: string
items: PlanItem[]
}
export type PersonalizedSceneConfig = {
targetHumidity: number
dehumidifierMode: string
fanLevel: string
enableUv: boolean
lightBrightnessPercent: number
lightColorTemperatureKelvin: number
mattressTargetTemp: number
mattressLeftFirmness: number
mattressRightFirmness: number
mattressHeatingLevel: number
mattressMode: string
enableFragrance: boolean
fragranceLevel: number
enableSpeakerSleepMode: boolean
speakerAudioMode: string
speakerVolumePercent: number
}
export type HealthAssessmentAnswers = {
sleepDuration: string
fallingAsleepSpeed: string
temperaturePreference: string
nightAwakening: string
mattressPreference: string
exerciseFrequency: string
muscleFatigueArea: string
activeTimeOfDay: string
mealRegularity: string
flavorPreference: string
lateNightEating: string
dailyWaterIntake: string
}
export type SaveHealthAssessmentInput = {
basicInfo: HealthProfile
answers: HealthAssessmentAnswers
}
export type HealthAssessmentOutput = {
hasCompletedAssessment: boolean
basicInfo: HealthProfile
answers: HealthAssessmentAnswers
sceneConfig: PersonalizedSceneConfig
bmi?: number | null
bmiStatus: string
}
export type Dashboard = {
user: HealthUser
profile?: HealthProfile
selectedModules: string[]
currentPlan?: HealthPlan
hasCompletedAssessment: boolean
bmi?: number | null
bmiStatus?: string
sceneConfig?: PersonalizedSceneConfig
}
export type HealthDeviceCategory =
| 'EnvironmentControl'
| 'EnvironmentSensor'
| 'Sleep'
| 'BodyComposition'
| 'Fragrance'
| 'Lighting'
| 'Media'
| 'Other'
export type HomeAssistantEntity = {
entityId: string
domain: string
name: string
state: string
available: boolean
unit?: string
attributes?: Record<string, unknown>
}
export type HomeAssistantDiscoveredDevice = {
deviceId: string
name: string
manufacturer: string
model: string
areaName?: string
category: HealthDeviceCategory | string
online: boolean
primaryControlEntityId?: string | null
entities: HomeAssistantEntity[]
metrics?: Record<string, unknown>
}
export type HomeAssistantSummary = {
totalDevices: number
onlineDevices: number
offlineDevices: number
totalEntities: number
availableEntities: number
}
export type HomeAssistantSceneDevicesSummary = {
total: number
available: number
}
export type HomeAssistantEnvironmentData = {
temperature?: number | null
humidity?: number | null
pm25?: number | null
pm10?: number | null
co2?: number | null
hcho?: number | null
tvoc?: number | null
}
export type HomeAssistantScenePreset = {
deviceName: string
category: string
entityId: string
available: boolean
availabilityMessage: string
action: string
detail: string
parameters: Record<string, unknown>
}
export type HomeAssistantDeviceSwitchOutput = {
success: boolean
deviceId: string
entityId: string
state: string
message: string
}
export type HomeAssistantStatus = {
connected: boolean
message: string
checkedAt: string
summary: HomeAssistantSummary
devices: HomeAssistantDiscoveredDevice[]
sceneDevices: HomeAssistantSceneDevicesSummary
environment: HomeAssistantEnvironmentData
scenePresets?: HomeAssistantScenePreset[]
controlParameters?: Record<string, HomeAssistantParameterState>
}
export type HomeAssistantParameterState = {
entityId: string
state: string
available: boolean
attributes?: Record<string, unknown>
}
export type HomeAssistantSceneAction = {
name: string
entityId: string
status: string
message: string
}
export type HomeAssistantSceneResult = {
sceneCode: string
sceneName: string
success: boolean
status: string
message: string
executedAt: string
actions: HomeAssistantSceneAction[]
}
export type HomeAssistantSetParameterInput = {
deviceId: string
entityId?: string
parameterType: string
value: unknown
}
export type HomeAssistantSetParameterOutput = {
success: boolean
deviceId: string
parameterType: string
message: string
}
export const healthApi = {
register: (payload: { phone: string; password: string; displayName: string }) =>
http.post<never, AuthOutput>('/api/health/auth/register', payload),
login: (payload: { phone: string; password: string }) =>
http.post<never, AuthOutput>('/api/health/auth/login', payload),
dashboard: () => http.get<never, Dashboard>('/api/health/dashboard'),
getAssessment: () => http.get<never, HealthAssessmentOutput>('/api/health/assessment'),
saveAssessment: (payload: SaveHealthAssessmentInput) =>
http.post<never, HealthAssessmentOutput>('/api/health/assessment', payload),
homeAssistantStatus: () =>
http.get<never, HomeAssistantStatus>('/api/health/home-assistant/status'),
executeSleepScene: () =>
http.post<never, HomeAssistantSceneResult>('/api/health/home-assistant/scenes/sleep'),
executeAllOffScene: () =>
http.post<never, HomeAssistantSceneResult>('/api/health/home-assistant/scenes/all-off'),
switchDevice: (payload: { deviceId: string; turnOn: boolean; entityId?: string }) =>
http.post<never, HomeAssistantDeviceSwitchOutput>('/api/health/home-assistant/devices/switch', payload),
setParameter: (payload: HomeAssistantSetParameterInput) =>
http.post<never, HomeAssistantSetParameterOutput>('/api/health/home-assistant/devices/set-parameter', payload)
}