import React from "react";
import { View, FlatList, Pressable } from "react-native";
import { Button, Chip, Text, TextInput } from "react-native-paper";
import { useSnapshot } from "valtio";
import API from "../API.js";
import GlobalState from "../contexts/GlobalState.js";
import i18n from "../i18nMessages.js";
const ChatMessage = ({ item, myProfileId, showOriginal, onPressIn, onPressOut }) => {
const isMine = item?.senderProfileId === myProfileId;
const isTranslated = !!(item?.textOriginal && item?.text && item.textOriginal !== item.text);
const messageText = isTranslated && showOriginal ? item?.textOriginal : item?.text;
const createdAt = item?.createdAt ? new Date(item.createdAt) : null;
return (
{item?.senderName || "Anonymous"}
{messageText || ""}
{isTranslated ? (
* {i18n.t("message.aiTranslated")}
) : <>>}
{createdAt && !Number.isNaN(createdAt.getTime()) ? createdAt.toLocaleTimeString() : ""}
);
};
let GlobalChat = () => {
const gState = useSnapshot(GlobalState);
const myProfileId = gState?.me?._id || "";
const [messages, setMessages] = React.useState([]);
const [activeUsers, setActiveUsers] = React.useState([]);
const [text, setText] = React.useState("");
const [loading, setLoading] = React.useState(true);
const [sending, setSending] = React.useState(false);
const [pressedMessageId, setPressedMessageId] = React.useState("");
const loadMessages = React.useCallback(async () => {
const data = await API.getChatMessages(100);
setMessages(Array.isArray(data) ? data : []);
}, []);
const refreshPresence = React.useCallback(async () => {
const users = await API.pingChatPresence();
setActiveUsers(Array.isArray(users) ? users : []);
}, []);
React.useEffect(() => {
let mounted = true;
const bootstrap = async () => {
setLoading(true);
const [initialMessages, users] = await Promise.all([
API.getChatMessages(100),
API.pingChatPresence(),
]);
if (!mounted) return;
setMessages(Array.isArray(initialMessages) ? initialMessages : []);
setActiveUsers(Array.isArray(users) ? users : []);
setLoading(false);
};
bootstrap();
const refreshInterval = setInterval(() => {
loadMessages();
refreshPresence();
}, 8000);
const pingInterval = setInterval(() => {
refreshPresence();
}, 25000);
return () => {
mounted = false;
clearInterval(refreshInterval);
clearInterval(pingInterval);
};
}, [loadMessages, refreshPresence]);
const sendMessage = async () => {
const trimmedText = (text || "").trim();
if (!trimmedText || sending) return;
setSending(true);
const response = await API.sendChatMessage(trimmedText);
if (response?.status === "ok" && response?.message) {
setMessages((prev) => [...prev, response.message]);
if (Array.isArray(response.activeUsers)) {
setActiveUsers(response.activeUsers);
}
setText("");
}
setSending(false);
};
return (
{i18n.t("message.globalChat")}
* {i18n.t("message.chatRoomBeta")}
{i18n.t("message.onlineNow")} ({activeUsers.length})
{activeUsers.slice(0, 20).map((user) => (
{user?.displayName || "Anonymous"}
))}
{loading ? (
{i18n.t("message.loadingChat")}
) : (
item?._id?.toString?.() || `${index}-${item?.createdAt || "msg"}`}
renderItem={({ item }) => {
const messageId = item?._id?.toString?.() || "";
return (
setPressedMessageId(messageId)}
onPressOut={() => setPressedMessageId("")}
/>
);
}}
contentContainerStyle={{ paddingBottom: 10 }}
style={{ flex: 1 }}
/>
)}
);
};
export default GlobalChat;