1*26ad19fcSEvan Baconimport React from 'react'; 2*26ad19fcSEvan Baconimport { Platform } from 'react-native'; 3*26ad19fcSEvan Bacon 4*26ad19fcSEvan Baconimport { LogBoxLog } from './LogBoxLog'; 5*26ad19fcSEvan Bacon 6*26ad19fcSEvan Bacon// Context provider for Array<LogBoxLog> 7*26ad19fcSEvan Bacon 8*26ad19fcSEvan Baconexport const LogContext = React.createContext<{ 9*26ad19fcSEvan Bacon selectedLogIndex: number; 10*26ad19fcSEvan Bacon isDisabled: boolean; 11*26ad19fcSEvan Bacon logs: LogBoxLog[]; 12*26ad19fcSEvan Bacon} | null>(null); 13*26ad19fcSEvan Bacon 14*26ad19fcSEvan Baconexport function useLogs(): { 15*26ad19fcSEvan Bacon selectedLogIndex: number; 16*26ad19fcSEvan Bacon isDisabled: boolean; 17*26ad19fcSEvan Bacon logs: LogBoxLog[]; 18*26ad19fcSEvan Bacon} { 19*26ad19fcSEvan Bacon const logs = React.useContext(LogContext); 20*26ad19fcSEvan Bacon if (!logs) { 21*26ad19fcSEvan Bacon if (Platform.OS === 'web' && typeof window !== 'undefined') { 22*26ad19fcSEvan Bacon // Logbox data that is pre-fetched on the dev server and rendered here. 23*26ad19fcSEvan Bacon const expoCliStaticErrorElement = document.getElementById('_expo-static-error'); 24*26ad19fcSEvan Bacon if (expoCliStaticErrorElement?.textContent) { 25*26ad19fcSEvan Bacon const raw = JSON.parse(expoCliStaticErrorElement.textContent); 26*26ad19fcSEvan Bacon return { 27*26ad19fcSEvan Bacon ...raw, 28*26ad19fcSEvan Bacon logs: raw.logs.map((raw: any) => new LogBoxLog(raw)), 29*26ad19fcSEvan Bacon }; 30*26ad19fcSEvan Bacon } 31*26ad19fcSEvan Bacon } 32*26ad19fcSEvan Bacon 33*26ad19fcSEvan Bacon throw new Error('useLogs must be used within a LogProvider'); 34*26ad19fcSEvan Bacon } 35*26ad19fcSEvan Bacon return logs; 36*26ad19fcSEvan Bacon} 37*26ad19fcSEvan Bacon 38*26ad19fcSEvan Baconexport function useSelectedLog() { 39*26ad19fcSEvan Bacon const { selectedLogIndex, logs } = useLogs(); 40*26ad19fcSEvan Bacon return logs[selectedLogIndex]; 41*26ad19fcSEvan Bacon} 42