feat: email provider, admin password reset, portal new-patient, chat pill

Chat: history pill now shows a History icon + a Start-new-chat (SquarePen)
button; removed the duplicate chat-history list from the sidebar.

Email: deployment-wide email provider config (Resend/Postmark/SendGrid/SMTP) in
Settings → Developers, with encrypted API key and a Send-test action. sendEmail
dispatches via the chosen provider (REST via fetch; SMTP via nodemailer).

Forgot password with no provider: alert the clinic admin(s) via a "System"
message card in Messages + a bell notification (seeded system user + per-clinic
System conversation); clicking deep-links to /settings?tab=careTeam&member=<id>.
Admins can set a member's password directly from the employee dialog
(PATCH /api/staff/:id/password via Better Auth's internal context — no admin
plugin needed).

Patient Portal: "New patient" booking path registers a demographics-only patient
then books; bookings reject double-booked slots (409).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Khalid Abdi
2026-06-20 19:52:55 +03:00
parent 516de6ad60
commit 90e6ec4cc0
29 changed files with 5200 additions and 142 deletions
+2 -1
View File
@@ -9,7 +9,8 @@ export type ActivityEntityType =
| "invoice"
| "inventory"
| "dispense"
| "task";
| "task"
| "settings";
export type ActivityEntry = {
id: string;
+10 -1
View File
@@ -25,7 +25,16 @@ export type MessageAttachment =
mimeType: string;
size: number;
}
| { kind: "appointment"; appointment: AppointmentSnapshot };
| { kind: "appointment"; appointment: AppointmentSnapshot }
// A system-generated alert (e.g. an employee asked for a password reset but no
// email provider is configured). Rendered as a distinct "System" card that
// deep-links an admin to the member's settings.
| {
kind: "passwordReset";
userId: string;
userName: string;
userEmail: string;
};
export type ConversationMessage = {
id: string;