react-native-elearn-ui 0.1.41 → 0.1.43

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 (38) hide show
  1. package/lib/module/index.js +1 -1
  2. package/lib/module/index.js.map +1 -1
  3. package/lib/module/screens/index.js +1 -0
  4. package/lib/module/screens/index.js.map +1 -1
  5. package/lib/module/screens/notes/NotesDetailScreen.js +297 -0
  6. package/lib/module/screens/notes/NotesDetailScreen.js.map +1 -0
  7. package/lib/module/screens/notes/NotesSubTopicScreen.js +192 -0
  8. package/lib/module/screens/notes/NotesSubTopicScreen.js.map +1 -0
  9. package/lib/module/screens/notes/NotesTopicScreen.js +198 -0
  10. package/lib/module/screens/notes/NotesTopicScreen.js.map +1 -0
  11. package/lib/module/screens/notes/index.js +6 -0
  12. package/lib/module/screens/notes/index.js.map +1 -0
  13. package/lib/module/screens/qbank/QBankOverviewScreen.js +4 -6
  14. package/lib/module/screens/qbank/QBankOverviewScreen.js.map +1 -1
  15. package/lib/typescript/src/index.d.ts +1 -1
  16. package/lib/typescript/src/index.d.ts.map +1 -1
  17. package/lib/typescript/src/screens/index.d.ts +1 -0
  18. package/lib/typescript/src/screens/index.d.ts.map +1 -1
  19. package/lib/typescript/src/screens/notes/NotesDetailScreen.d.ts +4 -0
  20. package/lib/typescript/src/screens/notes/NotesDetailScreen.d.ts.map +1 -0
  21. package/lib/typescript/src/screens/notes/NotesSubTopicScreen.d.ts +4 -0
  22. package/lib/typescript/src/screens/notes/NotesSubTopicScreen.d.ts.map +1 -0
  23. package/lib/typescript/src/screens/notes/NotesTopicScreen.d.ts +4 -0
  24. package/lib/typescript/src/screens/notes/NotesTopicScreen.d.ts.map +1 -0
  25. package/lib/typescript/src/screens/notes/index.d.ts +4 -0
  26. package/lib/typescript/src/screens/notes/index.d.ts.map +1 -0
  27. package/lib/typescript/src/screens/qbank/QBankOverviewScreen.d.ts.map +1 -1
  28. package/lib/typescript/src/types/index.d.ts +49 -0
  29. package/lib/typescript/src/types/index.d.ts.map +1 -1
  30. package/package.json +1 -1
  31. package/src/index.tsx +3 -0
  32. package/src/screens/index.ts +1 -0
  33. package/src/screens/notes/NotesDetailScreen.tsx +260 -0
  34. package/src/screens/notes/NotesSubTopicScreen.tsx +168 -0
  35. package/src/screens/notes/NotesTopicScreen.tsx +174 -0
  36. package/src/screens/notes/index.ts +3 -0
  37. package/src/screens/qbank/QBankOverviewScreen.tsx +3 -4
  38. package/src/types/index.ts +61 -0
@@ -0,0 +1,260 @@
1
+ import React from 'react';
2
+ import {
3
+ View,
4
+ ScrollView,
5
+ StyleSheet,
6
+ TouchableOpacity,
7
+ } from 'react-native';
8
+ import { SafeAreaView } from 'react-native-safe-area-context';
9
+ import { useTheme } from '../../context/ThemeContext';
10
+ import { Typography, Icon } from '../../components';
11
+ import type { NotesDetailScreenProps } from '../../types';
12
+
13
+ export const NotesDetailScreen: React.FC<NotesDetailScreenProps> = ({
14
+ topicTitle,
15
+ sectionTitle,
16
+ currentProgress,
17
+ totalProgress,
18
+ subTopicTitle,
19
+ content,
20
+ isCompleted = false,
21
+ onBack,
22
+ onPressGroup,
23
+ onToggleComplete,
24
+ onPressPrev,
25
+ onPressNext,
26
+ }) => {
27
+ const theme = useTheme();
28
+
29
+ const progressPercentage = totalProgress > 0 ? (currentProgress / totalProgress) * 100 : 0;
30
+
31
+ return (
32
+ <SafeAreaView style={[styles.safeArea, { backgroundColor: '#FFFFFF' }]} edges={['top', 'bottom']}>
33
+ {/* Header */}
34
+ <View style={styles.header}>
35
+ <TouchableOpacity style={styles.headerBtnLeft} onPress={onBack}>
36
+ <Icon name="chevron-left" size={24} color={theme.textPrimary} />
37
+ </TouchableOpacity>
38
+ <Typography variant="h2" bold color={theme.textPrimary} style={styles.headerTitle}>
39
+ {topicTitle}
40
+ </Typography>
41
+ <TouchableOpacity style={styles.headerBtnRight} onPress={onPressGroup}>
42
+ <Icon name="users" size={20} color={theme.textPrimary} />
43
+ </TouchableOpacity>
44
+ </View>
45
+
46
+ {/* Progress Bar */}
47
+ <View style={styles.progressBarContainer}>
48
+ <View style={[styles.progressFill, { width: `${progressPercentage}%`, backgroundColor: theme.success }]} />
49
+ </View>
50
+
51
+ <ScrollView style={{ flex: 1 }} contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
52
+ {/* Section Header */}
53
+ <View style={styles.sectionHeaderRow}>
54
+ <View style={styles.sectionHeaderLeft}>
55
+ <View style={[styles.dot, { backgroundColor: theme.success }]} />
56
+ <Typography variant="caption" color={theme.textSecondary} style={styles.sectionTitle}>
57
+ {sectionTitle}
58
+ </Typography>
59
+ </View>
60
+ <Typography variant="caption" color={theme.textPrimary} style={styles.progressText}>
61
+ {currentProgress}/{totalProgress}
62
+ </Typography>
63
+ </View>
64
+
65
+ {/* Sub Topic Title */}
66
+ <Typography variant="h3" color={theme.textPrimary} style={styles.subTopicTitle}>
67
+ {subTopicTitle}
68
+ </Typography>
69
+
70
+ {/* Content */}
71
+ <View style={styles.contentContainer}>
72
+ {content && content.map((item, index) => (
73
+ <View key={index} style={styles.bulletItem}>
74
+ <Typography variant="body" color={theme.textPrimary} style={styles.bulletDot}>
75
+
76
+ </Typography>
77
+ <Typography variant="body" color={theme.textSecondary} style={styles.bulletText}>
78
+ <Typography variant="body" bold color={theme.textPrimary}>
79
+ {item.title}
80
+ </Typography>{' '}
81
+ {item.description}
82
+ </Typography>
83
+ </View>
84
+ ))}
85
+ </View>
86
+ </ScrollView>
87
+
88
+ {/* Footer */}
89
+ <View style={styles.footer}>
90
+ <TouchableOpacity
91
+ style={styles.completeToggle}
92
+ activeOpacity={0.8}
93
+ onPress={() => onToggleComplete?.(!isCompleted)}
94
+ >
95
+ <View style={[
96
+ styles.checkbox,
97
+ { backgroundColor: isCompleted ? theme.success : '#FFFFFF', borderColor: isCompleted ? theme.success : '#D1D5DB' }
98
+ ]}>
99
+ {isCompleted && <Icon name="check" size={14} color="#FFFFFF" />}
100
+ </View>
101
+ <Typography variant="body" color={theme.textPrimary} style={styles.completeText}>
102
+ Mark as Complete
103
+ </Typography>
104
+ </TouchableOpacity>
105
+
106
+ <View style={styles.navButtons}>
107
+ <TouchableOpacity
108
+ style={styles.navBtn}
109
+ onPress={onPressPrev}
110
+ >
111
+ <Typography variant="body" bold color={theme.textSecondary}>
112
+ Prev
113
+ </Typography>
114
+ </TouchableOpacity>
115
+ <TouchableOpacity
116
+ style={[styles.navBtn, styles.nextBtn, { backgroundColor: theme.success }]}
117
+ onPress={onPressNext}
118
+ >
119
+ <Typography variant="body" bold color="#FFFFFF">
120
+ Next
121
+ </Typography>
122
+ </TouchableOpacity>
123
+ </View>
124
+ </View>
125
+ </SafeAreaView>
126
+ );
127
+ };
128
+
129
+ const styles = StyleSheet.create({
130
+ safeArea: {
131
+ flex: 1,
132
+ },
133
+ header: {
134
+ flexDirection: 'row',
135
+ alignItems: 'center',
136
+ justifyContent: 'space-between',
137
+ paddingHorizontal: 16,
138
+ paddingVertical: 12,
139
+ backgroundColor: '#FFFFFF',
140
+ },
141
+ headerBtnLeft: {
142
+ width: 40,
143
+ height: 40,
144
+ justifyContent: 'center',
145
+ alignItems: 'flex-start',
146
+ },
147
+ headerBtnRight: {
148
+ width: 40,
149
+ height: 40,
150
+ justifyContent: 'center',
151
+ alignItems: 'flex-end',
152
+ },
153
+ headerTitle: {
154
+ flex: 1,
155
+ textAlign: 'center',
156
+ fontSize: 18,
157
+ },
158
+ progressBarContainer: {
159
+ width: '100%',
160
+ height: 4,
161
+ backgroundColor: '#E2E8F0',
162
+ },
163
+ progressFill: {
164
+ height: '100%',
165
+ },
166
+ scrollContent: {
167
+ padding: 20,
168
+ paddingBottom: 40,
169
+ },
170
+ sectionHeaderRow: {
171
+ flexDirection: 'row',
172
+ alignItems: 'center',
173
+ justifyContent: 'space-between',
174
+ marginBottom: 20,
175
+ },
176
+ sectionHeaderLeft: {
177
+ flexDirection: 'row',
178
+ alignItems: 'center',
179
+ },
180
+ dot: {
181
+ width: 6,
182
+ height: 6,
183
+ borderRadius: 3,
184
+ marginRight: 8,
185
+ },
186
+ sectionTitle: {
187
+ fontSize: 12,
188
+ letterSpacing: 0.5,
189
+ fontWeight: '600',
190
+ textTransform: 'uppercase',
191
+ },
192
+ progressText: {
193
+ fontSize: 14,
194
+ fontWeight: '600',
195
+ },
196
+ subTopicTitle: {
197
+ fontSize: 16,
198
+ fontWeight: '600',
199
+ lineHeight: 24,
200
+ marginBottom: 24,
201
+ },
202
+ contentContainer: {
203
+ width: '100%',
204
+ },
205
+ bulletItem: {
206
+ flexDirection: 'row',
207
+ marginBottom: 16,
208
+ },
209
+ bulletDot: {
210
+ marginRight: 8,
211
+ marginTop: -2,
212
+ fontSize: 16,
213
+ },
214
+ bulletText: {
215
+ flex: 1,
216
+ lineHeight: 22,
217
+ fontSize: 14,
218
+ },
219
+ footer: {
220
+ flexDirection: 'row',
221
+ alignItems: 'center',
222
+ justifyContent: 'space-between',
223
+ paddingHorizontal: 20,
224
+ paddingVertical: 16,
225
+ backgroundColor: '#FFFFFF',
226
+ borderTopWidth: 1,
227
+ borderTopColor: '#F1F5F9',
228
+ },
229
+ completeToggle: {
230
+ flexDirection: 'row',
231
+ alignItems: 'center',
232
+ },
233
+ checkbox: {
234
+ width: 20,
235
+ height: 20,
236
+ borderRadius: 4,
237
+ borderWidth: 2,
238
+ justifyContent: 'center',
239
+ alignItems: 'center',
240
+ marginRight: 10,
241
+ },
242
+ completeText: {
243
+ fontSize: 14,
244
+ fontWeight: '500',
245
+ },
246
+ navButtons: {
247
+ flexDirection: 'row',
248
+ alignItems: 'center',
249
+ },
250
+ navBtn: {
251
+ paddingHorizontal: 16,
252
+ paddingVertical: 8,
253
+ justifyContent: 'center',
254
+ alignItems: 'center',
255
+ },
256
+ nextBtn: {
257
+ borderRadius: 6,
258
+ marginLeft: 12,
259
+ },
260
+ });
@@ -0,0 +1,168 @@
1
+ import React from 'react';
2
+ import {
3
+ View,
4
+ ScrollView,
5
+ StyleSheet,
6
+ TouchableOpacity,
7
+ } from 'react-native';
8
+ import { SafeAreaView } from 'react-native-safe-area-context';
9
+ import { useTheme } from '../../context/ThemeContext';
10
+ import { Typography, Icon } from '../../components';
11
+ import type { NotesSubTopicScreenProps, NotesSubTopicSection } from '../../types';
12
+
13
+ export const NotesSubTopicScreen: React.FC<NotesSubTopicScreenProps> = ({
14
+ topicTitle,
15
+ sections,
16
+ onBack,
17
+ onPressFilter,
18
+ onPressSubTopic,
19
+ }) => {
20
+ const theme = useTheme();
21
+
22
+ return (
23
+ <SafeAreaView style={[styles.safeArea, { backgroundColor: '#F9FAFB' }]} edges={['top', 'bottom']}>
24
+ {/* Header */}
25
+ <View style={styles.header}>
26
+ <TouchableOpacity style={styles.headerBtnLeft} onPress={onBack}>
27
+ <Icon name="chevron-left" size={24} color={theme.textPrimary} />
28
+ </TouchableOpacity>
29
+ <Typography variant="h2" bold color={theme.textPrimary} style={styles.headerTitle}>
30
+ {topicTitle}
31
+ </Typography>
32
+ <TouchableOpacity style={styles.headerBtnRight} onPress={onPressFilter}>
33
+ <Icon name="filter" size={20} color={theme.textPrimary} />
34
+ </TouchableOpacity>
35
+ </View>
36
+
37
+ <ScrollView style={{ flex: 1 }} contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
38
+ {sections && sections.map((section: NotesSubTopicSection) => (
39
+ <View key={section.id} style={styles.sectionContainer}>
40
+ <View style={styles.sectionHeader}>
41
+ <View style={[styles.dot, { backgroundColor: theme.success }]} />
42
+ <Typography variant="caption" color={theme.textSecondary} style={styles.sectionTitle}>
43
+ {section.title}
44
+ </Typography>
45
+ </View>
46
+
47
+ {section.subTopics.map((subTopic) => (
48
+ <TouchableOpacity
49
+ key={subTopic.id}
50
+ style={styles.subTopicCard}
51
+ activeOpacity={0.8}
52
+ onPress={() => onPressSubTopic?.(subTopic.id)}
53
+ >
54
+ <View style={styles.subTopicLeft}>
55
+ <Typography variant="body" color={theme.textPrimary} style={styles.subTopicTitle}>
56
+ {subTopic.title}
57
+ </Typography>
58
+ </View>
59
+ <View style={styles.subTopicRight}>
60
+ {subTopic.isLocked && (
61
+ <View style={styles.lockIconContainer}>
62
+ <Icon name="lock" size={14} color="#94A3B8" />
63
+ </View>
64
+ )}
65
+ </View>
66
+ </TouchableOpacity>
67
+ ))}
68
+ </View>
69
+ ))}
70
+ </ScrollView>
71
+ </SafeAreaView>
72
+ );
73
+ };
74
+
75
+ const styles = StyleSheet.create({
76
+ safeArea: {
77
+ flex: 1,
78
+ },
79
+ header: {
80
+ flexDirection: 'row',
81
+ alignItems: 'center',
82
+ justifyContent: 'space-between',
83
+ paddingHorizontal: 16,
84
+ paddingVertical: 12,
85
+ backgroundColor: '#FFFFFF',
86
+ borderBottomWidth: 1,
87
+ borderBottomColor: '#F1F5F9',
88
+ },
89
+ headerBtnLeft: {
90
+ width: 40,
91
+ height: 40,
92
+ justifyContent: 'center',
93
+ alignItems: 'flex-start',
94
+ },
95
+ headerBtnRight: {
96
+ width: 40,
97
+ height: 40,
98
+ justifyContent: 'center',
99
+ alignItems: 'flex-end',
100
+ },
101
+ headerTitle: {
102
+ flex: 1,
103
+ textAlign: 'center',
104
+ fontSize: 18,
105
+ },
106
+ scrollContent: {
107
+ padding: 16,
108
+ paddingBottom: 40,
109
+ },
110
+ sectionContainer: {
111
+ marginBottom: 24,
112
+ },
113
+ sectionHeader: {
114
+ flexDirection: 'row',
115
+ alignItems: 'center',
116
+ marginBottom: 12,
117
+ },
118
+ dot: {
119
+ width: 6,
120
+ height: 6,
121
+ borderRadius: 3,
122
+ marginRight: 8,
123
+ },
124
+ sectionTitle: {
125
+ fontSize: 12,
126
+ letterSpacing: 0.5,
127
+ fontWeight: '600',
128
+ textTransform: 'uppercase',
129
+ },
130
+ subTopicCard: {
131
+ backgroundColor: '#FFFFFF',
132
+ flexDirection: 'row',
133
+ alignItems: 'center',
134
+ justifyContent: 'space-between',
135
+ paddingVertical: 16,
136
+ paddingHorizontal: 16,
137
+ borderRadius: 12,
138
+ marginBottom: 12,
139
+ shadowColor: '#000',
140
+ shadowOffset: { width: 0, height: 2 },
141
+ shadowOpacity: 0.05,
142
+ shadowRadius: 4,
143
+ elevation: 2,
144
+ borderWidth: 1,
145
+ borderColor: '#F1F5F9',
146
+ },
147
+ subTopicLeft: {
148
+ flex: 1,
149
+ paddingRight: 12,
150
+ },
151
+ subTopicTitle: {
152
+ fontSize: 14,
153
+ fontWeight: '500',
154
+ lineHeight: 20,
155
+ },
156
+ subTopicRight: {
157
+ justifyContent: 'center',
158
+ alignItems: 'center',
159
+ },
160
+ lockIconContainer: {
161
+ width: 28,
162
+ height: 28,
163
+ borderRadius: 14,
164
+ backgroundColor: '#F1F5F9',
165
+ justifyContent: 'center',
166
+ alignItems: 'center',
167
+ },
168
+ });
@@ -0,0 +1,174 @@
1
+ import React from 'react';
2
+ import {
3
+ View,
4
+ ScrollView,
5
+ StyleSheet,
6
+ TouchableOpacity,
7
+ } from 'react-native';
8
+ import { SafeAreaView } from 'react-native-safe-area-context';
9
+ import { useTheme } from '../../context/ThemeContext';
10
+ import { Typography, Icon } from '../../components';
11
+ import type { NotesTopicScreenProps, NotesTopic } from '../../types';
12
+
13
+ export const NotesTopicScreen: React.FC<NotesTopicScreenProps> = ({
14
+ title = 'BNS/MD',
15
+ recentlyAdded,
16
+ allTopics,
17
+ onBack,
18
+ onPressSearch,
19
+ onPressTopic,
20
+ }) => {
21
+ const theme = useTheme();
22
+
23
+ const renderTopicCard = (item: NotesTopic, isRecentlyAdded: boolean) => (
24
+ <TouchableOpacity
25
+ key={item.id}
26
+ style={styles.topicCard}
27
+ activeOpacity={0.8}
28
+ onPress={() => onPressTopic?.(item.id)}
29
+ >
30
+ <View style={styles.topicCardLeft}>
31
+ <View style={styles.iconContainer}>
32
+ <Icon name="file-text" size={20} color={theme.primary} />
33
+ </View>
34
+ <Typography variant="h3" color={theme.textPrimary} style={styles.topicTitle}>
35
+ {item.title}
36
+ </Typography>
37
+ </View>
38
+ <View style={styles.topicCardRight}>
39
+ {isRecentlyAdded && item.isCompleted ? (
40
+ <Icon name="check" size={20} color={theme.success} />
41
+ ) : (
42
+ <Icon name="chevron-right" size={20} color={theme.textSecondary} />
43
+ )}
44
+ </View>
45
+ </TouchableOpacity>
46
+ );
47
+
48
+ return (
49
+ <SafeAreaView style={[styles.safeArea, { backgroundColor: '#F9FAFB' }]} edges={['top', 'bottom']}>
50
+ {/* Header */}
51
+ <View style={styles.header}>
52
+ <TouchableOpacity style={styles.headerBtnLeft} onPress={onBack}>
53
+ <Icon name="chevron-left" size={24} color={theme.textPrimary} />
54
+ </TouchableOpacity>
55
+ <Typography variant="h2" bold color={theme.textPrimary} style={styles.headerTitle}>
56
+ {title}
57
+ </Typography>
58
+ <TouchableOpacity style={styles.headerBtnRight} onPress={onPressSearch}>
59
+ <Icon name="search" size={22} color={theme.textPrimary} />
60
+ </TouchableOpacity>
61
+ </View>
62
+
63
+ <ScrollView style={{ flex: 1 }} contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
64
+ {/* Recently Added Section */}
65
+ {recentlyAdded && recentlyAdded.length > 0 && (
66
+ <View style={styles.section}>
67
+ <Typography variant="caption" color={theme.textSecondary} style={styles.sectionHeader}>
68
+ RECENTLY ADDED
69
+ </Typography>
70
+ {recentlyAdded.map((topic) => renderTopicCard(topic, true))}
71
+ </View>
72
+ )}
73
+
74
+ {/* All Topics Section */}
75
+ {allTopics && allTopics.length > 0 && (
76
+ <View style={[styles.section, { marginTop: 24 }]}>
77
+ <Typography variant="caption" color={theme.textSecondary} style={styles.sectionHeader}>
78
+ ALL TOPICS
79
+ </Typography>
80
+ {allTopics.map((topic) => renderTopicCard(topic, false))}
81
+ </View>
82
+ )}
83
+ </ScrollView>
84
+ </SafeAreaView>
85
+ );
86
+ };
87
+
88
+ const styles = StyleSheet.create({
89
+ safeArea: {
90
+ flex: 1,
91
+ },
92
+ header: {
93
+ flexDirection: 'row',
94
+ alignItems: 'center',
95
+ justifyContent: 'space-between',
96
+ paddingHorizontal: 16,
97
+ paddingVertical: 12,
98
+ backgroundColor: '#FFFFFF',
99
+ borderBottomWidth: 1,
100
+ borderBottomColor: '#F1F5F9',
101
+ },
102
+ headerBtnLeft: {
103
+ width: 40,
104
+ height: 40,
105
+ justifyContent: 'center',
106
+ alignItems: 'flex-start',
107
+ },
108
+ headerBtnRight: {
109
+ width: 40,
110
+ height: 40,
111
+ justifyContent: 'center',
112
+ alignItems: 'flex-end',
113
+ },
114
+ headerTitle: {
115
+ flex: 1,
116
+ textAlign: 'center',
117
+ fontSize: 18,
118
+ },
119
+ scrollContent: {
120
+ padding: 16,
121
+ paddingBottom: 40,
122
+ },
123
+ section: {
124
+ width: '100%',
125
+ },
126
+ sectionHeader: {
127
+ fontSize: 12,
128
+ letterSpacing: 0.5,
129
+ marginBottom: 12,
130
+ fontWeight: '600',
131
+ textTransform: 'uppercase',
132
+ },
133
+ topicCard: {
134
+ backgroundColor: '#FFFFFF',
135
+ flexDirection: 'row',
136
+ alignItems: 'center',
137
+ justifyContent: 'space-between',
138
+ paddingVertical: 16,
139
+ paddingHorizontal: 16,
140
+ borderRadius: 12,
141
+ marginBottom: 12,
142
+ shadowColor: '#000',
143
+ shadowOffset: { width: 0, height: 2 },
144
+ shadowOpacity: 0.05,
145
+ shadowRadius: 4,
146
+ elevation: 2,
147
+ borderWidth: 1,
148
+ borderColor: '#F1F5F9',
149
+ },
150
+ topicCardLeft: {
151
+ flexDirection: 'row',
152
+ alignItems: 'center',
153
+ flex: 1,
154
+ },
155
+ iconContainer: {
156
+ width: 40,
157
+ height: 40,
158
+ borderRadius: 8,
159
+ backgroundColor: '#F8FAFC',
160
+ justifyContent: 'center',
161
+ alignItems: 'center',
162
+ marginRight: 16,
163
+ borderWidth: 1,
164
+ borderColor: '#E2E8F0',
165
+ },
166
+ topicTitle: {
167
+ fontSize: 16,
168
+ fontWeight: '600',
169
+ },
170
+ topicCardRight: {
171
+ justifyContent: 'center',
172
+ alignItems: 'center',
173
+ },
174
+ });
@@ -0,0 +1,3 @@
1
+ export * from './NotesTopicScreen';
2
+ export * from './NotesSubTopicScreen';
3
+ export * from './NotesDetailScreen';
@@ -8,7 +8,7 @@ import {
8
8
  Platform,
9
9
  useWindowDimensions,
10
10
  } from 'react-native';
11
- import { useSafeAreaInsets } from 'react-native-safe-area-context';
11
+ import { SafeAreaView } from 'react-native-safe-area-context';
12
12
  import { useTheme } from '../../context/ThemeContext';
13
13
  import { Typography, Icon } from '../../components';
14
14
  import type { QBankOverviewScreenProps, QBankOverviewQuestion } from '../../types';
@@ -30,7 +30,6 @@ export const QBankOverviewScreen: React.FC<QBankOverviewScreenProps> = ({
30
30
  const theme = useTheme();
31
31
  const [filter, setFilter] = useState<FilterType>('all');
32
32
  const [isSheetOpen, setIsSheetOpen] = useState(false);
33
- const insets = useSafeAreaInsets();
34
33
  const { height: SCREEN_HEIGHT } = useWindowDimensions();
35
34
 
36
35
  // Animation value for Bottom Sheet
@@ -104,7 +103,7 @@ export const QBankOverviewScreen: React.FC<QBankOverviewScreenProps> = ({
104
103
  };
105
104
 
106
105
  return (
107
- <View style={[styles.container, { paddingTop: insets.top }]}>
106
+ <SafeAreaView style={styles.container} edges={['top', 'bottom']}>
108
107
  {/* Header */}
109
108
  <View style={styles.header}>
110
109
  <TouchableOpacity onPress={onBack} style={styles.headerBtn}>
@@ -228,7 +227,7 @@ export const QBankOverviewScreen: React.FC<QBankOverviewScreenProps> = ({
228
227
  </TouchableOpacity>
229
228
  ))}
230
229
  </Animated.View>
231
- </View>
230
+ </SafeAreaView>
232
231
  );
233
232
  };
234
233
 
@@ -304,3 +304,64 @@ export interface QBankSubTopicParams {
304
304
  };
305
305
  sections: QBankSubTopicSection[];
306
306
  }
307
+
308
+ // --------------------------------------------------
309
+ // Notes Module Types
310
+ // --------------------------------------------------
311
+
312
+ export interface NotesTopic {
313
+ id: string;
314
+ title: string;
315
+ icon?: string;
316
+ isCompleted?: boolean;
317
+ }
318
+
319
+ export interface NotesTopicScreenProps {
320
+ title?: string;
321
+ recentlyAdded: NotesTopic[];
322
+ allTopics: NotesTopic[];
323
+ onBack?: () => void;
324
+ onPressSearch?: () => void;
325
+ onPressTopic?: (topicId: string) => void;
326
+ }
327
+
328
+ export interface NotesSubTopic {
329
+ id: string;
330
+ title: string;
331
+ isLocked?: boolean;
332
+ }
333
+
334
+ export interface NotesSubTopicSection {
335
+ id: string;
336
+ title: string;
337
+ subTopics: NotesSubTopic[];
338
+ }
339
+
340
+ export interface NotesSubTopicScreenProps {
341
+ topicTitle: string;
342
+ sections: NotesSubTopicSection[];
343
+ onBack?: () => void;
344
+ onPressFilter?: () => void;
345
+ onPressSubTopic?: (subTopicId: string) => void;
346
+ }
347
+
348
+ export interface NotesDetailContent {
349
+ title: string;
350
+ description: string;
351
+ }
352
+
353
+ export interface NotesDetailScreenProps {
354
+ topicTitle: string;
355
+ sectionTitle: string;
356
+ currentProgress: number;
357
+ totalProgress: number;
358
+ subTopicTitle: string;
359
+ content: NotesDetailContent[];
360
+ isCompleted?: boolean;
361
+ onBack?: () => void;
362
+ onPressGroup?: () => void;
363
+ onToggleComplete?: (isComplete: boolean) => void;
364
+ onPressPrev?: () => void;
365
+ onPressNext?: () => void;
366
+ }
367
+