You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
6.5 KiB
272 lines
6.5 KiB
import React, { useState } from "react"; |
|
import customRF from '../utils/customRF'; |
|
|
|
import { |
|
View, |
|
Text, |
|
StyleSheet, |
|
TextInput, |
|
TouchableOpacity, |
|
FlatList, |
|
KeyboardAvoidingView, |
|
Platform, |
|
ImageBackground, |
|
} from "react-native"; |
|
import { useNavigation } from "@react-navigation/native"; |
|
import { NativeStackNavigationProp } from "@react-navigation/native-stack"; |
|
import { RootStackParamList } from "../../App"; |
|
|
|
interface Message { |
|
id: string; |
|
text: string; |
|
isMe: boolean; |
|
timestamp: Date; |
|
} |
|
|
|
type TabType = "customer" | "product" | "notification"; |
|
|
|
export const ChatScreen = () => { |
|
const [messages, setMessages] = useState<Message[]>([]); |
|
const [inputText, setInputText] = useState(""); |
|
const [activeTab, setActiveTab] = useState<TabType>("customer"); |
|
|
|
const sendMessage = () => { |
|
if (inputText.trim() === "") return; |
|
|
|
const newMessage: Message = { |
|
id: Date.now().toString(), |
|
text: inputText, |
|
isMe: true, |
|
timestamp: new Date(), |
|
}; |
|
|
|
setMessages([...messages, newMessage]); |
|
setInputText(""); |
|
}; |
|
|
|
const renderMessage = ({ item }: { item: Message }) => ( |
|
<View |
|
style={[ |
|
styles.messageContainer, |
|
item.isMe ? styles.myMessage : styles.theirMessage, |
|
]} |
|
> |
|
<Text style={styles.messageText}>{item.text}</Text> |
|
<Text style={styles.timestamp}> |
|
{item.timestamp.toLocaleTimeString([], { |
|
hour: "2-digit", |
|
minute: "2-digit", |
|
})} |
|
</Text> |
|
</View> |
|
); |
|
|
|
const renderTabContent = () => { |
|
switch (activeTab) { |
|
case "customer": |
|
return ( |
|
<View style={styles.tabContent}> |
|
<FlatList |
|
data={messages} |
|
renderItem={renderMessage} |
|
keyExtractor={(item) => item.id} |
|
contentContainerStyle={styles.messageList} |
|
showsVerticalScrollIndicator={false} |
|
/> |
|
</View> |
|
); |
|
case "product": |
|
return ( |
|
<View style={styles.tabContent}> |
|
<FlatList |
|
data={messages} |
|
renderItem={renderMessage} |
|
keyExtractor={(item) => item.id} |
|
contentContainerStyle={styles.messageList} |
|
showsVerticalScrollIndicator={false} |
|
/> |
|
</View> |
|
); |
|
case "notification": |
|
return ( |
|
<View style={styles.tabContent}> |
|
<FlatList |
|
data={messages} |
|
renderItem={renderMessage} |
|
keyExtractor={(item) => item.id} |
|
contentContainerStyle={styles.messageList} |
|
showsVerticalScrollIndicator={false} |
|
/> |
|
</View> |
|
); |
|
} |
|
}; |
|
|
|
return ( |
|
<KeyboardAvoidingView |
|
style={styles.container} |
|
behavior={Platform.OS === "ios" ? "padding" : undefined} |
|
keyboardVerticalOffset={Platform.OS === "ios" ? 90 : 0} |
|
> |
|
<ImageBackground |
|
source={require('../../assets/img/DefaultWallpaper.png')} |
|
style={styles.backgroundImage} |
|
resizeMode="cover" |
|
> |
|
<View style={styles.tabBar}> |
|
<TouchableOpacity |
|
style={[styles.tab, activeTab === "customer" && styles.activeTab]} |
|
onPress={() => setActiveTab("customer")} |
|
> |
|
<Text |
|
style={[ |
|
styles.tabText, |
|
activeTab === "customer" && styles.activeTabText, |
|
]} |
|
> |
|
客服聊天 |
|
</Text> |
|
</TouchableOpacity> |
|
<TouchableOpacity |
|
style={[styles.tab, activeTab === "product" && styles.activeTab]} |
|
onPress={() => setActiveTab("product")} |
|
> |
|
<Text |
|
style={[ |
|
styles.tabText, |
|
activeTab === "product" && styles.activeTabText, |
|
]} |
|
> |
|
产品聊天 |
|
</Text> |
|
</TouchableOpacity> |
|
<TouchableOpacity |
|
style={[styles.tab, activeTab === "notification" && styles.activeTab]} |
|
onPress={() => setActiveTab("notification")} |
|
> |
|
<Text |
|
style={[ |
|
styles.tabText, |
|
activeTab === "notification" && styles.activeTabText, |
|
]} |
|
> |
|
消息通知 |
|
</Text> |
|
</TouchableOpacity> |
|
</View> |
|
|
|
{renderTabContent()} |
|
|
|
<View style={styles.inputContainer}> |
|
<TextInput |
|
style={styles.input} |
|
value={inputText} |
|
onChangeText={setInputText} |
|
placeholder="请输入消息" |
|
multiline |
|
/> |
|
<TouchableOpacity style={styles.sendButton} onPress={sendMessage}> |
|
<Text style={styles.sendButtonText}>发送</Text> |
|
</TouchableOpacity> |
|
</View> |
|
</ImageBackground> |
|
</KeyboardAvoidingView> |
|
); |
|
}; |
|
|
|
const styles = StyleSheet.create({ |
|
container: { |
|
flex: 1, |
|
}, |
|
backgroundImage: { |
|
flex: 1, |
|
width: '100%', |
|
height: '100%', |
|
}, |
|
tabBar: { |
|
flexDirection: "row", |
|
backgroundColor: "#007a6c", |
|
borderBottomWidth: 1, |
|
borderBottomColor: "#eef0f1", |
|
shadowColor: "#000", |
|
shadowOffset: { |
|
width: 0, |
|
height: 2, |
|
}, |
|
shadowOpacity: 0.25, |
|
shadowRadius: 3.84, |
|
elevation: 5, |
|
}, |
|
tab: { |
|
flex: 1, |
|
paddingVertical: 15, |
|
alignItems: "center", |
|
}, |
|
activeTab: { |
|
borderBottomWidth: 2, |
|
borderBottomColor: "#eef0f1", |
|
}, |
|
tabText: { |
|
fontSize: customRF(14), |
|
color: "#fff", |
|
}, |
|
activeTabText: { |
|
color: "#fff", |
|
fontWeight: "600", |
|
}, |
|
tabContent: { |
|
flex: 1, |
|
}, |
|
messageList: { |
|
padding: 10, |
|
}, |
|
messageContainer: { |
|
maxWidth: "80%", |
|
padding: 10, |
|
borderRadius: 10, |
|
marginVertical: 5, |
|
}, |
|
myMessage: { |
|
alignSelf: "flex-end", |
|
backgroundColor: "#dcf8c6", |
|
}, |
|
theirMessage: { |
|
alignSelf: "flex-start", |
|
backgroundColor: "white", |
|
}, |
|
messageText: { |
|
fontSize: 16, |
|
}, |
|
timestamp: { |
|
fontSize: 12, |
|
color: "#666", |
|
alignSelf: "flex-end", |
|
marginTop: 5, |
|
}, |
|
inputContainer: { |
|
flexDirection: "row", |
|
padding: 10, |
|
backgroundColor: "white", |
|
borderTopWidth: 1, |
|
borderTopColor: "#ddd", |
|
}, |
|
input: { |
|
flex: 1, |
|
backgroundColor: "#f0f0f0", |
|
borderRadius: 20, |
|
paddingHorizontal: 15, |
|
paddingVertical: 8, |
|
marginRight: 10, |
|
maxHeight: 100, |
|
}, |
|
sendButton: { |
|
backgroundColor: "#128C7E", |
|
borderRadius: 20, |
|
paddingHorizontal: 20, |
|
justifyContent: "center", |
|
}, |
|
sendButtonText: { |
|
color: "white", |
|
fontSize: 16, |
|
}, |
|
});
|
|
|