react-native-elearn-ui 0.1.12 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/screens/HomeScreen.js +665 -650
- package/lib/module/screens/HomeScreen.js.map +1 -1
- package/lib/module/screens/index.js +0 -8
- package/lib/module/screens/index.js.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/screens/HomeScreen.d.ts.map +1 -1
- package/lib/typescript/src/screens/index.d.ts +0 -8
- package/lib/typescript/src/screens/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +0 -8
- package/src/screens/HomeScreen.tsx +461 -522
- package/src/screens/index.ts +0 -8
- package/lib/module/screens/PearlChaptersScreen.js +0 -359
- package/lib/module/screens/PearlChaptersScreen.js.map +0 -1
- package/lib/module/screens/PearlReaderScreen.js +0 -313
- package/lib/module/screens/PearlReaderScreen.js.map +0 -1
- package/lib/module/screens/PearlsScreen.js +0 -153
- package/lib/module/screens/PearlsScreen.js.map +0 -1
- package/lib/module/screens/QbankScreen.js +0 -370
- package/lib/module/screens/QbankScreen.js.map +0 -1
- package/lib/module/screens/QuestionScreen.js +0 -437
- package/lib/module/screens/QuestionScreen.js.map +0 -1
- package/lib/module/screens/QuizStartScreen.js +0 -283
- package/lib/module/screens/QuizStartScreen.js.map +0 -1
- package/lib/module/screens/ResultScreen.js +0 -646
- package/lib/module/screens/ResultScreen.js.map +0 -1
- package/lib/module/screens/TopicListScreen.js +0 -420
- package/lib/module/screens/TopicListScreen.js.map +0 -1
- package/lib/module/screens/pearlsMockData.js +0 -77
- package/lib/module/screens/pearlsMockData.js.map +0 -1
- package/lib/typescript/src/screens/PearlChaptersScreen.d.ts +0 -13
- package/lib/typescript/src/screens/PearlChaptersScreen.d.ts.map +0 -1
- package/lib/typescript/src/screens/PearlReaderScreen.d.ts +0 -14
- package/lib/typescript/src/screens/PearlReaderScreen.d.ts.map +0 -1
- package/lib/typescript/src/screens/PearlsScreen.d.ts +0 -11
- package/lib/typescript/src/screens/PearlsScreen.d.ts.map +0 -1
- package/lib/typescript/src/screens/QbankScreen.d.ts +0 -10
- package/lib/typescript/src/screens/QbankScreen.d.ts.map +0 -1
- package/lib/typescript/src/screens/QuestionScreen.d.ts +0 -14
- package/lib/typescript/src/screens/QuestionScreen.d.ts.map +0 -1
- package/lib/typescript/src/screens/QuizStartScreen.d.ts +0 -14
- package/lib/typescript/src/screens/QuizStartScreen.d.ts.map +0 -1
- package/lib/typescript/src/screens/ResultScreen.d.ts +0 -13
- package/lib/typescript/src/screens/ResultScreen.d.ts.map +0 -1
- package/lib/typescript/src/screens/TopicListScreen.d.ts +0 -12
- package/lib/typescript/src/screens/TopicListScreen.d.ts.map +0 -1
- package/lib/typescript/src/screens/pearlsMockData.d.ts +0 -3
- package/lib/typescript/src/screens/pearlsMockData.d.ts.map +0 -1
- package/src/screens/PearlChaptersScreen.tsx +0 -330
- package/src/screens/PearlReaderScreen.tsx +0 -306
- package/src/screens/PearlsScreen.tsx +0 -147
- package/src/screens/QbankScreen.tsx +0 -327
- package/src/screens/QuestionScreen.tsx +0 -423
- package/src/screens/QuizStartScreen.tsx +0 -260
- package/src/screens/ResultScreen.tsx +0 -618
- package/src/screens/TopicListScreen.tsx +0 -388
- package/src/screens/pearlsMockData.ts +0 -70
|
@@ -1,618 +0,0 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
View,
|
|
4
|
-
ScrollView,
|
|
5
|
-
StyleSheet,
|
|
6
|
-
TouchableOpacity,
|
|
7
|
-
StatusBar,
|
|
8
|
-
Image,
|
|
9
|
-
} from 'react-native';
|
|
10
|
-
import { SafeAreaView } from 'react-native-safe-area-context';
|
|
11
|
-
import type { QuizResults, Question } from '../types';
|
|
12
|
-
import { useElearnConfig } from '../context/ElearnConfigContext';
|
|
13
|
-
import { useTheme } from '../context/ThemeContext';
|
|
14
|
-
import { Typography, Card, CircularProgress, Button, Icon } from '../components';
|
|
15
|
-
|
|
16
|
-
interface ResultScreenProps {
|
|
17
|
-
results: QuizResults;
|
|
18
|
-
questions?: Question[];
|
|
19
|
-
topicId?: string;
|
|
20
|
-
onClose: () => void;
|
|
21
|
-
onReviewAnswers?: () => void;
|
|
22
|
-
hideHeader?: boolean;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const ResultScreen: React.FC<ResultScreenProps> = ({
|
|
26
|
-
results,
|
|
27
|
-
questions,
|
|
28
|
-
topicId,
|
|
29
|
-
onClose,
|
|
30
|
-
hideHeader = false,
|
|
31
|
-
}) => {
|
|
32
|
-
const { config, getString } = useElearnConfig();
|
|
33
|
-
const theme = useTheme();
|
|
34
|
-
|
|
35
|
-
const activeTopic = topicId ? config.courses?.flatMap((c) => c.topics).find((t) => t.id === topicId) : undefined;
|
|
36
|
-
const activeQuestions = questions || activeTopic?.questions || [];
|
|
37
|
-
|
|
38
|
-
// Selected question index for individual review
|
|
39
|
-
const [selectedReviewIndex, setSelectedReviewIndex] = useState<number | null>(null);
|
|
40
|
-
|
|
41
|
-
const optionPrefixes = ['A', 'B', 'C', 'D', 'E'];
|
|
42
|
-
|
|
43
|
-
const formatTime = (totalSeconds: number) => {
|
|
44
|
-
const mins = Math.floor(totalSeconds / 60);
|
|
45
|
-
const secs = totalSeconds % 60;
|
|
46
|
-
if (mins > 0) {
|
|
47
|
-
return `${mins}m ${secs}s`;
|
|
48
|
-
}
|
|
49
|
-
return `${secs}s`;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
const handlePrevReview = () => {
|
|
53
|
-
if (selectedReviewIndex !== null && selectedReviewIndex > 0) {
|
|
54
|
-
setSelectedReviewIndex(selectedReviewIndex - 1);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const handleNextReview = () => {
|
|
59
|
-
if (selectedReviewIndex !== null && selectedReviewIndex < activeQuestions.length - 1) {
|
|
60
|
-
setSelectedReviewIndex(selectedReviewIndex + 1);
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
// --- Sub-View: Individual Question Detail Review ---
|
|
65
|
-
if (selectedReviewIndex !== null) {
|
|
66
|
-
const currentReviewQuestion = activeQuestions[selectedReviewIndex]!;
|
|
67
|
-
const userAnswerIdx = results.userAnswers[currentReviewQuestion.id];
|
|
68
|
-
// Removed unused isCorrect variable
|
|
69
|
-
|
|
70
|
-
return (
|
|
71
|
-
<SafeAreaView style={[styles.safeArea, { backgroundColor: theme.background }]}>
|
|
72
|
-
<StatusBar barStyle="dark-content" />
|
|
73
|
-
|
|
74
|
-
{/* Review Header */}
|
|
75
|
-
{!hideHeader && (
|
|
76
|
-
<View style={styles.header}>
|
|
77
|
-
<TouchableOpacity onPress={() => setSelectedReviewIndex(null)} style={styles.backButton}>
|
|
78
|
-
<Icon name="arrow-left" size={20} color={theme.textPrimary} />
|
|
79
|
-
</TouchableOpacity>
|
|
80
|
-
|
|
81
|
-
<Typography variant="h2" bold style={styles.headerTitle}>
|
|
82
|
-
QBank Analysis
|
|
83
|
-
</Typography>
|
|
84
|
-
|
|
85
|
-
<TouchableOpacity onPress={onClose} style={styles.closeButton}>
|
|
86
|
-
<Icon name="x-circle" size={24} color={theme.textSecondary} />
|
|
87
|
-
</TouchableOpacity>
|
|
88
|
-
</View>
|
|
89
|
-
)}
|
|
90
|
-
|
|
91
|
-
<ScrollView contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
|
|
92
|
-
|
|
93
|
-
{/* Question Index Meta */}
|
|
94
|
-
<View style={styles.metaRow}>
|
|
95
|
-
<Typography variant="caption" bold color={theme.textSecondary} style={styles.questionNumLabel}>
|
|
96
|
-
QUESTION {selectedReviewIndex + 1}/{activeQuestions.length}
|
|
97
|
-
</Typography>
|
|
98
|
-
<View style={styles.metaActions}>
|
|
99
|
-
<TouchableOpacity style={styles.metaActionBtn}>
|
|
100
|
-
<Icon name="bookmark" size={18} color={theme.textSecondary} />
|
|
101
|
-
</TouchableOpacity>
|
|
102
|
-
</View>
|
|
103
|
-
</View>
|
|
104
|
-
|
|
105
|
-
{/* Question text */}
|
|
106
|
-
<Typography variant="h2" bold color={theme.textPrimary} style={styles.questionText}>
|
|
107
|
-
{currentReviewQuestion.text}
|
|
108
|
-
</Typography>
|
|
109
|
-
|
|
110
|
-
{/* Optional microscope image */}
|
|
111
|
-
{currentReviewQuestion.imageUrl && (
|
|
112
|
-
<Image
|
|
113
|
-
source={{ uri: currentReviewQuestion.imageUrl }}
|
|
114
|
-
style={styles.questionImage}
|
|
115
|
-
resizeMode="cover"
|
|
116
|
-
/>
|
|
117
|
-
)}
|
|
118
|
-
|
|
119
|
-
{/* Options list showing correctness evaluations */}
|
|
120
|
-
<View style={styles.optionsList}>
|
|
121
|
-
{currentReviewQuestion.options.map((option, idx) => {
|
|
122
|
-
const isUserSelection = userAnswerIdx === idx;
|
|
123
|
-
const isCorrectAnswer = idx === currentReviewQuestion.correctOptionIndex;
|
|
124
|
-
|
|
125
|
-
let optionBg = '#FFFFFF';
|
|
126
|
-
let optionBorder = theme.border;
|
|
127
|
-
let labelColor = theme.textPrimary;
|
|
128
|
-
let prefixColor = theme.textSecondary;
|
|
129
|
-
let statText = '';
|
|
130
|
-
|
|
131
|
-
if (isCorrectAnswer) {
|
|
132
|
-
optionBg = '#E6F4F1'; // Tinted green bg
|
|
133
|
-
optionBorder = '#10B981'; // Green border
|
|
134
|
-
labelColor = '#065F46';
|
|
135
|
-
prefixColor = '#065F46';
|
|
136
|
-
statText = isUserSelection ? 'Your Correct Answer' : 'Correct Answer';
|
|
137
|
-
} else if (isUserSelection) {
|
|
138
|
-
optionBg = '#FEF2F2'; // Tinted red bg
|
|
139
|
-
optionBorder = '#EF4444'; // Red border
|
|
140
|
-
labelColor = '#991B1B';
|
|
141
|
-
prefixColor = '#991B1B';
|
|
142
|
-
statText = 'Your Incorrect Answer';
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return (
|
|
146
|
-
<View
|
|
147
|
-
key={idx}
|
|
148
|
-
style={[
|
|
149
|
-
styles.optionCard,
|
|
150
|
-
{
|
|
151
|
-
backgroundColor: optionBg,
|
|
152
|
-
borderColor: optionBorder,
|
|
153
|
-
},
|
|
154
|
-
]}
|
|
155
|
-
>
|
|
156
|
-
<View style={styles.optionRow}>
|
|
157
|
-
<Typography variant="body" bold color={prefixColor} style={styles.optionPrefix}>
|
|
158
|
-
{optionPrefixes[idx] || idx + 1}
|
|
159
|
-
</Typography>
|
|
160
|
-
<Typography variant="body" color={labelColor} style={styles.optionText}>
|
|
161
|
-
{option}
|
|
162
|
-
</Typography>
|
|
163
|
-
</View>
|
|
164
|
-
|
|
165
|
-
{statText !== '' && (
|
|
166
|
-
<View style={styles.statBadgeRow}>
|
|
167
|
-
<Typography variant="caption" bold color={isCorrectAnswer ? '#10B981' : '#EF4444'}>
|
|
168
|
-
{statText}
|
|
169
|
-
</Typography>
|
|
170
|
-
</View>
|
|
171
|
-
)}
|
|
172
|
-
</View>
|
|
173
|
-
);
|
|
174
|
-
})}
|
|
175
|
-
</View>
|
|
176
|
-
|
|
177
|
-
{/* Explanation info */}
|
|
178
|
-
<View style={styles.explanationSection}>
|
|
179
|
-
<Typography variant="h2" bold color={theme.textPrimary} style={styles.explanationTitle}>
|
|
180
|
-
Explanation
|
|
181
|
-
</Typography>
|
|
182
|
-
<Typography variant="body" color={theme.textSecondary} style={styles.explanationBody}>
|
|
183
|
-
{currentReviewQuestion.explanation}
|
|
184
|
-
</Typography>
|
|
185
|
-
|
|
186
|
-
<Typography variant="h3" bold color={theme.textSecondary} style={styles.rxdxId}>
|
|
187
|
-
RXDX ID: R23082
|
|
188
|
-
</Typography>
|
|
189
|
-
</View>
|
|
190
|
-
|
|
191
|
-
</ScrollView>
|
|
192
|
-
|
|
193
|
-
{/* Previous and Next Navigation Footer */}
|
|
194
|
-
<View style={styles.footerRow}>
|
|
195
|
-
{/* Previous Button */}
|
|
196
|
-
<TouchableOpacity
|
|
197
|
-
onPress={handlePrevReview}
|
|
198
|
-
disabled={selectedReviewIndex === 0}
|
|
199
|
-
style={[styles.footerActionBtn, selectedReviewIndex === 0 && { opacity: 0.4 }]}
|
|
200
|
-
>
|
|
201
|
-
<Typography variant="body" bold color={theme.textPrimary}>
|
|
202
|
-
Previous
|
|
203
|
-
</Typography>
|
|
204
|
-
</TouchableOpacity>
|
|
205
|
-
|
|
206
|
-
{/* Back to summary */}
|
|
207
|
-
<TouchableOpacity
|
|
208
|
-
onPress={() => setSelectedReviewIndex(null)}
|
|
209
|
-
style={styles.backToListBtn}
|
|
210
|
-
>
|
|
211
|
-
<Typography variant="body" bold color={theme.primary}>
|
|
212
|
-
Back to Summary
|
|
213
|
-
</Typography>
|
|
214
|
-
</TouchableOpacity>
|
|
215
|
-
|
|
216
|
-
{/* Next Button */}
|
|
217
|
-
<TouchableOpacity
|
|
218
|
-
onPress={handleNextReview}
|
|
219
|
-
disabled={selectedReviewIndex === activeQuestions.length - 1}
|
|
220
|
-
style={[
|
|
221
|
-
styles.nextActionBtn,
|
|
222
|
-
{ backgroundColor: theme.primary },
|
|
223
|
-
selectedReviewIndex === activeQuestions.length - 1 && { opacity: 0.4 }
|
|
224
|
-
]}
|
|
225
|
-
>
|
|
226
|
-
<Typography variant="body" bold color="#FFFFFF">
|
|
227
|
-
Next
|
|
228
|
-
</Typography>
|
|
229
|
-
</TouchableOpacity>
|
|
230
|
-
</View>
|
|
231
|
-
</SafeAreaView>
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// --- Main View: Quiz Performance Scorecard & Summary List ---
|
|
236
|
-
return (
|
|
237
|
-
<SafeAreaView style={[styles.safeArea, { backgroundColor: theme.background }]}>
|
|
238
|
-
<StatusBar barStyle="dark-content" />
|
|
239
|
-
|
|
240
|
-
{/* Header */}
|
|
241
|
-
{!hideHeader && (
|
|
242
|
-
<View style={styles.header}>
|
|
243
|
-
<View style={styles.headerLeftPlaceholder} />
|
|
244
|
-
<Typography variant="h2" bold style={styles.headerTitleMain}>
|
|
245
|
-
QBank Analysis
|
|
246
|
-
</Typography>
|
|
247
|
-
<TouchableOpacity onPress={onClose} style={styles.closeButton}>
|
|
248
|
-
<Icon name="x-circle" size={24} color={theme.textSecondary} />
|
|
249
|
-
</TouchableOpacity>
|
|
250
|
-
</View>
|
|
251
|
-
)}
|
|
252
|
-
|
|
253
|
-
<ScrollView contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
|
|
254
|
-
|
|
255
|
-
{/* Scorecard Summary */}
|
|
256
|
-
<Card bordered style={styles.summaryCard}>
|
|
257
|
-
<View style={styles.summaryRow}>
|
|
258
|
-
<View style={styles.summaryLeft}>
|
|
259
|
-
<Typography variant="h1" bold color={theme.textPrimary}>
|
|
260
|
-
{getString('scorecardTitle') || 'Quiz Analysis'}
|
|
261
|
-
</Typography>
|
|
262
|
-
<Typography variant="body" color={theme.textSecondary} style={styles.summarySubtitle}>
|
|
263
|
-
{getString('resultsSubtitle') || 'Here is your QBank performance summary!'}
|
|
264
|
-
</Typography>
|
|
265
|
-
|
|
266
|
-
<View style={styles.statsContainer}>
|
|
267
|
-
<View style={styles.statBox}>
|
|
268
|
-
<Typography variant="caption" color={theme.textSecondary}>
|
|
269
|
-
{getString('correctAnswersCountLabel') || 'Correct Answers'}
|
|
270
|
-
</Typography>
|
|
271
|
-
<Typography variant="h2" bold color={theme.success} style={styles.statValue}>
|
|
272
|
-
{results.correctCount} / {results.totalQuestions}
|
|
273
|
-
</Typography>
|
|
274
|
-
</View>
|
|
275
|
-
|
|
276
|
-
<View style={styles.statBox}>
|
|
277
|
-
<Typography variant="caption" color={theme.textSecondary}>
|
|
278
|
-
{getString('timeSpentLabel') || 'Time Spent'}
|
|
279
|
-
</Typography>
|
|
280
|
-
<Typography variant="h2" bold color={theme.textPrimary} style={styles.statValue}>
|
|
281
|
-
{formatTime(results.timeSpentSeconds)}
|
|
282
|
-
</Typography>
|
|
283
|
-
</View>
|
|
284
|
-
</View>
|
|
285
|
-
</View>
|
|
286
|
-
|
|
287
|
-
<View style={styles.summaryRight}>
|
|
288
|
-
<CircularProgress
|
|
289
|
-
progress={results.accuracy / 100}
|
|
290
|
-
size={84}
|
|
291
|
-
strokeWidth={8}
|
|
292
|
-
color={results.accuracy >= 60 ? theme.success : theme.warning}
|
|
293
|
-
backgroundColor={theme.secondary}
|
|
294
|
-
textStyle={{ fontSize: 16 }}
|
|
295
|
-
/>
|
|
296
|
-
<Typography variant="caption" color={theme.textSecondary} style={styles.accuracyText}>
|
|
297
|
-
{getString('accuracyLabel') || 'Accuracy'}
|
|
298
|
-
</Typography>
|
|
299
|
-
</View>
|
|
300
|
-
</View>
|
|
301
|
-
</Card>
|
|
302
|
-
|
|
303
|
-
{/* Detailed Question Review List */}
|
|
304
|
-
<View style={styles.sectionHeader}>
|
|
305
|
-
<Typography variant="h2" bold>
|
|
306
|
-
Questions Summary
|
|
307
|
-
</Typography>
|
|
308
|
-
</View>
|
|
309
|
-
|
|
310
|
-
<View style={styles.reviewList}>
|
|
311
|
-
{activeQuestions.map((question, idx) => {
|
|
312
|
-
const userAnswerIdx = results.userAnswers[question.id];
|
|
313
|
-
const isCorrect = userAnswerIdx === question.correctOptionIndex;
|
|
314
|
-
|
|
315
|
-
return (
|
|
316
|
-
<TouchableOpacity
|
|
317
|
-
key={question.id}
|
|
318
|
-
activeOpacity={0.8}
|
|
319
|
-
onPress={() => setSelectedReviewIndex(idx)}
|
|
320
|
-
>
|
|
321
|
-
<Card bordered style={styles.reviewCard}>
|
|
322
|
-
<View style={styles.reviewCardHeader}>
|
|
323
|
-
<View style={[styles.questionNumBadge, { backgroundColor: theme.secondary }]}>
|
|
324
|
-
<Typography variant="caption" bold color={theme.primary}>
|
|
325
|
-
Q{idx + 1}
|
|
326
|
-
</Typography>
|
|
327
|
-
</View>
|
|
328
|
-
|
|
329
|
-
<View style={styles.statusBadge}>
|
|
330
|
-
<Icon
|
|
331
|
-
name={isCorrect ? 'check-circle' : 'x-circle'}
|
|
332
|
-
size={18}
|
|
333
|
-
color={isCorrect ? theme.success : theme.danger}
|
|
334
|
-
/>
|
|
335
|
-
<Typography
|
|
336
|
-
variant="caption"
|
|
337
|
-
bold
|
|
338
|
-
color={isCorrect ? theme.success : theme.danger}
|
|
339
|
-
style={styles.statusBadgeText}
|
|
340
|
-
>
|
|
341
|
-
{isCorrect ? 'Correct' : 'Incorrect'}
|
|
342
|
-
</Typography>
|
|
343
|
-
</View>
|
|
344
|
-
</View>
|
|
345
|
-
|
|
346
|
-
<Typography variant="body" bold style={styles.reviewQuestionText}>
|
|
347
|
-
{question.text}
|
|
348
|
-
</Typography>
|
|
349
|
-
|
|
350
|
-
<View style={styles.userSelectionContainer}>
|
|
351
|
-
<Typography variant="caption" color={theme.textSecondary}>
|
|
352
|
-
Your answer:{' '}
|
|
353
|
-
<Typography variant="caption" bold color={isCorrect ? theme.success : theme.danger}>
|
|
354
|
-
{userAnswerIdx !== undefined
|
|
355
|
-
? `Option ${optionPrefixes[userAnswerIdx] || userAnswerIdx + 1}`
|
|
356
|
-
: 'Skipped'}
|
|
357
|
-
</Typography>
|
|
358
|
-
</Typography>
|
|
359
|
-
|
|
360
|
-
{!isCorrect && (
|
|
361
|
-
<Typography variant="caption" color={theme.textSecondary} style={styles.correctAnswerText}>
|
|
362
|
-
Correct answer:{' '}
|
|
363
|
-
<Typography variant="caption" bold color={theme.success}>
|
|
364
|
-
Option {optionPrefixes[question.correctOptionIndex] || question.correctOptionIndex + 1}
|
|
365
|
-
</Typography>
|
|
366
|
-
</Typography>
|
|
367
|
-
)}
|
|
368
|
-
</View>
|
|
369
|
-
</Card>
|
|
370
|
-
</TouchableOpacity>
|
|
371
|
-
);
|
|
372
|
-
})}
|
|
373
|
-
</View>
|
|
374
|
-
|
|
375
|
-
</ScrollView>
|
|
376
|
-
|
|
377
|
-
{/* Footer Controls */}
|
|
378
|
-
<View style={[styles.footer, { backgroundColor: theme.cardBackground, borderTopColor: theme.border }]}>
|
|
379
|
-
<Button
|
|
380
|
-
title="Back to Dashboard"
|
|
381
|
-
onPress={onClose}
|
|
382
|
-
variant="primary"
|
|
383
|
-
style={styles.homeBtn}
|
|
384
|
-
/>
|
|
385
|
-
</View>
|
|
386
|
-
</SafeAreaView>
|
|
387
|
-
);
|
|
388
|
-
};
|
|
389
|
-
|
|
390
|
-
const styles = StyleSheet.create({
|
|
391
|
-
safeArea: {
|
|
392
|
-
flex: 1,
|
|
393
|
-
},
|
|
394
|
-
header: {
|
|
395
|
-
flexDirection: 'row',
|
|
396
|
-
justifyContent: 'space-between',
|
|
397
|
-
alignItems: 'center',
|
|
398
|
-
paddingHorizontal: 16,
|
|
399
|
-
paddingVertical: 12,
|
|
400
|
-
},
|
|
401
|
-
backButton: {
|
|
402
|
-
padding: 6,
|
|
403
|
-
},
|
|
404
|
-
closeButton: {
|
|
405
|
-
padding: 6,
|
|
406
|
-
},
|
|
407
|
-
headerTitle: {
|
|
408
|
-
fontSize: 18,
|
|
409
|
-
fontWeight: '700',
|
|
410
|
-
},
|
|
411
|
-
headerTitleMain: {
|
|
412
|
-
fontSize: 18,
|
|
413
|
-
fontWeight: '700',
|
|
414
|
-
},
|
|
415
|
-
headerLeftPlaceholder: {
|
|
416
|
-
width: 36,
|
|
417
|
-
},
|
|
418
|
-
scrollContent: {
|
|
419
|
-
paddingHorizontal: 16,
|
|
420
|
-
paddingTop: 12,
|
|
421
|
-
paddingBottom: 40,
|
|
422
|
-
},
|
|
423
|
-
summaryCard: {
|
|
424
|
-
padding: 20,
|
|
425
|
-
borderRadius: 20,
|
|
426
|
-
},
|
|
427
|
-
summaryRow: {
|
|
428
|
-
flexDirection: 'row',
|
|
429
|
-
justifyContent: 'space-between',
|
|
430
|
-
alignItems: 'center',
|
|
431
|
-
},
|
|
432
|
-
summaryLeft: {
|
|
433
|
-
flex: 1,
|
|
434
|
-
paddingRight: 16,
|
|
435
|
-
},
|
|
436
|
-
summarySubtitle: {
|
|
437
|
-
marginTop: 4,
|
|
438
|
-
marginBottom: 16,
|
|
439
|
-
fontSize: 12,
|
|
440
|
-
},
|
|
441
|
-
statsContainer: {
|
|
442
|
-
flexDirection: 'row',
|
|
443
|
-
},
|
|
444
|
-
statBox: {
|
|
445
|
-
marginRight: 24,
|
|
446
|
-
},
|
|
447
|
-
statValue: {
|
|
448
|
-
fontSize: 18,
|
|
449
|
-
marginTop: 2,
|
|
450
|
-
},
|
|
451
|
-
summaryRight: {
|
|
452
|
-
alignItems: 'center',
|
|
453
|
-
justifyContent: 'center',
|
|
454
|
-
},
|
|
455
|
-
accuracyText: {
|
|
456
|
-
marginTop: 8,
|
|
457
|
-
fontWeight: '600',
|
|
458
|
-
},
|
|
459
|
-
sectionHeader: {
|
|
460
|
-
marginTop: 24,
|
|
461
|
-
marginBottom: 12,
|
|
462
|
-
},
|
|
463
|
-
reviewList: {
|
|
464
|
-
marginTop: 4,
|
|
465
|
-
},
|
|
466
|
-
reviewCard: {
|
|
467
|
-
padding: 16,
|
|
468
|
-
marginBottom: 12,
|
|
469
|
-
borderRadius: 16,
|
|
470
|
-
},
|
|
471
|
-
reviewCardHeader: {
|
|
472
|
-
flexDirection: 'row',
|
|
473
|
-
justifyContent: 'space-between',
|
|
474
|
-
alignItems: 'center',
|
|
475
|
-
marginBottom: 10,
|
|
476
|
-
},
|
|
477
|
-
questionNumBadge: {
|
|
478
|
-
paddingHorizontal: 8,
|
|
479
|
-
paddingVertical: 4,
|
|
480
|
-
borderRadius: 8,
|
|
481
|
-
},
|
|
482
|
-
statusBadge: {
|
|
483
|
-
flexDirection: 'row',
|
|
484
|
-
alignItems: 'center',
|
|
485
|
-
},
|
|
486
|
-
statusBadgeText: {
|
|
487
|
-
marginLeft: 6,
|
|
488
|
-
},
|
|
489
|
-
reviewQuestionText: {
|
|
490
|
-
fontSize: 14,
|
|
491
|
-
lineHeight: 20,
|
|
492
|
-
marginBottom: 10,
|
|
493
|
-
},
|
|
494
|
-
userSelectionContainer: {
|
|
495
|
-
backgroundColor: '#F8FAFC',
|
|
496
|
-
padding: 10,
|
|
497
|
-
borderRadius: 8,
|
|
498
|
-
},
|
|
499
|
-
correctAnswerText: {
|
|
500
|
-
marginTop: 4,
|
|
501
|
-
},
|
|
502
|
-
footer: {
|
|
503
|
-
paddingHorizontal: 16,
|
|
504
|
-
paddingVertical: 14,
|
|
505
|
-
borderTopWidth: 1,
|
|
506
|
-
backgroundColor: '#FFFFFF',
|
|
507
|
-
},
|
|
508
|
-
homeBtn: {
|
|
509
|
-
width: '100%',
|
|
510
|
-
height: 48,
|
|
511
|
-
justifyContent: 'center',
|
|
512
|
-
alignItems: 'center',
|
|
513
|
-
borderRadius: 24, // Matches "Back to Dashboard" rounded pill button
|
|
514
|
-
},
|
|
515
|
-
// --- Detailed Review Screen Styles ---
|
|
516
|
-
metaRow: {
|
|
517
|
-
flexDirection: 'row',
|
|
518
|
-
justifyContent: 'space-between',
|
|
519
|
-
alignItems: 'center',
|
|
520
|
-
marginBottom: 12,
|
|
521
|
-
},
|
|
522
|
-
questionNumLabel: {
|
|
523
|
-
fontSize: 12,
|
|
524
|
-
letterSpacing: 0.8,
|
|
525
|
-
},
|
|
526
|
-
metaActions: {
|
|
527
|
-
flexDirection: 'row',
|
|
528
|
-
alignItems: 'center',
|
|
529
|
-
},
|
|
530
|
-
metaActionBtn: {
|
|
531
|
-
padding: 6,
|
|
532
|
-
},
|
|
533
|
-
questionText: {
|
|
534
|
-
fontSize: 16,
|
|
535
|
-
lineHeight: 22,
|
|
536
|
-
marginBottom: 14,
|
|
537
|
-
},
|
|
538
|
-
questionImage: {
|
|
539
|
-
width: '100%',
|
|
540
|
-
height: 180,
|
|
541
|
-
borderRadius: 12,
|
|
542
|
-
marginBottom: 16,
|
|
543
|
-
backgroundColor: '#F8FAFC',
|
|
544
|
-
},
|
|
545
|
-
optionsList: {
|
|
546
|
-
marginBottom: 12,
|
|
547
|
-
},
|
|
548
|
-
optionCard: {
|
|
549
|
-
borderWidth: 1,
|
|
550
|
-
borderRadius: 10,
|
|
551
|
-
padding: 12,
|
|
552
|
-
marginBottom: 10,
|
|
553
|
-
},
|
|
554
|
-
optionRow: {
|
|
555
|
-
flexDirection: 'row',
|
|
556
|
-
alignItems: 'flex-start',
|
|
557
|
-
},
|
|
558
|
-
optionPrefix: {
|
|
559
|
-
width: 24,
|
|
560
|
-
fontSize: 14,
|
|
561
|
-
fontWeight: '600',
|
|
562
|
-
},
|
|
563
|
-
optionText: {
|
|
564
|
-
flex: 1,
|
|
565
|
-
fontSize: 14,
|
|
566
|
-
lineHeight: 18,
|
|
567
|
-
},
|
|
568
|
-
statBadgeRow: {
|
|
569
|
-
marginTop: 6,
|
|
570
|
-
paddingLeft: 24,
|
|
571
|
-
},
|
|
572
|
-
explanationSection: {
|
|
573
|
-
marginTop: 14,
|
|
574
|
-
paddingTop: 14,
|
|
575
|
-
borderTopWidth: 1,
|
|
576
|
-
borderTopColor: '#E2E8F0',
|
|
577
|
-
},
|
|
578
|
-
explanationTitle: {
|
|
579
|
-
fontSize: 15,
|
|
580
|
-
marginBottom: 6,
|
|
581
|
-
},
|
|
582
|
-
explanationBody: {
|
|
583
|
-
fontSize: 13,
|
|
584
|
-
lineHeight: 18,
|
|
585
|
-
marginBottom: 16,
|
|
586
|
-
},
|
|
587
|
-
rxdxId: {
|
|
588
|
-
fontSize: 12,
|
|
589
|
-
textAlign: 'center',
|
|
590
|
-
marginTop: 12,
|
|
591
|
-
},
|
|
592
|
-
footerRow: {
|
|
593
|
-
flexDirection: 'row',
|
|
594
|
-
alignItems: 'center',
|
|
595
|
-
paddingHorizontal: 16,
|
|
596
|
-
paddingVertical: 12,
|
|
597
|
-
backgroundColor: '#FFFFFF',
|
|
598
|
-
borderTopWidth: 1,
|
|
599
|
-
borderTopColor: '#E2E8F0',
|
|
600
|
-
justifyContent: 'space-between',
|
|
601
|
-
},
|
|
602
|
-
footerActionBtn: {
|
|
603
|
-
paddingVertical: 8,
|
|
604
|
-
paddingHorizontal: 12,
|
|
605
|
-
},
|
|
606
|
-
backToListBtn: {
|
|
607
|
-
paddingVertical: 8,
|
|
608
|
-
paddingHorizontal: 12,
|
|
609
|
-
},
|
|
610
|
-
nextActionBtn: {
|
|
611
|
-
paddingHorizontal: 24,
|
|
612
|
-
paddingVertical: 10,
|
|
613
|
-
borderRadius: 8,
|
|
614
|
-
minWidth: 80,
|
|
615
|
-
justifyContent: 'center',
|
|
616
|
-
alignItems: 'center',
|
|
617
|
-
},
|
|
618
|
-
});
|