- Add NotificationHistoryItem, NotificationHistoryResponse types - Add notification type enums (NotificationType, NotificationChannel, NotificationStatus) - Implement getNotificationHistory() in api.ts with filtering support - Supports limit, offset, type, status query params - Returns paginated history with total count 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
286 lines
7.8 KiB
TypeScript
286 lines
7.8 KiB
TypeScript
// User & Auth Types
|
|
export interface User {
|
|
user_id: number | string;
|
|
email?: string;
|
|
firstName?: string | null;
|
|
lastName?: string | null;
|
|
phone?: string | null;
|
|
avatarUrl?: string | null;
|
|
max_role: number | string;
|
|
privileges: string | string[];
|
|
}
|
|
|
|
export interface AuthResponse {
|
|
access_token: string;
|
|
privileges: string;
|
|
user_id: number;
|
|
max_role: number;
|
|
status: string;
|
|
}
|
|
|
|
export interface LoginCredentials {
|
|
username: string;
|
|
password: string;
|
|
}
|
|
|
|
// Subscription status for beneficiary
|
|
export interface BeneficiarySubscription {
|
|
status: 'active' | 'trialing' | 'expired' | 'none' | 'expiring_soon' | 'past_due' | 'canceled';
|
|
startDate?: string; // ISO date
|
|
endDate?: string; // ISO date (currentPeriodEnd from Stripe)
|
|
planType?: 'monthly' | 'annual';
|
|
price?: number;
|
|
cancelAtPeriodEnd?: boolean; // Will cancel at end of billing period
|
|
}
|
|
|
|
// Device/Sensor connected to beneficiary
|
|
export interface BeneficiaryDevice {
|
|
id: string;
|
|
type: 'motion' | 'door' | 'temperature' | 'bed' | 'other';
|
|
name: string;
|
|
location?: string;
|
|
status: 'online' | 'offline';
|
|
lastSeen?: string;
|
|
}
|
|
|
|
// WP Sensor (Water Pressure sensor) from Legacy API
|
|
export interface WPSensor {
|
|
deviceId: string; // Device ID from Legacy API
|
|
wellId: number; // Well ID (physical device identifier)
|
|
mac: string; // MAC address
|
|
name: string; // Display name (e.g., "WP_12_a1b2c3")
|
|
status: 'online' | 'warning' | 'offline'; // Connection status
|
|
lastSeen: Date; // Last data transmission time
|
|
location?: string; // Physical location
|
|
description?: string; // User description
|
|
beneficiaryId: string; // Associated beneficiary
|
|
deploymentId: number; // Legacy API deployment ID
|
|
source: 'api' | 'ble'; // Data source (API = attached, BLE = nearby)
|
|
}
|
|
|
|
// Equipment/Kit delivery status
|
|
export type EquipmentStatus =
|
|
| 'none' // No equipment ordered
|
|
| 'ordered' // Kit ordered, waiting to ship
|
|
| 'shipped' // Kit shipped, in transit
|
|
| 'delivered' // Kit delivered, ready to activate
|
|
| 'active' // Equipment activated and working
|
|
| 'demo'; // Demo mode (DEMO-00000)
|
|
|
|
// Deployment (location where beneficiary can be monitored)
|
|
export interface Deployment {
|
|
id: number;
|
|
beneficiary_id: number;
|
|
name: string; // e.g., "Home", "Office", "Vacation Home"
|
|
address?: string;
|
|
is_primary: boolean; // One deployment per beneficiary is primary
|
|
legacy_deployment_id?: number; // Link to Legacy API deployment
|
|
created_at: string;
|
|
updated_at: string;
|
|
}
|
|
|
|
// Beneficiary Types (elderly people being monitored)
|
|
export interface Beneficiary {
|
|
id: number;
|
|
name: string;
|
|
email?: string; // Email from beneficiaries table
|
|
customName?: string | null; // User's custom display name (e.g., "Mom", "Dad")
|
|
displayName: string; // Computed: customName || name (for UI display)
|
|
originalName?: string; // Original name from beneficiaries table (same as name)
|
|
avatar?: string;
|
|
device_id?: string;
|
|
status: 'online' | 'offline';
|
|
relationship?: string;
|
|
last_activity?: string;
|
|
sensor_data?: SensorData;
|
|
// Extended data from dashboard_single API
|
|
address?: string;
|
|
timezone?: string;
|
|
wellness_score?: number;
|
|
wellness_descriptor?: string;
|
|
last_location?: string;
|
|
temperature?: number;
|
|
units?: string;
|
|
sleep_hours?: number;
|
|
bedroom_temperature?: number;
|
|
before_last_location?: string;
|
|
last_detected_time?: string;
|
|
// Subscription & Devices
|
|
subscription?: BeneficiarySubscription;
|
|
devices?: BeneficiaryDevice[];
|
|
hasDevices?: boolean;
|
|
// Equipment status
|
|
equipmentStatus?: EquipmentStatus;
|
|
trackingNumber?: string; // Shipping tracking number
|
|
isDemo?: boolean; // Demo mode flag
|
|
// User's role for this beneficiary
|
|
role?: 'custodian' | 'guardian' | 'caretaker';
|
|
// Invitations for sharing access
|
|
invitations?: {
|
|
id: string;
|
|
email: string;
|
|
role: string;
|
|
label?: string;
|
|
status: string;
|
|
created_at: string;
|
|
}[];
|
|
}
|
|
|
|
// Dashboard API response
|
|
export interface DashboardSingleResponse {
|
|
result_list: BeneficiaryDashboardData[];
|
|
status: string;
|
|
}
|
|
|
|
export interface BeneficiaryDashboardData {
|
|
user_id: number;
|
|
name: string;
|
|
address: string;
|
|
time_zone: string;
|
|
picture: string;
|
|
deployment_id: string;
|
|
wellness_score_percent: number;
|
|
wellness_descriptor: string;
|
|
wellness_descriptor_color: string;
|
|
last_location: string;
|
|
last_detected_time: string;
|
|
before_last_location: string;
|
|
temperature: number;
|
|
bedroom_temperature: number;
|
|
sleep_hours: number;
|
|
units: string;
|
|
location_list: string[];
|
|
}
|
|
|
|
export interface SensorData {
|
|
motion_detected?: boolean;
|
|
last_motion?: string;
|
|
door_status?: 'open' | 'closed';
|
|
temperature?: number;
|
|
humidity?: number;
|
|
last_updated?: string;
|
|
}
|
|
|
|
// Chat Types
|
|
export interface Message {
|
|
id: string;
|
|
role: 'user' | 'assistant';
|
|
content: string;
|
|
timestamp: Date;
|
|
}
|
|
|
|
export interface ChatResponse {
|
|
ok: boolean;
|
|
response: {
|
|
Command: string;
|
|
body: string;
|
|
language: string;
|
|
};
|
|
status: string;
|
|
}
|
|
|
|
// Notification Types
|
|
export type NotificationType = 'emergency' | 'activity' | 'low_battery' | 'daily_summary' | 'weekly_summary' | 'system';
|
|
export type NotificationChannel = 'push' | 'email' | 'sms';
|
|
export type NotificationStatus = 'pending' | 'sent' | 'delivered' | 'failed' | 'skipped';
|
|
|
|
// Notification History Item (from /api/notification-settings/history)
|
|
export interface NotificationHistoryItem {
|
|
id: number;
|
|
title: string;
|
|
body: string;
|
|
type: NotificationType;
|
|
channel: NotificationChannel;
|
|
status: NotificationStatus;
|
|
skipReason: string | null;
|
|
data: Record<string, unknown> | null;
|
|
beneficiaryId: number | null;
|
|
createdAt: string;
|
|
sentAt: string | null;
|
|
deliveredAt: string | null;
|
|
}
|
|
|
|
// Notification History Response
|
|
export interface NotificationHistoryResponse {
|
|
history: NotificationHistoryItem[];
|
|
total: number;
|
|
limit: number;
|
|
offset: number;
|
|
}
|
|
|
|
// Notification Settings
|
|
export interface NotificationSettings {
|
|
// Alert types
|
|
emergencyAlerts: boolean;
|
|
activityAlerts: boolean;
|
|
lowBattery: boolean;
|
|
dailySummary: boolean;
|
|
weeklySummary: boolean;
|
|
// Delivery methods
|
|
pushEnabled: boolean;
|
|
emailEnabled: boolean;
|
|
smsEnabled: boolean;
|
|
// Quiet hours
|
|
quietHours: boolean;
|
|
quietStart: string; // "HH:MM" format
|
|
quietEnd: string; // "HH:MM" format
|
|
}
|
|
|
|
// API Types
|
|
export interface ApiError {
|
|
message: string;
|
|
code?: string;
|
|
status?: number;
|
|
}
|
|
|
|
export interface ApiResponse<T> {
|
|
data?: T;
|
|
error?: ApiError;
|
|
ok: boolean;
|
|
}
|
|
|
|
// Batch Sensor Setup Types
|
|
|
|
/** States a sensor can be in during batch setup */
|
|
export type SensorSetupStatus =
|
|
| 'pending' // Waiting in queue
|
|
| 'connecting' // BLE connection in progress
|
|
| 'unlocking' // Sending PIN command
|
|
| 'setting_wifi' // Configuring WiFi
|
|
| 'attaching' // Calling Legacy API to link to deployment
|
|
| 'rebooting' // Restarting sensor
|
|
| 'success' // Completed successfully
|
|
| 'error' // Failed (with error message)
|
|
| 'skipped'; // User chose to skip after error
|
|
|
|
/** Step within a sensor's setup process */
|
|
export interface SensorSetupStep {
|
|
name: 'connect' | 'unlock' | 'wifi' | 'attach' | 'reboot';
|
|
status: 'pending' | 'in_progress' | 'completed' | 'failed';
|
|
error?: string;
|
|
}
|
|
|
|
/** State of a single sensor during batch setup */
|
|
export interface SensorSetupState {
|
|
deviceId: string;
|
|
deviceName: string;
|
|
wellId?: number;
|
|
mac: string;
|
|
status: SensorSetupStatus;
|
|
steps: SensorSetupStep[];
|
|
error?: string;
|
|
startTime?: number;
|
|
endTime?: number;
|
|
}
|
|
|
|
/** Overall batch setup state */
|
|
export interface BatchSetupState {
|
|
sensors: SensorSetupState[];
|
|
currentIndex: number;
|
|
ssid: string;
|
|
password: string;
|
|
isPaused: boolean;
|
|
isComplete: boolean;
|
|
startTime: number;
|
|
}
|