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