fix(mobile): complete block G metadata and accessibility

This commit is contained in:
saravanakumardb1 2026-03-31 00:23:57 -07:00
parent a9172e4230
commit e4683ad695
10 changed files with 50 additions and 28 deletions

View File

@ -28,6 +28,7 @@
"@bytelyst/survey-client": "^0.1.0", "@bytelyst/survey-client": "^0.1.0",
"@bytelyst/telemetry-client": "^0.1.0", "@bytelyst/telemetry-client": "^0.1.0",
"expo": "~55.0.4", "expo": "~55.0.4",
"expo-constants": "~18.0.13",
"expo-router": "~6.0.4", "expo-router": "~6.0.4",
"expo-status-bar": "~3.0.9", "expo-status-bar": "~3.0.9",
"react": "19.2.0", "react": "19.2.0",

View File

@ -3,11 +3,11 @@ import { Tabs } from 'expo-router';
export default function TabLayout() { export default function TabLayout() {
return ( return (
<Tabs screenOptions={{ headerShown: false }}> <Tabs screenOptions={{ headerShown: false }}>
<Tabs.Screen name="index" options={{ title: 'Home' }} /> <Tabs.Screen name="index" options={{ title: 'Home', tabBarAccessibilityLabel: 'Home tab' }} />
<Tabs.Screen name="search" options={{ title: 'Search' }} /> <Tabs.Screen name="search" options={{ title: 'Search', tabBarAccessibilityLabel: 'Search tab' }} />
<Tabs.Screen name="capture" options={{ title: 'Capture' }} /> <Tabs.Screen name="capture" options={{ title: 'Capture', tabBarAccessibilityLabel: 'Capture tab' }} />
<Tabs.Screen name="inbox" options={{ title: 'Inbox' }} /> <Tabs.Screen name="inbox" options={{ title: 'Inbox', tabBarAccessibilityLabel: 'Inbox tab' }} />
<Tabs.Screen name="settings" options={{ title: 'Settings' }} /> <Tabs.Screen name="settings" options={{ title: 'Settings', tabBarAccessibilityLabel: 'Settings tab' }} />
</Tabs> </Tabs>
); );
} }

View File

@ -64,6 +64,7 @@ export default function CaptureScreen() {
textAlignVertical="top" textAlignVertical="top"
/> />
<Pressable <Pressable
accessibilityLabel={activeWorkspaceId ? 'Save draft note' : 'Select workspace before saving'}
onPress={async () => { onPress={async () => {
const didSave = await saveDraft(activeWorkspaceId, title, body); const didSave = await saveDraft(activeWorkspaceId, title, body);
setSaved(didSave); setSaved(didSave);

View File

@ -40,6 +40,7 @@ export default function InboxScreen() {
<Text style={styles.status}>Status: {item.status}</Text> <Text style={styles.status}>Status: {item.status}</Text>
<View style={styles.actionRow}> <View style={styles.actionRow}>
<Pressable <Pressable
accessibilityLabel={`Approve ${item.title}`}
style={[ style={[
styles.approveButton, styles.approveButton,
pendingApprovalId === item.id || item.status !== 'pending' ? styles.buttonDisabled : null, pendingApprovalId === item.id || item.status !== 'pending' ? styles.buttonDisabled : null,
@ -61,6 +62,7 @@ export default function InboxScreen() {
</Text> </Text>
</Pressable> </Pressable>
<Pressable <Pressable
accessibilityLabel={`Reject ${item.title}`}
style={[ style={[
styles.rejectButton, styles.rejectButton,
pendingApprovalId === item.id || item.status !== 'pending' ? styles.buttonDisabled : null, pendingApprovalId === item.id || item.status !== 'pending' ? styles.buttonDisabled : null,

View File

@ -63,6 +63,7 @@ export default function AuthScreen() {
/> />
{errorMessage ? <Text style={styles.errorText}>{errorMessage}</Text> : null} {errorMessage ? <Text style={styles.errorText}>{errorMessage}</Text> : null}
<Pressable <Pressable
accessibilityLabel={mode === 'signin' ? 'Sign in' : 'Register account'}
onPress={async () => { onPress={async () => {
const didAuthenticate = const didAuthenticate =
mode === 'signin' mode === 'signin'
@ -87,6 +88,7 @@ export default function AuthScreen() {
</Text> </Text>
</Pressable> </Pressable>
<Pressable <Pressable
accessibilityLabel={mode === 'signin' ? 'Switch to register mode' : 'Switch to sign in mode'}
onPress={() => { onPress={() => {
setErrorMessage(null); setErrorMessage(null);
setMode((current) => (current === 'signin' ? 'register' : 'signin')); setMode((current) => (current === 'signin' ? 'register' : 'signin'));

View File

@ -0,0 +1,12 @@
import Constants from 'expo-constants';
import { Platform } from 'react-native';
export const APP_PLATFORM: 'ios' | 'android' = Platform.OS === 'android' ? 'android' : 'ios';
export const APP_VERSION = Constants.expoConfig?.version ?? '0.1.0';
export const BUILD_NUMBER =
Constants.expoConfig?.ios?.buildNumber ??
(Constants.expoConfig?.android?.versionCode ? String(Constants.expoConfig.android.versionCode) : '1');
export const OS_VERSION = typeof Platform.Version === 'string' ? Platform.Version : String(Platform.Version ?? 'unknown');

View File

@ -1,6 +1,7 @@
import { createBroadcastClient, type BroadcastClient } from '@bytelyst/broadcast-client'; import { createBroadcastClient, type BroadcastClient } from '@bytelyst/broadcast-client';
import { API_CONFIG, PRODUCT_ID } from '../api/config'; import { API_CONFIG, PRODUCT_ID } from '../api/config';
import { getAuthClient } from '../api/auth'; import { getAuthClient } from '../api/auth';
import { APP_PLATFORM, APP_VERSION, OS_VERSION } from './app-metadata';
let broadcastClient: BroadcastClient | null = null; let broadcastClient: BroadcastClient | null = null;
@ -10,9 +11,9 @@ export function getBroadcastClient(): BroadcastClient {
baseUrl: API_CONFIG.platformBaseUrl, baseUrl: API_CONFIG.platformBaseUrl,
productId: PRODUCT_ID, productId: PRODUCT_ID,
getAuthToken: () => getAuthClient().getAccessToken() ?? '', getAuthToken: () => getAuthClient().getAccessToken() ?? '',
platform: 'ios', platform: APP_PLATFORM,
appVersion: '0.1.0', appVersion: APP_VERSION,
osVersion: 'unknown', osVersion: OS_VERSION,
}); });
} }

View File

@ -5,6 +5,7 @@ import { createBlobClient } from '@bytelyst/blob-client';
import { DiagnosticsClient } from '@bytelyst/diagnostics-client'; import { DiagnosticsClient } from '@bytelyst/diagnostics-client';
import { API_CONFIG, PRODUCT_ID } from '../api/config'; import { API_CONFIG, PRODUCT_ID } from '../api/config';
import { mmkvStorage } from '../store/mmkv-storage'; import { mmkvStorage } from '../store/mmkv-storage';
import { APP_VERSION, BUILD_NUMBER, OS_VERSION } from './app-metadata';
function getAccessToken(): string | null { function getAccessToken(): string | null {
return mmkvStorage.getItem(`${PRODUCT_ID}_access_token`); return mmkvStorage.getItem(`${PRODUCT_ID}_access_token`);
@ -17,10 +18,10 @@ export const telemetryClient = createTelemetryClient({
platform: 'mobile', platform: 'mobile',
channel: 'notelett_mobile', channel: 'notelett_mobile',
transport: 'fetch', transport: 'fetch',
appVersion: '0.1.0', appVersion: APP_VERSION,
buildNumber: '1', buildNumber: BUILD_NUMBER,
releaseChannel: 'dev', releaseChannel: 'dev',
osFamily: 'other', osFamily: OS_VERSION,
}); });
export const featureFlagClient = createFeatureFlagClient({ export const featureFlagClient = createFeatureFlagClient({
@ -54,9 +55,9 @@ export function getDiagnosticsClient() {
platform: 'mobile', platform: 'mobile',
channel: 'notelett_mobile', channel: 'notelett_mobile',
anonymousInstallId: mmkvStorage.getItem(`${PRODUCT_ID}_install_id`) ?? 'unknown', anonymousInstallId: mmkvStorage.getItem(`${PRODUCT_ID}_install_id`) ?? 'unknown',
osFamily: 'other', osFamily: OS_VERSION,
appVersion: '0.1.0', appVersion: APP_VERSION,
buildNumber: '1', buildNumber: BUILD_NUMBER,
releaseChannel: 'dev', releaseChannel: 'dev',
getAuthToken: () => getAccessToken() ?? '', getAuthToken: () => getAccessToken() ?? '',
}); });

View File

@ -1,6 +1,7 @@
import { createSurveyClient, type SurveyClient } from '@bytelyst/survey-client'; import { createSurveyClient, type SurveyClient } from '@bytelyst/survey-client';
import { API_CONFIG, PRODUCT_ID } from '../api/config'; import { API_CONFIG, PRODUCT_ID } from '../api/config';
import { getAuthClient } from '../api/auth'; import { getAuthClient } from '../api/auth';
import { APP_PLATFORM, APP_VERSION, OS_VERSION } from './app-metadata';
let surveyClient: SurveyClient | null = null; let surveyClient: SurveyClient | null = null;
@ -10,9 +11,9 @@ export function getSurveyClient(): SurveyClient {
baseUrl: API_CONFIG.platformBaseUrl, baseUrl: API_CONFIG.platformBaseUrl,
productId: PRODUCT_ID, productId: PRODUCT_ID,
getAuthToken: () => getAuthClient().getAccessToken() ?? '', getAuthToken: () => getAuthClient().getAccessToken() ?? '',
platform: 'ios', platform: APP_PLATFORM,
appVersion: '0.1.0', appVersion: APP_VERSION,
osVersion: 'unknown', osVersion: OS_VERSION,
}); });
} }

23
pnpm-lock.yaml generated
View File

@ -126,9 +126,12 @@ importers:
expo: expo:
specifier: ~55.0.4 specifier: ~55.0.4
version: 55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) version: 55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
expo-constants:
specifier: ~18.0.13
version: 18.0.13(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))
expo-router: expo-router:
specifier: ~6.0.4 specifier: ~6.0.4
version: 6.0.23(fbac16d1b6e18492193348f9e089f0a0) version: 6.0.23(8f4d8b3ea945913a36065f8394178341)
expo-status-bar: expo-status-bar:
specifier: ~3.0.9 specifier: ~3.0.9
version: 3.0.9(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) version: 3.0.9(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)
@ -7335,7 +7338,7 @@ snapshots:
'@exodus/bytes@1.15.0': {} '@exodus/bytes@1.15.0': {}
'@expo/cli@55.0.18(@expo/dom-webview@55.0.3)(expo-constants@55.0.9)(expo-font@55.0.4(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo-router@6.0.23)(expo@55.0.8)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': '@expo/cli@55.0.18(@expo/dom-webview@55.0.3)(expo-constants@55.0.9(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo-router@6.0.23)(expo@55.0.8)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies: dependencies:
'@expo/code-signing-certificates': 0.0.6 '@expo/code-signing-certificates': 0.0.6
'@expo/config': 55.0.10(typescript@5.9.3) '@expo/config': 55.0.10(typescript@5.9.3)
@ -7352,7 +7355,7 @@ snapshots:
'@expo/plist': 0.5.2 '@expo/plist': 0.5.2
'@expo/prebuild-config': 55.0.10(expo@55.0.8)(typescript@5.9.3) '@expo/prebuild-config': 55.0.10(expo@55.0.8)(typescript@5.9.3)
'@expo/require-utils': 55.0.3(typescript@5.9.3) '@expo/require-utils': 55.0.3(typescript@5.9.3)
'@expo/router-server': 55.0.11(expo-constants@55.0.9)(expo-font@55.0.4(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo-router@6.0.23)(expo-server@55.0.6)(expo@55.0.8)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@expo/router-server': 55.0.11(expo-constants@55.0.9(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo-router@6.0.23)(expo-server@55.0.6)(expo@55.0.8)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@expo/schema-utils': 55.0.2 '@expo/schema-utils': 55.0.2
'@expo/spawn-async': 1.7.2 '@expo/spawn-async': 1.7.2
'@expo/ws-tunnel': 1.0.6 '@expo/ws-tunnel': 1.0.6
@ -7396,7 +7399,7 @@ snapshots:
ws: 8.20.0 ws: 8.20.0
zod: 3.25.76 zod: 3.25.76
optionalDependencies: optionalDependencies:
expo-router: 6.0.23(fbac16d1b6e18492193348f9e089f0a0) expo-router: 6.0.23(8f4d8b3ea945913a36065f8394178341)
react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0) react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0)
transitivePeerDependencies: transitivePeerDependencies:
- '@expo/dom-webview' - '@expo/dom-webview'
@ -7679,7 +7682,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@expo/router-server@55.0.11(expo-constants@55.0.9)(expo-font@55.0.4(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo-router@6.0.23)(expo-server@55.0.6)(expo@55.0.8)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': '@expo/router-server@55.0.11(expo-constants@55.0.9(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo-router@6.0.23)(expo-server@55.0.6)(expo@55.0.8)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies: dependencies:
debug: 4.4.3 debug: 4.4.3
expo: 55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) expo: 55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
@ -7688,7 +7691,7 @@ snapshots:
expo-server: 55.0.6 expo-server: 55.0.6
react: 19.2.0 react: 19.2.0
optionalDependencies: optionalDependencies:
expo-router: 6.0.23(fbac16d1b6e18492193348f9e089f0a0) expo-router: 6.0.23(8f4d8b3ea945913a36065f8394178341)
react-dom: 19.2.0(react@19.2.0) react-dom: 19.2.0(react@19.2.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -8409,9 +8412,7 @@ snapshots:
metro-runtime: 0.83.5 metro-runtime: 0.83.5
transitivePeerDependencies: transitivePeerDependencies:
- '@babel/core' - '@babel/core'
- bufferutil
- supports-color - supports-color
- utf-8-validate
'@react-native/normalize-colors@0.83.2': {} '@react-native/normalize-colors@0.83.2': {}
@ -10365,7 +10366,7 @@ snapshots:
react: 19.2.0 react: 19.2.0
react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0) react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0)
expo-router@6.0.23(fbac16d1b6e18492193348f9e089f0a0): expo-router@6.0.23(8f4d8b3ea945913a36065f8394178341):
dependencies: dependencies:
'@expo/schema-utils': 0.1.8 '@expo/schema-utils': 0.1.8
'@radix-ui/react-slot': 1.2.0(@types/react@19.2.14)(react@19.2.0) '@radix-ui/react-slot': 1.2.0(@types/react@19.2.14)(react@19.2.0)
@ -10377,7 +10378,7 @@ snapshots:
debug: 4.4.3 debug: 4.4.3
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
expo: 55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) expo: 55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
expo-constants: 55.0.9(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(typescript@5.9.3) expo-constants: 18.0.13(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))
expo-linking: 8.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) expo-linking: 8.0.11(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)
expo-server: 1.0.5 expo-server: 1.0.5
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
@ -10419,7 +10420,7 @@ snapshots:
expo@55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3): expo@55.0.8(@babel/core@7.29.0)(@expo/dom-webview@55.0.3)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3):
dependencies: dependencies:
'@babel/runtime': 7.29.2 '@babel/runtime': 7.29.2
'@expo/cli': 55.0.18(@expo/dom-webview@55.0.3)(expo-constants@55.0.9)(expo-font@55.0.4(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo-router@6.0.23)(expo@55.0.8)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) '@expo/cli': 55.0.18(@expo/dom-webview@55.0.3)(expo-constants@55.0.9(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.8)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo-router@6.0.23)(expo@55.0.8)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
'@expo/config': 55.0.10(typescript@5.9.3) '@expo/config': 55.0.10(typescript@5.9.3)
'@expo/config-plugins': 55.0.7 '@expo/config-plugins': 55.0.7
'@expo/devtools': 55.0.2(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) '@expo/devtools': 55.0.2(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)