diff --git a/.gitignore b/.gitignore index d914c32..bdbb99a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,75 @@ -# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files +# OSX +# +.DS_Store -# dependencies +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +ios/.xcode.env.local + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof +.cxx/ +*.keystore +!debug.keystore + +# node.js +# node_modules/ +npm-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +*.keystore +!debug.keystore + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +*/fastlane/report.xml +*/fastlane/Preview.html +*/fastlane/screenshots +*/fastlane/test_output + +# Bundle artifact +*.jsbundle + +# Ruby / CocoaPods +/ios/Pods/ +/vendor/bundle/ # Expo .expo/ -dist/ web-build/ -expo-env.d.ts # Native -.kotlin/ *.orig.* *.jks *.p8 @@ -36,6 +95,6 @@ yarn-error.* # typescript *.tsbuildinfo -# generated native folders -/ios -/android +# Ignore build files +modules/*/android/build/ +modules/*/ios/build/ diff --git a/App.tsx b/App.tsx index 0329d0c..b6a359e 100644 --- a/App.tsx +++ b/App.tsx @@ -1,10 +1,148 @@ import { StatusBar } from 'expo-status-bar'; -import { StyleSheet, Text, View } from 'react-native'; +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([]); + 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 ( - Open up App.tsx to start working on your app! + + Twilio Conversations Demo + + 状态: {status} + + Twilio访问令牌: + + +