File size: 4,296 Bytes
debda0e
ebdfd67
970eef1
31d11b5
970eef1
 
 
 
 
 
 
ebdfd67
 
 
 
 
 
 
970eef1
d6f0b38
debda0e
d6f0b38
debda0e
 
d6f0b38
debda0e
 
 
 
 
 
 
d6f0b38
debda0e
 
 
 
 
 
 
970eef1
 
 
 
d6f0b38
debda0e
d6f0b38
debda0e
 
 
 
d6f0b38
debda0e
d6f0b38
debda0e
d6f0b38
debda0e
 
d6f0b38
debda0e
 
 
 
 
d6f0b38
debda0e
 
d6f0b38
debda0e
 
d6f0b38
debda0e
 
d6f0b38
debda0e
 
 
 
 
 
970eef1
 
 
 
 
ebdfd67
970eef1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d0d74d
 
 
 
 
 
 
 
 
 
 
 
1cb025f
 
 
0d0d74d
970eef1
 
 
 
 
 
 
 
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import React, { useEffect } from "react";
import { Box, Container, CssBaseline } from "@mui/material";
import {
  HashRouter as Router,
  Routes,
  Route,
  Navigate,
} from "react-router-dom";
import getTheme from "./config/theme";
import { useThemeMode } from "./hooks/useThemeMode";
import { ThemeProvider } from "@mui/material/styles";
import ExternalLinks from "./components/ExternalLinks";
import KeyboardShortcuts from "./components/KeyboardShortcuts";
import HomePage from "./pages/HomePage";
import BenchmarkGenerationPage from "./pages/BenchmarkGenerationPage";
import BenchmarkDisplayPage from "./pages/BenchmarkDisplayPage";
import BenchmarkEvaluationPage from "./pages/BenchmarkEvaluationPage";
import EvaluationDisplayPage from "./pages/EvaluationDisplayPage";

// Function to synchronize URL hash with parent Hugging Face page
const syncURLWithParent = () => {
  // This function is only necessary in a Hugging Face Spaces environment
  if (window.parent !== window) {
    try {
      // Send the current hash to the parent page (Hugging Face)
      window.parent.postMessage(
        {
          hash: window.location.hash,
        },
        "https://huggingface.co"
      );

      // Log for debugging
      console.log("Synced hash with parent:", window.location.hash);
    } catch (error) {
      console.error("Error syncing URL with parent:", error);
    }
  }
};

function App() {
  const { mode } = useThemeMode();
  const theme = getTheme(mode);

  // Effect to monitor hash changes and synchronize them
  useEffect(() => {
    // Event handler function for hash changes
    const handleHashChange = () => {
      syncURLWithParent();
    };

    // Function to handle messages received from the parent page
    const handleParentMessage = (event) => {
      // Verify that the message comes from Hugging Face
      if (event.origin === "https://huggingface.co") {
        // If the message contains a hash and it's different from the current hash
        if (event.data.hash && event.data.hash !== window.location.hash) {
          console.log("Received hash from parent:", event.data.hash);
          // Update the URL hash without reloading the page
          window.location.hash = event.data.hash;
        }
      }
    };

    // Synchronize on initial load
    syncURLWithParent();

    // Listen for hash changes
    window.addEventListener("hashchange", handleHashChange);

    // Listen for messages from the parent page
    window.addEventListener("message", handleParentMessage);

    // Cleanup
    return () => {
      window.removeEventListener("hashchange", handleHashChange);
      window.removeEventListener("message", handleParentMessage);
    };
  }, []);

  return (
    <ThemeProvider theme={theme}>
      <CssBaseline />
      <Router>
        <Container maxWidth="md">
          <ExternalLinks />
          <Box sx={{ pt: 12, pb: 4 }}>
            <KeyboardShortcuts />
            <Routes>
              <Route path="/" element={<HomePage />} />
              <Route
                path="/benchmark-generation"
                element={<BenchmarkGenerationPage />}
              />
              <Route
                path="/benchmark-display"
                element={<BenchmarkDisplayPage />}
              />
              <Route
                path="/benchmark-evaluation"
                element={<BenchmarkEvaluationPage />}
              />
              <Route
                path="/evaluation-display"
                element={<EvaluationDisplayPage />}
              />
              <Route path="*" element={<Navigate to="/" replace />} />
            </Routes>
            <Box
              component="footer"
              sx={{
                mt: 4,
                textAlign: "center",
                fontSize: "0.875rem",
                color: "text.secondary",
                opacity: 0.7,
                maxWidth: { xs: "100%", md: "70%" },
                mx: "auto",
              }}
            >
              We keep processed documents for research purposes, to which you
              agree by using the space. For a fully private usage, please
              duplicate the advanced space
            </Box>
          </Box>
        </Container>
      </Router>
    </ThemeProvider>
  );
}

export default App;