import React, { useMemo, useState } from 'react';
import { ActivityIndicator, Pressable, StyleSheet, Text, TextInput, View } from 'react-native';
import type { ReactNode } from 'react';
import { LinearGradient } from 'expo-linear-gradient';
import { Colors, Fonts, FontSize, BorderRadius, Spacing } from '@/constants/theme';
import { useMobileAuth } from '@/providers/MobileAuthProvider';
export function AuthGate({ children }: { children: ReactNode }) {
const { user, loading, signIn, error } = useMobileAuth();
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [submitting, setSubmitting] = useState(false);
const errorMessage = useMemo(() => error, [error]);
if (loading) {
return (
Restoring trading session...
);
}
if (user) {
return <>{children}>;
}
return (
BYTElyst TRADING
Sign in to your trading workspace
Mobile now authenticates against the shared platform-service identity boundary used across the ecosystem.
{errorMessage ? {errorMessage} : null}
{
setSubmitting(true);
await signIn(email.trim(), password);
setSubmitting(false);
}}
>
{submitting ? 'Signing in...' : 'Sign In'}
);
}
const styles = StyleSheet.create({
screen: {
flex: 1,
backgroundColor: Colors.background.primary,
justifyContent: 'center',
padding: Spacing.screenPadding,
},
centered: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: Colors.background.primary,
gap: 12,
},
loadingText: {
fontFamily: Fonts.inter.medium,
fontSize: FontSize.body,
color: Colors.text.secondary,
},
card: {
borderRadius: BorderRadius.large,
borderWidth: 1,
borderColor: Colors.border.default,
padding: Spacing.cardPaddingLarge,
gap: 14,
},
eyebrow: {
fontFamily: Fonts.inter.black,
fontSize: FontSize.micro,
color: Colors.accent.green,
letterSpacing: 3,
},
title: {
fontFamily: Fonts.inter.black,
fontSize: FontSize.heading,
color: Colors.text.primary,
},
subtitle: {
fontFamily: Fonts.inter.medium,
fontSize: FontSize.body,
color: Colors.text.secondary,
lineHeight: 21,
},
input: {
borderWidth: 1,
borderColor: Colors.border.default,
borderRadius: BorderRadius.medium,
backgroundColor: Colors.background.card,
color: Colors.text.primary,
paddingHorizontal: 14,
paddingVertical: 12,
fontFamily: Fonts.inter.medium,
fontSize: FontSize.body,
},
button: {
marginTop: 6,
borderRadius: BorderRadius.medium,
backgroundColor: Colors.accent.green,
paddingVertical: 14,
alignItems: 'center',
},
buttonText: {
fontFamily: Fonts.inter.black,
fontSize: FontSize.body,
color: '#04120b',
},
error: {
fontFamily: Fonts.inter.medium,
fontSize: FontSize.bodySmall,
color: Colors.accent.red,
},
});