Compare commits
11 Commits
test
...
925dc6e0c0
| Author | SHA1 | Date | |
|---|---|---|---|
| 925dc6e0c0 | |||
| c2014b2176 | |||
| 917c7e1524 | |||
| f81591ccb0 | |||
| ccc8b00348 | |||
| dd6627ae35 | |||
| f98ffef4ce | |||
| fa5dd09d04 | |||
| bfee90a6fc | |||
| 60fdb02c9d | |||
| a4fa09589e |
18
app.json
18
app.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"expo": {
|
"expo": {
|
||||||
"name": "iso-test-app",
|
"name": "mcbeno",
|
||||||
"slug": "iso-test-app",
|
"slug": "mcbeno",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"orientation": "portrait",
|
"orientation": "portrait",
|
||||||
"icon": "./assets/images/icon.png",
|
"icon": "./assets/images/icon.png",
|
||||||
@@ -10,14 +10,15 @@
|
|||||||
"newArchEnabled": true,
|
"newArchEnabled": true,
|
||||||
"ios": {
|
"ios": {
|
||||||
"supportsTablet": true,
|
"supportsTablet": true,
|
||||||
"bundleIdentifier": "com.anonymous.iso-test-app"
|
"bundleIdentifier": "com.devbeni.mcbeno"
|
||||||
},
|
},
|
||||||
"android": {
|
"android": {
|
||||||
"adaptiveIcon": {
|
"adaptiveIcon": {
|
||||||
"foregroundImage": "./assets/images/icon.png",
|
"foregroundImage": "./assets/images/icon.png",
|
||||||
"backgroundColor": "#0c0a0a"
|
"backgroundColor": "#0c0a0a"
|
||||||
},
|
},
|
||||||
"edgeToEdgeEnabled": true
|
"edgeToEdgeEnabled": true,
|
||||||
|
"package": "com.devbeni.mcbeno"
|
||||||
},
|
},
|
||||||
"web": {
|
"web": {
|
||||||
"bundler": "metro",
|
"bundler": "metro",
|
||||||
@@ -38,6 +39,13 @@
|
|||||||
],
|
],
|
||||||
"experiments": {
|
"experiments": {
|
||||||
"typedRoutes": true
|
"typedRoutes": true
|
||||||
}
|
},
|
||||||
|
"extra": {
|
||||||
|
"router": {},
|
||||||
|
"eas": {
|
||||||
|
"projectId": "972fe547-cd46-4ed0-b9e1-9f13b035e4b7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"owner": "devbeni"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
231
app/index.tsx
231
app/index.tsx
@@ -1,105 +1,132 @@
|
|||||||
import * as Notifications from 'expo-notifications';
|
import { MaterialIcons } from '@expo/vector-icons';
|
||||||
|
import { useRouter } from 'expo-router';
|
||||||
|
import * as SecureStore from 'expo-secure-store';
|
||||||
import { StatusBar } from 'expo-status-bar';
|
import { StatusBar } from 'expo-status-bar';
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { Alert, Platform, StyleSheet, Text, TextInput, TouchableOpacity, View } from "react-native";
|
import { ActivityIndicator, Alert, Platform, StyleSheet, Text, TextInput, ToastAndroid, TouchableOpacity, View } from "react-native";
|
||||||
|
|
||||||
const PRIMARY = '#A24BFA';
|
const PRIMARY = '#A24BFA';
|
||||||
const BG = '#0c0a0a';
|
const BG = '#0c0a0a';
|
||||||
|
|
||||||
Notifications.setNotificationHandler({
|
|
||||||
handleNotification: async () => ({
|
|
||||||
shouldShowBanner: true,
|
|
||||||
shouldShowList: true,
|
|
||||||
shouldPlaySound: false,
|
|
||||||
shouldSetBadge: false,
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
async function registerForPushNotificationsAsync() {
|
|
||||||
const { status: existingStatus } = await Notifications.getPermissionsAsync();
|
|
||||||
let finalStatus = existingStatus;
|
|
||||||
if (existingStatus !== 'granted') {
|
|
||||||
const { status } = await Notifications.requestPermissionsAsync();
|
|
||||||
finalStatus = status;
|
|
||||||
}
|
|
||||||
if (finalStatus !== 'granted') {
|
|
||||||
Alert.alert('Permission for notifications not granted!');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function sendNotification() {
|
|
||||||
try {
|
|
||||||
const id = await Notifications.scheduleNotificationAsync({
|
|
||||||
content: {
|
|
||||||
title: "Hello!",
|
|
||||||
body: "Ez egy értesítés példája.",
|
|
||||||
},
|
|
||||||
trigger: Platform.OS === 'android'
|
|
||||||
? ({ seconds: 1, repeats: false } as any)
|
|
||||||
: null,
|
|
||||||
});
|
|
||||||
Alert.alert('Notification scheduled!', `ID: ${id}`);
|
|
||||||
} catch (e) {
|
|
||||||
Alert.alert('Hiba történt!', String(e));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function Index() {
|
export default function Index() {
|
||||||
const [username, setUsername] = useState("");
|
const [username, setUsername] = useState("");
|
||||||
const [password, setPassword] = useState("");
|
const [password, setPassword] = useState("");
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const [autoLogin, setAutoLogin] = useState(false);
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
registerForPushNotificationsAsync();
|
(async () => {
|
||||||
|
const savedEmail = await SecureStore.getItemAsync('email');
|
||||||
|
const savedPassword = await SecureStore.getItemAsync('password');
|
||||||
|
if (savedEmail && savedPassword) {
|
||||||
|
setUsername(savedEmail);
|
||||||
|
setPassword(savedPassword);
|
||||||
|
setAutoLogin(true);
|
||||||
|
setTimeout(() => {
|
||||||
|
handleLogin(savedEmail, savedPassword, true);
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
})();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
async function handleLogin(emailOverride?: string, passwordOverride?: string, isAuto?: boolean) {
|
||||||
|
setLoading(true);
|
||||||
|
const user = emailOverride ?? username;
|
||||||
|
const pass = passwordOverride ?? password;
|
||||||
|
try {
|
||||||
|
|
||||||
|
const response = await fetch('https://menuapi.devbeni.lol/api/login', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ username: user, password: pass })
|
||||||
|
});
|
||||||
|
const loginData = await response.json();
|
||||||
|
if (!loginData || !loginData.token) {
|
||||||
|
throw new Error('Hibás bejelentkezés vagy hiányzó token!');
|
||||||
|
}
|
||||||
|
|
||||||
|
await SecureStore.setItemAsync('token', loginData.token);
|
||||||
|
await SecureStore.setItemAsync('email', user);
|
||||||
|
await SecureStore.setItemAsync('password', pass);
|
||||||
|
|
||||||
|
const meResponse = await fetch('https://menuapi.devbeni.lol/api/@me', {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${loginData.token}`,
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const meData = await meResponse.json();
|
||||||
|
if (meData && meData.data) {
|
||||||
|
await SecureStore.setItemAsync('fullName', meData.data.fullName || '');
|
||||||
|
await SecureStore.setItemAsync('userId', String(meData.data.userId || ''));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isAuto) {
|
||||||
|
if (Platform.OS === 'android') {
|
||||||
|
ToastAndroid.show('Sikeres automatikus bejelentkezés', ToastAndroid.SHORT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
router.replace('/profile');
|
||||||
|
} catch (e) {
|
||||||
|
Alert.alert('Hiba', 'Hibás felhasználónév vagy jelszó, vagy hálózati hiba.');
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
setAutoLogin(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
<StatusBar style="light" backgroundColor={BG} />
|
<StatusBar style="light" backgroundColor={BG} />
|
||||||
<View style={styles.card}>
|
<View style={styles.card}>
|
||||||
<View style={{ alignItems: 'center', marginBottom: 16 }}>
|
|
||||||
<Text style={styles.logoText}>ANGELIC{"\n"}MC</Text>
|
|
||||||
</View>
|
|
||||||
<Text style={styles.title}>Üdv újra</Text>
|
<Text style={styles.title}>Üdv újra</Text>
|
||||||
<Text style={styles.subtitle}>Jelentkezz be a fiókodba</Text>
|
<Text style={styles.subtitle}>Jelentkezz be a mymenu fiókodba</Text>
|
||||||
<View style={{ height: 24 }} />
|
<View style={{ height: 24 }} />
|
||||||
<Text style={styles.label}>Felhasználónév</Text>
|
<Text style={styles.label}>Felhasználónév</Text>
|
||||||
<TextInput
|
<View style={styles.inputRow}>
|
||||||
style={styles.input}
|
<MaterialIcons name="email" size={22} color="#bdbdbd" style={{ marginRight: 8 }} />
|
||||||
placeholder="Add meg a felhasználóneved"
|
<TextInput
|
||||||
placeholderTextColor="#aaa"
|
style={styles.input}
|
||||||
value={username}
|
placeholder="valaki@gmail.com"
|
||||||
onChangeText={setUsername}
|
placeholderTextColor="#aaa"
|
||||||
autoCapitalize="none"
|
value={username}
|
||||||
/>
|
onChangeText={setUsername}
|
||||||
<View style={{ height: 16 }} />
|
autoCapitalize="none"
|
||||||
<View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
|
/>
|
||||||
<Text style={styles.label}>Jelszó</Text>
|
</View>
|
||||||
<TouchableOpacity>
|
<View style={{ height: 16 }} />
|
||||||
<Text style={styles.forgot}>Elfelejtetted?</Text>
|
<Text style={styles.label}>Jelszó</Text>
|
||||||
</TouchableOpacity>
|
<View style={styles.inputRow}>
|
||||||
|
<MaterialIcons name="lock" size={22} color="#bdbdbd" style={{ marginRight: 8 }} />
|
||||||
|
<TextInput
|
||||||
|
style={styles.input}
|
||||||
|
placeholder="••••••••"
|
||||||
|
placeholderTextColor="#aaa"
|
||||||
|
value={password}
|
||||||
|
onChangeText={setPassword}
|
||||||
|
secureTextEntry
|
||||||
|
/>
|
||||||
</View>
|
</View>
|
||||||
<TextInput
|
|
||||||
style={styles.input}
|
|
||||||
placeholder="••••••••"
|
|
||||||
placeholderTextColor="#aaa"
|
|
||||||
value={password}
|
|
||||||
onChangeText={setPassword}
|
|
||||||
secureTextEntry
|
|
||||||
/>
|
|
||||||
<View style={{ height: 24 }} />
|
<View style={{ height: 24 }} />
|
||||||
<TouchableOpacity style={styles.button} onPress={sendNotification}>
|
<TouchableOpacity style={styles.button} onPress={() => handleLogin()} disabled={loading}>
|
||||||
<Text style={styles.buttonText}>Bejelentkezés</Text>
|
{loading ? (
|
||||||
|
<ActivityIndicator color="#fff" />
|
||||||
|
) : (
|
||||||
|
<Text style={styles.buttonText}>Bejelentkezés</Text>
|
||||||
|
)}
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
<View style={{ height: 16 }} />
|
|
||||||
<View style={{ flexDirection: 'row', justifyContent: 'center' }}>
|
|
||||||
<Text style={styles.bottomText}>Nincs még fiókod? </Text>
|
|
||||||
<TouchableOpacity>
|
|
||||||
<Text style={styles.register}>Regisztrálj most!</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
</View>
|
|
||||||
</View>
|
</View>
|
||||||
|
{(loading || autoLogin) && (
|
||||||
|
<View style={styles.loadingOverlay}>
|
||||||
|
<ActivityIndicator size="large" color={PRIMARY} />
|
||||||
|
<Text style={styles.loadingText}>{autoLogin ? 'Bejelentkezés...' : 'Betöltés...'}</Text>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -127,14 +154,6 @@ const styles = StyleSheet.create({
|
|||||||
shadowOffset: { width: 0, height: 8 },
|
shadowOffset: { width: 0, height: 8 },
|
||||||
elevation: 8,
|
elevation: 8,
|
||||||
},
|
},
|
||||||
logoText: {
|
|
||||||
color: PRIMARY,
|
|
||||||
fontWeight: 'bold',
|
|
||||||
fontSize: 28,
|
|
||||||
textAlign: 'center',
|
|
||||||
letterSpacing: 2,
|
|
||||||
marginBottom: 4,
|
|
||||||
},
|
|
||||||
title: {
|
title: {
|
||||||
color: '#fff',
|
color: '#fff',
|
||||||
fontWeight: 'bold',
|
fontWeight: 'bold',
|
||||||
@@ -146,27 +165,31 @@ const styles = StyleSheet.create({
|
|||||||
color: '#bdbdbd',
|
color: '#bdbdbd',
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
marginBottom: 8,
|
marginBottom: 24,
|
||||||
},
|
},
|
||||||
label: {
|
label: {
|
||||||
color: '#bdbdbd',
|
color: '#bdbdbd',
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
marginBottom: 4,
|
marginBottom: 8,
|
||||||
},
|
},
|
||||||
input: {
|
inputRow: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
backgroundColor: 'rgba(20,18,24,1)',
|
backgroundColor: 'rgba(20,18,24,1)',
|
||||||
borderColor: PRIMARY,
|
borderColor: PRIMARY,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
borderRadius: 12,
|
borderRadius: 12,
|
||||||
|
marginBottom: 16,
|
||||||
|
paddingHorizontal: 8,
|
||||||
|
},
|
||||||
|
input: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: 'transparent',
|
||||||
color: '#fff',
|
color: '#fff',
|
||||||
paddingHorizontal: 16,
|
paddingHorizontal: 8,
|
||||||
paddingVertical: 12,
|
paddingVertical: 12,
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
},
|
borderWidth: 0,
|
||||||
forgot: {
|
|
||||||
color: PRIMARY,
|
|
||||||
fontSize: 14,
|
|
||||||
fontWeight: '500',
|
|
||||||
},
|
},
|
||||||
button: {
|
button: {
|
||||||
backgroundColor: PRIMARY,
|
backgroundColor: PRIMARY,
|
||||||
@@ -185,13 +208,21 @@ const styles = StyleSheet.create({
|
|||||||
fontWeight: 'bold',
|
fontWeight: 'bold',
|
||||||
fontSize: 18,
|
fontSize: 18,
|
||||||
},
|
},
|
||||||
bottomText: {
|
loadingOverlay: {
|
||||||
color: '#bdbdbd',
|
position: 'absolute',
|
||||||
fontSize: 15,
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
backgroundColor: 'rgba(12,10,10,0.85)',
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
zIndex: 10,
|
||||||
},
|
},
|
||||||
register: {
|
loadingText: {
|
||||||
color: PRIMARY,
|
color: PRIMARY,
|
||||||
|
fontSize: 18,
|
||||||
|
marginTop: 16,
|
||||||
fontWeight: 'bold',
|
fontWeight: 'bold',
|
||||||
fontSize: 15,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
181
app/profile.tsx
Normal file
181
app/profile.tsx
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
|
||||||
|
import { Ionicons, MaterialCommunityIcons, MaterialIcons } from '@expo/vector-icons';
|
||||||
|
import { useRouter } from 'expo-router';
|
||||||
|
import * as SecureStore from 'expo-secure-store';
|
||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
|
||||||
|
|
||||||
|
const PRIMARY = '#A24BFA';
|
||||||
|
const BG = '#0c0a0a';
|
||||||
|
|
||||||
|
export default function Profile() {
|
||||||
|
const [user, setUser] = useState<any>(null);
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
fetchUser();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
async function fetchUser() {
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
const token = await SecureStore.getItemAsync('token');
|
||||||
|
if (!token) {
|
||||||
|
throw new Error('Nincs elmentett token, kérlek jelentkezz be újra!');
|
||||||
|
}
|
||||||
|
const response = await fetch('https://menuapi.devbeni.lol/api/@me', {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${token}`,
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const data = await response.json();
|
||||||
|
if (!data || !data.data || !data.data.Data) {
|
||||||
|
setUser(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setUser(data.data.Data);
|
||||||
|
} catch (e) {
|
||||||
|
setUser(null);
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleLogout() {
|
||||||
|
await SecureStore.deleteItemAsync('token');
|
||||||
|
await SecureStore.deleteItemAsync('email');
|
||||||
|
await SecureStore.deleteItemAsync('password');
|
||||||
|
await SecureStore.deleteItemAsync('fullName');
|
||||||
|
await SecureStore.deleteItemAsync('userId');
|
||||||
|
router.replace('/');
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<Text style={styles.title}>Profil</Text>
|
||||||
|
<View style={styles.card}>
|
||||||
|
<Text style={styles.label}>Név:</Text>
|
||||||
|
<Text style={styles.value}>{user?.FullName || '-'}</Text>
|
||||||
|
<Text style={styles.label}>UserID:</Text>
|
||||||
|
<Text style={styles.value}>{user?.UserID || '-'}</Text>
|
||||||
|
<Text style={styles.label}>Szerepkör:</Text>
|
||||||
|
<Text style={styles.value}>{user?.RoleCode || '-'}</Text>
|
||||||
|
<Text style={styles.label}>Étterem:</Text>
|
||||||
|
<Text style={styles.value}>{user?.RestaurantName || '-'}</Text>
|
||||||
|
<TouchableOpacity style={styles.logoutButton} onPress={handleLogout}>
|
||||||
|
<Text style={styles.logoutText}>Kijelentkezés</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
<View style={styles.navBar}>
|
||||||
|
<NavBar activeTab="profile" />
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function NavBar({ activeTab }: { activeTab: string }) {
|
||||||
|
const router = useRouter();
|
||||||
|
return (
|
||||||
|
<View style={styles.navBar}>
|
||||||
|
<TouchableOpacity style={styles.navItem} onPress={() => router.push('/profile')}>
|
||||||
|
<MaterialIcons name="person" size={28} color={activeTab === 'profile' ? PRIMARY : '#bdbdbd'} />
|
||||||
|
<Text style={[styles.navLabel, { color: activeTab === 'profile' ? PRIMARY : '#bdbdbd' }]}>Profilom</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TouchableOpacity style={styles.navItem} onPress={() => router.push('/schedule')}>
|
||||||
|
<MaterialCommunityIcons name="calendar-month" size={28} color={activeTab === 'schedule' ? PRIMARY : '#bdbdbd'} />
|
||||||
|
<Text style={[styles.navLabel, { color: activeTab === 'schedule' ? PRIMARY : '#bdbdbd' }]}>Beosztás</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TouchableOpacity style={styles.navItem} onPress={() => router.push('/requests')}>
|
||||||
|
<Ionicons name="mail" size={28} color={activeTab === 'requests' ? PRIMARY : '#bdbdbd'} />
|
||||||
|
<Text style={[styles.navLabel, { color: activeTab === 'requests' ? PRIMARY : '#bdbdbd' }]}>Kérelmek</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: BG,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
paddingBottom: 64,
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
color: '#fff',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
fontSize: 28,
|
||||||
|
textAlign: 'center',
|
||||||
|
marginBottom: 24,
|
||||||
|
marginTop: 32,
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
backgroundColor: 'rgba(24, 20, 28, 0.95)',
|
||||||
|
borderRadius: 24,
|
||||||
|
padding: 32,
|
||||||
|
width: '90%',
|
||||||
|
maxWidth: 400,
|
||||||
|
shadowColor: '#000',
|
||||||
|
shadowOpacity: 0.3,
|
||||||
|
shadowRadius: 24,
|
||||||
|
shadowOffset: { width: 0, height: 8 },
|
||||||
|
elevation: 8,
|
||||||
|
marginBottom: 32,
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
color: '#bdbdbd',
|
||||||
|
fontSize: 16,
|
||||||
|
marginTop: 12,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
color: PRIMARY,
|
||||||
|
fontSize: 18,
|
||||||
|
marginBottom: 8,
|
||||||
|
},
|
||||||
|
navBar: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-around',
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: 'rgba(24, 20, 28, 0.98)',
|
||||||
|
borderTopWidth: 1,
|
||||||
|
borderTopColor: '#222',
|
||||||
|
position: 'absolute',
|
||||||
|
bottom: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
height: 64,
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
},
|
||||||
|
navItem: {
|
||||||
|
flex: 1,
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
navLabel: {
|
||||||
|
fontSize: 13,
|
||||||
|
marginTop: 2,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
logoutButton: {
|
||||||
|
backgroundColor: PRIMARY,
|
||||||
|
borderRadius: 12,
|
||||||
|
paddingVertical: 16,
|
||||||
|
alignItems: 'center',
|
||||||
|
marginTop: 32,
|
||||||
|
shadowColor: PRIMARY,
|
||||||
|
shadowOpacity: 0.3,
|
||||||
|
shadowRadius: 8,
|
||||||
|
shadowOffset: { width: 0, height: 2 },
|
||||||
|
elevation: 2,
|
||||||
|
},
|
||||||
|
logoutText: {
|
||||||
|
color: '#fff',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
fontSize: 18,
|
||||||
|
letterSpacing: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
98
app/requests.tsx
Normal file
98
app/requests.tsx
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
import { Ionicons, MaterialCommunityIcons, MaterialIcons } from '@expo/vector-icons';
|
||||||
|
import { useRouter } from 'expo-router';
|
||||||
|
import React, { useEffect } from 'react';
|
||||||
|
import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
|
||||||
|
|
||||||
|
const PRIMARY = '#A24BFA';
|
||||||
|
const BG = '#0c0a0a';
|
||||||
|
|
||||||
|
export default function Requests() {
|
||||||
|
useEffect(() => {
|
||||||
|
console.log('Requests oldal betöltve');
|
||||||
|
}, []);
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<View style={styles.card}>
|
||||||
|
<Text style={styles.label}>Kérelmek funkció hamarosan…</Text>
|
||||||
|
</View>
|
||||||
|
<View style={styles.navBar}>
|
||||||
|
<NavBar activeTab="requests" />
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function NavBar({ activeTab }: { activeTab: string }) {
|
||||||
|
const router = useRouter();
|
||||||
|
return (
|
||||||
|
<View style={styles.navBar}>
|
||||||
|
<TouchableOpacity style={styles.navItem} onPress={() => router.replace('/profile')}>
|
||||||
|
<MaterialIcons name="person" size={28} color={activeTab === 'profile' ? PRIMARY : '#bdbdbd'} />
|
||||||
|
<Text style={[styles.navLabel, { color: activeTab === 'profile' ? PRIMARY : '#bdbdbd' }]}>Profilom</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TouchableOpacity style={styles.navItem} onPress={() => router.replace('/schedule')}>
|
||||||
|
<MaterialCommunityIcons name="calendar-month" size={28} color={activeTab === 'schedule' ? PRIMARY : '#bdbdbd'} />
|
||||||
|
<Text style={[styles.navLabel, { color: activeTab === 'schedule' ? PRIMARY : '#bdbdbd' }]}>Beosztás</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TouchableOpacity style={styles.navItem} onPress={() => router.replace('/requests')}>
|
||||||
|
<Ionicons name="mail" size={28} color={activeTab === 'requests' ? PRIMARY : '#bdbdbd'} />
|
||||||
|
<Text style={[styles.navLabel, { color: activeTab === 'requests' ? PRIMARY : '#bdbdbd' }]}>Kérelmek</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: BG,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
paddingBottom: 64,
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
backgroundColor: 'rgba(24, 20, 28, 0.95)',
|
||||||
|
borderRadius: 24,
|
||||||
|
padding: 32,
|
||||||
|
width: '90%',
|
||||||
|
maxWidth: 400,
|
||||||
|
shadowColor: '#000',
|
||||||
|
shadowOpacity: 0.3,
|
||||||
|
shadowRadius: 24,
|
||||||
|
shadowOffset: { width: 0, height: 8 },
|
||||||
|
elevation: 8,
|
||||||
|
marginBottom: 32,
|
||||||
|
marginTop: 32,
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
color: '#bdbdbd',
|
||||||
|
fontSize: 16,
|
||||||
|
marginBottom: 16,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
navBar: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-around',
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: 'rgba(24, 20, 28, 0.98)',
|
||||||
|
borderTopWidth: 1,
|
||||||
|
borderTopColor: '#222',
|
||||||
|
position: 'absolute',
|
||||||
|
bottom: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
height: 64,
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
},
|
||||||
|
navItem: {
|
||||||
|
flex: 1,
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
navLabel: {
|
||||||
|
fontSize: 13,
|
||||||
|
marginTop: 2,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
});
|
||||||
257
app/schedule.tsx
Normal file
257
app/schedule.tsx
Normal file
@@ -0,0 +1,257 @@
|
|||||||
|
import { Ionicons, MaterialCommunityIcons, MaterialIcons } from '@expo/vector-icons';
|
||||||
|
import { addDays, addWeeks, format, getMonth, getYear, isSameDay, startOfWeek, subWeeks } from 'date-fns';
|
||||||
|
import { useRouter } from 'expo-router';
|
||||||
|
import * as SecureStore from 'expo-secure-store';
|
||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { ScrollView, StyleSheet, Text, TouchableOpacity, View } from "react-native";
|
||||||
|
|
||||||
|
const PRIMARY = '#A24BFA';
|
||||||
|
const BG = '#0c0a0a';
|
||||||
|
|
||||||
|
export default function Schedule() {
|
||||||
|
const [currentWeek, setCurrentWeek] = useState(new Date());
|
||||||
|
const [workdays, setWorkdays] = useState<any[]>([]);
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
fetchWorkdays();
|
||||||
|
}, [currentWeek]);
|
||||||
|
|
||||||
|
async function fetchWorkdays() {
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
const token = await SecureStore.getItemAsync('token');
|
||||||
|
if (!token) {
|
||||||
|
throw new Error('Nincs elmentett token, kérlek jelentkezz be újra!');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Az aktuális hét első és utolsó napja
|
||||||
|
const weekStart = startOfWeek(currentWeek, { weekStartsOn: 1 });
|
||||||
|
const weekEnd = addDays(weekStart, 6);
|
||||||
|
const months = new Set([
|
||||||
|
getMonth(weekStart) + 1,
|
||||||
|
getMonth(weekEnd) + 1
|
||||||
|
]);
|
||||||
|
const years = new Set([
|
||||||
|
getYear(weekStart),
|
||||||
|
getYear(weekEnd)
|
||||||
|
]);
|
||||||
|
|
||||||
|
let allWorkdays: any[] = [];
|
||||||
|
for (const year of years) {
|
||||||
|
for (const month of months) {
|
||||||
|
const response = await fetch(`https://menuapi.devbeni.lol/api/@me/schedule?year=${year}&month=${month}`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${token}`,
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const data = await response.json();
|
||||||
|
if (data && data.data && Array.isArray(data.data.Data)) {
|
||||||
|
allWorkdays = allWorkdays.concat(data.data.Data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setWorkdays(allWorkdays);
|
||||||
|
} catch (e) {
|
||||||
|
const err = e as any;
|
||||||
|
if (err.response) {
|
||||||
|
console.log('API error response:', {
|
||||||
|
data: err.response.data,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log('Network error:', e);
|
||||||
|
}
|
||||||
|
setWorkdays([]);
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderCalendar() {
|
||||||
|
const weekStart = startOfWeek(currentWeek, { weekStartsOn: 1 });
|
||||||
|
const today = new Date();
|
||||||
|
// 2 soros grid: első sor 4 nap, második sor 3 nap
|
||||||
|
const weekDays = Array.from({ length: 7 }, (_, i) => addDays(weekStart, i));
|
||||||
|
const firstRow = weekDays.slice(0, 4);
|
||||||
|
const secondRow = weekDays.slice(4);
|
||||||
|
|
||||||
|
function renderDayBox(day: string | number | Date) {
|
||||||
|
const formattedDate = format(day, 'yyyy-MM-dd');
|
||||||
|
const wd = workdays.find(w => w.WorkDay?.slice(0, 10) === formattedDate);
|
||||||
|
let bg = '#ede7f6';
|
||||||
|
let color = '#6a1b9a';
|
||||||
|
let borderWidth = 0;
|
||||||
|
if (isSameDay(day, today)) {
|
||||||
|
borderWidth = 2;
|
||||||
|
color = PRIMARY;
|
||||||
|
}
|
||||||
|
if (wd) {
|
||||||
|
if (wd.Type === 1) {
|
||||||
|
bg = '#B388FF';
|
||||||
|
color = '#311b92';
|
||||||
|
} else if (wd.Type === 10) {
|
||||||
|
bg = '#A24BFA';
|
||||||
|
color = '#fff';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<View
|
||||||
|
key={day.toString()}
|
||||||
|
style={{
|
||||||
|
flex: 1,
|
||||||
|
margin: 6,
|
||||||
|
minWidth: 60,
|
||||||
|
minHeight: 70,
|
||||||
|
maxWidth: 120,
|
||||||
|
maxHeight: 120,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<View style={{
|
||||||
|
backgroundColor: bg,
|
||||||
|
borderRadius: 18,
|
||||||
|
borderWidth,
|
||||||
|
borderColor: PRIMARY,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
width: '100%',
|
||||||
|
minHeight: 60,
|
||||||
|
paddingVertical: 10,
|
||||||
|
paddingHorizontal: 4,
|
||||||
|
shadowColor: '#a24bfa',
|
||||||
|
shadowOpacity: 0.10,
|
||||||
|
shadowRadius: 8,
|
||||||
|
shadowOffset: { width: 0, height: 2 },
|
||||||
|
overflow: 'hidden',
|
||||||
|
}}>
|
||||||
|
<Text style={{ color, fontWeight: 'bold', fontSize: 22, textAlign: 'center', width: '100%' }}>{format(day, 'd')}</Text>
|
||||||
|
{wd && wd.Type === 1 && (
|
||||||
|
<Text style={{ color, fontSize: 15, fontWeight: 'bold', marginTop: 4, textAlign: 'center', width: '100%' }} numberOfLines={2} ellipsizeMode="tail">PN</Text>
|
||||||
|
)}
|
||||||
|
{wd && wd.Type === 10 && wd.text && (
|
||||||
|
<Text style={{ color, fontSize: 15, fontWeight: 'bold', marginTop: 4, textAlign: 'center', width: '100%' }} numberOfLines={2} ellipsizeMode="tail">{wd.text}</Text>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View>
|
||||||
|
<View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', marginBottom: 12 }}>
|
||||||
|
<TouchableOpacity onPress={() => setCurrentWeek(subWeeks(currentWeek, 1))}><Ionicons name="chevron-back" size={28} color="#fff" /></TouchableOpacity>
|
||||||
|
<Text style={{ color: '#fff', fontSize: 18, fontWeight: 'bold' }}>{format(weekStart, 'yyyy. MMMM d.') + ' - ' + format(addDays(weekStart, 6), 'MMMM d.')}</Text>
|
||||||
|
<TouchableOpacity onPress={() => setCurrentWeek(addWeeks(currentWeek, 1))}><Ionicons name="chevron-forward" size={28} color="#fff" /></TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
<View style={{ flexDirection: 'row', marginBottom: 4, width: '100%' }}>
|
||||||
|
{["H", "K", "Sz", "Cs", "P", "Szo", "V"].map(d => (
|
||||||
|
<Text key={d} style={{ flex: 1, color: '#bdbdbd', textAlign: 'center', fontWeight: 'bold' }}>{d}</Text>
|
||||||
|
))}
|
||||||
|
</View>
|
||||||
|
{loading ? (
|
||||||
|
<Text style={{ color: '#fff', textAlign: 'center', marginTop: 24 }}>Betöltés…</Text>
|
||||||
|
) : (
|
||||||
|
<View style={{ width: '100%', alignItems: 'center', justifyContent: 'center' }}>
|
||||||
|
<View style={{ flexDirection: 'row', width: '100%', justifyContent: 'center' }}>
|
||||||
|
{firstRow.map(renderDayBox)}
|
||||||
|
</View>
|
||||||
|
<View style={{ flexDirection: 'row', width: '75%', justifyContent: 'center' }}>
|
||||||
|
{secondRow.map(renderDayBox)}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ScrollView style={{ flex: 1, backgroundColor: BG }} contentContainerStyle={{ flexGrow: 1, justifyContent: 'center', alignItems: 'center', minHeight: '100%', paddingBottom: 80, width: '100%' }}>
|
||||||
|
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', width: '100%' }}>
|
||||||
|
<View style={[styles.card, { alignSelf: 'center', marginTop: 48, marginBottom: 48, width: '100%' }]}>
|
||||||
|
<Text style={styles.label}>Beosztás naptár</Text>
|
||||||
|
{(!loading && workdays.length === 0) && (
|
||||||
|
<Text style={{ color: '#ff5252', textAlign: 'center', marginBottom: 12, fontWeight: 'bold' }}>
|
||||||
|
Nincs beosztás vagy nem vagy bejelentkezve!
|
||||||
|
</Text>
|
||||||
|
)}
|
||||||
|
{renderCalendar()}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
<View style={styles.navBar}>
|
||||||
|
<NavBar activeTab="schedule" />
|
||||||
|
</View>
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function NavBar({ activeTab }: { activeTab: string }) {
|
||||||
|
const router = useRouter();
|
||||||
|
return (
|
||||||
|
<View style={styles.navBar}>
|
||||||
|
<TouchableOpacity style={styles.navItem} onPress={() => router.push('/profile')}>
|
||||||
|
<MaterialIcons name="person" size={28} color={activeTab === 'profile' ? PRIMARY : '#bdbdbd'} />
|
||||||
|
<Text style={[styles.navLabel, { color: activeTab === 'profile' ? PRIMARY : '#bdbdbd' }]}>Profilom</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TouchableOpacity style={styles.navItem} onPress={() => router.push('/schedule')}>
|
||||||
|
<MaterialCommunityIcons name="calendar-month" size={28} color={activeTab === 'schedule' ? PRIMARY : '#bdbdbd'} />
|
||||||
|
<Text style={[styles.navLabel, { color: activeTab === 'schedule' ? PRIMARY : '#bdbdbd' }]}>Beosztás</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
<TouchableOpacity style={styles.navItem} onPress={() => router.push('/requests')}>
|
||||||
|
<Ionicons name="mail" size={28} color={activeTab === 'requests' ? PRIMARY : '#bdbdbd'} />
|
||||||
|
<Text style={[styles.navLabel, { color: activeTab === 'requests' ? PRIMARY : '#bdbdbd' }]}>Kérelmek</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
card: {
|
||||||
|
backgroundColor: 'rgba(24, 20, 28, 0.95)',
|
||||||
|
borderRadius: 24,
|
||||||
|
padding: 32,
|
||||||
|
width: '90%',
|
||||||
|
maxWidth: 400,
|
||||||
|
shadowColor: '#000',
|
||||||
|
shadowOpacity: 0.3,
|
||||||
|
shadowRadius: 24,
|
||||||
|
shadowOffset: { width: 0, height: 8 },
|
||||||
|
elevation: 8,
|
||||||
|
marginBottom: 32,
|
||||||
|
marginTop: 32,
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
color: '#bdbdbd',
|
||||||
|
fontSize: 16,
|
||||||
|
marginBottom: 16,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
navBar: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-around',
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: 'rgba(24, 20, 28, 0.98)',
|
||||||
|
borderTopWidth: 1,
|
||||||
|
borderTopColor: '#222',
|
||||||
|
position: 'absolute',
|
||||||
|
bottom: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
height: 64,
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
},
|
||||||
|
navItem: {
|
||||||
|
flex: 1,
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
navLabel: {
|
||||||
|
fontSize: 13,
|
||||||
|
marginTop: 2,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
});
|
||||||
24
eas.json
Normal file
24
eas.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"cli": {
|
||||||
|
"version": ">= 16.17.3",
|
||||||
|
"appVersionSource": "remote"
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"development": {
|
||||||
|
"developmentClient": true,
|
||||||
|
"distribution": "internal",
|
||||||
|
"ios": {
|
||||||
|
"simulator": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"distribution": "internal"
|
||||||
|
},
|
||||||
|
"production": {
|
||||||
|
"autoIncrement": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"submit": {
|
||||||
|
"production": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
package.json
10
package.json
@@ -1,20 +1,22 @@
|
|||||||
{
|
{
|
||||||
"name": "iso-test-app",
|
"name": "mcbeno",
|
||||||
"main": "expo-router/entry",
|
"main": "expo-router/entry",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "expo start",
|
"start": "expo start",
|
||||||
"reset-project": "node ./scripts/reset-project.js",
|
|
||||||
"android": "expo run:android",
|
"android": "expo run:android",
|
||||||
"ios": "expo run:ios",
|
"ios": "expo run:ios",
|
||||||
"web": "expo start --web",
|
"web": "expo start --web",
|
||||||
"lint": "expo lint"
|
"lint": "expo lint",
|
||||||
|
"build": "expo build:ios && expo build:android"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@expo/vector-icons": "^14.1.0",
|
"@expo/vector-icons": "^14.1.0",
|
||||||
"@react-navigation/bottom-tabs": "^7.3.10",
|
"@react-navigation/bottom-tabs": "^7.3.10",
|
||||||
"@react-navigation/elements": "^2.3.8",
|
"@react-navigation/elements": "^2.3.8",
|
||||||
"@react-navigation/native": "^7.1.6",
|
"@react-navigation/native": "^7.1.6",
|
||||||
|
"axios": "^1.11.0",
|
||||||
|
"date-fns": "^4.1.0",
|
||||||
"expo": "~53.0.20",
|
"expo": "~53.0.20",
|
||||||
"expo-blur": "~14.1.5",
|
"expo-blur": "~14.1.5",
|
||||||
"expo-constants": "~17.1.7",
|
"expo-constants": "~17.1.7",
|
||||||
@@ -24,6 +26,7 @@
|
|||||||
"expo-linking": "~7.1.7",
|
"expo-linking": "~7.1.7",
|
||||||
"expo-notifications": "~0.31.4",
|
"expo-notifications": "~0.31.4",
|
||||||
"expo-router": "~5.1.4",
|
"expo-router": "~5.1.4",
|
||||||
|
"expo-secure-store": "^14.2.3",
|
||||||
"expo-splash-screen": "~0.30.10",
|
"expo-splash-screen": "~0.30.10",
|
||||||
"expo-status-bar": "~2.2.3",
|
"expo-status-bar": "~2.2.3",
|
||||||
"expo-symbols": "~0.4.5",
|
"expo-symbols": "~0.4.5",
|
||||||
@@ -41,6 +44,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@babel/core": "^7.25.2",
|
||||||
|
"@types/date-fns": "^2.6.3",
|
||||||
"@types/react": "~19.0.10",
|
"@types/react": "~19.0.10",
|
||||||
"eslint": "^9.25.0",
|
"eslint": "^9.25.0",
|
||||||
"eslint-config-expo": "~9.2.0",
|
"eslint-config-expo": "~9.2.0",
|
||||||
|
|||||||
92
pnpm-lock.yaml
generated
92
pnpm-lock.yaml
generated
@@ -20,6 +20,12 @@ importers:
|
|||||||
'@react-navigation/native':
|
'@react-navigation/native':
|
||||||
specifier: ^7.1.6
|
specifier: ^7.1.6
|
||||||
version: 7.1.16(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
|
version: 7.1.16(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
|
||||||
|
axios:
|
||||||
|
specifier: ^1.11.0
|
||||||
|
version: 1.11.0
|
||||||
|
date-fns:
|
||||||
|
specifier: ^4.1.0
|
||||||
|
version: 4.1.0
|
||||||
expo:
|
expo:
|
||||||
specifier: ~53.0.20
|
specifier: ~53.0.20
|
||||||
version: 53.0.20(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0)))(react-native-webview@13.13.5(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
|
version: 53.0.20(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0)))(react-native-webview@13.13.5(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
|
||||||
@@ -47,6 +53,9 @@ importers:
|
|||||||
expo-router:
|
expo-router:
|
||||||
specifier: ~5.1.4
|
specifier: ~5.1.4
|
||||||
version: 5.1.4(e1c8eefe113e01b6d50ed7cbca38deea)
|
version: 5.1.4(e1c8eefe113e01b6d50ed7cbca38deea)
|
||||||
|
expo-secure-store:
|
||||||
|
specifier: ^14.2.3
|
||||||
|
version: 14.2.3(expo@53.0.20(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0)))(react-native-webview@13.13.5(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))
|
||||||
expo-splash-screen:
|
expo-splash-screen:
|
||||||
specifier: ~0.30.10
|
specifier: ~0.30.10
|
||||||
version: 0.30.10(expo@53.0.20(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0)))(react-native-webview@13.13.5(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))
|
version: 0.30.10(expo@53.0.20(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0)))(react-native-webview@13.13.5(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))
|
||||||
@@ -93,6 +102,9 @@ importers:
|
|||||||
'@babel/core':
|
'@babel/core':
|
||||||
specifier: ^7.25.2
|
specifier: ^7.25.2
|
||||||
version: 7.28.0
|
version: 7.28.0
|
||||||
|
'@types/date-fns':
|
||||||
|
specifier: ^2.6.3
|
||||||
|
version: 2.6.3
|
||||||
'@types/react':
|
'@types/react':
|
||||||
specifier: ~19.0.10
|
specifier: ~19.0.10
|
||||||
version: 19.0.14
|
version: 19.0.14
|
||||||
@@ -1005,6 +1017,10 @@ packages:
|
|||||||
'@types/babel__traverse@7.20.7':
|
'@types/babel__traverse@7.20.7':
|
||||||
resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==}
|
resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==}
|
||||||
|
|
||||||
|
'@types/date-fns@2.6.3':
|
||||||
|
resolution: {integrity: sha512-Ke1lw2Ni1t/wMUoLtKFmSNCLozcTBd6vmMqFP4hRzXn6qzkNt97bPAX0x5Y/c15DP43kKvwW1ycStD5+43jVQA==}
|
||||||
|
deprecated: This is a stub types definition. date-fns provides its own type definitions, so you do not need this installed.
|
||||||
|
|
||||||
'@types/estree@1.0.8':
|
'@types/estree@1.0.8':
|
||||||
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
|
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
|
||||||
|
|
||||||
@@ -1347,10 +1363,16 @@ packages:
|
|||||||
async-limiter@1.0.1:
|
async-limiter@1.0.1:
|
||||||
resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==}
|
resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==}
|
||||||
|
|
||||||
|
asynckit@0.4.0:
|
||||||
|
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
|
||||||
|
|
||||||
available-typed-arrays@1.0.7:
|
available-typed-arrays@1.0.7:
|
||||||
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
|
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
axios@1.11.0:
|
||||||
|
resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==}
|
||||||
|
|
||||||
babel-jest@29.7.0:
|
babel-jest@29.7.0:
|
||||||
resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
|
resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
|
||||||
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
||||||
@@ -1569,6 +1591,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
|
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
|
||||||
engines: {node: '>=12.5.0'}
|
engines: {node: '>=12.5.0'}
|
||||||
|
|
||||||
|
combined-stream@1.0.8:
|
||||||
|
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
commander@12.1.0:
|
commander@12.1.0:
|
||||||
resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
|
resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -1638,6 +1664,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
|
resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
date-fns@4.1.0:
|
||||||
|
resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
|
||||||
|
|
||||||
debug@2.6.9:
|
debug@2.6.9:
|
||||||
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
|
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -1693,6 +1722,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
|
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
delayed-stream@1.0.0:
|
||||||
|
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
||||||
|
engines: {node: '>=0.4.0'}
|
||||||
|
|
||||||
depd@2.0.0:
|
depd@2.0.0:
|
||||||
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
@@ -2032,6 +2065,11 @@ packages:
|
|||||||
react-native-reanimated:
|
react-native-reanimated:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
expo-secure-store@14.2.3:
|
||||||
|
resolution: {integrity: sha512-hYBbaAD70asKTFd/eZBKVu+9RTo9OSTMMLqXtzDF8ndUGjpc6tmRCoZtrMHlUo7qLtwL5jm+vpYVBWI8hxh/1Q==}
|
||||||
|
peerDependencies:
|
||||||
|
expo: '*'
|
||||||
|
|
||||||
expo-splash-screen@0.30.10:
|
expo-splash-screen@0.30.10:
|
||||||
resolution: {integrity: sha512-Tt9va/sLENQDQYeOQ6cdLdGvTZ644KR3YG9aRlnpcs2/beYjOX1LHT510EGzVN9ljUTg+1ebEo5GGt2arYtPjw==}
|
resolution: {integrity: sha512-Tt9va/sLENQDQYeOQ6cdLdGvTZ644KR3YG9aRlnpcs2/beYjOX1LHT510EGzVN9ljUTg+1ebEo5GGt2arYtPjw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2155,6 +2193,15 @@ packages:
|
|||||||
flow-enums-runtime@0.0.6:
|
flow-enums-runtime@0.0.6:
|
||||||
resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==}
|
resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==}
|
||||||
|
|
||||||
|
follow-redirects@1.15.9:
|
||||||
|
resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
|
||||||
|
engines: {node: '>=4.0'}
|
||||||
|
peerDependencies:
|
||||||
|
debug: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
debug:
|
||||||
|
optional: true
|
||||||
|
|
||||||
fontfaceobserver@2.3.0:
|
fontfaceobserver@2.3.0:
|
||||||
resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==}
|
resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==}
|
||||||
|
|
||||||
@@ -2166,6 +2213,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
|
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
|
form-data@4.0.4:
|
||||||
|
resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
|
||||||
|
engines: {node: '>= 6'}
|
||||||
|
|
||||||
freeport-async@2.0.0:
|
freeport-async@2.0.0:
|
||||||
resolution: {integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==}
|
resolution: {integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -3141,6 +3192,9 @@ packages:
|
|||||||
prop-types@15.8.1:
|
prop-types@15.8.1:
|
||||||
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
|
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
|
||||||
|
|
||||||
|
proxy-from-env@1.1.0:
|
||||||
|
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
|
||||||
|
|
||||||
punycode@2.3.1:
|
punycode@2.3.1:
|
||||||
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -5264,6 +5318,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.28.2
|
'@babel/types': 7.28.2
|
||||||
|
|
||||||
|
'@types/date-fns@2.6.3':
|
||||||
|
dependencies:
|
||||||
|
date-fns: 4.1.0
|
||||||
|
|
||||||
'@types/estree@1.0.8': {}
|
'@types/estree@1.0.8': {}
|
||||||
|
|
||||||
'@types/graceful-fs@4.1.9':
|
'@types/graceful-fs@4.1.9':
|
||||||
@@ -5628,10 +5686,20 @@ snapshots:
|
|||||||
|
|
||||||
async-limiter@1.0.1: {}
|
async-limiter@1.0.1: {}
|
||||||
|
|
||||||
|
asynckit@0.4.0: {}
|
||||||
|
|
||||||
available-typed-arrays@1.0.7:
|
available-typed-arrays@1.0.7:
|
||||||
dependencies:
|
dependencies:
|
||||||
possible-typed-array-names: 1.1.0
|
possible-typed-array-names: 1.1.0
|
||||||
|
|
||||||
|
axios@1.11.0:
|
||||||
|
dependencies:
|
||||||
|
follow-redirects: 1.15.9
|
||||||
|
form-data: 4.0.4
|
||||||
|
proxy-from-env: 1.1.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- debug
|
||||||
|
|
||||||
babel-jest@29.7.0(@babel/core@7.28.0):
|
babel-jest@29.7.0(@babel/core@7.28.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.0
|
'@babel/core': 7.28.0
|
||||||
@@ -5917,6 +5985,10 @@ snapshots:
|
|||||||
color-convert: 2.0.1
|
color-convert: 2.0.1
|
||||||
color-string: 1.9.1
|
color-string: 1.9.1
|
||||||
|
|
||||||
|
combined-stream@1.0.8:
|
||||||
|
dependencies:
|
||||||
|
delayed-stream: 1.0.0
|
||||||
|
|
||||||
commander@12.1.0: {}
|
commander@12.1.0: {}
|
||||||
|
|
||||||
commander@2.20.3: {}
|
commander@2.20.3: {}
|
||||||
@@ -6003,6 +6075,8 @@ snapshots:
|
|||||||
es-errors: 1.3.0
|
es-errors: 1.3.0
|
||||||
is-data-view: 1.0.2
|
is-data-view: 1.0.2
|
||||||
|
|
||||||
|
date-fns@4.1.0: {}
|
||||||
|
|
||||||
debug@2.6.9:
|
debug@2.6.9:
|
||||||
dependencies:
|
dependencies:
|
||||||
ms: 2.0.0
|
ms: 2.0.0
|
||||||
@@ -6041,6 +6115,8 @@ snapshots:
|
|||||||
has-property-descriptors: 1.0.2
|
has-property-descriptors: 1.0.2
|
||||||
object-keys: 1.1.1
|
object-keys: 1.1.1
|
||||||
|
|
||||||
|
delayed-stream@1.0.0: {}
|
||||||
|
|
||||||
depd@2.0.0: {}
|
depd@2.0.0: {}
|
||||||
|
|
||||||
destroy@1.2.0: {}
|
destroy@1.2.0: {}
|
||||||
@@ -6514,6 +6590,10 @@ snapshots:
|
|||||||
- react-native
|
- react-native
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
expo-secure-store@14.2.3(expo@53.0.20(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0)))(react-native-webview@13.13.5(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)):
|
||||||
|
dependencies:
|
||||||
|
expo: 53.0.20(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0)))(react-native-webview@13.13.5(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
|
||||||
|
|
||||||
expo-splash-screen@0.30.10(expo@53.0.20(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0)))(react-native-webview@13.13.5(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)):
|
expo-splash-screen@0.30.10(expo@53.0.20(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0)))(react-native-webview@13.13.5(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.5(@babel/core@7.28.0)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@expo/prebuild-config': 9.0.11
|
'@expo/prebuild-config': 9.0.11
|
||||||
@@ -6667,6 +6747,8 @@ snapshots:
|
|||||||
|
|
||||||
flow-enums-runtime@0.0.6: {}
|
flow-enums-runtime@0.0.6: {}
|
||||||
|
|
||||||
|
follow-redirects@1.15.9: {}
|
||||||
|
|
||||||
fontfaceobserver@2.3.0: {}
|
fontfaceobserver@2.3.0: {}
|
||||||
|
|
||||||
for-each@0.3.5:
|
for-each@0.3.5:
|
||||||
@@ -6678,6 +6760,14 @@ snapshots:
|
|||||||
cross-spawn: 7.0.6
|
cross-spawn: 7.0.6
|
||||||
signal-exit: 4.1.0
|
signal-exit: 4.1.0
|
||||||
|
|
||||||
|
form-data@4.0.4:
|
||||||
|
dependencies:
|
||||||
|
asynckit: 0.4.0
|
||||||
|
combined-stream: 1.0.8
|
||||||
|
es-set-tostringtag: 2.1.0
|
||||||
|
hasown: 2.0.2
|
||||||
|
mime-types: 2.1.35
|
||||||
|
|
||||||
freeport-async@2.0.0: {}
|
freeport-async@2.0.0: {}
|
||||||
|
|
||||||
fresh@0.5.2: {}
|
fresh@0.5.2: {}
|
||||||
@@ -7744,6 +7834,8 @@ snapshots:
|
|||||||
object-assign: 4.1.1
|
object-assign: 4.1.1
|
||||||
react-is: 16.13.1
|
react-is: 16.13.1
|
||||||
|
|
||||||
|
proxy-from-env@1.1.0: {}
|
||||||
|
|
||||||
punycode@2.3.1: {}
|
punycode@2.3.1: {}
|
||||||
|
|
||||||
qrcode-terminal@0.11.0: {}
|
qrcode-terminal@0.11.0: {}
|
||||||
|
|||||||
Reference in New Issue
Block a user