react-native-elearn-ui 0.1.11 → 0.1.13

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.
Files changed (60) hide show
  1. package/lib/module/index.js +1 -1
  2. package/lib/module/index.js.map +1 -1
  3. package/lib/module/screens/HomeScreen.js +672 -662
  4. package/lib/module/screens/HomeScreen.js.map +1 -1
  5. package/lib/module/screens/index.js +0 -8
  6. package/lib/module/screens/index.js.map +1 -1
  7. package/lib/typescript/src/index.d.ts +1 -1
  8. package/lib/typescript/src/index.d.ts.map +1 -1
  9. package/lib/typescript/src/screens/HomeScreen.d.ts.map +1 -1
  10. package/lib/typescript/src/screens/index.d.ts +0 -8
  11. package/lib/typescript/src/screens/index.d.ts.map +1 -1
  12. package/package.json +1 -1
  13. package/src/index.tsx +0 -8
  14. package/src/screens/HomeScreen.tsx +471 -534
  15. package/src/screens/index.ts +0 -8
  16. package/lib/module/screens/PearlChaptersScreen.js +0 -359
  17. package/lib/module/screens/PearlChaptersScreen.js.map +0 -1
  18. package/lib/module/screens/PearlReaderScreen.js +0 -313
  19. package/lib/module/screens/PearlReaderScreen.js.map +0 -1
  20. package/lib/module/screens/PearlsScreen.js +0 -153
  21. package/lib/module/screens/PearlsScreen.js.map +0 -1
  22. package/lib/module/screens/QbankScreen.js +0 -370
  23. package/lib/module/screens/QbankScreen.js.map +0 -1
  24. package/lib/module/screens/QuestionScreen.js +0 -437
  25. package/lib/module/screens/QuestionScreen.js.map +0 -1
  26. package/lib/module/screens/QuizStartScreen.js +0 -283
  27. package/lib/module/screens/QuizStartScreen.js.map +0 -1
  28. package/lib/module/screens/ResultScreen.js +0 -646
  29. package/lib/module/screens/ResultScreen.js.map +0 -1
  30. package/lib/module/screens/TopicListScreen.js +0 -420
  31. package/lib/module/screens/TopicListScreen.js.map +0 -1
  32. package/lib/module/screens/pearlsMockData.js +0 -77
  33. package/lib/module/screens/pearlsMockData.js.map +0 -1
  34. package/lib/typescript/src/screens/PearlChaptersScreen.d.ts +0 -13
  35. package/lib/typescript/src/screens/PearlChaptersScreen.d.ts.map +0 -1
  36. package/lib/typescript/src/screens/PearlReaderScreen.d.ts +0 -14
  37. package/lib/typescript/src/screens/PearlReaderScreen.d.ts.map +0 -1
  38. package/lib/typescript/src/screens/PearlsScreen.d.ts +0 -11
  39. package/lib/typescript/src/screens/PearlsScreen.d.ts.map +0 -1
  40. package/lib/typescript/src/screens/QbankScreen.d.ts +0 -10
  41. package/lib/typescript/src/screens/QbankScreen.d.ts.map +0 -1
  42. package/lib/typescript/src/screens/QuestionScreen.d.ts +0 -14
  43. package/lib/typescript/src/screens/QuestionScreen.d.ts.map +0 -1
  44. package/lib/typescript/src/screens/QuizStartScreen.d.ts +0 -14
  45. package/lib/typescript/src/screens/QuizStartScreen.d.ts.map +0 -1
  46. package/lib/typescript/src/screens/ResultScreen.d.ts +0 -13
  47. package/lib/typescript/src/screens/ResultScreen.d.ts.map +0 -1
  48. package/lib/typescript/src/screens/TopicListScreen.d.ts +0 -12
  49. package/lib/typescript/src/screens/TopicListScreen.d.ts.map +0 -1
  50. package/lib/typescript/src/screens/pearlsMockData.d.ts +0 -3
  51. package/lib/typescript/src/screens/pearlsMockData.d.ts.map +0 -1
  52. package/src/screens/PearlChaptersScreen.tsx +0 -330
  53. package/src/screens/PearlReaderScreen.tsx +0 -306
  54. package/src/screens/PearlsScreen.tsx +0 -147
  55. package/src/screens/QbankScreen.tsx +0 -327
  56. package/src/screens/QuestionScreen.tsx +0 -423
  57. package/src/screens/QuizStartScreen.tsx +0 -260
  58. package/src/screens/ResultScreen.tsx +0 -618
  59. package/src/screens/TopicListScreen.tsx +0 -388
  60. package/src/screens/pearlsMockData.ts +0 -70
@@ -1,147 +0,0 @@
1
- import React from 'react';
2
- import {
3
- View,
4
- ScrollView,
5
- StyleSheet,
6
- TouchableOpacity,
7
- StatusBar,
8
- } from 'react-native';
9
- import { SafeAreaView } from 'react-native-safe-area-context';
10
- import { useElearnConfig } from '../context/ElearnConfigContext';
11
- import { useTheme } from '../context/ThemeContext';
12
- import { Typography, Card, Icon } from '../components';
13
- import { MOCK_PEARLS_TOPICS } from './pearlsMockData';
14
- import type { PearlTopic } from '../types';
15
-
16
- interface PearlsScreenProps {
17
- onBack?: () => void;
18
- hideHeader?: boolean;
19
- onSelectTopic?: (topic: PearlTopic) => void;
20
- title?: string;
21
- }
22
-
23
- export const PearlsScreen: React.FC<PearlsScreenProps> = ({
24
- onBack,
25
- hideHeader = false,
26
- onSelectTopic,
27
- title = 'Pearls',
28
- }) => {
29
- const { callbacks } = useElearnConfig();
30
- const theme = useTheme();
31
-
32
- const handleBackPress = () => {
33
- if (onBack) {
34
- onBack();
35
- } else {
36
- callbacks.onBackToDashboard?.();
37
- }
38
- };
39
-
40
- return (
41
- <SafeAreaView style={[styles.safeArea, { backgroundColor: theme.background }]}>
42
- <StatusBar barStyle="dark-content" />
43
-
44
- {/* Header */}
45
- {!hideHeader && (
46
- <View style={styles.header}>
47
- <TouchableOpacity onPress={handleBackPress} style={styles.backButton}>
48
- <Icon name="arrow-left" size={20} color={theme.textPrimary} />
49
- </TouchableOpacity>
50
-
51
- <Typography variant="h2" bold style={styles.headerTitle}>
52
- {title}
53
- </Typography>
54
-
55
- <TouchableOpacity style={styles.headerRightBtn}>
56
- <Icon name="search" size={20} color={theme.textPrimary} />
57
- </TouchableOpacity>
58
- </View>
59
- )}
60
-
61
- {/* Topics list view */}
62
- <ScrollView contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
63
- <Typography variant="h2" bold color={theme.textPrimary} style={styles.sectionHeaderTitle}>
64
- All Topics
65
- </Typography>
66
-
67
- <View style={styles.listContainer}>
68
- {MOCK_PEARLS_TOPICS.map((topic) => (
69
- <TouchableOpacity
70
- key={topic.id}
71
- activeOpacity={0.8}
72
- onPress={() => onSelectTopic?.(topic)}
73
- >
74
- <Card bordered style={styles.topicCard}>
75
- <View style={styles.topicRow}>
76
- {/* Left Circle Icon */}
77
- <View style={[styles.iconCircle, { backgroundColor: 'rgba(59, 130, 246, 0.08)' }]}>
78
- <Icon name="file-text" size={16} color="#3B82F6" />
79
- </View>
80
- {/* Right label */}
81
- <Typography variant="body" bold color={theme.textPrimary} style={styles.topicLabelText}>
82
- {topic.title}
83
- </Typography>
84
- </View>
85
- </Card>
86
- </TouchableOpacity>
87
- ))}
88
- </View>
89
- </ScrollView>
90
- </SafeAreaView>
91
- );
92
- };
93
-
94
- const styles = StyleSheet.create({
95
- safeArea: {
96
- flex: 1,
97
- },
98
- header: {
99
- flexDirection: 'row',
100
- justifyContent: 'space-between',
101
- alignItems: 'center',
102
- paddingHorizontal: 16,
103
- paddingVertical: 12,
104
- },
105
- backButton: {
106
- padding: 6,
107
- },
108
- headerTitle: {
109
- fontSize: 18,
110
- fontWeight: '700',
111
- },
112
- headerRightBtn: {
113
- padding: 6,
114
- },
115
- scrollContent: {
116
- paddingHorizontal: 16,
117
- paddingTop: 8,
118
- paddingBottom: 24,
119
- },
120
- sectionHeaderTitle: {
121
- fontSize: 16,
122
- marginBottom: 16,
123
- },
124
- listContainer: {
125
- marginTop: 4,
126
- },
127
- topicCard: {
128
- padding: 14,
129
- marginBottom: 10,
130
- borderRadius: 12,
131
- },
132
- topicRow: {
133
- flexDirection: 'row',
134
- alignItems: 'center',
135
- },
136
- iconCircle: {
137
- width: 36,
138
- height: 36,
139
- borderRadius: 18,
140
- justifyContent: 'center',
141
- alignItems: 'center',
142
- marginRight: 14,
143
- },
144
- topicLabelText: {
145
- fontSize: 14,
146
- },
147
- });
@@ -1,327 +0,0 @@
1
- import React 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 { useElearnConfig } from '../context/ElearnConfigContext';
12
- import { useTheme } from '../context/ThemeContext';
13
- import { Typography, Card, ProgressBar, Icon } from '../components';
14
- import type { IconName } from '../components';
15
- import type { Course } from '../types';
16
-
17
- interface QbankScreenProps {
18
- hideHeader?: boolean;
19
- onBack?: () => void;
20
- onSelectCourse?: (course: Course) => void;
21
- }
22
-
23
- export const QbankScreen: React.FC<QbankScreenProps> = ({
24
- hideHeader = false,
25
- onBack,
26
- onSelectCourse,
27
- }) => {
28
- const { config, callbacks } = useElearnConfig();
29
- const theme = useTheme();
30
-
31
- const courses = config.courses || [];
32
-
33
- const handleBack = () => {
34
- if (onBack) {
35
- onBack();
36
- } else {
37
- callbacks.onBackToDashboard?.();
38
- }
39
- };
40
-
41
- return (
42
- <SafeAreaView style={[styles.safeArea, { backgroundColor: theme.background }]}>
43
- <StatusBar barStyle="dark-content" />
44
-
45
- {/* Header */}
46
- {!hideHeader && (
47
- <View style={styles.header}>
48
- <TouchableOpacity
49
- onPress={handleBack}
50
- style={[styles.backButton, { borderColor: theme.border }]}
51
- >
52
- <Icon name="arrow-left" size={20} color={theme.textPrimary} />
53
- </TouchableOpacity>
54
- <Typography variant="h2" bold style={styles.headerTitle}>
55
- QBank
56
- </Typography>
57
- <TouchableOpacity style={styles.searchButton}>
58
- <Icon name="search" size={20} color={theme.textPrimary} />
59
- </TouchableOpacity>
60
- </View>
61
- )}
62
-
63
- <ScrollView contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
64
-
65
- {/* Promoted Premium Card */}
66
- <Card style={styles.premiumCard}>
67
- <View style={styles.premiumTextContainer}>
68
- <Typography variant="h2" bold color={theme.textPrimary} style={styles.premiumTitle}>
69
- More than 100+ Courses in premium
70
- </Typography>
71
- <Typography variant="caption" color={theme.textSecondary} style={styles.premiumSub}>
72
- Advance your skills with top-rated, expert-led courses anytime
73
- </Typography>
74
- <TouchableOpacity style={[styles.premiumBtn, { backgroundColor: theme.primary }]}>
75
- <Typography variant="caption" bold color="#FFFFFF">
76
- Get Premium
77
- </Typography>
78
- </TouchableOpacity>
79
- </View>
80
- <View style={styles.premiumImageContainer}>
81
- <Image
82
- source={{ uri: 'https://images.unsplash.com/photo-1559839734-2b71ea197ec2?q=80&w=200&auto=format&fit=crop' }}
83
- style={styles.premiumImage}
84
- />
85
- </View>
86
- </Card>
87
-
88
- {/* Quick Options */}
89
- <View style={styles.optionsRow}>
90
- <TouchableOpacity style={styles.optionBtn}>
91
- <View style={[styles.optionIconContainer, { backgroundColor: 'rgba(59, 130, 246, 0.1)' }]}>
92
- <Icon name="bookmark" size={18} color="#3B82F6" />
93
- </View>
94
- <Typography variant="caption" bold color={theme.textPrimary} style={styles.optionLabel}>
95
- Bookmark
96
- </Typography>
97
- </TouchableOpacity>
98
-
99
- <TouchableOpacity style={styles.optionBtn}>
100
- <View style={[styles.optionIconContainer, { backgroundColor: 'rgba(16, 185, 129, 0.1)' }]}>
101
- <Icon name="clipboard" size={18} color="#10B981" strokeWidth={1.5} />
102
- </View>
103
- <Typography variant="caption" bold color={theme.textPrimary} style={styles.optionLabel}>
104
- Costume module
105
- </Typography>
106
- </TouchableOpacity>
107
-
108
- <TouchableOpacity style={styles.optionBtn}>
109
- <View style={[styles.optionIconContainer, { backgroundColor: 'rgba(168, 85, 247, 0.1)' }]}>
110
- <Icon name="activity" size={18} color="#A855F7" />
111
- </View>
112
- <Typography variant="caption" bold color={theme.textPrimary} style={styles.optionLabel}>
113
- Track Qbank
114
- </Typography>
115
- </TouchableOpacity>
116
- </View>
117
-
118
- {/* Subjects List */}
119
- <View style={styles.listContainer}>
120
- {courses.map((course) => {
121
- const pct = Math.round(course.progress * 100);
122
-
123
- // Map course icon name or fall back to diamond
124
- let iconName: IconName = 'diamond';
125
- let iconBg = 'rgba(249, 115, 22, 0.1)';
126
- let iconColor = '#F97316';
127
-
128
- const titleLower = course.title.toLowerCase();
129
- if (titleLower.includes('anatomy')) {
130
- iconName = 'diamond';
131
- iconBg = 'rgba(251, 146, 60, 0.1)';
132
- iconColor = '#EA580C';
133
- } else if (titleLower.includes('biochem')) {
134
- iconName = 'dna';
135
- iconBg = 'rgba(168, 85, 247, 0.1)';
136
- iconColor = '#A855F7';
137
- } else if (titleLower.includes('physio')) {
138
- iconName = 'user';
139
- iconBg = 'rgba(239, 68, 68, 0.1)';
140
- iconColor = '#EF4444';
141
- } else if (titleLower.includes('ophthalmology')) {
142
- iconName = 'eye';
143
- iconBg = 'rgba(59, 130, 246, 0.1)';
144
- iconColor = '#3B82F6';
145
- } else if (titleLower.includes('pharmacology')) {
146
- iconName = 'award';
147
- iconBg = 'rgba(245, 158, 11, 0.1)';
148
- iconColor = '#D97706';
149
- } else if (titleLower.includes('microbiology')) {
150
- iconName = 'atom';
151
- iconBg = 'rgba(236, 72, 153, 0.1)';
152
- iconColor = '#DB2777';
153
- } else if (titleLower.includes('pathology')) {
154
- iconName = 'flask';
155
- iconBg = 'rgba(20, 184, 166, 0.1)';
156
- iconColor = '#0D9488';
157
- }
158
-
159
- return (
160
- <Card
161
- key={course.id}
162
- bordered
163
- onPress={() => {
164
- if (onSelectCourse) {
165
- onSelectCourse(course);
166
- } else {
167
- callbacks.onSelectCourse?.(course);
168
- }
169
- }}
170
- style={styles.subjectCard}
171
- >
172
- <View style={styles.subjectRow}>
173
- {/* Left Icon Container */}
174
- <View style={[styles.subjectIconBox, { backgroundColor: iconBg }]}>
175
- <Icon name={iconName} size={22} color={iconColor} />
176
- </View>
177
-
178
- {/* Right Content */}
179
- <View style={styles.subjectInfo}>
180
- <Typography variant="h3" bold color={theme.textPrimary} style={styles.subjectTitle}>
181
- {course.title}
182
- </Typography>
183
-
184
- <ProgressBar progress={course.progress} height={6} style={styles.subjectProgressBar} />
185
-
186
- <View style={styles.subjectStatsRow}>
187
- <Typography variant="caption" color={theme.textSecondary}>
188
- {course.completedQuestions} / {course.totalQuestions} Modules
189
- </Typography>
190
- <Typography variant="caption" bold color={theme.textPrimary}>
191
- {pct}%
192
- </Typography>
193
- </View>
194
- </View>
195
- </View>
196
- </Card>
197
- );
198
- })}
199
- </View>
200
-
201
- </ScrollView>
202
- </SafeAreaView>
203
- );
204
- };
205
-
206
- const styles = StyleSheet.create({
207
- safeArea: {
208
- flex: 1,
209
- },
210
- header: {
211
- flexDirection: 'row',
212
- justifyContent: 'space-between',
213
- alignItems: 'center',
214
- paddingHorizontal: 16,
215
- paddingVertical: 12,
216
- },
217
- backButton: {
218
- padding: 6,
219
- },
220
- headerTitle: {
221
- fontSize: 18,
222
- fontWeight: '700',
223
- },
224
- searchButton: {
225
- padding: 6,
226
- },
227
- scrollContent: {
228
- paddingHorizontal: 16,
229
- paddingBottom: 24,
230
- },
231
- premiumCard: {
232
- flexDirection: 'row',
233
- backgroundColor: '#FFFFFF',
234
- borderRadius: 16,
235
- padding: 16,
236
- marginTop: 12,
237
- borderWidth: 1,
238
- borderColor: '#E2E8F0',
239
- },
240
- premiumTextContainer: {
241
- flex: 1.3,
242
- justifyContent: 'center',
243
- },
244
- premiumTitle: {
245
- fontSize: 15,
246
- lineHeight: 19,
247
- marginBottom: 4,
248
- },
249
- premiumSub: {
250
- fontSize: 11,
251
- lineHeight: 14,
252
- marginBottom: 10,
253
- },
254
- premiumBtn: {
255
- alignSelf: 'flex-start',
256
- paddingHorizontal: 12,
257
- paddingVertical: 6,
258
- borderRadius: 8,
259
- },
260
- premiumImageContainer: {
261
- flex: 0.7,
262
- justifyContent: 'center',
263
- alignItems: 'center',
264
- },
265
- premiumImage: {
266
- width: 70,
267
- height: 70,
268
- borderRadius: 35,
269
- backgroundColor: '#E9D5FF', // Light purple
270
- },
271
- optionsRow: {
272
- flexDirection: 'row',
273
- justifyContent: 'space-between',
274
- marginVertical: 16,
275
- },
276
- optionBtn: {
277
- flex: 1,
278
- alignItems: 'center',
279
- },
280
- optionIconContainer: {
281
- width: 44,
282
- height: 44,
283
- borderRadius: 22,
284
- justifyContent: 'center',
285
- alignItems: 'center',
286
- marginBottom: 6,
287
- },
288
- optionLabel: {
289
- fontSize: 12,
290
- },
291
- listContainer: {
292
- marginTop: 4,
293
- },
294
- subjectCard: {
295
- padding: 10,
296
- marginBottom: 8,
297
- borderRadius: 12,
298
- },
299
- subjectRow: {
300
- flexDirection: 'row',
301
- alignItems: 'center',
302
- },
303
- subjectIconBox: {
304
- width: 40,
305
- height: 40,
306
- borderRadius: 10,
307
- justifyContent: 'center',
308
- alignItems: 'center',
309
- marginRight: 12,
310
- },
311
- subjectInfo: {
312
- flex: 1,
313
- },
314
- subjectTitle: {
315
- fontSize: 14,
316
- marginBottom: 2,
317
- },
318
- subjectProgressBar: {
319
- marginVertical: 2,
320
- },
321
- subjectStatsRow: {
322
- flexDirection: 'row',
323
- justifyContent: 'space-between',
324
- alignItems: 'center',
325
- marginTop: 2,
326
- },
327
- });