settings und login verschönert
This commit is contained in:
@@ -94,6 +94,7 @@ export const ThemeTextInput = ({ style, value, disabled, onValueChange, secureTe
|
|||||||
paddingRight: 14,
|
paddingRight: 14,
|
||||||
paddingLeft: 8,
|
paddingLeft: 8,
|
||||||
paddingVertical: 1,
|
paddingVertical: 1,
|
||||||
|
marginVertical: 5,
|
||||||
borderColor: disabled ? colors.textDisabled : colors.text,
|
borderColor: disabled ? colors.textDisabled : colors.text,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|||||||
import { ToastType, useToast } from "./ToastProvider";
|
import { ToastType, useToast } from "./ToastProvider";
|
||||||
|
|
||||||
const fadeDuration = 300;
|
const fadeDuration = 300;
|
||||||
const tabBarHeight = 60;
|
|
||||||
|
|
||||||
export const Toast: React.FC = () => {
|
export const Toast: React.FC = () => {
|
||||||
const insets = useSafeAreaInsets();
|
const insets = useSafeAreaInsets();
|
||||||
@@ -60,7 +59,7 @@ export const Toast: React.FC = () => {
|
|||||||
<Animated.View
|
<Animated.View
|
||||||
style={[
|
style={[
|
||||||
styles.container,
|
styles.container,
|
||||||
{ bottom: insets.bottom + tabBarHeight, opacity },
|
{ top: insets.top + 20, opacity }, // Positioning at the top
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<View style={[styles.toast, { backgroundColor }]}>
|
<View style={[styles.toast, { backgroundColor }]}>
|
||||||
@@ -86,4 +85,4 @@ const styles = StyleSheet.create({
|
|||||||
textAlign: "center",
|
textAlign: "center",
|
||||||
color: '#fff',
|
color: '#fff',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import React, { useState, useEffect, useContext, useRef } from 'react';
|
import React, { useState, useEffect, useContext } from 'react';
|
||||||
import { View, Text, ScrollView, Button, StyleSheet, TouchableOpacity, ActivityIndicator, Alert, Animated, Image } from 'react-native';
|
import { View, ScrollView, Button, StyleSheet, Image, ActivityIndicator, Alert } from 'react-native';
|
||||||
import { SettingsContext } from '../SettingsProvider';
|
import { SettingsContext } from '../SettingsProvider';
|
||||||
import { useColors } from '../common/colors';
|
import { useColors } from '../common/colors';
|
||||||
import ErrorBoundary from 'react-native-error-boundary';
|
import ErrorBoundary from 'react-native-error-boundary';
|
||||||
import { ThemeSwitch, ThemeText, ThemeTextInput } from '../common/ThemeTypes';
|
import { ThemeText, ThemeTextInput } from '../common/ThemeTypes';
|
||||||
import Credits from '../common/Credits';
|
import Credits from '../common/Credits';
|
||||||
import FontAwesome5 from '@expo/vector-icons/FontAwesome5';
|
import { AdvancedSettings } from './Settings';
|
||||||
import { ServerSettings } from './Settings';
|
|
||||||
|
|
||||||
const Login = () => {
|
const Login = () => {
|
||||||
const colors = useColors();
|
const colors = useColors();
|
||||||
@@ -15,23 +14,14 @@ const Login = () => {
|
|||||||
const [url, setUrl] = useState('');
|
const [url, setUrl] = useState('');
|
||||||
const [username, setUsername] = useState('');
|
const [username, setUsername] = useState('');
|
||||||
const [password, setPassword] = useState('');
|
const [password, setPassword] = useState('');
|
||||||
const [isSystemTheme, setIsSystemTheme] = useState(settings.systemTheme);
|
|
||||||
const [isDarkMode, setIsDarkMode] = useState(settings.darkTheme);
|
|
||||||
const [requireAuth, setRequireAuth] = useState(settings.requireAuth);
|
const [requireAuth, setRequireAuth] = useState(settings.requireAuth);
|
||||||
const [isSaving, setIsSaving] = useState(false);
|
const [isSaving, setIsSaving] = useState(false);
|
||||||
const [showAdvanced, setShowAdvanced] = useState(false);
|
|
||||||
const [rotateAnim] = useState(new Animated.Value(0)); // Animation state for the arrow
|
|
||||||
const [advancedHeightAnim] = useState(new Animated.Value(0)); // Animation state for the advanced settings height
|
|
||||||
|
|
||||||
const advancedSectionRef = useRef(null);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (settings) {
|
if (settings) {
|
||||||
setUrl(settings.url || '');
|
setUrl(settings.url || '');
|
||||||
setUsername(settings.username || '');
|
setUsername(settings.username || '');
|
||||||
setPassword(settings.password || '');
|
setPassword(settings.password || '');
|
||||||
setIsSystemTheme(settings.systemTheme);
|
|
||||||
setIsDarkMode(settings.darkTheme);
|
|
||||||
setRequireAuth(settings.requireAuth);
|
setRequireAuth(settings.requireAuth);
|
||||||
}
|
}
|
||||||
}, [settings]);
|
}, [settings]);
|
||||||
@@ -42,11 +32,10 @@ const Login = () => {
|
|||||||
try {
|
try {
|
||||||
setIsSaving(true);
|
setIsSaving(true);
|
||||||
await updateSettings({
|
await updateSettings({
|
||||||
|
...settings,
|
||||||
url,
|
url,
|
||||||
username,
|
username,
|
||||||
password,
|
password,
|
||||||
systemTheme: isSystemTheme,
|
|
||||||
darkTheme: isDarkMode,
|
|
||||||
requireAuth,
|
requireAuth,
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -61,30 +50,6 @@ const Login = () => {
|
|||||||
setter(value);
|
setter(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
const toggleAdvancedSettings = () => {
|
|
||||||
setShowAdvanced(!showAdvanced);
|
|
||||||
|
|
||||||
// Rotate the arrow
|
|
||||||
Animated.timing(rotateAnim, {
|
|
||||||
toValue: showAdvanced ? 0 : 1,
|
|
||||||
duration: 200,
|
|
||||||
useNativeDriver: true,
|
|
||||||
}).start();
|
|
||||||
|
|
||||||
// Animate the height of the advanced settings
|
|
||||||
const targetHeight = showAdvanced ? 0 : 150; // You can adjust this height
|
|
||||||
Animated.timing(advancedHeightAnim, {
|
|
||||||
toValue: targetHeight,
|
|
||||||
duration: 300,
|
|
||||||
useNativeDriver: false,
|
|
||||||
}).start();
|
|
||||||
};
|
|
||||||
|
|
||||||
const arrowRotation = rotateAnim.interpolate({
|
|
||||||
inputRange: [0, 1],
|
|
||||||
outputRange: ['0deg', '90deg'],
|
|
||||||
});
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: {
|
container: {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
@@ -98,32 +63,11 @@ const Login = () => {
|
|||||||
section: {
|
section: {
|
||||||
marginBottom: 40,
|
marginBottom: 40,
|
||||||
},
|
},
|
||||||
switchContainer: {
|
|
||||||
marginTop: 15,
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'space-between',
|
|
||||||
},
|
|
||||||
activityindicator: {
|
activityindicator: {
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
width: '100%',
|
width: '100%',
|
||||||
height: '100%',
|
height: '100%',
|
||||||
},
|
},
|
||||||
arrowContainer: {
|
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'center',
|
|
||||||
marginTop: 20,
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
},
|
|
||||||
advancedButtonText: {
|
|
||||||
marginLeft: 8,
|
|
||||||
fontSize: 16,
|
|
||||||
color: colors.text,
|
|
||||||
},
|
|
||||||
advancedSection: {
|
|
||||||
overflow: 'hidden',
|
|
||||||
},
|
|
||||||
logo: {
|
logo: {
|
||||||
width: 100,
|
width: 100,
|
||||||
height: 100,
|
height: 100,
|
||||||
@@ -141,7 +85,37 @@ const Login = () => {
|
|||||||
<View style={[styles.section, styles.logoContainer]}>
|
<View style={[styles.section, styles.logoContainer]}>
|
||||||
<Image style={styles.logo} source={require('../assets/favicon.png')} />
|
<Image style={styles.logo} source={require('../assets/favicon.png')} />
|
||||||
</View>
|
</View>
|
||||||
<ServerSettings />
|
|
||||||
|
<View style={styles.section}>
|
||||||
|
<ThemeText style={styles.label}>Benutzername</ThemeText>
|
||||||
|
<ThemeTextInput
|
||||||
|
value={username}
|
||||||
|
onValueChange={handleChange(setUsername)}
|
||||||
|
placeholder="Benutzername"
|
||||||
|
disabled={!requireAuth}
|
||||||
|
/>
|
||||||
|
<ThemeText style={styles.label}>Passwort</ThemeText>
|
||||||
|
<ThemeTextInput
|
||||||
|
value={password}
|
||||||
|
onValueChange={handleChange(setPassword)}
|
||||||
|
secureTextEntry
|
||||||
|
placeholder="Passwort"
|
||||||
|
disabled={!requireAuth}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View style={styles.section}>
|
||||||
|
<Button title={isSaving ? "" : "Einloggen"} onPress={handleSave} disabled={isSaving} />
|
||||||
|
{isSaving && <ActivityIndicator size="small" color={colors.primary} style={styles.activityindicator} />}
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<AdvancedSettings
|
||||||
|
url={url}
|
||||||
|
requireAuth={requireAuth}
|
||||||
|
onUrlChange={setUrl}
|
||||||
|
onRequireAuthChange={setRequireAuth}
|
||||||
|
/>
|
||||||
|
|
||||||
<Credits />
|
<Credits />
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
</ErrorBoundary>
|
</ErrorBoundary>
|
||||||
|
|||||||
@@ -109,23 +109,8 @@ const Settings = () => {
|
|||||||
return (
|
return (
|
||||||
<ErrorBoundary>
|
<ErrorBoundary>
|
||||||
<ScrollView style={[styles.container, { backgroundColor: colors.backPrimary }]}>
|
<ScrollView style={[styles.container, { backgroundColor: colors.backPrimary }]}>
|
||||||
<ServerSettings />
|
|
||||||
<View style={styles.section}>
|
<View style={styles.section}>
|
||||||
<ThemeText style={styles.title}>Server</ThemeText>
|
<ThemeText style={styles.title}>Login</ThemeText>
|
||||||
<ThemeText style={styles.label}>URL</ThemeText>
|
|
||||||
<ThemeTextInput
|
|
||||||
value={url}
|
|
||||||
onValueChange={handleChange(setUrl)}
|
|
||||||
placeholder="URL"
|
|
||||||
/>
|
|
||||||
<View style={styles.switchContainer}>
|
|
||||||
<ThemeText>Authentifizierung</ThemeText>
|
|
||||||
<ThemeSwitch
|
|
||||||
value={requireAuth}
|
|
||||||
onValueChange={handleChange(setRequireAuth)}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
|
|
||||||
<ThemeText style={styles.label}>Benutzername</ThemeText>
|
<ThemeText style={styles.label}>Benutzername</ThemeText>
|
||||||
<ThemeTextInput
|
<ThemeTextInput
|
||||||
value={username}
|
value={username}
|
||||||
@@ -162,6 +147,15 @@ const Settings = () => {
|
|||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
|
<View style={styles.section}>
|
||||||
|
<AdvancedSettings
|
||||||
|
url={url}
|
||||||
|
requireAuth={requireAuth}
|
||||||
|
onUrlChange={setUrl}
|
||||||
|
onRequireAuthChange={setRequireAuth}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
|
||||||
<View style={styles.section}>
|
<View style={styles.section}>
|
||||||
<Button title={isSaving ? "" : "Speichern"} onPress={handleSave} disabled={isSaving} />
|
<Button title={isSaving ? "" : "Speichern"} onPress={handleSave} disabled={isSaving} />
|
||||||
{isSaving && <ActivityIndicator size="small" color={colors.primary} style={styles.activityindicator} />}
|
{isSaving && <ActivityIndicator size="small" color={colors.primary} style={styles.activityindicator} />}
|
||||||
@@ -176,58 +170,47 @@ const Settings = () => {
|
|||||||
export default Settings;
|
export default Settings;
|
||||||
|
|
||||||
|
|
||||||
export const ServerSettings = () => {
|
|
||||||
const colors = useColors();
|
|
||||||
const { settings, updateSettings } = useContext(SettingsContext);
|
|
||||||
|
|
||||||
const [url, setUrl] = useState('');
|
export const CredentialsInput = ({ username, password, onUsernameChange, onPasswordChange, requireAuth }) => {
|
||||||
const [username, setUsername] = useState('');
|
const styles = StyleSheet.create({
|
||||||
const [password, setPassword] = useState('');
|
section: {
|
||||||
const [isSystemTheme, setIsSystemTheme] = useState(settings.systemTheme);
|
marginBottom: 40,
|
||||||
const [isDarkMode, setIsDarkMode] = useState(settings.darkTheme);
|
},
|
||||||
const [requireAuth, setRequireAuth] = useState(settings.requireAuth);
|
label: {
|
||||||
const [isSaving, setIsSaving] = useState(false);
|
fontWeight: 'bold',
|
||||||
|
marginTop: 8,
|
||||||
|
marginBottom: 6,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return (
|
||||||
|
<View style={styles.section}>
|
||||||
|
<ThemeText style={styles.label}>Benutzername</ThemeText>
|
||||||
|
<ThemeTextInput
|
||||||
|
value={username}
|
||||||
|
onValueChange={onUsernameChange}
|
||||||
|
placeholder="Benutzername"
|
||||||
|
disabled={!requireAuth}
|
||||||
|
/>
|
||||||
|
<ThemeText style={styles.label}>Passwort</ThemeText>
|
||||||
|
<ThemeTextInput
|
||||||
|
value={password}
|
||||||
|
onValueChange={onPasswordChange}
|
||||||
|
secureTextEntry
|
||||||
|
placeholder="Passwort"
|
||||||
|
disabled={!requireAuth}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export const AdvancedSettings = ({ url, requireAuth, onUrlChange, onRequireAuthChange }) => {
|
||||||
const [showAdvanced, setShowAdvanced] = useState(false);
|
const [showAdvanced, setShowAdvanced] = useState(false);
|
||||||
const [rotateAnim] = useState(new Animated.Value(0)); // Animation state for the arrow
|
const [rotateAnim] = useState(new Animated.Value(0)); // Animation state for the arrow
|
||||||
const [advancedHeightAnim] = useState(new Animated.Value(0)); // Animation state for the advanced settings height
|
const [advancedHeightAnim] = useState(new Animated.Value(0)); // Animation state for the advanced settings height
|
||||||
|
|
||||||
const advancedSectionRef = useRef(null);
|
const advancedSectionRef = useRef(null);
|
||||||
|
const colors = useColors();
|
||||||
useEffect(() => {
|
|
||||||
if (settings) {
|
|
||||||
setUrl(settings.url || '');
|
|
||||||
setUsername(settings.username || '');
|
|
||||||
setPassword(settings.password || '');
|
|
||||||
setIsSystemTheme(settings.systemTheme);
|
|
||||||
setIsDarkMode(settings.darkTheme);
|
|
||||||
setRequireAuth(settings.requireAuth);
|
|
||||||
}
|
|
||||||
}, [settings]);
|
|
||||||
|
|
||||||
const handleSave = async () => {
|
|
||||||
if (isSaving) return;
|
|
||||||
|
|
||||||
try {
|
|
||||||
setIsSaving(true);
|
|
||||||
await updateSettings({
|
|
||||||
url,
|
|
||||||
username,
|
|
||||||
password,
|
|
||||||
systemTheme: isSystemTheme,
|
|
||||||
darkTheme: isDarkMode,
|
|
||||||
requireAuth,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error updating settings:', error);
|
|
||||||
Alert.alert('Error', 'Failed to save settings.');
|
|
||||||
} finally {
|
|
||||||
setIsSaving(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleChange = (setter) => (value) => {
|
|
||||||
setter(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
const toggleAdvancedSettings = () => {
|
const toggleAdvancedSettings = () => {
|
||||||
setShowAdvanced(!showAdvanced);
|
setShowAdvanced(!showAdvanced);
|
||||||
@@ -254,33 +237,10 @@ export const ServerSettings = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: {
|
|
||||||
flex: 1,
|
|
||||||
padding: 20,
|
|
||||||
},
|
|
||||||
label: {
|
|
||||||
fontWeight: 'bold',
|
|
||||||
marginTop: 8,
|
|
||||||
marginBottom: 6,
|
|
||||||
},
|
|
||||||
section: {
|
|
||||||
marginBottom: 40,
|
|
||||||
},
|
|
||||||
switchContainer: {
|
|
||||||
marginTop: 15,
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'space-between',
|
|
||||||
},
|
|
||||||
activityindicator: {
|
|
||||||
position: 'absolute',
|
|
||||||
width: '100%',
|
|
||||||
height: '100%',
|
|
||||||
},
|
|
||||||
arrowContainer: {
|
arrowContainer: {
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
marginTop: 20,
|
marginVertical: 20,
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
},
|
},
|
||||||
@@ -292,71 +252,49 @@ export const ServerSettings = () => {
|
|||||||
advancedSection: {
|
advancedSection: {
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
},
|
},
|
||||||
logo: {
|
label: {
|
||||||
width: 100,
|
fontWeight: 'bold',
|
||||||
height: 100,
|
marginTop: 8,
|
||||||
|
marginBottom: 6,
|
||||||
},
|
},
|
||||||
logoContainer: {
|
switchContainer: {
|
||||||
marginTop: 10,
|
marginTop: 15,
|
||||||
display: 'flex',
|
flexDirection: 'row',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
|
justifyContent: 'space-between',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ErrorBoundary>
|
<>
|
||||||
<ScrollView style={[styles.container, { backgroundColor: colors.backPrimary }]}>
|
{/* Toggle button */}
|
||||||
<View style={styles.section}>
|
<TouchableOpacity style={styles.arrowContainer} onPress={toggleAdvancedSettings}>
|
||||||
<ThemeText style={styles.label}>Benutzername</ThemeText>
|
<Animated.View style={{ transform: [{ rotate: arrowRotation }] }}>
|
||||||
<ThemeTextInput
|
<FontAwesome5 name="angle-right" size={24} color={colors.textAccent} />
|
||||||
value={username}
|
|
||||||
onValueChange={handleChange(setUsername)}
|
|
||||||
placeholder="Benutzername"
|
|
||||||
disabled={!requireAuth}
|
|
||||||
/>
|
|
||||||
<ThemeText style={styles.label}>Passwort</ThemeText>
|
|
||||||
<ThemeTextInput
|
|
||||||
value={password}
|
|
||||||
onValueChange={handleChange(setPassword)}
|
|
||||||
secureTextEntry
|
|
||||||
placeholder="Passwort"
|
|
||||||
disabled={!requireAuth}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
<View style={styles.section}>
|
|
||||||
<Button title={isSaving ? "" : "Einloggen"} onPress={handleSave} disabled={isSaving} />
|
|
||||||
{isSaving && <ActivityIndicator size="small" color={colors.primary} style={styles.activityindicator} />}
|
|
||||||
</View>
|
|
||||||
|
|
||||||
<TouchableOpacity style={styles.arrowContainer} onPress={toggleAdvancedSettings}>
|
|
||||||
<Animated.View style={{ transform: [{ rotate: arrowRotation }] }}>
|
|
||||||
<FontAwesome5 name="angle-right" size={24} color={colors.textAccent} />
|
|
||||||
</Animated.View>
|
|
||||||
<Text style={styles.advancedButtonText}>
|
|
||||||
{showAdvanced ? 'Erweiterte Einstellungen verbergen' : 'Erweiterte Einstellungen anzeigen'}
|
|
||||||
</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
|
|
||||||
{/* Animated section for advanced settings */}
|
|
||||||
<Animated.View style={[styles.advancedSection, { height: advancedHeightAnim }]}>
|
|
||||||
<View ref={advancedSectionRef}>
|
|
||||||
<ThemeText style={styles.label}>URL</ThemeText>
|
|
||||||
<ThemeTextInput
|
|
||||||
value={url}
|
|
||||||
onValueChange={handleChange(setUrl)}
|
|
||||||
placeholder="URL"
|
|
||||||
/>
|
|
||||||
<View style={styles.switchContainer}>
|
|
||||||
<ThemeText>Authentifizierung</ThemeText>
|
|
||||||
<ThemeSwitch
|
|
||||||
value={requireAuth}
|
|
||||||
onValueChange={handleChange(setRequireAuth)}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
</Animated.View>
|
</Animated.View>
|
||||||
</ScrollView>
|
<Text style={styles.advancedButtonText}>
|
||||||
</ErrorBoundary>
|
{showAdvanced ? 'Erweiterte Einstellungen verbergen' : 'Erweiterte Einstellungen anzeigen'}
|
||||||
);
|
</Text>
|
||||||
};
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
{/* Animated section for advanced settings */}
|
||||||
|
<Animated.View style={[styles.advancedSection, { height: advancedHeightAnim }]}>
|
||||||
|
<View ref={advancedSectionRef}>
|
||||||
|
<ThemeText style={styles.label}>URL</ThemeText>
|
||||||
|
<ThemeTextInput
|
||||||
|
value={url}
|
||||||
|
onValueChange={onUrlChange}
|
||||||
|
placeholder="URL"
|
||||||
|
/>
|
||||||
|
<View style={styles.switchContainer}>
|
||||||
|
<ThemeText>Authentifizierung</ThemeText>
|
||||||
|
<ThemeSwitch
|
||||||
|
value={requireAuth}
|
||||||
|
onValueChange={onRequireAuthChange}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Animated.View>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user