-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy pathuseBuildLogs.js
56 lines (48 loc) · 1.41 KB
/
useBuildLogs.js
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
import { useEffect, useState } from 'react';
import api from '../util/federalistApi';
const REFRESH_INTERVAL = parseInt(10 * 1000, 10);
const initResultsState = {
offset: 0,
logs: [],
state: '',
isLoading: true,
totalRequests: 0,
};
export const useBuildLogs = (id) => {
const [results, setResults] = useState(initResultsState);
useEffect(() => {
async function fetchData(fetchOffest) {
const {
state,
output_count: outputCountStr,
output,
} = await api.fetchBuildLogs({ id }, fetchOffest);
const outputCount = parseInt(outputCountStr, 10);
const updatedLogs = [...results.logs, ...output];
const updatedResults = {
offset: fetchOffest + outputCount,
logs: updatedLogs,
state,
isLoading: false,
totalRequests: results.totalRequests + 1,
};
if (['created', 'processing', 'queued', 'tasked'].includes(state)) {
if (fetchOffest === 0) {
setResults(updatedResults);
} else {
setTimeout(setResults, REFRESH_INTERVAL, updatedResults);
}
}
if (['success', 'error'].includes(state)) {
if (outputCount > 0) {
setResults(updatedResults);
}
if (outputCount === 0 && results.totalRequests === 0) {
setResults(updatedResults);
}
}
}
fetchData(results.offset);
}, [results]);
return results;
};