File size: 2,155 Bytes
b03f016
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { useExperimentsState } from "./store";
import ExperimentList from "./components/ExperimentList";
import ExperimentDetail from "./components/ExperimentDetail";
import SubExperimentView from "./components/SubExperimentView";
import NoteView from "./components/NoteView";

export default function ExperimentsApp() {
  const state = useExperimentsState();

  if (state.loading && state.experiments.length === 0) {
    return (
      <div className="flex items-center justify-center h-full text-gray-500">
        Loading experiments...
      </div>
    );
  }

  if (state.error && state.experiments.length === 0) {
    return (
      <div className="flex flex-col items-center justify-center h-full text-gray-500">
        <p className="text-red-400 mb-2">{state.error}</p>
        <button
          onClick={state.loadExperiments}
          className="text-cyan-400 hover:text-cyan-300 text-sm"
        >
          Retry
        </button>
      </div>
    );
  }

  if (state.view.kind === "note" && state.currentNote && state.currentDetail) {
    return (
      <NoteView
        note={state.currentNote}
        experimentName={state.currentDetail.name}
        onBack={() => state.navigateToDetail(state.view.kind === "note" ? state.view.expId : "")}
      />
    );
  }

  if (state.view.kind === "sub" && state.currentSub && state.currentDetail) {
    return (
      <SubExperimentView
        sub={state.currentSub}
        experimentName={state.currentDetail.name}
        onBack={() => state.navigateToDetail(state.view.kind === "sub" ? state.view.expId : "")}
        onRefresh={state.refreshDetail}
      />
    );
  }

  if (state.view.kind === "detail" && state.currentDetail) {
    return (
      <ExperimentDetail
        experiment={state.currentDetail}
        onBack={state.navigateToList}
        onSelectNote={(noteId) => state.navigateToNote(state.view.kind === "detail" ? state.view.expId : "", noteId)}
        onRefresh={state.refreshDetail}
      />
    );
  }

  return (
    <ExperimentList
      experiments={state.experiments}
      onSelect={state.navigateToDetail}
      onRefresh={state.loadExperiments}
    />
  );
}