This repository has been archived by the owner on May 10, 2023. It is now read-only.
/
review-form.js
108 lines (92 loc) · 3.52 KB
/
review-form.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
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
import React, { useState } from 'react';
import Pager from './pager';
import SubmitButton from './submit-button';
import SwipeReviewForm from './swipe-review-form';
import '../../css/review-form.css';
const PAGE_SIZE = 5;
export default function ReviewForm({ message, useSwipeReview, sentences, onReviewed }) {
const [page, setPage] = useState(0);
const [reviewedSentencesCount, setReviewedCount] = useState(0);
const [reviewApproval, setReviewApproval] = useState({});
const totalPages = Math.ceil(sentences.length / PAGE_SIZE);
const lastPage = totalPages - 1;
const offset = page * PAGE_SIZE;
const currentSentences = sentences.slice(offset, offset + PAGE_SIZE);
const onSubmit = async (event) => {
event.preventDefault();
const categorizedSentences = mapSentencesAccordingToState(sentences, reviewApproval);
onReviewed(categorizedSentences);
setReviewApproval({});
};
const reviewSentence = (index, approval) => {
if (reviewApproval[index] === approval) {
// already set before, deselecting now
setReviewApproval((previousValue) => ({ ...previousValue, [index]: undefined }));
} else {
setReviewApproval((previousValue) => ({ ...previousValue, [index]: approval }));
}
setReviewedCount((previousNumber) => previousNumber + 1);
};
if (!Array.isArray(sentences) || sentences.length < 1) {
return (<h2>nothing to review</h2>);
}
if (useSwipeReview) {
return (
<SwipeReviewForm
onReviewSentence={reviewSentence}
onSubmit={onSubmit}
sentences={sentences}
page={page}
lastPage={lastPage}
offset={offset}
message={message}
reviewedSentencesCount={reviewedSentencesCount}
/>
);
}
return (
<form id="review-form" onSubmit={onSubmit}>
{ message && ( <p>{message}</p> ) }
{ currentSentences.map((sentence, i) => (
<section id={`sentence-${offset + i}`} key={offset + i} className="validator">
<div className="sentence-box">
<p>{sentence.sentence || sentence}</p>
<small>{sentence.source ? `Source: ${sentence.source}` : ''}</small>
</div>
<div className="button-group">
<button type="button"
className={`${reviewApproval[offset + i] === true ? 'yes' : ''}`}
aria-pressed={reviewApproval[offset + i] === true}
onClick={() => reviewSentence(offset + i, true)}
name={`validate-${offset + i}`}>
👍
</button>
<button type="button"
className={`${reviewApproval[offset + i] === false ? 'no' : ''}`}
aria-pressed={reviewApproval[offset + i] === false}
onClick={() => reviewSentence(offset + i, false)}
name={`validate-${offset + i}`}>
👎
</button>
</div>
</section>
)) }
<section className="review-footer">
<SubmitButton submitText="Finish Review"/>
<Pager page={page} lastPage={lastPage} onPage={setPage} />
</section>
</form>
);
}
function mapSentencesAccordingToState(sentences, reviewApproval) {
return sentences.reduce((acc, sentence, index) => {
if (reviewApproval[index] === true) {
acc.validated.push(sentence);
} else if (reviewApproval[index] === false) {
acc.invalidated.push(sentence);
} else {
acc.unreviewed.push(sentence);
}
return acc;
}, { validated: [], invalidated: [], unreviewed: [] });
}