import React, { useEffect, useMemo, useState } from "react"; import { FlatList, Platform, StyleSheet, Text, TextInput, TouchableOpacity, View, } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useNavigation } from "@react-navigation/native"; import type { NativeStackNavigationProp } from "@react-navigation/native-stack"; import type { RootStackParamList } from "../navigation/types"; import { useSession } from "../state/session-context"; import { useI18n } from "../i18n"; import { useTheme } from "../theme"; import type { AppTheme } from "../theme"; import ExitGameButton from "../components/ExitGameButton"; export default function LobbyScreen() { const navigation = useNavigation>(); const manager = useSession(); const { t } = useI18n(); const theme = useTheme(); const styles = useMemo(() => createStyles(theme), [theme]); const placeholderColor = theme.colors.placeholder; const [dummyName, setDummyName] = useState(""); const [dummyBalance, setDummyBalance] = useState("1500"); const insets = useSafeAreaInsets(); const topInset = insets.top || (Platform.OS === "ios" ? 44 : 0); const containerStyle = useMemo( () => [ styles.container, { paddingTop: topInset + 20, paddingBottom: insets.bottom + 20, paddingLeft: insets.left + 20, paddingRight: insets.right + 20, }, ], [ styles.container, topInset, insets.bottom, insets.left, insets.right, ], ); useEffect(() => { if (!manager.session || !manager.me) return; if (manager.session.status === "active") { navigation.replace(manager.isBanker ? "BankerTabs" : "PlayerTabs"); } }, [manager.session, manager.me, manager.isBanker, navigation]); if (!manager.session || !manager.me) { return ( {t("common.loadingLobby")} {manager.error ? {manager.error} : null} ); } const canStart = manager.isBanker && manager.session.status === "lobby"; return ( {t("lobby.title")} {t("lobby.code", { code: manager.session.code })} item.id} contentContainerStyle={styles.list} renderItem={({ item }) => ( {item.name} {item.role === "banker" ? t("common.banker") : t("common.player")}{" "} {item.isDummy ? `- ${t("common.dummy")}` : ""} {item.connected ? t("common.online") : t("common.offline")} )} /> {manager.isBanker && manager.session.status === "lobby" && ( {t("lobby.addDummyTitle")} {t("lobby.addDummySubtitle")} { manager.sendMessage({ type: "banker_create_dummy", sessionId: manager.sessionId, bankerId: manager.me?.id, name: dummyName, balance: Number(dummyBalance) || undefined, }); setDummyName(""); setDummyBalance("1500"); }} > {t("lobby.addDummyButton")} )} {canStart && ( manager.sendMessage({ type: "banker_start", sessionId: manager.sessionId, bankerId: manager.me?.id, }) } > {t("lobby.startGame")} )} ); } const createStyles = (theme: AppTheme) => StyleSheet.create({ container: { flex: 1, paddingHorizontal: 0, paddingBottom: 0, gap: 12, backgroundColor: theme.colors.background, }, title: { fontSize: 24, fontWeight: "700", color: theme.colors.text, }, subtitle: { color: theme.colors.textMuted, }, list: { gap: 10, paddingBottom: 20, }, listItem: { backgroundColor: theme.colors.surface, borderRadius: 12, padding: 12, flexDirection: "row", justifyContent: "space-between", alignItems: "center", }, playerName: { fontWeight: "600", color: theme.colors.text, }, playerMeta: { fontSize: 12, color: theme.colors.textMuted, }, card: { backgroundColor: theme.colors.surface, borderRadius: 16, padding: 16, gap: 10, borderWidth: 1, borderColor: theme.colors.borderMuted, }, cardTitle: { fontWeight: "600", color: theme.colors.text, }, helper: { color: theme.colors.textMuted, fontSize: 12, }, input: { borderWidth: 1, borderColor: theme.colors.border, backgroundColor: theme.colors.inputBackground, color: theme.colors.inputText, borderRadius: 12, paddingHorizontal: 12, paddingVertical: 10, }, button: { backgroundColor: theme.colors.primary, paddingVertical: 14, borderRadius: 999, alignItems: "center", }, buttonText: { color: theme.colors.primaryText, fontWeight: "600", }, buttonSecondary: { backgroundColor: theme.colors.secondary, paddingVertical: 12, borderRadius: 999, alignItems: "center", }, buttonSecondaryText: { color: theme.colors.secondaryText, fontWeight: "600", }, });