wellnua-lite/contexts/BeneficiaryContext.tsx
Sergei a578ec8081 feat: Pass Debug tab deployment ID to voice calls
- Add debugDeploymentId to BeneficiaryContext for sharing between screens
- Sync Debug tab's deploymentId state with global context
- voice-call.tsx now prioritizes debugDeploymentId when starting calls
- Enables testing voice calls with specific deployment IDs from Debug screen
2026-01-24 00:05:47 -08:00

94 lines
2.8 KiB
TypeScript

import React, { createContext, useContext, useState, useCallback } from 'react';
import type { Beneficiary } from '@/types';
interface BeneficiaryContextType {
currentBeneficiary: Beneficiary | null;
setCurrentBeneficiary: (beneficiary: Beneficiary | null) => void;
clearCurrentBeneficiary: () => void;
// Helper to format beneficiary context for AI
getBeneficiaryContext: () => string;
// Debug: Override deployment ID for testing (used by Debug screen)
debugDeploymentId: string | null;
setDebugDeploymentId: (id: string | null) => void;
}
const BeneficiaryContext = createContext<BeneficiaryContextType | undefined>(undefined);
export function BeneficiaryProvider({ children }: { children: React.ReactNode }) {
const [currentBeneficiary, setCurrentBeneficiary] = useState<Beneficiary | null>(null);
// Debug: Override deployment ID for testing purposes
const [debugDeploymentId, setDebugDeploymentId] = useState<string | null>(null);
const clearCurrentBeneficiary = useCallback(() => {
setCurrentBeneficiary(null);
}, []);
const getBeneficiaryContext = useCallback(() => {
if (!currentBeneficiary) {
return '';
}
const parts = [`[Context: Asking about ${currentBeneficiary.name}`];
if (currentBeneficiary.relationship) {
parts.push(`(${currentBeneficiary.relationship})`);
}
if (currentBeneficiary.sensor_data) {
const sensor = currentBeneficiary.sensor_data;
const sensorInfo: string[] = [];
if (sensor.motion_detected !== undefined) {
sensorInfo.push(`motion: ${sensor.motion_detected ? 'active' : 'inactive'}`);
}
if (sensor.last_motion) {
sensorInfo.push(`last motion: ${sensor.last_motion}`);
}
if (sensor.door_status) {
sensorInfo.push(`door: ${sensor.door_status}`);
}
if (sensor.temperature !== undefined) {
sensorInfo.push(`temp: ${sensor.temperature}°C`);
}
if (sensor.humidity !== undefined) {
sensorInfo.push(`humidity: ${sensor.humidity}%`);
}
if (sensorInfo.length > 0) {
parts.push(`| Sensors: ${sensorInfo.join(', ')}`);
}
}
if (currentBeneficiary.last_activity) {
parts.push(`| Last activity: ${currentBeneficiary.last_activity}`);
}
parts.push(']');
return parts.join(' ');
}, [currentBeneficiary]);
return (
<BeneficiaryContext.Provider
value={{
currentBeneficiary,
setCurrentBeneficiary,
clearCurrentBeneficiary,
getBeneficiaryContext,
debugDeploymentId,
setDebugDeploymentId,
}}
>
{children}
</BeneficiaryContext.Provider>
);
}
export function useBeneficiary() {
const context = useContext(BeneficiaryContext);
if (context === undefined) {
throw new Error('useBeneficiary must be used within a BeneficiaryProvider');
}
return context;
}