69 lines
2.0 KiB
JavaScript
69 lines
2.0 KiB
JavaScript
import { useCallback, useState } from 'react';
|
|
import { ActivityIndicator, StyleSheet, View } from 'react-native';
|
|
import { StripeProvider } from '@stripe/stripe-react-native';
|
|
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
|
import { colors } from './src/theme';
|
|
import { apiFetch } from './src/api';
|
|
import { useAuth } from './src/hooks/useAuth';
|
|
import LoginScreen from './src/screens/LoginScreen';
|
|
import LobbyScreen from './src/screens/LobbyScreen';
|
|
import TableScreen from './src/screens/TableScreen';
|
|
|
|
export default function App() {
|
|
const { token, user, loading, login, logout, setUser } = useAuth();
|
|
const [selectedTable, setSelectedTable] = useState(null);
|
|
|
|
const refreshUser = useCallback(async () => {
|
|
if (!token) {
|
|
return;
|
|
}
|
|
const data = await apiFetch('/api/me', token);
|
|
setUser(data);
|
|
}, [token, setUser]);
|
|
|
|
if (loading) {
|
|
return (
|
|
<View style={styles.loading}>
|
|
<ActivityIndicator color={colors.goldBright} />
|
|
</View>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<SafeAreaProvider>
|
|
<StripeProvider
|
|
publishableKey={process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY || ''}
|
|
merchantIdentifier={process.env.EXPO_PUBLIC_STRIPE_MERCHANT_ID || 'merchant.com.devbeni.vegasblackjack'}
|
|
>
|
|
{!token || !user ? (
|
|
<LoginScreen onLogin={login} loading={loading} />
|
|
) : selectedTable ? (
|
|
<TableScreen
|
|
token={token}
|
|
tableId={selectedTable}
|
|
user={user}
|
|
onLeave={() => setSelectedTable(null)}
|
|
/>
|
|
) : (
|
|
<LobbyScreen
|
|
user={user}
|
|
token={token}
|
|
onLogout={logout}
|
|
onSelectTable={setSelectedTable}
|
|
onRefreshUser={refreshUser}
|
|
/>
|
|
)}
|
|
</StripeProvider>
|
|
</SafeAreaProvider>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
loading: {
|
|
flex: 1,
|
|
alignItems: 'center',
|
|
justifyContent: 'center',
|
|
backgroundColor: colors.backgroundTop
|
|
}
|
|
});
|