twilio-rn/App.tsx

211 lines
5.6 KiB
TypeScript

import { StatusBar } from 'expo-status-bar';
import React, { useState, useEffect } from 'react';
import { StyleSheet, Text, View, Button, TextInput, Alert, ScrollView } from 'react-native';
import MyNativeModule from 'my-native-module';
export default function App() {
const [token, setToken] = useState('');
const [conversationName, setConversationName] = useState('');
const [isInitialized, setIsInitialized] = useState(false);
const [conversations, setConversations] = useState<any[]>([]);
const [status, setStatus] = useState('未初始化');
// 初始化Twilio Conversations客户端
const initializeClient = async () => {
if (!token.trim()) {
Alert.alert('错误', '请输入有效的Twilio令牌');
return;
}
try {
setStatus('正在初始化...');
const result = await MyNativeModule.initialize(token);
console.log('初始化结果:', result);
setIsInitialized(true);
setStatus('已初始化');
Alert.alert('成功', 'Twilio Conversations客户端已初始化');
} catch (error) {
console.error('初始化失败:', error);
setStatus('初始化失败');
Alert.alert('错误', `初始化失败: ${error}`);
}
};
// 创建新对话
const createConversation = async () => {
if (!isInitialized) {
Alert.alert('错误', '请先初始化Twilio Conversations客户端');
return;
}
if (!conversationName.trim()) {
Alert.alert('错误', '请输入对话名称');
return;
}
try {
setStatus('正在创建对话...');
const conversation = await MyNativeModule.createConversation(conversationName);
console.log('创建的对话:', conversation);
Alert.alert('成功', `对话 "${conversation.friendlyName}" 已创建`);
setConversationName('');
// 刷新对话列表
loadConversations();
} catch (error) {
console.error('创建对话失败:', error);
setStatus('创建对话失败');
Alert.alert('错误', `创建对话失败: ${error}`);
}
};
// 加载对话列表
const loadConversations = async () => {
if (!isInitialized) {
return;
}
try {
setStatus('正在加载对话列表...');
const conversationList = await MyNativeModule.getConversations();
console.log('对话列表:', conversationList);
setConversations(conversationList || []);
setStatus('已加载对话列表');
} catch (error) {
console.error('加载对话列表失败:', error);
setStatus('加载对话列表失败');
}
};
// 当初始化状态改变时,加载对话列表
useEffect(() => {
if (isInitialized) {
loadConversations();
}
}, [isInitialized]);
return (
<View style={styles.container}>
<ScrollView style={styles.scrollView}>
<Text style={styles.title}>Twilio Conversations Demo</Text>
<Text style={styles.status}>: {status}</Text>
<Text style={styles.label}>Twilio访问令牌:</Text>
<TextInput
style={styles.input}
value={token}
onChangeText={setToken}
placeholder="输入您的Twilio访问令牌"
multiline
/>
<Button
title="初始化客户端"
onPress={initializeClient}
disabled={!token.trim() || isInitialized}
/>
<View style={styles.spacer} />
<Text style={styles.label}>:</Text>
<TextInput
style={styles.input}
value={conversationName}
onChangeText={setConversationName}
placeholder="输入新对话的名称"
/>
<Button
title="创建对话"
onPress={createConversation}
disabled={!isInitialized || !conversationName.trim()}
/>
<View style={styles.spacer} />
<Button
title="刷新对话列表"
onPress={loadConversations}
disabled={!isInitialized}
/>
<View style={styles.spacer} />
<Text style={styles.label}>:</Text>
{conversations.length > 0 ? (
conversations.map((conversation, index) => (
<View style={styles.conversationItem}>
<Text style={styles.conversationName}>{conversation.friendlyName}</Text>
<Text style={styles.conversationSid}>SID: {conversation.sid}</Text>
</View>
))
) : (
<Text style={styles.noConversations}></Text>
)}
</ScrollView>
<StatusBar style="auto" />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
paddingTop: 40,
},
scrollView: {
flex: 1,
paddingHorizontal: 20,
},
title: {
fontSize: 24,
fontWeight: 'bold',
textAlign: 'center',
marginBottom: 20,
},
status: {
fontSize: 16,
marginBottom: 10,
textAlign: 'center',
fontStyle: 'italic',
},
label: {
fontSize: 16,
marginBottom: 5,
marginTop: 15,
},
input: {
borderWidth: 1,
borderColor: '#ccc',
borderRadius: 5,
padding: 10,
marginBottom: 15,
fontSize: 16,
},
spacer: {
height: 20,
},
conversationItem: {
backgroundColor: '#f5f5f5',
padding: 15,
borderRadius: 5,
marginBottom: 10,
},
conversationName: {
fontSize: 18,
fontWeight: 'bold',
},
conversationSid: {
fontSize: 14,
color: '#666',
marginTop: 5,
},
noConversations: {
textAlign: 'center',
fontStyle: 'italic',
color: '#666',
marginTop: 10,
},
});