Fix chat and profile issues
- Terms of Service / Privacy Policy now open in browser - Auto-select first beneficiary on chat load - Allow typing while waiting for AI response - Optimize AI response speed (removed pre-fetch) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
1977156ffd
commit
6e6b6b6c5f
@ -8,7 +8,6 @@ import {
|
|||||||
TouchableOpacity,
|
TouchableOpacity,
|
||||||
KeyboardAvoidingView,
|
KeyboardAvoidingView,
|
||||||
Platform,
|
Platform,
|
||||||
Alert,
|
|
||||||
Modal,
|
Modal,
|
||||||
ActivityIndicator,
|
ActivityIndicator,
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
@ -169,39 +168,22 @@ export default function ChatScreen() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Send message with full context
|
// Send message with full context - optimized for speed
|
||||||
const sendWithContext = async (question: string): Promise<string> => {
|
const sendWithContext = async (question: string): Promise<string> => {
|
||||||
const token = await SecureStore.getItemAsync('accessToken');
|
const token = await SecureStore.getItemAsync('accessToken');
|
||||||
const userName = await SecureStore.getItemAsync('userName');
|
const userName = await SecureStore.getItemAsync('userName');
|
||||||
|
|
||||||
if (!token || !userName) throw new Error('Please log in');
|
if (!token || !userName) throw new Error('Please log in');
|
||||||
if (!currentBeneficiary?.id) throw new Error('Please select a beneficiary');
|
|
||||||
|
|
||||||
const beneficiaryName = currentBeneficiary.name || 'the patient';
|
const beneficiaryName = currentBeneficiary?.name || 'the patient';
|
||||||
const deploymentId = currentBeneficiary.id.toString();
|
const deploymentId = currentBeneficiary?.id?.toString() || '';
|
||||||
|
|
||||||
// Get activity context (primary source)
|
// Skip context fetching for faster response - just send directly
|
||||||
let activityContext = await getActivityContext(token, userName, deploymentId);
|
const enhancedQuestion = currentBeneficiary?.id
|
||||||
|
? `You are a caring assistant helping monitor ${beneficiaryName}'s wellbeing. Please answer: ${question}`
|
||||||
|
: `You are a helpful AI assistant. Please answer: ${question}`;
|
||||||
|
|
||||||
// If activity context is empty, try dashboard context as fallback
|
// Call API directly without pre-fetching context
|
||||||
if (!activityContext) {
|
|
||||||
activityContext = await getDashboardContext(token, userName, deploymentId);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build the question with embedded context
|
|
||||||
let enhancedQuestion: string;
|
|
||||||
if (activityContext) {
|
|
||||||
enhancedQuestion = `You are a caring assistant helping monitor ${beneficiaryName}'s wellbeing.
|
|
||||||
|
|
||||||
Here is the current data about ${beneficiaryName}:
|
|
||||||
${activityContext}
|
|
||||||
|
|
||||||
Based on this data, please answer the following question: ${question}`;
|
|
||||||
} else {
|
|
||||||
enhancedQuestion = `You are a caring assistant helping monitor ${beneficiaryName}'s wellbeing. Please answer: ${question}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call API
|
|
||||||
const requestBody = new URLSearchParams({
|
const requestBody = new URLSearchParams({
|
||||||
function: 'voice_ask',
|
function: 'voice_ask',
|
||||||
clientId: '001',
|
clientId: '001',
|
||||||
@ -209,7 +191,7 @@ Based on this data, please answer the following question: ${question}`;
|
|||||||
token: token,
|
token: token,
|
||||||
question: enhancedQuestion,
|
question: enhancedQuestion,
|
||||||
deployment_id: deploymentId,
|
deployment_id: deploymentId,
|
||||||
context: activityContext || '',
|
context: '',
|
||||||
}).toString();
|
}).toString();
|
||||||
|
|
||||||
const response = await fetch(API_URL, {
|
const response = await fetch(API_URL, {
|
||||||
@ -233,14 +215,10 @@ Based on this data, please answer the following question: ${question}`;
|
|||||||
const trimmedInput = input.trim();
|
const trimmedInput = input.trim();
|
||||||
if (!trimmedInput || isSending) return;
|
if (!trimmedInput || isSending) return;
|
||||||
|
|
||||||
// Require beneficiary to be selected
|
// If no beneficiary selected, auto-selection should have happened
|
||||||
|
// but if still none, just proceed without context
|
||||||
if (!currentBeneficiary?.id) {
|
if (!currentBeneficiary?.id) {
|
||||||
Alert.alert(
|
console.log('No beneficiary selected, proceeding without context');
|
||||||
'Select Beneficiary',
|
|
||||||
'Please select a beneficiary using the icon in the top right corner.',
|
|
||||||
[{ text: 'OK' }]
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const userMessage: Message = {
|
const userMessage: Message = {
|
||||||
@ -424,7 +402,7 @@ Based on this data, please answer the following question: ${question}`;
|
|||||||
onChangeText={setInput}
|
onChangeText={setInput}
|
||||||
multiline
|
multiline
|
||||||
maxLength={1000}
|
maxLength={1000}
|
||||||
editable={!isSending}
|
editable={true}
|
||||||
onSubmitEditing={handleSend}
|
onSubmitEditing={handleSend}
|
||||||
/>
|
/>
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import {
|
|||||||
ScrollView,
|
ScrollView,
|
||||||
TouchableOpacity,
|
TouchableOpacity,
|
||||||
Alert,
|
Alert,
|
||||||
|
Linking,
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import { router } from 'expo-router';
|
import { router } from 'expo-router';
|
||||||
import { Ionicons } from '@expo/vector-icons';
|
import { Ionicons } from '@expo/vector-icons';
|
||||||
@ -48,9 +49,20 @@ function MenuItem({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TERMS_URL = 'https://wellnuo.com/terms';
|
||||||
|
const PRIVACY_URL = 'https://wellnuo.com/privacy';
|
||||||
|
|
||||||
export default function ProfileScreen() {
|
export default function ProfileScreen() {
|
||||||
const { user, logout } = useAuth();
|
const { user, logout } = useAuth();
|
||||||
|
|
||||||
|
const openTerms = () => {
|
||||||
|
Linking.openURL(TERMS_URL);
|
||||||
|
};
|
||||||
|
|
||||||
|
const openPrivacy = () => {
|
||||||
|
Linking.openURL(PRIVACY_URL);
|
||||||
|
};
|
||||||
|
|
||||||
const handleLogout = () => {
|
const handleLogout = () => {
|
||||||
Alert.alert(
|
Alert.alert(
|
||||||
'Logout',
|
'Logout',
|
||||||
@ -100,11 +112,13 @@ export default function ProfileScreen() {
|
|||||||
<MenuItem
|
<MenuItem
|
||||||
icon="document-text-outline"
|
icon="document-text-outline"
|
||||||
title="Terms of Service"
|
title="Terms of Service"
|
||||||
|
onPress={openTerms}
|
||||||
/>
|
/>
|
||||||
<View style={styles.menuDivider} />
|
<View style={styles.menuDivider} />
|
||||||
<MenuItem
|
<MenuItem
|
||||||
icon="shield-outline"
|
icon="shield-outline"
|
||||||
title="Privacy Policy"
|
title="Privacy Policy"
|
||||||
|
onPress={openPrivacy}
|
||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user