react-native-salespanda 0.7.6 → 0.7.7

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 (130) hide show
  1. package/lib/module/NativeSalespanda.js.map +1 -0
  2. package/lib/module/SalespandaApp.js.map +1 -0
  3. package/lib/module/assets/images/index.js.map +1 -0
  4. package/lib/module/components/BottomSheet.js.map +1 -0
  5. package/lib/module/components/ContactViaModal.js.map +1 -0
  6. package/lib/module/components/Loader.js.map +1 -0
  7. package/lib/module/components/ScreenHeader.js.map +1 -0
  8. package/lib/module/components/SearchBar.js.map +1 -0
  9. package/lib/module/components/TabsHeader.js.map +1 -0
  10. package/lib/module/components/index.js.map +1 -0
  11. package/lib/module/config/FlavorConfig.js.map +1 -0
  12. package/lib/module/config/SalespandaConfig.js.map +1 -0
  13. package/lib/module/constants/Colors.js.map +1 -0
  14. package/lib/module/constants/GetPlatorm.js.map +1 -0
  15. package/lib/module/index.js.map +1 -0
  16. package/lib/module/navigation/AppNavigator.js.map +1 -0
  17. package/lib/module/navigation/BottomTabNavigator.js.map +1 -0
  18. package/lib/module/navigation/DrawerNavigator.js.map +1 -0
  19. package/lib/module/navigation/StackNavigator.js.map +1 -0
  20. package/lib/module/screens/CRM/AddContactModal.js.map +1 -0
  21. package/lib/module/screens/CRM/CategoryTabs.js.map +1 -0
  22. package/lib/module/screens/CRM/ContactItem.js.map +1 -0
  23. package/lib/module/screens/CRM/FilterDropdown.js.map +1 -0
  24. package/lib/module/screens/CRM/FunnelChart.js.map +1 -0
  25. package/lib/module/screens/CRM/InfoCard.js.map +1 -0
  26. package/lib/module/screens/CRM/LeadCard.js.map +1 -0
  27. package/lib/module/screens/CRM/LogCallScreen.js.map +1 -0
  28. package/lib/module/screens/CRM/TopTabs.js.map +1 -0
  29. package/lib/module/screens/CRM/index.js.map +1 -0
  30. package/lib/module/screens/ReportsScreen.js.map +1 -0
  31. package/lib/module/screens/Tabs/ActivityAnalytics.js.map +1 -0
  32. package/lib/module/screens/Tabs/CRMScreen.js.map +1 -0
  33. package/lib/module/screens/Tabs/DigitalDiary.js.map +1 -0
  34. package/lib/module/screens/Tabs/HomeScreen.js.map +1 -0
  35. package/lib/module/screens/Tabs/NotificationsScreen.js.map +1 -0
  36. package/lib/module/screens/contentliberary/contentliberary.js.map +1 -0
  37. package/lib/module/services/api.js.map +1 -0
  38. package/lib/module/services/authService.js.map +1 -0
  39. package/lib/module/store/index.js.map +1 -0
  40. package/lib/typescript/src/NativeSalespanda.d.ts.map +1 -0
  41. package/lib/typescript/src/SalespandaApp.d.ts.map +1 -0
  42. package/lib/typescript/src/assets/images/index.d.ts.map +1 -0
  43. package/lib/typescript/src/components/BottomSheet.d.ts.map +1 -0
  44. package/lib/typescript/src/components/ContactViaModal.d.ts.map +1 -0
  45. package/lib/typescript/src/components/Loader.d.ts.map +1 -0
  46. package/lib/typescript/src/components/ScreenHeader.d.ts.map +1 -0
  47. package/lib/typescript/src/components/SearchBar.d.ts.map +1 -0
  48. package/lib/typescript/src/components/TabsHeader.d.ts.map +1 -0
  49. package/lib/typescript/src/components/index.d.ts.map +1 -0
  50. package/lib/typescript/src/config/FlavorConfig.d.ts.map +1 -0
  51. package/lib/typescript/src/config/SalespandaConfig.d.ts.map +1 -0
  52. package/lib/typescript/src/constants/Colors.d.ts.map +1 -0
  53. package/lib/typescript/src/constants/GetPlatorm.d.ts.map +1 -0
  54. package/lib/typescript/src/index.d.ts.map +1 -0
  55. package/lib/typescript/src/navigation/AppNavigator.d.ts.map +1 -0
  56. package/lib/typescript/src/navigation/BottomTabNavigator.d.ts.map +1 -0
  57. package/lib/typescript/src/navigation/DrawerNavigator.d.ts.map +1 -0
  58. package/lib/typescript/src/navigation/StackNavigator.d.ts.map +1 -0
  59. package/lib/typescript/src/screens/CRM/AddContactModal.d.ts.map +1 -0
  60. package/lib/typescript/src/screens/CRM/CategoryTabs.d.ts.map +1 -0
  61. package/lib/typescript/src/screens/CRM/ContactItem.d.ts.map +1 -0
  62. package/lib/typescript/src/screens/CRM/FilterDropdown.d.ts.map +1 -0
  63. package/lib/typescript/src/screens/CRM/FunnelChart.d.ts.map +1 -0
  64. package/lib/typescript/src/screens/CRM/InfoCard.d.ts.map +1 -0
  65. package/lib/typescript/src/screens/CRM/LeadCard.d.ts.map +1 -0
  66. package/lib/typescript/src/screens/CRM/LogCallScreen.d.ts.map +1 -0
  67. package/lib/typescript/src/screens/CRM/TopTabs.d.ts.map +1 -0
  68. package/lib/typescript/src/screens/CRM/index.d.ts.map +1 -0
  69. package/lib/typescript/src/screens/ReportsScreen.d.ts.map +1 -0
  70. package/lib/typescript/src/screens/Tabs/ActivityAnalytics.d.ts.map +1 -0
  71. package/lib/typescript/src/screens/Tabs/CRMScreen.d.ts.map +1 -0
  72. package/lib/typescript/src/screens/Tabs/DigitalDiary.d.ts.map +1 -0
  73. package/lib/typescript/src/screens/Tabs/HomeScreen.d.ts.map +1 -0
  74. package/lib/typescript/src/screens/Tabs/NotificationsScreen.d.ts.map +1 -0
  75. package/lib/typescript/src/screens/contentliberary/contentliberary.d.ts.map +1 -0
  76. package/lib/typescript/src/services/api.d.ts.map +1 -0
  77. package/lib/typescript/src/services/authService.d.ts.map +1 -0
  78. package/lib/typescript/src/store/index.d.ts.map +1 -0
  79. package/package.json +4 -3
  80. package/react-native.config.js +3 -4
  81. package/src/NativeSalespanda.ts +7 -0
  82. package/src/SalespandaApp.tsx +141 -0
  83. package/src/assets/images/bottomtabs/analytics.png +0 -0
  84. package/src/assets/images/bottomtabs/analyticsactive.png +0 -0
  85. package/src/assets/images/bottomtabs/crm.png +0 -0
  86. package/src/assets/images/bottomtabs/crmactive.png +0 -0
  87. package/src/assets/images/bottomtabs/diary.png +0 -0
  88. package/src/assets/images/bottomtabs/diaryactive.png +0 -0
  89. package/src/assets/images/bottomtabs/home.png +0 -0
  90. package/src/assets/images/bottomtabs/homeactive.png +0 -0
  91. package/src/assets/images/bottomtabs/notification.png +0 -0
  92. package/src/assets/images/bottomtabs/notificationactive.png +0 -0
  93. package/src/assets/images/index.js +11 -0
  94. package/src/assets/images/index.ts +40 -0
  95. package/src/components/BottomSheet.tsx +146 -0
  96. package/src/components/ContactViaModal.tsx +80 -0
  97. package/src/components/Loader.tsx +48 -0
  98. package/src/components/ScreenHeader.tsx +57 -0
  99. package/src/components/SearchBar.tsx +59 -0
  100. package/src/components/TabsHeader.tsx +72 -0
  101. package/src/components/index.ts +5 -0
  102. package/src/config/FlavorConfig.ts +55 -0
  103. package/src/config/SalespandaConfig.ts +142 -0
  104. package/src/constants/Colors.ts +17 -0
  105. package/src/constants/GetPlatorm.ts +29 -0
  106. package/src/index.tsx +31 -0
  107. package/src/navigation/AppNavigator.tsx +24 -0
  108. package/src/navigation/BottomTabNavigator.tsx +181 -0
  109. package/src/navigation/DrawerNavigator.tsx +306 -0
  110. package/src/navigation/StackNavigator.tsx +32 -0
  111. package/src/screens/CRM/AddContactModal.tsx +57 -0
  112. package/src/screens/CRM/CategoryTabs.tsx +109 -0
  113. package/src/screens/CRM/ContactItem.tsx +168 -0
  114. package/src/screens/CRM/FilterDropdown.tsx +34 -0
  115. package/src/screens/CRM/FunnelChart.tsx +103 -0
  116. package/src/screens/CRM/InfoCard.tsx +51 -0
  117. package/src/screens/CRM/LeadCard.tsx +69 -0
  118. package/src/screens/CRM/LogCallScreen.tsx +318 -0
  119. package/src/screens/CRM/TopTabs.tsx +95 -0
  120. package/src/screens/CRM/index.ts +10 -0
  121. package/src/screens/ReportsScreen.tsx +37 -0
  122. package/src/screens/Tabs/ActivityAnalytics.tsx +25 -0
  123. package/src/screens/Tabs/CRMScreen.tsx +381 -0
  124. package/src/screens/Tabs/DigitalDiary.tsx +35 -0
  125. package/src/screens/Tabs/HomeScreen.tsx +379 -0
  126. package/src/screens/Tabs/NotificationsScreen.tsx +25 -0
  127. package/src/screens/contentliberary/contentliberary.tsx +268 -0
  128. package/src/services/api.ts +173 -0
  129. package/src/services/authService.ts +75 -0
  130. package/src/store/index.ts +16 -0
@@ -0,0 +1,306 @@
1
+ import * as React from 'react';
2
+ import { createDrawerNavigator } from '@react-navigation/drawer';
3
+ import {
4
+ View,
5
+ Text,
6
+ StyleSheet,
7
+ TouchableOpacity,
8
+ Image,
9
+ ScrollView,
10
+ } from 'react-native';
11
+ import { scale, verticalScale, moderateScale } from 'react-native-size-matters';
12
+ import BottomTabNavigator from './BottomTabNavigator';
13
+ import { Colors } from '../constants/Colors';
14
+ import ProfileScreen from '../screens/Tabs/ActivityAnalytics';
15
+ import { GetPlatform } from '../constants/GetPlatorm';
16
+
17
+ const Drawer = createDrawerNavigator();
18
+
19
+ interface DrawerItemProps {
20
+ label: string;
21
+ onPress: () => void;
22
+ active?: boolean;
23
+ }
24
+
25
+ const DrawerItem: React.FC<DrawerItemProps> = ({
26
+ label,
27
+ onPress,
28
+ active = false,
29
+ }) => {
30
+ return (
31
+ <TouchableOpacity
32
+ style={[styles.drawerItem, active && styles.activeDrawerItem]}
33
+ onPress={onPress}
34
+ >
35
+ <Text style={[styles.drawerLabel, active && styles.activeDrawerLabel]}>
36
+ {label}
37
+ </Text>
38
+ </TouchableOpacity>
39
+ );
40
+ };
41
+
42
+ interface CustomDrawerContentProps {
43
+ navigation: any;
44
+ state?: any;
45
+ }
46
+
47
+ const CustomDrawerContent: React.FC<CustomDrawerContentProps> = ({
48
+ navigation,
49
+ }) => {
50
+ const [expanded, setExpanded] = React.useState<Record<string, boolean>>({
51
+ 'Campaign': false,
52
+ 'Sales WAR Room': false,
53
+ 'Pipeline': false,
54
+ });
55
+ const toggle = (key: string) =>
56
+ setExpanded((prev) => ({ ...prev, [key]: !prev[key] }));
57
+
58
+ const groups: Array<{
59
+ label: string;
60
+ children?: Array<{ label: string; onPress: () => void }>;
61
+ onPress?: () => void;
62
+ }> = [
63
+ { label: 'Content Library', onPress: () => {} },
64
+ {
65
+ label: 'Campaign',
66
+ children: [
67
+ { label: 'Run Campaign', onPress: () => {} },
68
+ { label: 'List', onPress: () => {} },
69
+ ],
70
+ },
71
+ { label: 'My Activity', onPress: () => {} },
72
+ { label: 'DigiCard', onPress: () => {} },
73
+ { label: 'My Profile', onPress: () => navigation.navigate('Profile') },
74
+ {
75
+ label: 'Sales WAR Room',
76
+ children: [
77
+ { label: 'Forms & Brochures', onPress: () => {} },
78
+ { label: 'CXO Announcements', onPress: () => {} },
79
+ { label: 'Training/Sales Content', onPress: () => {} },
80
+ ],
81
+ },
82
+ { label: 'Tasks', onPress: () => {} },
83
+ { label: 'Import Phone Contacts', onPress: () => {} },
84
+ {
85
+ label: 'Pipeline',
86
+ children: [
87
+ { label: 'Leads', onPress: () => {} },
88
+ { label: 'Contacts', onPress: () => {} },
89
+ { label: 'Email Activity', onPress: () => {} },
90
+ ],
91
+ },
92
+ { label: 'Notification', onPress: () => {} },
93
+ { label: 'Settings', onPress: () => {} },
94
+ { label: 'Help & Support', onPress: () => {} },
95
+ ];
96
+
97
+ return (
98
+ <View style={styles.drawerContainer}>
99
+ <ScrollView
100
+ style={styles.drawerContent}
101
+ showsVerticalScrollIndicator={false}
102
+ >
103
+ <View style={styles.drawerHeader}>
104
+ <View style={styles.headerRow}>
105
+ <Image
106
+ source={{ uri: 'https://via.placeholder.com/80x80' }}
107
+ style={styles.drawerAvatar}
108
+ />
109
+ <View style={styles.headerTextCol}>
110
+ <Text style={styles.drawerName}>Eduuu Parrtner</Text>
111
+ <TouchableOpacity style={styles.badgeButton}>
112
+ <Text style={styles.badgeText}>Go to Microsite</Text>
113
+ </TouchableOpacity>
114
+ </View>
115
+ </View>
116
+ </View>
117
+ {groups.map((group, index) => {
118
+ const hasChildren =
119
+ Array.isArray(group.children) && group.children.length > 0;
120
+ if (!hasChildren) {
121
+ return (
122
+ <View key={group.label}>
123
+ {index > 0 ? <View style={styles.drawerDivider} /> : null}
124
+ <DrawerItem
125
+ label={group.label}
126
+ onPress={group.onPress ?? (() => {})}
127
+ />
128
+ </View>
129
+ );
130
+ }
131
+ const isOpen = !!expanded[group.label];
132
+ return (
133
+ <View key={group.label}>
134
+ {index > 0 ? <View style={styles.drawerDivider} /> : null}
135
+ <TouchableOpacity
136
+ style={styles.drawerItem}
137
+ onPress={() => toggle(group.label)}
138
+ activeOpacity={0.7}
139
+ >
140
+ <Text style={[styles.drawerLabel, styles.flexOne]}>
141
+ {group.label}
142
+ </Text>
143
+ <Text style={styles.chevron}>{isOpen ? '▾' : '▸'}</Text>
144
+ </TouchableOpacity>
145
+ {isOpen &&
146
+ group.children!.map((child, cIdx) => (
147
+ <View key={child.label}>
148
+ {cIdx > 0 ? <View style={styles.drawerDivider} /> : null}
149
+ <TouchableOpacity
150
+ style={styles.childItem}
151
+ onPress={child.onPress}
152
+ >
153
+ <Text style={styles.childLabel}>{child.label}</Text>
154
+ </TouchableOpacity>
155
+ </View>
156
+ ))}
157
+ </View>
158
+ );
159
+ })}
160
+ </ScrollView>
161
+ </View>
162
+ );
163
+ };
164
+
165
+ const renderDrawerContent = (props: any) => {
166
+ return <CustomDrawerContent navigation={props.navigation} />;
167
+ };
168
+
169
+ const DrawerNavigator: React.FC = () => {
170
+ return (
171
+ <Drawer.Navigator
172
+ drawerContent={renderDrawerContent}
173
+ screenOptions={{
174
+ headerShown: false,
175
+ drawerType: 'slide',
176
+ swipeEdgeWidth: 100,
177
+ drawerStyle: {
178
+ width: scale(280),
179
+ backgroundColor: Colors.primary,
180
+ },
181
+ headerStyle: {
182
+ backgroundColor: Colors.white,
183
+ },
184
+ headerTintColor: Colors.primary,
185
+ headerTitleAlign: 'left',
186
+ headerTitleStyle: {
187
+ fontWeight: '600',
188
+ color: Colors.black,
189
+ },
190
+ }}
191
+ >
192
+ <Drawer.Screen
193
+ name="HomeTabs"
194
+ component={BottomTabNavigator}
195
+ options={{
196
+ title: 'Home Page',
197
+ }}
198
+ />
199
+ <Drawer.Screen
200
+ name="Profile"
201
+ component={ProfileScreen}
202
+ options={{
203
+ title: 'Profile',
204
+ }}
205
+ />
206
+ </Drawer.Navigator>
207
+ );
208
+ };
209
+
210
+ export default DrawerNavigator;
211
+
212
+ const styles = StyleSheet.create({
213
+ drawerContainer: {
214
+ flex: 1,
215
+ backgroundColor: Colors.primary,
216
+ },
217
+ drawerHeader: {
218
+ backgroundColor: Colors.primary,
219
+ paddingHorizontal: scale(20),
220
+ paddingTop: verticalScale(36),
221
+ paddingBottom: verticalScale(16),
222
+ alignItems: 'flex-start',
223
+ },
224
+ headerRow: {
225
+ width: '100%',
226
+ flexDirection: 'row',
227
+ alignItems: 'center',
228
+ marginTop: GetPlatform(verticalScale(20), 0),
229
+ },
230
+ drawerAvatar: {
231
+ width: scale(60),
232
+ height: scale(60),
233
+ borderRadius: moderateScale(40),
234
+ marginRight: scale(14),
235
+ borderWidth: 2,
236
+ borderColor: Colors.black30,
237
+ },
238
+ headerTextCol: {
239
+ flex: 1,
240
+ justifyContent: 'center',
241
+ },
242
+ drawerName: {
243
+ fontSize: moderateScale(20),
244
+ fontWeight: '600',
245
+ color: Colors.white,
246
+ marginBottom: verticalScale(10),
247
+ },
248
+ badgeButton: {
249
+ borderWidth: 1,
250
+ borderColor: Colors.white,
251
+ paddingHorizontal: scale(12),
252
+ paddingVertical: verticalScale(6),
253
+ borderRadius: moderateScale(16),
254
+ alignSelf: 'flex-start',
255
+ },
256
+ badgeText: {
257
+ color: Colors.white,
258
+ fontSize: moderateScale(12),
259
+ fontWeight: '500',
260
+ },
261
+ drawerContent: {
262
+ flex: 1,
263
+ paddingTop: verticalScale(8),
264
+ },
265
+ drawerItem: {
266
+ flexDirection: 'row',
267
+ alignItems: 'center',
268
+ padding: scale(10),
269
+ paddingHorizontal: scale(20),
270
+ },
271
+ activeDrawerItem: {
272
+ backgroundColor: 'rgba(255,255,255,0.08)',
273
+ borderLeftWidth: 0,
274
+ },
275
+ drawerLabel: {
276
+ fontSize: moderateScale(16),
277
+ color: Colors.white,
278
+ fontWeight: '700',
279
+ },
280
+ activeDrawerLabel: {
281
+ fontWeight: '600',
282
+ color: Colors.white,
283
+ },
284
+ chevron: {
285
+ color: 'rgba(255,255,255,0.9)',
286
+ fontSize: moderateScale(24),
287
+ },
288
+ drawerDivider: {
289
+ height: 1,
290
+ backgroundColor: Colors.black10,
291
+ marginVertical: verticalScale(4),
292
+ marginLeft: scale(20),
293
+ },
294
+ childItem: {
295
+ paddingVertical: verticalScale(6),
296
+ paddingLeft: scale(60),
297
+ },
298
+ childLabel: {
299
+ fontSize: moderateScale(15),
300
+ color: Colors.white,
301
+ fontWeight: '500',
302
+ },
303
+ flexOne: {
304
+ flex: 1,
305
+ },
306
+ });
@@ -0,0 +1,32 @@
1
+ import DrawerNavigator from './DrawerNavigator';
2
+ import LogCallScreen from '../screens/CRM/LogCallScreen';
3
+ import { createNativeStackNavigator } from '@react-navigation/native-stack';
4
+
5
+ export type RootStackParamList = {
6
+ HomeTabs: undefined;
7
+ LogCall: {
8
+ contact: {
9
+ name: string;
10
+ avatarInitial: string;
11
+ avatarColor: string;
12
+ };
13
+ };
14
+ // Add more screens here as needed
15
+ };
16
+
17
+ const Stack = createNativeStackNavigator<RootStackParamList>();
18
+
19
+ const StackNavigator: React.FC = () => {
20
+ return (
21
+ <Stack.Navigator
22
+ screenOptions={{
23
+ headerShown: false,
24
+ }}
25
+ >
26
+ <Stack.Screen name="HomeTabs" component={DrawerNavigator} />
27
+ <Stack.Screen name="LogCall" component={LogCallScreen} />
28
+ </Stack.Navigator>
29
+ );
30
+ };
31
+
32
+ export default StackNavigator;
@@ -0,0 +1,57 @@
1
+ import { BottomSheet, BottomSheetOption } from '../../components/BottomSheet';
2
+
3
+ interface AddContactModalProps {
4
+ visible: boolean;
5
+ onClose: () => void;
6
+ onAddManually?: () => void;
7
+ onUploadGmail?: () => void;
8
+ onUploadPhonebook?: () => void;
9
+ onUploadCSV?: () => void;
10
+ }
11
+
12
+ export const AddContactModal = ({
13
+ visible,
14
+ onClose,
15
+ onAddManually,
16
+ onUploadGmail,
17
+ onUploadPhonebook,
18
+ onUploadCSV,
19
+ }: AddContactModalProps) => {
20
+ return (
21
+ <BottomSheet visible={visible} onClose={onClose} title="Add new contact">
22
+ <BottomSheetOption
23
+ icon="⋮⋮⋮"
24
+ label="Add manually"
25
+ onPress={() => {
26
+ onClose();
27
+ onAddManually?.();
28
+ }}
29
+ />
30
+ <BottomSheetOption
31
+ icon="G"
32
+ label="Upload Gmail contact"
33
+ iconColor="#EA4335"
34
+ onPress={() => {
35
+ onClose();
36
+ onUploadGmail?.();
37
+ }}
38
+ />
39
+ <BottomSheetOption
40
+ icon="📱"
41
+ label="Upload Phonebook contacts"
42
+ onPress={() => {
43
+ onClose();
44
+ onUploadPhonebook?.();
45
+ }}
46
+ />
47
+ <BottomSheetOption
48
+ icon="↑"
49
+ label="Upload CSV"
50
+ onPress={() => {
51
+ onClose();
52
+ onUploadCSV?.();
53
+ }}
54
+ />
55
+ </BottomSheet>
56
+ );
57
+ };
@@ -0,0 +1,109 @@
1
+ import { View, Text, StyleSheet, TouchableOpacity } from 'react-native';
2
+ import { scale, verticalScale, moderateScale } from 'react-native-size-matters';
3
+ import { Colors } from '../../constants/Colors';
4
+
5
+ interface CategoryTabsProps {
6
+ selectedCategory: 'all' | 'followUp' | 'new' | 'engaged';
7
+ onSelectCategory: (category: 'all' | 'followUp' | 'new' | 'engaged') => void;
8
+ }
9
+
10
+ export const CategoryTabs: React.FC<CategoryTabsProps> = ({
11
+ selectedCategory,
12
+ onSelectCategory,
13
+ }) => {
14
+ return (
15
+ <View style={styles.categoryTabsContainer}>
16
+ <TouchableOpacity
17
+ style={[
18
+ styles.categoryTab,
19
+ selectedCategory === 'all' && styles.categoryTabActive,
20
+ ]}
21
+ onPress={() => onSelectCategory('all')}
22
+ >
23
+ <Text
24
+ style={[
25
+ styles.categoryTabText,
26
+ selectedCategory === 'all' && styles.categoryTabTextActive,
27
+ ]}
28
+ >
29
+ All
30
+ </Text>
31
+ </TouchableOpacity>
32
+ <TouchableOpacity
33
+ style={[
34
+ styles.categoryTab,
35
+ selectedCategory === 'followUp' && styles.categoryTabActive,
36
+ ]}
37
+ onPress={() => onSelectCategory('followUp')}
38
+ >
39
+ <Text
40
+ style={[
41
+ styles.categoryTabText,
42
+ selectedCategory === 'followUp' && styles.categoryTabTextActive,
43
+ ]}
44
+ >
45
+ Follow Up
46
+ </Text>
47
+ </TouchableOpacity>
48
+ <TouchableOpacity
49
+ style={[
50
+ styles.categoryTab,
51
+ selectedCategory === 'new' && styles.categoryTabActive,
52
+ ]}
53
+ onPress={() => onSelectCategory('new')}
54
+ >
55
+ <Text
56
+ style={[
57
+ styles.categoryTabText,
58
+ selectedCategory === 'new' && styles.categoryTabTextActive,
59
+ ]}
60
+ >
61
+ New
62
+ </Text>
63
+ </TouchableOpacity>
64
+ <TouchableOpacity
65
+ style={[
66
+ styles.categoryTab,
67
+ selectedCategory === 'engaged' && styles.categoryTabActive,
68
+ ]}
69
+ onPress={() => onSelectCategory('engaged')}
70
+ >
71
+ <Text
72
+ style={[
73
+ styles.categoryTabText,
74
+ selectedCategory === 'engaged' && styles.categoryTabTextActive,
75
+ ]}
76
+ >
77
+ Engaged
78
+ </Text>
79
+ </TouchableOpacity>
80
+ </View>
81
+ );
82
+ };
83
+
84
+ const styles = StyleSheet.create({
85
+ categoryTabsContainer: {
86
+ flexDirection: 'row',
87
+ backgroundColor: Colors.white,
88
+ paddingHorizontal: scale(16),
89
+ paddingVertical: verticalScale(8),
90
+ },
91
+ categoryTab: {
92
+ flex: 1,
93
+ paddingVertical: verticalScale(12),
94
+ alignItems: 'center',
95
+ borderBottomWidth: 3,
96
+ borderBottomColor: 'transparent',
97
+ },
98
+ categoryTabActive: {
99
+ borderBottomColor: '#FF9800',
100
+ },
101
+ categoryTabText: {
102
+ fontSize: moderateScale(14),
103
+ fontWeight: '600',
104
+ color: Colors.black,
105
+ },
106
+ categoryTabTextActive: {
107
+ color: '#FF9800',
108
+ },
109
+ });
@@ -0,0 +1,168 @@
1
+ import { View, Text, StyleSheet, TouchableOpacity } from 'react-native';
2
+ import { scale, verticalScale, moderateScale } from 'react-native-size-matters';
3
+ import { Colors } from '../../constants/Colors';
4
+
5
+ interface ContactItemProps {
6
+ name: string;
7
+ phone?: string;
8
+ email?: string;
9
+ description?: string;
10
+ avatarColor: string;
11
+ avatarInitial: string;
12
+ selected?: boolean;
13
+ onPress?: () => void;
14
+ onSelectToggle?: () => void;
15
+ onReminderPress?: () => void;
16
+ onCallPress?: () => void;
17
+ onMenuPress?: () => void;
18
+ showCheckbox?: boolean;
19
+ showActionButtons?: boolean;
20
+ }
21
+
22
+ export const ContactItem: React.FC<ContactItemProps> = ({
23
+ name,
24
+ phone,
25
+ email,
26
+ description,
27
+ avatarColor,
28
+ avatarInitial,
29
+ selected = false,
30
+ onPress,
31
+ onSelectToggle,
32
+ onReminderPress,
33
+ onCallPress,
34
+ onMenuPress,
35
+ showCheckbox = false,
36
+ showActionButtons = false,
37
+ }) => {
38
+ return (
39
+ <TouchableOpacity
40
+ style={styles.contactItem}
41
+ onPress={onPress}
42
+ activeOpacity={0.7}
43
+ >
44
+ <View style={[styles.avatar, { backgroundColor: avatarColor }]}>
45
+ <Text style={styles.avatarText}>{avatarInitial}</Text>
46
+ </View>
47
+ <View style={styles.contactInfo}>
48
+ <Text style={styles.contactName}>{name}</Text>
49
+ {phone && <Text style={styles.contactPhone}>{phone}</Text>}
50
+ {email && <Text style={styles.contactEmail}>{email}</Text>}
51
+ {description && (
52
+ <Text
53
+ style={styles.contactDescription}
54
+ numberOfLines={1}
55
+ ellipsizeMode="tail"
56
+ >
57
+ {description}
58
+ </Text>
59
+ )}
60
+ </View>
61
+ {showActionButtons && (
62
+ <View style={styles.actionButtons}>
63
+ <TouchableOpacity
64
+ style={styles.actionButton}
65
+ onPress={onReminderPress}
66
+ >
67
+ <Text style={styles.actionIcon}>⏰</Text>
68
+ </TouchableOpacity>
69
+ <TouchableOpacity style={styles.actionButton} onPress={onCallPress}>
70
+ <Text style={styles.actionIcon}>📞</Text>
71
+ </TouchableOpacity>
72
+ <TouchableOpacity style={styles.actionButton} onPress={onMenuPress}>
73
+ <Text style={styles.actionIcon}>⋮</Text>
74
+ </TouchableOpacity>
75
+ </View>
76
+ )}
77
+ {showCheckbox && (
78
+ <TouchableOpacity style={styles.checkbox} onPress={onSelectToggle}>
79
+ <View
80
+ style={[styles.checkboxInner, selected && styles.checkboxSelected]}
81
+ >
82
+ {selected && <Text style={styles.checkmark}>✓</Text>}
83
+ </View>
84
+ </TouchableOpacity>
85
+ )}
86
+ </TouchableOpacity>
87
+ );
88
+ };
89
+
90
+ const styles = StyleSheet.create({
91
+ contactItem: {
92
+ flexDirection: 'row',
93
+ alignItems: 'center',
94
+ backgroundColor: Colors.white,
95
+ padding: scale(16),
96
+ borderBottomWidth: 1,
97
+ borderBottomColor: '#E0E0E0',
98
+ },
99
+ avatar: {
100
+ width: scale(46),
101
+ height: scale(46),
102
+ borderRadius: moderateScale(23),
103
+ justifyContent: 'center',
104
+ alignItems: 'center',
105
+ marginRight: scale(12),
106
+ },
107
+ avatarText: {
108
+ fontSize: moderateScale(24),
109
+ fontWeight: '700',
110
+ color: Colors.white,
111
+ },
112
+ contactInfo: {
113
+ flex: 1,
114
+ },
115
+ contactName: {
116
+ fontSize: moderateScale(16),
117
+ fontWeight: '700',
118
+ color: Colors.black,
119
+ marginBottom: verticalScale(4),
120
+ },
121
+ contactPhone: {
122
+ fontSize: moderateScale(12),
123
+ color: Colors.black,
124
+ marginBottom: verticalScale(2),
125
+ },
126
+ contactEmail: {
127
+ fontSize: moderateScale(12),
128
+ color: '#666',
129
+ marginBottom: verticalScale(4),
130
+ },
131
+ contactDescription: {
132
+ fontSize: moderateScale(12),
133
+ color: Colors.black,
134
+ lineHeight: verticalScale(18),
135
+ },
136
+ actionButtons: {
137
+ flexDirection: 'row',
138
+ alignItems: 'center',
139
+ },
140
+ actionButton: {
141
+ padding: scale(8),
142
+ marginLeft: scale(8),
143
+ },
144
+ actionIcon: {
145
+ fontSize: moderateScale(20),
146
+ color: Colors.black,
147
+ },
148
+ checkbox: {
149
+ padding: scale(8),
150
+ },
151
+ checkboxInner: {
152
+ width: scale(28),
153
+ height: scale(28),
154
+ borderWidth: 2,
155
+ borderColor: '#FF9800',
156
+ borderRadius: moderateScale(4),
157
+ justifyContent: 'center',
158
+ alignItems: 'center',
159
+ },
160
+ checkboxSelected: {
161
+ backgroundColor: '#FF9800',
162
+ },
163
+ checkmark: {
164
+ color: Colors.white,
165
+ fontSize: moderateScale(16),
166
+ fontWeight: '700',
167
+ },
168
+ });
@@ -0,0 +1,34 @@
1
+ import { Text, StyleSheet, TouchableOpacity } from 'react-native';
2
+ import { scale, moderateScale } from 'react-native-size-matters';
3
+
4
+ interface FilterDropdownProps {
5
+ onPress?: () => void;
6
+ }
7
+
8
+ export const FilterDropdown: React.FC<FilterDropdownProps> = ({ onPress }) => {
9
+ return (
10
+ <TouchableOpacity style={styles.filterButton} onPress={onPress}>
11
+ <Text style={styles.filterText}>Filter By</Text>
12
+ <Text style={styles.filterArrow}>▼</Text>
13
+ </TouchableOpacity>
14
+ );
15
+ };
16
+
17
+ const styles = StyleSheet.create({
18
+ filterButton: {
19
+ flexDirection: 'row',
20
+ alignItems: 'center',
21
+ justifyContent: 'flex-end',
22
+ paddingHorizontal: scale(16),
23
+ },
24
+ filterText: {
25
+ fontSize: moderateScale(16),
26
+ fontWeight: '600',
27
+ color: '#FF9800',
28
+ marginRight: scale(4),
29
+ },
30
+ filterArrow: {
31
+ fontSize: moderateScale(12),
32
+ color: '#FF9800',
33
+ },
34
+ });