From 2a8e1f1397245de57cf2892ef2d3c4f2f8308ea1 Mon Sep 17 00:00:00 2001 From: Tomasz Sapeta Date: Sat, 2 May 2026 22:50:15 +0200 Subject: [PATCH 1/2] [observe-tester] Rename app and add Sessions tab with crash report viewer (#45145) --- .../app/(tabs)/(metrics)/_layout.tsx | 9 - .../app/(tabs)/debug/_layout.tsx | 9 - .../components/Button.tsx | 85 ----- apps/observe-tester/.gitignore | 42 +++ .../app.config.ts | 2 - .../app.json | 4 +- .../app/(tabs)/(metrics)/_layout.tsx | 16 + .../app/(tabs)/(metrics)/index.tsx | 61 ++-- .../app/(tabs)/(sessions)/_layout.tsx | 17 + .../app/(tabs)/(sessions)/sessions/[id].tsx | 132 +++++++ .../app/(tabs)/(sessions)/sessions/index.tsx | 323 ++++++++++++++++++ .../app/(tabs)/_layout.tsx | 4 + .../app/(tabs)/debug/_layout.tsx | 16 + .../app/(tabs)/debug/index.tsx | 20 +- .../app/_layout.tsx | 3 +- .../app/redirect.tsx | 0 .../assets/images/android-icon-dark.png | Bin .../assets/images/android-icon-foreground.png | Bin .../assets/images/android-icon.png | Bin .../assets/images/favicon.png | Bin .../assets/images/icon.png | Bin .../assets/images/splash-icon-dark.png | Bin .../assets/images/splash-icon.png | Bin .../assets/observe.icon/Assets/pulse.svg | 0 .../assets/observe.icon/icon.json | 0 apps/observe-tester/components/Button.tsx | 82 +++++ .../components/CallStackTreeView.tsx | 189 ++++++++++ apps/observe-tester/components/Chevron.tsx | 51 +++ .../components/CrashReportPanel.tsx | 172 ++++++++++ .../components/CrashReportsSection.tsx | 60 ++++ apps/observe-tester/components/Divider.tsx | 15 + .../components/JSAnimation.tsx | 0 apps/observe-tester/components/JSONView.tsx | 91 +++++ .../components/MetricsPanel.tsx | 189 ++++++++++ .../components/SessionHeader.tsx | 177 ++++++++++ .../eas.json | 0 .../package.json | 4 +- .../router-metrics-integration/index.ts | 0 .../scripts/test-ios.sh | 0 .../tsconfig.json | 0 apps/observe-tester/utils/theme.ts | 6 + pnpm-lock.yaml | 8 +- 42 files changed, 1631 insertions(+), 156 deletions(-) delete mode 100644 apps/observability-tester/app/(tabs)/(metrics)/_layout.tsx delete mode 100644 apps/observability-tester/app/(tabs)/debug/_layout.tsx delete mode 100644 apps/observability-tester/components/Button.tsx create mode 100644 apps/observe-tester/.gitignore rename apps/{observability-tester => observe-tester}/app.config.ts (90%) rename apps/{observability-tester => observe-tester}/app.json (97%) create mode 100644 apps/observe-tester/app/(tabs)/(metrics)/_layout.tsx rename apps/{observability-tester => observe-tester}/app/(tabs)/(metrics)/index.tsx (69%) create mode 100644 apps/observe-tester/app/(tabs)/(sessions)/_layout.tsx create mode 100644 apps/observe-tester/app/(tabs)/(sessions)/sessions/[id].tsx create mode 100644 apps/observe-tester/app/(tabs)/(sessions)/sessions/index.tsx rename apps/{observability-tester => observe-tester}/app/(tabs)/_layout.tsx (73%) create mode 100644 apps/observe-tester/app/(tabs)/debug/_layout.tsx rename apps/{observability-tester => observe-tester}/app/(tabs)/debug/index.tsx (50%) rename apps/{observability-tester => observe-tester}/app/_layout.tsx (99%) rename apps/{observability-tester => observe-tester}/app/redirect.tsx (100%) rename apps/{observability-tester => observe-tester}/assets/images/android-icon-dark.png (100%) rename apps/{observability-tester => observe-tester}/assets/images/android-icon-foreground.png (100%) rename apps/{observability-tester => observe-tester}/assets/images/android-icon.png (100%) rename apps/{observability-tester => observe-tester}/assets/images/favicon.png (100%) rename apps/{observability-tester => observe-tester}/assets/images/icon.png (100%) rename apps/{observability-tester => observe-tester}/assets/images/splash-icon-dark.png (100%) rename apps/{observability-tester => observe-tester}/assets/images/splash-icon.png (100%) rename apps/{observability-tester => observe-tester}/assets/observe.icon/Assets/pulse.svg (100%) rename apps/{observability-tester => observe-tester}/assets/observe.icon/icon.json (100%) create mode 100644 apps/observe-tester/components/Button.tsx create mode 100644 apps/observe-tester/components/CallStackTreeView.tsx create mode 100644 apps/observe-tester/components/Chevron.tsx create mode 100644 apps/observe-tester/components/CrashReportPanel.tsx create mode 100644 apps/observe-tester/components/CrashReportsSection.tsx create mode 100644 apps/observe-tester/components/Divider.tsx rename apps/{observability-tester => observe-tester}/components/JSAnimation.tsx (100%) create mode 100644 apps/observe-tester/components/JSONView.tsx create mode 100644 apps/observe-tester/components/MetricsPanel.tsx create mode 100644 apps/observe-tester/components/SessionHeader.tsx rename apps/{observability-tester => observe-tester}/eas.json (100%) rename apps/{observability-tester => observe-tester}/package.json (94%) rename apps/{observability-tester => observe-tester}/router-metrics-integration/index.ts (100%) rename apps/{observability-tester => observe-tester}/scripts/test-ios.sh (100%) rename apps/{observability-tester => observe-tester}/tsconfig.json (100%) create mode 100644 apps/observe-tester/utils/theme.ts diff --git a/apps/observability-tester/app/(tabs)/(metrics)/_layout.tsx b/apps/observability-tester/app/(tabs)/(metrics)/_layout.tsx deleted file mode 100644 index dd85d6fdc11773..00000000000000 --- a/apps/observability-tester/app/(tabs)/(metrics)/_layout.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { Stack } from 'expo-router'; - -export default function MetricsLayout() { - return ( - - - - ); -} diff --git a/apps/observability-tester/app/(tabs)/debug/_layout.tsx b/apps/observability-tester/app/(tabs)/debug/_layout.tsx deleted file mode 100644 index 328223422f0709..00000000000000 --- a/apps/observability-tester/app/(tabs)/debug/_layout.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { Stack } from 'expo-router'; - -export default function MetricsLayout() { - return ( - - - - ); -} diff --git a/apps/observability-tester/components/Button.tsx b/apps/observability-tester/components/Button.tsx deleted file mode 100644 index 9173de78b1bd7f..00000000000000 --- a/apps/observability-tester/components/Button.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import React from 'react'; -import { Pressable, PressableProps, StyleSheet, Text, useColorScheme } from 'react-native'; - -type ButtonProps = { - title: string; - onPress?: () => void; - theme?: 'primary' | 'secondary' | 'tertiary'; - disabled?: boolean; -} & PressableProps; - -export function Button({ title, onPress, theme = 'primary', disabled, ...rest }: ButtonProps) { - const colorScheme = useColorScheme(); - const isDark = colorScheme === 'dark'; - - const buttonStyle = [ - styles.button, - theme === 'primary' && styles.buttonPrimary, - theme === 'secondary' && - (isDark ? { backgroundColor: '#1F1F1F', borderColor: '#404040' } : styles.buttonSecondary), - theme === 'tertiary' && styles.buttonTertiary, - disabled && styles.buttonDisabled, - ]; - - const textStyle = [ - styles.text, - theme === 'primary' && styles.textPrimary, - theme === 'secondary' && (isDark ? { color: '#FFFFFF' } : styles.textSecondary), - theme === 'tertiary' && (isDark ? { color: '#E5E5E5' } : styles.textTertiary), - ]; - - return ( - [buttonStyle, pressed ? styles.buttonFocused : null]} - disabled={disabled} - {...rest}> - {title} - - ); -} - -const styles = StyleSheet.create({ - button: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - borderRadius: 6, - paddingHorizontal: 20, - paddingVertical: 12, - marginBottom: 16, - borderWidth: 1, - }, - buttonFocused: { - opacity: 0.5, - }, - buttonPrimary: { - backgroundColor: '#007AFF', - borderColor: '#007AFF', - }, - buttonSecondary: { - backgroundColor: '#FFFFFF', - borderColor: '#D1D5DB', - }, - buttonTertiary: { - backgroundColor: 'transparent', - borderColor: 'transparent', - }, - buttonDisabled: { - opacity: 0.5, - }, - text: { - fontWeight: '600', - fontSize: 18, - letterSpacing: 0.5, - }, - textPrimary: { - color: '#FFFFFF', - }, - textSecondary: { - color: '#000000', - }, - textTertiary: { - color: '#1F2937', - }, -}); diff --git a/apps/observe-tester/.gitignore b/apps/observe-tester/.gitignore new file mode 100644 index 00000000000000..f25965cd078aa5 --- /dev/null +++ b/apps/observe-tester/.gitignore @@ -0,0 +1,42 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ +expo-env.d.ts + +#prebuild +android/ +ios/ + +# Native +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo + +app-example diff --git a/apps/observability-tester/app.config.ts b/apps/observe-tester/app.config.ts similarity index 90% rename from apps/observability-tester/app.config.ts rename to apps/observe-tester/app.config.ts index a7312b34f82c6a..44ff6222c94b72 100644 --- a/apps/observability-tester/app.config.ts +++ b/apps/observe-tester/app.config.ts @@ -3,8 +3,6 @@ import 'tsx/cjs'; const config = ({ config }: ConfigContext): ExpoConfig => ({ ...config, - name: 'Observe', - slug: 'observability', extra: { ...config.extra, eas: { diff --git a/apps/observability-tester/app.json b/apps/observe-tester/app.json similarity index 97% rename from apps/observability-tester/app.json rename to apps/observe-tester/app.json index 3c1600af836677..e1b5a7c77e13e9 100644 --- a/apps/observability-tester/app.json +++ b/apps/observe-tester/app.json @@ -1,11 +1,11 @@ { "expo": { - "name": "observability", + "name": "Observe", "slug": "observability", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/images/icon.png", - "scheme": "observability", + "scheme": "observe", "userInterfaceStyle": "automatic", "ios": { "supportsTablet": true, diff --git a/apps/observe-tester/app/(tabs)/(metrics)/_layout.tsx b/apps/observe-tester/app/(tabs)/(metrics)/_layout.tsx new file mode 100644 index 00000000000000..e1fa42eec19b3d --- /dev/null +++ b/apps/observe-tester/app/(tabs)/(metrics)/_layout.tsx @@ -0,0 +1,16 @@ +import { Stack } from 'expo-router'; + +import { useTheme } from '@/utils/theme'; + +export default function MetricsLayout() { + const theme = useTheme(); + return ( + + + + ); +} diff --git a/apps/observability-tester/app/(tabs)/(metrics)/index.tsx b/apps/observe-tester/app/(tabs)/(metrics)/index.tsx similarity index 69% rename from apps/observability-tester/app/(tabs)/(metrics)/index.tsx rename to apps/observe-tester/app/(tabs)/(metrics)/index.tsx index 50046da1cfcb6b..4c50d8f4cf9b91 100644 --- a/apps/observability-tester/app/(tabs)/(metrics)/index.tsx +++ b/apps/observe-tester/app/(tabs)/(metrics)/index.tsx @@ -1,17 +1,17 @@ -import { Code } from '@expo/html-elements'; -import { useCallback, useEffect, useState } from 'react'; -import { Platform, ScrollView, StyleSheet, Text, View, useColorScheme } from 'react-native'; - -import { useRouterMetricsHelpers } from '@/router-metrics-integration'; import AppMetrics, { type Metric } from 'expo-app-metrics'; import ExpoObserve from 'expo-observe'; -import { Button } from '../../../components/Button'; - import { checkForUpdateAsync, fetchUpdateAsync, reloadAsync, useUpdates } from 'expo-updates'; +import { useCallback, useEffect, useState } from 'react'; +import { Platform, ScrollView, StyleSheet, Text, View } from 'react-native'; + +import { Button } from '@/components/Button'; +import { Divider } from '@/components/Divider'; +import { JSONView } from '@/components/JSONView'; +import { useRouterMetricsHelpers } from '@/router-metrics-integration'; +import { useTheme } from '@/utils/theme'; export default function Index() { - const colorScheme = useColorScheme(); - const isDark = colorScheme === 'dark'; + const theme = useTheme(); const [metrics, setMetrics] = useState([]); const [showEntries, setShowEntries] = useState(false); const { isUpdateAvailable, isUpdatePending, availableUpdate, currentlyRunning } = useUpdates(); @@ -61,7 +61,7 @@ export default function Index() { return (