No more periodic api calls. all websockets

This commit is contained in:
Gabriel Brown 2024-10-30 15:03:53 -05:00
parent cfb6f01d00
commit 28543c285c
6 changed files with 106 additions and 112 deletions

View File

@ -13,10 +13,8 @@ const IndexScreen = () => {
return ( return (
<ThemedView style={styles.container}> <ThemedView style={styles.container}>
<UserInfo onPfpUpdate={handlePfpUpdate} /> <UserInfo onPfpUpdate={handlePfpUpdate} />
<CountdownView />
<RelationshipView pfpUrl={pfpUrl} /> <RelationshipView pfpUrl={pfpUrl} />
<ThemedView style={styles.footerContainer}> <CountdownView />
</ThemedView>
</ThemedView> </ThemedView>
); );
}; };
@ -25,10 +23,5 @@ export default IndexScreen;
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { container: {
flex: 1, flex: 1,
alignItems: 'center',
},
footerContainer: {
flex: 1 / 3,
alignItems: 'center',
}, },
}); });

View File

@ -107,12 +107,12 @@ const MessagesScreen = () => {
}); });
socket.on('connect', () => { socket.on('connect', () => {
console.log('Connected to WebSocket server'); console.log('Connected to WebSocket server');
socket.emit('join', user.id); socket.emit('join', { userId: user.id });
}); });
socket.on('connect_error', (error) => { socket.on('connect_error', (error) => {
console.error('Error connecting to WebSocket server:', error); console.error('Error connecting to WebSocket server:', error);
}); });
socket.on('message', async (newMessage) => { socket.on('new_message', async (newMessage) => {
const initialMessages = await getMessages(user.id, 20, 0); const initialMessages = await getMessages(user.id, 20, 0);
if (!initialMessages) return; if (!initialMessages) return;
const formattedMessages = formatMessages(initialMessages); const formattedMessages = formatMessages(initialMessages);

View File

@ -24,7 +24,6 @@ const CountdownView = () => {
const [isDateModalOpen, setIsDateModalOpen] = useState(false); const [isDateModalOpen, setIsDateModalOpen] = useState(false);
const [user, setUser] = useState<User | null>(null); const [user, setUser] = useState<User | null>(null);
const [relationship, setRelationship] = useState<Relationship | null>(null); const [relationship, setRelationship] = useState<Relationship | null>(null);
const [title, setTitle] = useState('');
useEffect(() => { useEffect(() => {
const loadData = async () => { const loadData = async () => {
@ -135,9 +134,9 @@ const CountdownView = () => {
/> />
</ThemedView> </ThemedView>
<TextButton <TextButton
width={320} height={68} width={160} height={48}
text='Change Countdown' text='Change Countdown'
fontSize={24} fontSize={18}
onPress={() => setIsDateModalOpen(true)} onPress={() => setIsDateModalOpen(true)}
/> />
{user && countdown && ( {user && countdown && (
@ -171,13 +170,12 @@ const styles = StyleSheet.create({
}, },
innerContainer: { innerContainer: {
flex: 1, flex: 1,
justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
paddingHorizontal: 10, paddingHorizontal: 10,
backgroundColor: 'transparent', backgroundColor: 'transparent',
}, },
title: { title: {
fontSize: 32, fontSize: 24,
lineHeight: 32, lineHeight: 32,
fontWeight: '600', fontWeight: '600',
textAlign: 'center', textAlign: 'center',
@ -187,17 +185,17 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
justifyContent: 'space-around', justifyContent: 'space-around',
alignItems: 'center', alignItems: 'center',
width: '100%', width: '90%',
backgroundColor: 'transparent', backgroundColor: 'transparent',
marginVertical: 20, marginVertical: 10,
}, },
countdownItem: { countdownItem: {
alignItems: 'center', alignItems: 'center',
marginHorizontal: 10, marginHorizontal: 5,
backgroundColor: 'transparent', backgroundColor: 'transparent',
}, },
countdownValue: { countdownValue: {
fontSize: 32, fontSize: 28,
lineHeight: 42, lineHeight: 42,
fontWeight: 'bold', fontWeight: 'bold',
}, },

View File

@ -1,4 +1,5 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { io } from 'socket.io-client';
import { Image, StyleSheet, AppState } from 'react-native'; import { Image, StyleSheet, AppState } from 'react-native';
import { ThemedText, ThemedView } from '@/components/theme/Theme'; import { ThemedText, ThemedView } from '@/components/theme/Theme';
import { getUser, getRelationship, getPartner, saveRelationshipData } from '@/components/services/SecureStore'; import { getUser, getRelationship, getPartner, saveRelationshipData } from '@/components/services/SecureStore';
@ -7,8 +8,6 @@ import TextButton from '@/components/theme/buttons/TextButton';
import { checkRelationshipStatus, updateRelationshipStatus } from '@/constants/APIs'; import { checkRelationshipStatus, updateRelationshipStatus } from '@/constants/APIs';
import type { User, Relationship, RelationshipData } from '@/constants/Types'; import type { User, Relationship, RelationshipData } from '@/constants/Types';
const CHECK_TIME = 2; // In minutes
type RelationshipProps = { type RelationshipProps = {
pfpUrl: string | null; pfpUrl: string | null;
}; };
@ -16,12 +15,12 @@ type RelationshipProps = {
const RelationshipView: React.FC<RelationshipProps> = ({ pfpUrl }) => { const RelationshipView: React.FC<RelationshipProps> = ({ pfpUrl }) => {
const [status, setStatus] = useState<RelationshipData | null>(null); const [status, setStatus] = useState<RelationshipData | null>(null);
const [user, setUser] = useState<User | null>(null); const [user, setUser] = useState<User | null>(null);
const [relationship, setRelationship] = useState<Relationship | null>(null);
const [showRequestRelationship, setShowRequestRelationship] = useState(false); const [showRequestRelationship, setShowRequestRelationship] = useState(false);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
useEffect(() => { useEffect(() => {
fetchRelationshipStatus(); fetchRelationshipStatus();
setUpPeriodicCheck();
}, []); }, []);
useEffect(() => { useEffect(() => {
@ -31,35 +30,35 @@ const RelationshipView: React.FC<RelationshipProps> = ({ pfpUrl }) => {
} }
}, [pfpUrl]); }, [pfpUrl]);
useEffect(() => {
if (!user || !relationship) {
console.log('User or relationship not found');
return;
}
const socket = io(process.env.EXPO_PUBLIC_WEBSOCKET_URL as string, {
transports: ['websocket'],
});
socket.on('connect', () => {
console.log('Connected to WebSocket server');
socket.emit('join', { relationshipId: relationship.id });
});
socket.on('connect_error', (error) => {
console.error('Error connecting to WebSocket server:', error);
});
socket.on('relationship_status_change', async (relationshipStatus) => {
handleCheckRelationshipStatus();
});
return () => {
socket.disconnect();
};
}, [relationship]);
const handleRequestSent = (relationshipData: RelationshipData) => { const handleRequestSent = (relationshipData: RelationshipData) => {
setStatus(relationshipData); setStatus(relationshipData);
setShowRequestRelationship(false); setShowRequestRelationship(false);
}; };
const setUpPeriodicCheck = () => {
let intervalId: NodeJS.Timeout | null = null;
const startChecking = () => {
handleCheckRelationshipStatus();
intervalId = setInterval(handleCheckRelationshipStatus, 60000*CHECK_TIME);
};
const stopChecking = () => {
if (intervalId) {
clearInterval(intervalId);
intervalId = null;
}
};
const handleAppStateChange = (nextAppState: string) => {
if (nextAppState === 'active') startChecking();
else stopChecking();
};
const subscription = AppState.addEventListener('change', handleAppStateChange);
if (AppState.currentState === 'active') startChecking();
return () => {
stopChecking();
subscription.remove();
};
};
const fetchRelationshipStatus = async () => { const fetchRelationshipStatus = async () => {
setLoading(true); setLoading(true);
try { try {
@ -67,6 +66,7 @@ const RelationshipView: React.FC<RelationshipProps> = ({ pfpUrl }) => {
if (!userFromStore) throw new Error('User not found in store.'); if (!userFromStore) throw new Error('User not found in store.');
setUser(userFromStore); setUser(userFromStore);
const relationshipFromStore: Relationship = await getRelationship() as Relationship; const relationshipFromStore: Relationship = await getRelationship() as Relationship;
setRelationship(relationshipFromStore);
const partnerFromStore: User = await getPartner() as User; const partnerFromStore: User = await getPartner() as User;
if (!relationshipFromStore || !partnerFromStore) if (!relationshipFromStore || !partnerFromStore)
throw new Error('Relationship not found in store.'); throw new Error('Relationship not found in store.');
@ -105,7 +105,7 @@ const RelationshipView: React.FC<RelationshipProps> = ({ pfpUrl }) => {
try { try {
if (newStatus === 'accepted') { if (newStatus === 'accepted') {
const updatedRelationshipData: RelationshipData = const updatedRelationshipData: RelationshipData =
await updateRelationshipStatus(user.id, newStatus); await updateRelationshipStatus(user.id, newStatus) as RelationshipData;
setStatus(updatedRelationshipData); setStatus(updatedRelationshipData);
await saveRelationshipData(updatedRelationshipData); await saveRelationshipData(updatedRelationshipData);
} else { } else {
@ -243,6 +243,12 @@ const RelationshipView: React.FC<RelationshipProps> = ({ pfpUrl }) => {
</ThemedView> </ThemedView>
)} )}
</ThemedView> </ThemedView>
<TextButton
width={140} height={36}
text='Leave Relationship'
fontSize={16}
onPress={() => handleRejectRequest()}
/>
</> </>
); );
} }
@ -260,7 +266,6 @@ const styles = StyleSheet.create({
container: { container: {
flex: 1, flex: 1,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center',
}, },
title: { title: {
fontSize: 24, fontSize: 24,
@ -271,7 +276,6 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
marginTop: 20,
}, },
profileWrapper: { profileWrapper: {
alignItems: 'center', alignItems: 'center',
@ -292,6 +296,7 @@ const styles = StyleSheet.create({
marginBottom: 10, marginBottom: 10,
}, },
buttonContainer: { buttonContainer: {
alignItems: 'center',
justifyContent: 'space-around', justifyContent: 'space-around',
width: '100%', width: '100%',
marginTop: 20, marginTop: 20,

View File

@ -97,7 +97,6 @@ const styles = StyleSheet.create({
profileContainer: { profileContainer: {
alignItems: 'center', alignItems: 'center',
marginTop: 20, marginTop: 20,
marginBottom: 20,
}, },
profilePicture: { profilePicture: {
width: 100, width: 100,
@ -112,6 +111,5 @@ const styles = StyleSheet.create({
}, },
email: { email: {
fontSize: 16, fontSize: 16,
marginBottom: 20,
}, },
}); });

122
pnpm-lock.yaml generated
View File

@ -134,10 +134,10 @@ importers:
version: 18.3.0 version: 18.3.0
jest: jest:
specifier: ^29.7.0 specifier: ^29.7.0
version: 29.7.0(@types/node@22.8.2) version: 29.7.0(@types/node@22.8.4)
jest-expo: jest-expo:
specifier: ~51.0.4 specifier: ~51.0.4
version: 51.0.4(@babel/core@7.26.0)(jest@29.7.0(@types/node@22.8.2))(react@18.2.0) version: 51.0.4(@babel/core@7.26.0)(jest@29.7.0(@types/node@22.8.4))(react@18.2.0)
react-test-renderer: react-test-renderer:
specifier: 18.2.0 specifier: 18.2.0
version: 18.2.0(react@18.2.0) version: 18.2.0(react@18.2.0)
@ -1482,17 +1482,17 @@ packages:
'@types/lodash.isequal@4.5.8': '@types/lodash.isequal@4.5.8':
resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==} resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==}
'@types/lodash@4.17.12': '@types/lodash@4.17.13':
resolution: {integrity: sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==} resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
'@types/node-forge@1.3.11': '@types/node-forge@1.3.11':
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
'@types/node@18.19.60': '@types/node@18.19.61':
resolution: {integrity: sha512-cYRj7igVqgxhlHFdBHHpU2SNw3+dN2x0VTZJtLYk6y/ieuGN4XiBgtDjYVktM/yk2y/8pKMileNc6IoEzEJnUw==} resolution: {integrity: sha512-z8fH66NcVkDzBItOao+Nyh0fiy7CYdxIyxnNCcZ60aY0I+EA/y4TSi/S/W9i8DIQvwVo7a0pgzAxmDeNnqrpkw==}
'@types/node@22.8.2': '@types/node@22.8.4':
resolution: {integrity: sha512-NzaRNFV+FZkvK/KLCsNdTvID0SThyrs5SHB6tsD/lajr22FGC73N2QeDPM2wHtVde8mgcXuSsHQkH5cX1pbPLw==} resolution: {integrity: sha512-SpNNxkftTJOPk0oN+y2bIqurEXHTA2AOZ3EJDDKeJ5VzkvvORSvmQXGQarcOzWV1ac7DCaPBEdMDxBsM+d8jWw==}
'@types/prop-types@15.7.13': '@types/prop-types@15.7.13':
resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
@ -1861,8 +1861,8 @@ packages:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'} engines: {node: '>=10'}
caniuse-lite@1.0.30001674: caniuse-lite@1.0.30001675:
resolution: {integrity: sha512-jOsKlZVRnzfhLojb+Ykb+gyUSp9Xb57So+fAiFlLzzTKpqg8xxSav0e40c8/4F/v9N8QSvrRRaLeVzQbLqomYw==} resolution: {integrity: sha512-/wV1bQwPrkLiQMjaJF5yUMVM/VdRPOCU8QZ+PmG6uW6DvYSrNY1bpwHI/3mOcUosLaJCzYDi5o91IQB51ft6cg==}
chalk@2.4.2: chalk@2.4.2:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
@ -2017,8 +2017,8 @@ packages:
convert-source-map@2.0.0: convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
cookie-signature@1.2.1: cookie-signature@1.2.2:
resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
engines: {node: '>=6.6.0'} engines: {node: '>=6.6.0'}
cookie@0.6.0: cookie@0.6.0:
@ -2590,8 +2590,8 @@ 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==}
flow-parser@0.250.0: flow-parser@0.251.0:
resolution: {integrity: sha512-8mkLh/CotlvqA9vCyQMbhJoPx2upEg9oKxARAayz8zQ58wCdABnTZy6U4xhMHvHvbTUFgZQk4uH2cglOCOel5A==} resolution: {integrity: sha512-iEGv3JbQ9jRXdhkijpluoltiLzmG9upZH58sCx3Qr4s437PvRp/8ntNNMoUaXehXizzoHB8mAwzA6jkRv8cQng==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
fontfaceobserver@2.3.0: fontfaceobserver@2.3.0:
@ -6451,7 +6451,7 @@ snapshots:
'@jest/console@29.7.0': '@jest/console@29.7.0':
dependencies: dependencies:
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
chalk: 4.1.2 chalk: 4.1.2
jest-message-util: 29.7.0 jest-message-util: 29.7.0
jest-util: 29.7.0 jest-util: 29.7.0
@ -6464,14 +6464,14 @@ snapshots:
'@jest/test-result': 29.7.0 '@jest/test-result': 29.7.0
'@jest/transform': 29.7.0 '@jest/transform': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
ansi-escapes: 4.3.2 ansi-escapes: 4.3.2
chalk: 4.1.2 chalk: 4.1.2
ci-info: 3.9.0 ci-info: 3.9.0
exit: 0.1.2 exit: 0.1.2
graceful-fs: 4.2.11 graceful-fs: 4.2.11
jest-changed-files: 29.7.0 jest-changed-files: 29.7.0
jest-config: 29.7.0(@types/node@22.8.2) jest-config: 29.7.0(@types/node@22.8.4)
jest-haste-map: 29.7.0 jest-haste-map: 29.7.0
jest-message-util: 29.7.0 jest-message-util: 29.7.0
jest-regex-util: 29.6.3 jest-regex-util: 29.6.3
@ -6500,7 +6500,7 @@ snapshots:
dependencies: dependencies:
'@jest/fake-timers': 29.7.0 '@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
jest-mock: 29.7.0 jest-mock: 29.7.0
'@jest/expect-utils@29.7.0': '@jest/expect-utils@29.7.0':
@ -6518,7 +6518,7 @@ snapshots:
dependencies: dependencies:
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0 '@sinonjs/fake-timers': 10.3.0
'@types/node': 22.8.2 '@types/node': 22.8.4
jest-message-util: 29.7.0 jest-message-util: 29.7.0
jest-mock: 29.7.0 jest-mock: 29.7.0
jest-util: 29.7.0 jest-util: 29.7.0
@ -6540,7 +6540,7 @@ snapshots:
'@jest/transform': 29.7.0 '@jest/transform': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
'@types/node': 22.8.2 '@types/node': 22.8.4
chalk: 4.1.2 chalk: 4.1.2
collect-v8-coverage: 1.0.2 collect-v8-coverage: 1.0.2
exit: 0.1.2 exit: 0.1.2
@ -6615,7 +6615,7 @@ snapshots:
dependencies: dependencies:
'@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4 '@types/istanbul-reports': 3.0.4
'@types/node': 22.8.2 '@types/node': 22.8.4
'@types/yargs': 15.0.19 '@types/yargs': 15.0.19
chalk: 4.1.2 chalk: 4.1.2
@ -6624,7 +6624,7 @@ snapshots:
'@jest/schemas': 29.6.3 '@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4 '@types/istanbul-reports': 3.0.4
'@types/node': 22.8.2 '@types/node': 22.8.4
'@types/yargs': 17.0.33 '@types/yargs': 17.0.33
chalk: 4.1.2 chalk: 4.1.2
@ -7074,7 +7074,7 @@ snapshots:
'@remix-run/server-runtime': 2.13.1(typescript@5.3.3) '@remix-run/server-runtime': 2.13.1(typescript@5.3.3)
'@remix-run/web-fetch': 4.4.2 '@remix-run/web-fetch': 4.4.2
'@web3-storage/multipart-parser': 1.0.0 '@web3-storage/multipart-parser': 1.0.0
cookie-signature: 1.2.1 cookie-signature: 1.2.2
source-map-support: 0.5.21 source-map-support: 0.5.21
stream-slice: 0.1.2 stream-slice: 0.1.2
undici: 6.20.1 undici: 6.20.1
@ -7125,7 +7125,7 @@ snapshots:
'@rnx-kit/chromium-edge-launcher@1.0.0': '@rnx-kit/chromium-edge-launcher@1.0.0':
dependencies: dependencies:
'@types/node': 18.19.60 '@types/node': 18.19.61
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
is-wsl: 2.2.0 is-wsl: 2.2.0
lighthouse-logger: 1.4.2 lighthouse-logger: 1.4.2
@ -7199,7 +7199,7 @@ snapshots:
'@types/graceful-fs@4.1.9': '@types/graceful-fs@4.1.9':
dependencies: dependencies:
'@types/node': 22.8.2 '@types/node': 22.8.4
'@types/hammerjs@2.0.46': {} '@types/hammerjs@2.0.46': {}
@ -7230,7 +7230,7 @@ snapshots:
'@types/jsdom@20.0.1': '@types/jsdom@20.0.1':
dependencies: dependencies:
'@types/node': 22.8.2 '@types/node': 22.8.4
'@types/tough-cookie': 4.0.5 '@types/tough-cookie': 4.0.5
parse5: 7.2.1 parse5: 7.2.1
@ -7238,23 +7238,23 @@ snapshots:
'@types/lodash.debounce@4.0.9': '@types/lodash.debounce@4.0.9':
dependencies: dependencies:
'@types/lodash': 4.17.12 '@types/lodash': 4.17.13
'@types/lodash.isequal@4.5.8': '@types/lodash.isequal@4.5.8':
dependencies: dependencies:
'@types/lodash': 4.17.12 '@types/lodash': 4.17.13
'@types/lodash@4.17.12': {} '@types/lodash@4.17.13': {}
'@types/node-forge@1.3.11': '@types/node-forge@1.3.11':
dependencies: dependencies:
'@types/node': 22.8.2 '@types/node': 22.8.4
'@types/node@18.19.60': '@types/node@18.19.61':
dependencies: dependencies:
undici-types: 5.26.5 undici-types: 5.26.5
'@types/node@22.8.2': '@types/node@22.8.4':
dependencies: dependencies:
undici-types: 6.19.8 undici-types: 6.19.8
@ -7619,7 +7619,7 @@ snapshots:
browserslist@4.24.2: browserslist@4.24.2:
dependencies: dependencies:
caniuse-lite: 1.0.30001674 caniuse-lite: 1.0.30001675
electron-to-chromium: 1.5.49 electron-to-chromium: 1.5.49
node-releases: 2.0.18 node-releases: 2.0.18
update-browserslist-db: 1.1.1(browserslist@4.24.2) update-browserslist-db: 1.1.1(browserslist@4.24.2)
@ -7687,7 +7687,7 @@ snapshots:
camelcase@6.3.0: {} camelcase@6.3.0: {}
caniuse-lite@1.0.30001674: {} caniuse-lite@1.0.30001675: {}
chalk@2.4.2: chalk@2.4.2:
dependencies: dependencies:
@ -7715,7 +7715,7 @@ snapshots:
chrome-launcher@0.15.2: chrome-launcher@0.15.2:
dependencies: dependencies:
'@types/node': 22.8.2 '@types/node': 22.8.4
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
is-wsl: 2.2.0 is-wsl: 2.2.0
lighthouse-logger: 1.4.2 lighthouse-logger: 1.4.2
@ -7837,7 +7837,7 @@ snapshots:
convert-source-map@2.0.0: {} convert-source-map@2.0.0: {}
cookie-signature@1.2.1: {} cookie-signature@1.2.2: {}
cookie@0.6.0: {} cookie@0.6.0: {}
@ -7854,13 +7854,13 @@ snapshots:
js-yaml: 3.14.1 js-yaml: 3.14.1
parse-json: 4.0.0 parse-json: 4.0.0
create-jest@29.7.0(@types/node@22.8.2): create-jest@29.7.0(@types/node@22.8.4):
dependencies: dependencies:
'@jest/types': 29.6.3 '@jest/types': 29.6.3
chalk: 4.1.2 chalk: 4.1.2
exit: 0.1.2 exit: 0.1.2
graceful-fs: 4.2.11 graceful-fs: 4.2.11
jest-config: 29.7.0(@types/node@22.8.2) jest-config: 29.7.0(@types/node@22.8.4)
jest-util: 29.7.0 jest-util: 29.7.0
prompts: 2.4.2 prompts: 2.4.2
transitivePeerDependencies: transitivePeerDependencies:
@ -8505,7 +8505,7 @@ snapshots:
flow-enums-runtime@0.0.6: {} flow-enums-runtime@0.0.6: {}
flow-parser@0.250.0: {} flow-parser@0.251.0: {}
fontfaceobserver@2.3.0: {} fontfaceobserver@2.3.0: {}
@ -9008,7 +9008,7 @@ snapshots:
'@jest/expect': 29.7.0 '@jest/expect': 29.7.0
'@jest/test-result': 29.7.0 '@jest/test-result': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
chalk: 4.1.2 chalk: 4.1.2
co: 4.6.0 co: 4.6.0
dedent: 1.5.3 dedent: 1.5.3
@ -9028,16 +9028,16 @@ snapshots:
- babel-plugin-macros - babel-plugin-macros
- supports-color - supports-color
jest-cli@29.7.0(@types/node@22.8.2): jest-cli@29.7.0(@types/node@22.8.4):
dependencies: dependencies:
'@jest/core': 29.7.0 '@jest/core': 29.7.0
'@jest/test-result': 29.7.0 '@jest/test-result': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
chalk: 4.1.2 chalk: 4.1.2
create-jest: 29.7.0(@types/node@22.8.2) create-jest: 29.7.0(@types/node@22.8.4)
exit: 0.1.2 exit: 0.1.2
import-local: 3.2.0 import-local: 3.2.0
jest-config: 29.7.0(@types/node@22.8.2) jest-config: 29.7.0(@types/node@22.8.4)
jest-util: 29.7.0 jest-util: 29.7.0
jest-validate: 29.7.0 jest-validate: 29.7.0
yargs: 17.7.2 yargs: 17.7.2
@ -9047,7 +9047,7 @@ snapshots:
- supports-color - supports-color
- ts-node - ts-node
jest-config@29.7.0(@types/node@22.8.2): jest-config@29.7.0(@types/node@22.8.4):
dependencies: dependencies:
'@babel/core': 7.26.0 '@babel/core': 7.26.0
'@jest/test-sequencer': 29.7.0 '@jest/test-sequencer': 29.7.0
@ -9072,7 +9072,7 @@ snapshots:
slash: 3.0.0 slash: 3.0.0
strip-json-comments: 3.1.1 strip-json-comments: 3.1.1
optionalDependencies: optionalDependencies:
'@types/node': 22.8.2 '@types/node': 22.8.4
transitivePeerDependencies: transitivePeerDependencies:
- babel-plugin-macros - babel-plugin-macros
- supports-color - supports-color
@ -9102,7 +9102,7 @@ snapshots:
'@jest/fake-timers': 29.7.0 '@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/jsdom': 20.0.1 '@types/jsdom': 20.0.1
'@types/node': 22.8.2 '@types/node': 22.8.4
jest-mock: 29.7.0 jest-mock: 29.7.0
jest-util: 29.7.0 jest-util: 29.7.0
jsdom: 20.0.3 jsdom: 20.0.3
@ -9116,11 +9116,11 @@ snapshots:
'@jest/environment': 29.7.0 '@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0 '@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
jest-mock: 29.7.0 jest-mock: 29.7.0
jest-util: 29.7.0 jest-util: 29.7.0
jest-expo@51.0.4(@babel/core@7.26.0)(jest@29.7.0(@types/node@22.8.2))(react@18.2.0): jest-expo@51.0.4(@babel/core@7.26.0)(jest@29.7.0(@types/node@22.8.4))(react@18.2.0):
dependencies: dependencies:
'@expo/config': 9.0.4 '@expo/config': 9.0.4
'@expo/json-file': 8.3.3 '@expo/json-file': 8.3.3
@ -9129,7 +9129,7 @@ snapshots:
find-up: 5.0.0 find-up: 5.0.0
jest-environment-jsdom: 29.7.0 jest-environment-jsdom: 29.7.0
jest-watch-select-projects: 2.0.0 jest-watch-select-projects: 2.0.0
jest-watch-typeahead: 2.2.1(jest@29.7.0(@types/node@22.8.2)) jest-watch-typeahead: 2.2.1(jest@29.7.0(@types/node@22.8.4))
json5: 2.2.3 json5: 2.2.3
lodash: 4.17.21 lodash: 4.17.21
react-test-renderer: 18.2.0(react@18.2.0) react-test-renderer: 18.2.0(react@18.2.0)
@ -9149,7 +9149,7 @@ snapshots:
dependencies: dependencies:
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/graceful-fs': 4.1.9 '@types/graceful-fs': 4.1.9
'@types/node': 22.8.2 '@types/node': 22.8.4
anymatch: 3.1.3 anymatch: 3.1.3
fb-watchman: 2.0.2 fb-watchman: 2.0.2
graceful-fs: 4.2.11 graceful-fs: 4.2.11
@ -9188,7 +9188,7 @@ snapshots:
jest-mock@29.7.0: jest-mock@29.7.0:
dependencies: dependencies:
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
jest-util: 29.7.0 jest-util: 29.7.0
jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
@ -9223,7 +9223,7 @@ snapshots:
'@jest/test-result': 29.7.0 '@jest/test-result': 29.7.0
'@jest/transform': 29.7.0 '@jest/transform': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
chalk: 4.1.2 chalk: 4.1.2
emittery: 0.13.1 emittery: 0.13.1
graceful-fs: 4.2.11 graceful-fs: 4.2.11
@ -9251,7 +9251,7 @@ snapshots:
'@jest/test-result': 29.7.0 '@jest/test-result': 29.7.0
'@jest/transform': 29.7.0 '@jest/transform': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
chalk: 4.1.2 chalk: 4.1.2
cjs-module-lexer: 1.4.1 cjs-module-lexer: 1.4.1
collect-v8-coverage: 1.0.2 collect-v8-coverage: 1.0.2
@ -9297,7 +9297,7 @@ snapshots:
jest-util@29.7.0: jest-util@29.7.0:
dependencies: dependencies:
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
chalk: 4.1.2 chalk: 4.1.2
ci-info: 3.9.0 ci-info: 3.9.0
graceful-fs: 4.2.11 graceful-fs: 4.2.11
@ -9318,11 +9318,11 @@ snapshots:
chalk: 3.0.0 chalk: 3.0.0
prompts: 2.4.2 prompts: 2.4.2
jest-watch-typeahead@2.2.1(jest@29.7.0(@types/node@22.8.2)): jest-watch-typeahead@2.2.1(jest@29.7.0(@types/node@22.8.4)):
dependencies: dependencies:
ansi-escapes: 6.2.1 ansi-escapes: 6.2.1
chalk: 4.1.2 chalk: 4.1.2
jest: 29.7.0(@types/node@22.8.2) jest: 29.7.0(@types/node@22.8.4)
jest-regex-util: 29.6.3 jest-regex-util: 29.6.3
jest-watcher: 29.7.0 jest-watcher: 29.7.0
slash: 5.1.0 slash: 5.1.0
@ -9333,7 +9333,7 @@ snapshots:
dependencies: dependencies:
'@jest/test-result': 29.7.0 '@jest/test-result': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
'@types/node': 22.8.2 '@types/node': 22.8.4
ansi-escapes: 4.3.2 ansi-escapes: 4.3.2
chalk: 4.1.2 chalk: 4.1.2
emittery: 0.13.1 emittery: 0.13.1
@ -9342,17 +9342,17 @@ snapshots:
jest-worker@29.7.0: jest-worker@29.7.0:
dependencies: dependencies:
'@types/node': 22.8.2 '@types/node': 22.8.4
jest-util: 29.7.0 jest-util: 29.7.0
merge-stream: 2.0.0 merge-stream: 2.0.0
supports-color: 8.1.1 supports-color: 8.1.1
jest@29.7.0(@types/node@22.8.2): jest@29.7.0(@types/node@22.8.4):
dependencies: dependencies:
'@jest/core': 29.7.0 '@jest/core': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
import-local: 3.2.0 import-local: 3.2.0
jest-cli: 29.7.0(@types/node@22.8.2) jest-cli: 29.7.0(@types/node@22.8.4)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- babel-plugin-macros - babel-plugin-macros
@ -9400,7 +9400,7 @@ snapshots:
'@babel/register': 7.25.9(@babel/core@7.26.0) '@babel/register': 7.25.9(@babel/core@7.26.0)
babel-core: 7.0.0-bridge.0(@babel/core@7.26.0) babel-core: 7.0.0-bridge.0(@babel/core@7.26.0)
chalk: 4.1.2 chalk: 4.1.2
flow-parser: 0.250.0 flow-parser: 0.251.0
graceful-fs: 4.2.11 graceful-fs: 4.2.11
micromatch: 4.0.8 micromatch: 4.0.8
neo-async: 2.6.2 neo-async: 2.6.2