|
1 | 1 | import 'bootstrap/dist/css/bootstrap.min.css'; |
2 | | -import React from "react"; |
| 2 | +import React, { useState, useEffect } from "react"; |
3 | 3 | import './App.css'; |
4 | | -import {Button} from "react-bootstrap"; |
| 4 | +import {Button, Spinner} from "react-bootstrap"; |
| 5 | +import {Check } from 'react-bootstrap-icons'; |
5 | 6 |
|
6 | 7 | function LoadingContent() { |
| 8 | + const [logs, setLogs] = useState([{ |
| 9 | + timestamp: "", |
| 10 | + language: "", |
| 11 | + message: "" |
| 12 | + }]); |
| 13 | + const [running, setRunning] = useState({ |
| 14 | + "arabic": { "start": null, "end": null, "isRunning": false, isLoaded: false }, |
| 15 | + "english-kbp": { "start": null, "end": null, "isRunning": false, isLoaded: false }, |
| 16 | + "english": { "start": null, "end": null, "isRunning": false, isLoaded: false }, |
| 17 | + "chinese": { "start": null, "end": null, "isRunning": false, isLoaded: false }, |
| 18 | + "french": { "start": null, "end": null, "isRunning": false, isLoaded: false }, |
| 19 | + "german": { "start": null, "end": null, "isRunning": false, isLoaded: false }, |
| 20 | + "spanish": { "start": null, "end": null, "isRunning": false, isLoaded: false } |
| 21 | + }) |
| 22 | + const [last, setLast] = useState(null); |
| 23 | + const [counter, setCounter] = useState(0); |
| 24 | + |
| 25 | + useEffect(() => { |
| 26 | + const intervalVar = setInterval(fetchLogs, 10000); |
| 27 | + |
| 28 | + return () => clearInterval(intervalVar); |
| 29 | + }, []) |
| 30 | + |
| 31 | + function fetchLogs() { |
| 32 | + let uri = '/exist/restxq/stanford/nlp/logs'; |
| 33 | + |
| 34 | + if (last) { |
| 35 | + uri += "?timestamp=" + last; |
| 36 | + } |
| 37 | + |
| 38 | + fetch(uri) |
| 39 | + .then((response) => response.json()) |
| 40 | + .then( |
| 41 | + (result) => { |
| 42 | + if (last) { |
| 43 | + setLogs([result.logs, ...logs]); |
| 44 | + } else { |
| 45 | + setLogs(result.logs); |
| 46 | + } |
| 47 | + setRunning(result.running); |
| 48 | + setLast(result.timestamp); |
| 49 | + }, |
| 50 | + (error) => { |
| 51 | + |
| 52 | + } |
| 53 | + ) |
| 54 | + } |
| 55 | + |
| 56 | + function loadLanguage(theLanguage: string) { |
| 57 | + let aRunning = running; |
| 58 | + // @ts-ignore |
| 59 | + aRunning[theLanguage].isRunning = true; |
| 60 | + // @ts-ignore |
| 61 | + aRunning[theLanguage].isLoaded = false; |
| 62 | + setRunning(aRunning); |
| 63 | + setCounter(counter + 1) |
| 64 | + |
| 65 | + fetch("/exist/restxq/stanford/nlp/load/" + theLanguage) |
| 66 | + .then((response) => response.json()) |
| 67 | + .then( |
| 68 | + (result) => { |
| 69 | + }, |
| 70 | + (error) => { |
| 71 | + |
| 72 | + } |
| 73 | + ) |
| 74 | + } |
| 75 | + |
7 | 76 | return ( |
8 | 77 | <div className={'LoadingContent'}> |
9 | 78 | <h1>Load</h1> |
10 | | - <Button>Arabic</Button> |
11 | | - <Button>Chinese</Button> |
12 | | - <Button>English</Button> |
13 | | - <Button>English KBP</Button> |
14 | | - <Button>French</Button> |
15 | | - <Button>German</Button> |
16 | | - <Button>Spanish</Button> |
| 79 | + <Button onClick={() => loadLanguage('arabic')} disabled={running.arabic.isRunning}> |
| 80 | + { |
| 81 | + running.arabic.isRunning ? |
| 82 | + <Spinner as="span" animation="grow" size="sm" role="status" aria-hidden="true"/> |
| 83 | + : running.arabic.isLoaded ? |
| 84 | + <Check/> |
| 85 | + :null |
| 86 | + } |
| 87 | + Arabic |
| 88 | + </Button> |
| 89 | + <Button onClick={() => loadLanguage('chinese')} disabled={running.chinese.isRunning}>{ |
| 90 | + running.chinese.isRunning ? |
| 91 | + <Spinner as="span" animation="grow" size="sm" role="status" aria-hidden="true"/> |
| 92 | + : running.chinese.isLoaded ? |
| 93 | + <Check/> |
| 94 | + :null |
| 95 | + } |
| 96 | + Chinese</Button> |
| 97 | + <Button onClick={() => loadLanguage('english')} disabled={running.english.isRunning}>{ |
| 98 | + running.english.isRunning ? |
| 99 | + <Spinner as="span" animation="grow" size="sm" role="status" aria-hidden="true"/> |
| 100 | + : running.english.isLoaded ? |
| 101 | + <Check/> |
| 102 | + :null |
| 103 | + } |
| 104 | + English</Button> |
| 105 | + <Button onClick={() => loadLanguage('english-kbp')} disabled={running['english-kbp'].isRunning}>{ |
| 106 | + running['english-kbp'].isRunning ? |
| 107 | + <Spinner as="span" animation="grow" size="sm" role="status" aria-hidden="true"/> |
| 108 | + : running['english-kbp'].isLoaded ? |
| 109 | + <Check/> |
| 110 | + :null |
| 111 | + } |
| 112 | + English KBP</Button> |
| 113 | + <Button onClick={() => loadLanguage('french')} disabled={running.french.isRunning}>{ |
| 114 | + running.french.isRunning ? |
| 115 | + <Spinner as="span" animation="grow" size="sm" role="status" aria-hidden="true"/> |
| 116 | + : running.french.isLoaded ? |
| 117 | + <Check/> |
| 118 | + :null |
| 119 | + } |
| 120 | + French</Button> |
| 121 | + <Button onClick={() => loadLanguage('german')} disabled={running.german.isRunning}>{ |
| 122 | + running.german.isRunning ? |
| 123 | + <Spinner as="span" animation="grow" size="sm" role="status" aria-hidden="true"/> |
| 124 | + : running.german.isLoaded ? |
| 125 | + <Check/> |
| 126 | + :null |
| 127 | + } |
| 128 | + German</Button> |
| 129 | + <Button onClick={() => loadLanguage('spanish')} disabled={running.spanish.isRunning}>{ |
| 130 | + running.spanish.isRunning ? |
| 131 | + <Spinner as="span" animation="grow" size="sm" role="status" aria-hidden="true"/> |
| 132 | + : running.spanish.isLoaded ? |
| 133 | + <Check/> |
| 134 | + :null |
| 135 | + } |
| 136 | + Spanish</Button> |
| 137 | + <table> |
| 138 | + <thead> |
| 139 | + <tr> |
| 140 | + <th>Timestamp</th> |
| 141 | + <th>Language</th> |
| 142 | + <th>Log</th> |
| 143 | + </tr> |
| 144 | + </thead> |
| 145 | + <tbody>{ |
| 146 | + logs.map((log) => { |
| 147 | + return ( |
| 148 | + <tr> |
| 149 | + <td>{log.timestamp}</td> |
| 150 | + <td>{log.language}</td> |
| 151 | + <td>{log.message}</td> |
| 152 | + </tr> |
| 153 | + ) |
| 154 | + }) |
| 155 | + }</tbody> |
| 156 | + </table> |
17 | 157 | </div> |
18 | 158 | ) |
19 | 159 | } |
|
0 commit comments