import React from 'react'; import { ViewStyle } from 'react-native'; import { Animated, PanResponderInstance } from 'react-native'; import type { ActiveTab, BreadcrumbType, CrashType, GroupedListItem, LocalFilter, LogFilter, Method, PushActionType, PushAppState, SettingsPage, SettingsSubTab, SocketFrameDirection, SocketFrameType, SocketStatus, SortOrder, StatusFilter } from './index'; export type SearchScope = 'all' | 'url' | 'reqBody' | 'resBody' | 'headers'; export interface ParsedStackFrame { method: string; file: string; lineNumber: number; column: number; raw?: string; isAppCode?: boolean; } export interface CrashBreadcrumb { type: BreadcrumbType; message: string; timestamp: number; data?: any; } export interface CrashRecord { id: string; error?: Error | any; isFatal: boolean; type: CrashType; message: string; name?: string; stack?: string; parsedStack?: ParsedStackFrame[]; componentStack?: string; timestamp: number; dateStr: string; timeStr: string; deviceInfo?: { platform: string; osVersion?: string; rnVersion?: string; isHermes?: boolean; isFabric?: boolean; appState?: string; }; memoryInfo?: { usedJSHeapSize?: number; totalJSHeapSize?: number; }; breadcrumbs?: CrashBreadcrumb[]; logId?: number; } export interface ConsoleLog { id: number; type: 'info' | 'warn' | 'error'; message: string; timestamp: number; caller?: string; stack?: string; errorStack?: string; rawArgs?: any[]; sourceMethod?: 'log' | 'info' | 'warn' | 'error'; duplicateCount?: number; } export interface AnalyticsEvent { id: number; name: string; screenName: string; screenClass: string; userId: string; params: Record; userProperties: Record; timestamp: number; source: 'firebase' | 'manual'; raw?: string; trackingId?: string; clientId?: string; sessionId?: string; pageTitle?: string; pageLocation?: string; } export interface AnalyticsFilters { categories: Set; screens: Set; sources: Set; userTypes: Set; timeWindow: 'all' | '1m' | '5m' | '15m' | '1h'; payloadComplexity: 'all' | 'none' | 'simple' | 'heavy'; hasRevenue: boolean; hasItems: boolean; hasUserProps: boolean; hasParams: boolean; onlyDuplicates: boolean; onlyConversions: boolean; sortBy: 'time_desc' | 'time_asc' | 'revenue_desc' | 'count_desc'; } export interface NetworkLog { id: number; url: string; method: string; status?: number | null; duration?: number | null; startTime: number; request?: unknown; response?: unknown; requestHeaders?: Record; responseHeaders?: Record; duplicateCount?: number; client?: 'axios' | 'fetch' | 'xhr' | 'apollo' | 'graphql' | string; caller?: string; routeInfo?: RouteInfo; } export interface RouteInfo { path: string; params: any; } export interface ReduxHistoryEntry { id: number; type: string; payload: any; timestamp: string; updatedAt?: number; affectedSlices: string[]; prevState?: any; nextState?: any; stack?: string; caller?: string; callerFile?: string; callerLine?: number; callerCol?: number; originType?: 'saga' | 'thunk' | 'ui' | 'direct' | 'listener'; sliceName?: string; } export interface InspectorStorage { getItem: (key: string) => string | null | Promise; setItem: (key: string, value: string) => void | Promise; removeItem?: (key: string) => void | Promise; } export interface CrashIgnoredTypes { js: boolean; native: boolean; render: boolean; promise: boolean; custom: boolean; } export type CrashModalTriggerPolicy = 'fatal_only' | 'all_errors' | 'silent_tab_only'; export interface PersistedSettings { isDark?: boolean; language?: string; modalHeightPercent?: number; modalAnimationType?: string; tabVisibility?: Record; defaultTab?: string; maxNetworkLogs?: number; maxConsoleLogs?: number; maxAnalyticsEventsLimit?: number; maxCrashLogs?: number; crashIgnoredTypes?: CrashIgnoredTypes; crashModalTriggerPolicy?: CrashModalTriggerPolicy; crashThrottleDuplicates?: boolean; maxPushLogsLimit?: number; maxSocketLogsLimit?: number; isSocketAutoCaptureEnabled?: boolean; isGroupByPageEnabled?: boolean; isAutoRamLimitEnabled?: boolean; showConsoleLevels?: { info: boolean; warn: boolean; error: boolean; }; reduxAutoRefresh?: boolean; reduxExpandDepth?: number; showDuplicateLogs?: boolean; showUpdateToast?: boolean; useNativeFab?: boolean; shakeToOpen?: boolean; telemetryClientId?: string; telemetryDeviceId?: string; deviceRegistered?: boolean; deviceFirstSeen?: number; telemetryLastPing?: number; telemetryLastActive?: number; starPromptActioned?: boolean; starPromptLastShown?: number; starPromptFirstSeen?: number; captureImageFormat?: 'png' | 'jpeg' | 'webp'; captureAutoHide?: boolean; captureAudioMode?: 'none' | 'app' | 'mic'; captureFps?: number; captureScale?: number; captureBitrate?: number; captureMaxDurationSeconds?: number; captureAutoGif?: boolean; captureWidgetEnabled?: boolean; peekOpacity?: number; hiddenUrlPatterns?: string[]; } export interface NetworkInspectorProps { enabled?: boolean; captureWidgetEnabled?: boolean; telemetry?: boolean; storage?: InspectorStorage; navigationRef?: any; appIcon?: any; environment?: 'DEV' | 'UAT' | 'PrePROD' | 'PROD' | 'QA' | 'Staging' | string; initialVisible?: boolean; visible?: boolean; remoteConfig?: boolean | any; } export interface NavigationTrackerProps { onStateChange: (state: any) => void; } export interface InspectorContextValue { visible: boolean; setVisible: React.Dispatch>; closeModal: () => void; isMinimized: boolean; setIsMinimized: React.Dispatch>; minimizeInspector: () => void; isDismissed: boolean; setIsDismissed: React.Dispatch>; dismissInspector: () => void; isReady: boolean; enabled: boolean; isEnabled: boolean; appIcon?: any; environment?: string; modalHeightPercent: number; setModalHeightPercent: React.Dispatch>; modalAnimationType: 'slide' | 'fade' | 'none'; setModalAnimationType: React.Dispatch>; hasNavigationContext: boolean; setNavState: React.Dispatch>; activeTab: ActiveTab; switchActiveTab: (key: ActiveTab) => void; tabVisibility: Record; toggleTabVisibility: (key: ActiveTab) => void; lastReadApisCount: number; lastReadLogsCount: number; mediaCount: number; refreshMediaCount: () => Promise; selected: NetworkLog | null; setSelected: React.Dispatch>; selectedEvent: AnalyticsEvent | null; setSelectedEvent: React.Dispatch>; selectedLog: ConsoleLog | null; setSelectedLog: React.Dispatch>; showHeaderInfo: boolean; setShowHeaderInfo: React.Dispatch>; settingsPage: SettingsPage; setSettingsPage: React.Dispatch>; isAboutOpen: boolean; setIsAboutOpen: React.Dispatch>; isSupportOpen: boolean; setIsSupportOpen: React.Dispatch>; updateAvailable: boolean; latestNpmVersion: string | null; clearAnim: Animated.Value; activePulseAnim: Animated.Value; unreadPulseAnim: Animated.Value; runClearAllWithAnimation: () => void; confirmModal: { visible: boolean; title: string; message: string; confirmText?: string; cancelText?: string; onConfirm: () => void; }; setConfirmModal: React.Dispatch void; }>>; useNativeFab: boolean; fabPan: Animated.ValueXY; fabPanResponder: PanResponderInstance; fabDraggedRef: React.MutableRefObject; pulseAnim: Animated.Value; fabShineAnim: Animated.Value; logs: NetworkLog[]; filteredLogs: NetworkLog[]; groupedData: GroupedListItem[]; search: string; setSearch: React.Dispatch>; searchScope: SearchScope; setSearchScope: React.Dispatch>; isRegexSearch: boolean; setIsRegexSearch: React.Dispatch>; isCaseSensitive: boolean; setIsCaseSensitive: React.Dispatch>; quickFilter: string; setQuickFilter: React.Dispatch>; statusFilters: Set; setStatusFilters: React.Dispatch>>; methodFilters: Set; setMethodFilters: React.Dispatch>>; latencyFilter: 'all' | 'fast' | 'normal' | 'slow'; setLatencyFilter: React.Dispatch>; protocolFilter: 'all' | 'https' | 'http'; setProtocolFilter: React.Dispatch>; networkSortBy: 'time_desc' | 'time_asc' | 'duration_desc' | 'duration_asc' | 'size_desc'; setNetworkSortBy: React.Dispatch>; availableMethods: Method[]; sortOrder: SortOrder; setSortOrder: React.Dispatch>; selectedLogs: Set; toggleSelect: (id: number) => void; minStart: number; totalRange: number; newLogIds: Set; toggleSectionFilter: (pageName: string, filter: LocalFilter) => void; toggleSectionCollapse: (pageName: string) => void; loadMoreSection: (pageName: string, step?: number) => void; handleDelete: () => void; isGroupByPageEnabled: boolean; setIsGroupByPageEnabled: React.Dispatch>; hiddenUrlPatterns: string[]; setHiddenUrlPatterns: React.Dispatch>; detailTitle: string; detailDisplayUrl: string; apiDetailActiveTab: 'metadata' | 'headers' | 'request' | 'response'; setApiDetailActiveTab: React.Dispatch>; detailSearch: string; setDetailSearch: React.Dispatch>; reqExpanded: boolean | undefined; setReqExpanded: React.Dispatch>; resExpanded: boolean | undefined; setResExpanded: React.Dispatch>; showReqDiff: boolean; setShowReqDiff: React.Dispatch>; showResDiff: boolean; setShowResDiff: React.Dispatch>; prevRequestData: unknown; prevResponseData: unknown; logRouteMapRef: React.MutableRefObject>; consoleLogs: ConsoleLog[]; visibleConsoleLogs: ConsoleLog[]; filteredConsoleLogs: ConsoleLog[]; logSearch: string; setLogSearch: React.Dispatch>; logFilters: Set; setLogFilters: React.Dispatch>>; logCounts: Record; logSortOrder: SortOrder; setLogSortOrder: React.Dispatch>; selectedConsoleLogs: Set; setSelectedConsoleLogs: React.Dispatch>>; toggleSelectConsoleLog: (id: number) => void; analyticsEvents: AnalyticsEvent[]; filteredAnalyticsEvents: (AnalyticsEvent & { count?: number; })[]; analyticsSearch: string; setAnalyticsSearch: React.Dispatch>; analyticsFilters: AnalyticsFilters; setAnalyticsFilters: React.Dispatch>; isAnalyticsFilterApplied: boolean; resetAnalyticsFilters: () => void; newEventIds: Set; isAnalyticsLayoutReady: boolean; setIsAnalyticsLayoutReady: React.Dispatch>; analyticsHeaderExpanded: boolean; setAnalyticsHeaderExpanded: React.Dispatch>; reduxState: any; setReduxState: React.Dispatch>; reduxLastActionMap: Record; reduxSearch: string; setReduxSearch: React.Dispatch>; selectedReduxSlice: string | null; setSelectedReduxSlice: React.Dispatch>; selectedReduxAction: any | null; setSelectedReduxAction: React.Dispatch>; reduxActiveSubTab: 'state' | 'timeline'; setReduxActiveSubTab: React.Dispatch>; crashRecords: CrashRecord[]; setCrashRecords: React.Dispatch>; selectedCrash: CrashRecord | null; setSelectedCrash: React.Dispatch>; lastReadCrashesCount: number; maxCrashLogs: number; setMaxCrashLogs: React.Dispatch>; clearAllCrashes: () => void; crashIgnoredTypes: CrashIgnoredTypes; setCrashIgnoredTypes: React.Dispatch>; crashModalTriggerPolicy: CrashModalTriggerPolicy; setCrashModalTriggerPolicyState: React.Dispatch>; applyCrashPolicyPreset: (preset: 'balanced' | 'max_shield' | 'silent') => void; pushRecords: PushNotificationRecord[]; filteredPushRecords: PushNotificationRecord[]; selectedPush: PushNotificationRecord | null; setSelectedPush: React.Dispatch>; pushSearch: string; setPushSearch: React.Dispatch>; pushQuickFilter: string; setPushQuickFilter: React.Dispatch>; lastReadPushCount: number; unreadPushCount: number; maxPushLogs: number; setMaxPushLogs: React.Dispatch>; clearAllPushLogs: () => void; simulatePush: (preset?: 'salesforce' | 'fcm' | 'apns' | 'deeplink' | 'rich_media' | 'custom', customData?: any) => void; socketRecords: SocketConnectionRecord[]; filteredSocketRecords: SocketConnectionRecord[]; selectedSocket: SocketConnectionRecord | null; setSelectedSocket: React.Dispatch>; socketSearch: string; setSocketSearch: React.Dispatch>; socketQuickFilter: string; setSocketQuickFilter: React.Dispatch>; lastReadSocketCount: number; unreadSocketCount: number; maxSocketLogs: number; setMaxSocketLogs: React.Dispatch>; clearAllSocketLogs: () => void; deleteSocketRecord?: (id: string) => void; deleteMultipleSocketRecords?: (ids: string[]) => void; simulateSocket: (preset?: 'chat' | 'crypto' | 'socketio' | 'echo' | 'custom', customData?: any) => void; settingsActiveSubTab: SettingsSubTab; setSettingsActiveSubTab: React.Dispatch>; defaultTab: ActiveTab; setDefaultTab: React.Dispatch>; isDark: boolean; setIsDark: React.Dispatch>; showDuplicateLogs: boolean; setShowDuplicateLogs: React.Dispatch>; showUpdateToast: boolean; setShowUpdateToast: React.Dispatch>; showConsoleLevels: { info: boolean; warn: boolean; error: boolean; }; setShowConsoleLevels: React.Dispatch>; resetToDefaults: () => Promise; storage: InspectorStorage | undefined; maxNetworkLogs: number; setMaxNetworkLogs: React.Dispatch>; maxConsoleLogs: number; setMaxConsoleLogs: React.Dispatch>; maxAnalyticsEventsLimit: number; setMaxAnalyticsEventsLimit: React.Dispatch>; isAutoRamLimitEnabled: boolean; setIsAutoRamLimitEnabled: React.Dispatch>; deviceFreeRamMb: number; reduxAutoRefresh: boolean; setReduxAutoRefreshState: React.Dispatch>; reduxExpandDepth: number; setReduxExpandDepth: React.Dispatch>; captureFps: number; setCaptureFps: React.Dispatch>; captureScale: number; setCaptureScale: React.Dispatch>; captureBitrate: number; setCaptureBitrate: React.Dispatch>; captureMaxDurationSeconds: number; setCaptureMaxDurationSeconds: React.Dispatch>; captureImageFormat: 'png' | 'jpeg' | 'webp'; setCaptureImageFormat: React.Dispatch>; captureAudioMode: 'none' | 'app' | 'mic'; setCaptureAudioMode: React.Dispatch>; captureAutoHide: boolean; setCaptureAutoHide: React.Dispatch>; captureAutoGif: boolean; setCaptureAutoGif: React.Dispatch>; captureWidgetEnabled: boolean; setCaptureWidgetEnabled: React.Dispatch>; peekMode: boolean; setPeekMode: React.Dispatch>; peekOpacity: number; setPeekOpacity: React.Dispatch>; previewMediaItem: import('../capture').CapturedMediaItem | null; setPreviewMediaItem: React.Dispatch>; isUpdatePopupVisible?: boolean; setIsUpdatePopupVisible?: React.Dispatch>; } export interface CopyButtonProps { value: unknown | (() => unknown); label: string; iconType?: 'copy' | 'terminal' | 'fetch'; } export interface SectionHeaderProps { title: string; value: unknown; expanded: boolean | undefined; onToggleExpand: () => void; showDiff?: boolean; isDiffing?: boolean; onToggleDiff?: () => void; showSearch?: boolean; isSearching?: boolean; onToggleSearch?: () => void; } export interface TreeNodeProps { data: unknown; name?: string | number; level?: number; search?: string; forceOpen?: boolean; defaultExpandDepth?: number; } export interface LogCardProps { item: NetworkLog; onPress: () => void; timelineMinStart: number; timelineTotalRange: number; isNew?: boolean; isSelected: boolean; onToggleSelect: (id: number) => void; searchStr?: string; testID?: string; } export interface MetaAccordionProps { status: number | null | undefined; statusColor: string; duration: number | null | undefined; size: string; triggeredAt: string; method: string; contentType?: string; url: string; } export interface HeadersSectionProps { title: string; headers: Record | undefined; search?: string; resetKey?: string | number; } export interface SourcePageCardProps { routeInfo: RouteInfo; } export interface SectionCardProps { title?: string; count?: number; accentColor?: string; children?: React.ReactNode; } export interface AnalyticsEventCardProps { event: AnalyticsEvent & { count?: number; }; onPress: () => void; isNew?: boolean; searchStr?: string; isFirst: boolean; isLast: boolean; msSincePrev?: number; showTimestamp?: boolean; computedScreenName?: string; } export interface CodeSnippetProps { code: string; language: 'html' | 'css' | 'javascript'; search?: string; } export interface AnimatedEntranceProps { children: React.ReactNode; delay?: number; distance?: number; duration?: number; index?: number; style?: ViewStyle | ViewStyle[]; } export interface ConsoleLogCardProps { item: ConsoleLog; searchStr?: string; onPress?: (item: ConsoleLog) => void; testID?: string; isSelected?: boolean; onToggleSelect?: (id: number) => void; } export interface JsonContent { header: string; data: any; } export interface AnalyticsGraphProps { event: AnalyticsEvent; accentColor: string; } export interface ErrorBoundaryProps { children: React.ReactNode; onClose?: () => void; onReset?: () => void; fallbackType?: 'modal' | 'inline'; } export interface ErrorBoundaryState { hasError: boolean; error: Error | null; } export type PushSource = string; export interface PushNotificationRecord { id: string; title?: string; body?: string; subtitle?: string; source: PushSource; domain?: string; appState: PushAppState; action: PushActionType; actionId?: string; userText?: string; timestamp: number; data: Record; rawPayload: any; channelId?: string; imageUrl?: string; sound?: string; badge?: number; collapseKey?: string; priority?: string; customDomainAttributes?: Record; } export interface PushFilterState { search: string; source: string; appState: string; action: string; } export interface PushStats { total: number; foreground: number; background: number; opened: number; sources: Record; } export interface PushCardProps { item: PushNotificationRecord; onPress: () => void; searchStr?: string; isNew?: boolean; } export interface PushDetailProps { item: PushNotificationRecord | null; onClose: () => void; } export interface SocketFrame { id: string; timestamp: number; direction: SocketFrameDirection; type: SocketFrameType; data: any; raw?: any; size?: number; eventName?: string; ackId?: number; } export interface SocketConnectionRecord { id: string; url: string; protocols?: string | string[]; readyState: number; status: SocketStatus; startTime: number; endTime?: number; duration?: number; closeCode?: number; closeReason?: string; error?: string | any; client: 'websocket' | 'socket.io' | string; frames: SocketFrame[]; sentCount: number; receivedCount: number; totalBytesSent: number; totalBytesReceived: number; caller?: string; query?: Record; headers?: Record; routeInfo?: RouteInfo; } export interface SocketFilterState { search: string; status: Set; types: Set; sortBy: 'time_desc' | 'time_asc' | 'frames_desc' | 'duration_desc'; } export interface SocketStats { total: number; open: number; closed: number; error: number; totalFrames: number; sentFrames: number; receivedFrames: number; totalBytes: number; } export interface SocketCardProps { item: SocketConnectionRecord; onPress: () => void; searchStr?: string; isNew?: boolean; isSelected?: boolean; onToggleSelect?: (id: string) => void; serialNumber?: number; } export interface SocketDetailProps { item: SocketConnectionRecord | null; onClose: () => void; }