import { useState, useCallback } from 'react'; import { View, Text, Input, Picker } from '@tarojs/components'; import Taro from '@tarojs/taro'; import { usePageData } from '@/hooks/usePageData'; import { getCachedPatientId } from '@/services/request'; import { requestSubscribe } from '@/services/wechat-templates'; import EmptyState from '../../../components/EmptyState'; import { listReminders, createReminder, updateReminder, deleteReminder, type MedicationReminder, } from '../../../services/medication-reminder'; import { useElderClass } from '../../../hooks/useElderClass'; import PageShell from '@/components/ui/PageShell'; import './index.scss'; export default function MedicationReminder() { const modeClass = useElderClass(); const [reminders, setReminders] = useState([]); const [loading, setLoading] = useState(true); const [showForm, setShowForm] = useState(false); const [formName, setFormName] = useState(''); const [formDosage, setFormDosage] = useState(''); const [formTime, setFormTime] = useState('08:00'); const fetchReminders = useCallback(async () => { try { const res = await listReminders(); setReminders(res.data ?? []); } catch (err) { console.warn('[medication] 加载失败:', err); Taro.showToast({ title: '加载失败', icon: 'none' }); } finally { setLoading(false); } }, []); usePageData( async () => { await fetchReminders(); // 请求用药提醒推送订阅 requestSubscribe('MEDICATION_REMINDER'); }, { throttleMs: 5000, enablePullDown: true }, ); const handleToggle = async (r: MedicationReminder) => { try { await updateReminder(r.id, { is_active: !r.is_active, version: r.version, }); fetchReminders(); } catch (err) { console.warn('[medication] 操作失败:', err); Taro.showToast({ title: '操作失败', icon: 'none' }); } }; const handleDelete = (r: MedicationReminder) => { Taro.showModal({ title: '确认删除', content: '确定要删除这个提醒吗?', }).then(async (res) => { if (res.confirm) { try { await deleteReminder(r.id, r.version); Taro.showToast({ title: '已删除', icon: 'success' }); fetchReminders(); } catch (err) { console.warn('[medication] 删除失败:', err); Taro.showToast({ title: '删除失败', icon: 'none' }); } } }); }; const handleAdd = async () => { if (!formName.trim()) { Taro.showToast({ title: '请输入药品名称', icon: 'none' }); return; } const patientId = getCachedPatientId(); if (!patientId) { Taro.showToast({ title: '请先绑定患者档案', icon: 'none' }); return; } try { await createReminder({ patient_id: patientId, medication_name: formName.trim(), dosage: formDosage.trim() || undefined, reminder_times: [formTime], is_active: true, }); setFormName(''); setFormDosage(''); setFormTime('08:00'); setShowForm(false); Taro.showToast({ title: '添加成功', icon: 'success' }); fetchReminders(); } catch (err) { console.warn('[medication] 添加失败:', err); Taro.showToast({ title: '添加失败', icon: 'none' }); } }; const nameInitial = (name: string) => { return name ? name.charAt(0) : '药'; }; if (loading) { return ( 用药提醒 加载中... ); } return ( 用药提醒 {reminders.map((r) => ( {nameInitial(r.medication_name)} {r.medication_name} {r.dosage || '-'} | {r.reminder_times?.join(', ') || '-'} handleToggle(r)} > handleDelete(r)} > 删除 ))} {reminders.length === 0 && ( )} {showForm && ( 添加提醒 药品名称 setFormName(e.detail.value)} /> 剂量 setFormDosage(e.detail.value)} /> 提醒时间 setFormTime(e.detail.value)} > {formTime} 修改 setShowForm(false)}> 取消 确认 )} {!showForm && ( setShowForm(true)}> 添加提醒 )} ); }