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,103 @@
1
+ import {
2
+ View,
3
+ Text,
4
+ StyleSheet,
5
+ TouchableOpacity,
6
+ Dimensions,
7
+ } from 'react-native';
8
+ import { scale, verticalScale, moderateScale } from 'react-native-size-matters';
9
+ import { Colors } from '../../constants/Colors';
10
+
11
+ const { width } = Dimensions.get('window');
12
+
13
+ interface FunnelData {
14
+ followUp: number;
15
+ new: number;
16
+ engaged: number;
17
+ deal: number;
18
+ quoteSent: number;
19
+ won: number;
20
+ dropped: number;
21
+ }
22
+
23
+ interface FunnelChartProps {
24
+ data: FunnelData;
25
+ totalLeads: number;
26
+ onListPress?: () => void;
27
+ }
28
+
29
+ export const FunnelChart: React.FC<FunnelChartProps> = ({
30
+ data,
31
+ totalLeads,
32
+ onListPress,
33
+ }) => {
34
+ const stages = [
35
+ { label: 'Follow Up', value: data.followUp, width: 1.0 },
36
+ { label: 'New', value: data.new, width: 0.85 },
37
+ { label: 'Engaged', value: data.engaged, width: 0.7 },
38
+ { label: 'Deal', value: data.deal, width: 0.55 },
39
+ { label: 'Quote sent', value: data.quoteSent, width: 0.4 },
40
+ { label: 'Won', value: data.won, width: 0.25 },
41
+ { label: 'Dropped', value: data.dropped, width: 0.15 },
42
+ ];
43
+
44
+ return (
45
+ <View style={styles.funnelContainer}>
46
+ <View style={styles.funnelHeader}>
47
+ <Text style={styles.totalLeadsText}>Total Leads: {totalLeads}</Text>
48
+ <TouchableOpacity onPress={onListPress}>
49
+ <Text style={styles.listIcon}>☰</Text>
50
+ </TouchableOpacity>
51
+ </View>
52
+ {stages.map((stage, index) => (
53
+ <View
54
+ key={index}
55
+ style={[
56
+ styles.funnelStage,
57
+ { width: width * 0.8 * stage.width, alignSelf: 'center' },
58
+ ]}
59
+ >
60
+ <Text style={styles.funnelStageText}>
61
+ {stage.label}: {stage.value}
62
+ </Text>
63
+ </View>
64
+ ))}
65
+ </View>
66
+ );
67
+ };
68
+
69
+ const styles = StyleSheet.create({
70
+ funnelContainer: {
71
+ backgroundColor: Colors.white,
72
+ margin: scale(16),
73
+ padding: scale(16),
74
+ borderRadius: moderateScale(12),
75
+ },
76
+ funnelHeader: {
77
+ flexDirection: 'row',
78
+ justifyContent: 'space-between',
79
+ alignItems: 'center',
80
+ marginBottom: verticalScale(20),
81
+ },
82
+ totalLeadsText: {
83
+ fontSize: moderateScale(16),
84
+ fontWeight: '700',
85
+ color: Colors.black,
86
+ },
87
+ listIcon: {
88
+ fontSize: moderateScale(20),
89
+ color: Colors.black,
90
+ },
91
+ funnelStage: {
92
+ backgroundColor: '#A5C9CA',
93
+ paddingVertical: verticalScale(20),
94
+ marginBottom: verticalScale(4),
95
+ borderRadius: moderateScale(4),
96
+ alignItems: 'center',
97
+ },
98
+ funnelStageText: {
99
+ fontSize: moderateScale(16),
100
+ fontWeight: '600',
101
+ color: Colors.black,
102
+ },
103
+ });
@@ -0,0 +1,51 @@
1
+ import { View, Text, StyleSheet } from 'react-native';
2
+ import { scale, verticalScale, moderateScale } from 'react-native-size-matters';
3
+ import { Colors } from '../../constants/Colors';
4
+
5
+ interface InfoCardProps {
6
+ title?: string;
7
+ description?: string;
8
+ }
9
+
10
+ export const InfoCard: React.FC<InfoCardProps> = ({
11
+ title = 'Engaged',
12
+ description = 'A Lead that is paying attention to your marketing methods and offers is called Engaged. For example,...',
13
+ }) => {
14
+ return (
15
+ <View style={styles.infoCard}>
16
+ <Text style={styles.infoTitle}>{title}</Text>
17
+ <Text style={styles.infoDescription}>
18
+ {description} <Text style={styles.readMore}>Read More</Text>
19
+ </Text>
20
+ </View>
21
+ );
22
+ };
23
+
24
+ const styles = StyleSheet.create({
25
+ infoCard: {
26
+ backgroundColor: Colors.white,
27
+ margin: scale(16),
28
+ padding: scale(16),
29
+ borderRadius: moderateScale(12),
30
+ shadowColor: Colors.black,
31
+ shadowOffset: { width: 0, height: verticalScale(2) },
32
+ shadowOpacity: 0.1,
33
+ shadowRadius: moderateScale(4),
34
+ elevation: 3,
35
+ },
36
+ infoTitle: {
37
+ fontSize: moderateScale(18),
38
+ fontWeight: '700',
39
+ color: Colors.black,
40
+ marginBottom: verticalScale(8),
41
+ },
42
+ infoDescription: {
43
+ fontSize: moderateScale(14),
44
+ color: Colors.black,
45
+ lineHeight: verticalScale(20),
46
+ },
47
+ readMore: {
48
+ color: '#FF9800',
49
+ fontWeight: '600',
50
+ },
51
+ });
@@ -0,0 +1,69 @@
1
+ import { View, Text, StyleSheet } from 'react-native';
2
+ import { scale, verticalScale, moderateScale } from 'react-native-size-matters';
3
+ import { Colors } from '../../constants/Colors';
4
+
5
+ interface LeadCardProps {
6
+ name: string;
7
+ email: string;
8
+ description: string;
9
+ timestamp: string;
10
+ }
11
+
12
+ export const LeadCard: React.FC<LeadCardProps> = ({
13
+ name,
14
+ email,
15
+ description,
16
+ timestamp,
17
+ }) => {
18
+ return (
19
+ <View style={styles.leadCard}>
20
+ <Text style={styles.leadName}>{name}</Text>
21
+ <Text style={styles.leadEmail}>{email}</Text>
22
+ <View style={styles.leadDivider} />
23
+ <Text style={styles.leadDescription}>{description}</Text>
24
+ <Text style={styles.leadTimestamp}>{timestamp}</Text>
25
+ </View>
26
+ );
27
+ };
28
+
29
+ const styles = StyleSheet.create({
30
+ leadCard: {
31
+ backgroundColor: Colors.white,
32
+ margin: scale(16),
33
+ marginTop: 0,
34
+ marginBottom: verticalScale(16),
35
+ padding: scale(16),
36
+ borderRadius: moderateScale(12),
37
+ shadowColor: Colors.black,
38
+ shadowOffset: { width: 0, height: verticalScale(2) },
39
+ shadowOpacity: 0.1,
40
+ shadowRadius: moderateScale(4),
41
+ elevation: 3,
42
+ },
43
+ leadName: {
44
+ fontSize: moderateScale(18),
45
+ fontWeight: '700',
46
+ color: Colors.black,
47
+ marginBottom: verticalScale(6),
48
+ },
49
+ leadEmail: {
50
+ fontSize: moderateScale(14),
51
+ color: '#666',
52
+ marginBottom: verticalScale(12),
53
+ },
54
+ leadDivider: {
55
+ height: 1,
56
+ backgroundColor: '#E0E0E0',
57
+ marginVertical: verticalScale(12),
58
+ },
59
+ leadDescription: {
60
+ fontSize: moderateScale(14),
61
+ color: Colors.black,
62
+ lineHeight: verticalScale(20),
63
+ marginBottom: verticalScale(12),
64
+ },
65
+ leadTimestamp: {
66
+ fontSize: moderateScale(13),
67
+ color: '#666',
68
+ },
69
+ });
@@ -0,0 +1,318 @@
1
+ import { useState } from 'react';
2
+ import {
3
+ View,
4
+ Text,
5
+ StyleSheet,
6
+ TouchableOpacity,
7
+ ScrollView,
8
+ } from 'react-native';
9
+ import { scale, verticalScale, moderateScale } from 'react-native-size-matters';
10
+ import { SafeAreaView } from 'react-native-safe-area-context';
11
+ import { Colors } from '../../constants/Colors';
12
+ import { ScreenHeader } from '../../components/ScreenHeader';
13
+ import { useNavigation, useRoute } from '@react-navigation/native';
14
+ import type { RouteProp } from '@react-navigation/native';
15
+ import type { RootStackParamList } from '../../navigation/StackNavigator';
16
+
17
+ type LogCallScreenRouteProp = RouteProp<RootStackParamList, 'LogCall'>;
18
+
19
+ interface LogCallScreenProps {
20
+ visible?: boolean;
21
+ onClose?: () => void;
22
+ contactName?: string;
23
+ contactAvatar?: string;
24
+ contactAvatarColor?: string;
25
+ onSave?: (outcome: string, leadStage: string, followUpDays: string) => void;
26
+ showCrossOnLeft?: boolean;
27
+ }
28
+
29
+ const callOutcomes = [
30
+ 'Interested',
31
+ 'Drop',
32
+ 'Hold',
33
+ 'Call back later',
34
+ 'Busy',
35
+ 'Other',
36
+ ];
37
+
38
+ const leadStages = [
39
+ 'All',
40
+ 'Follow Up',
41
+ 'New',
42
+ 'Engaged',
43
+ 'Deal',
44
+ 'Quote sent',
45
+ 'Won',
46
+ 'Dropped',
47
+ ];
48
+
49
+ const LogCallScreen: React.FC<LogCallScreenProps> = ({
50
+ visible,
51
+ onClose,
52
+ contactName: propContactName,
53
+ contactAvatar: propContactAvatar,
54
+ contactAvatarColor: propContactAvatarColor,
55
+ onSave,
56
+ showCrossOnLeft = false,
57
+ } = {}) => {
58
+ const navigation = useNavigation();
59
+ const route = useRoute<LogCallScreenRouteProp>();
60
+
61
+ const contact = route.params?.contact;
62
+ const contactName = propContactName || contact?.name || 'Contact';
63
+ const contactAvatar = propContactAvatar || contact?.avatarInitial || 'H';
64
+ const contactAvatarColor =
65
+ propContactAvatarColor || contact?.avatarColor || '#C84B9E';
66
+
67
+ const [selectedOutcome, setSelectedOutcome] = useState('Interested');
68
+ const [selectedStage, setSelectedStage] = useState('All');
69
+ const [selectedFollowUp] = useState('1 day');
70
+
71
+ const handleSave = () => {
72
+ onSave?.(selectedOutcome, selectedStage, selectedFollowUp);
73
+ if (onClose) {
74
+ onClose();
75
+ } else {
76
+ navigation.goBack();
77
+ }
78
+ };
79
+
80
+ const handleBack = () => {
81
+ if (onClose) {
82
+ onClose();
83
+ } else {
84
+ navigation.goBack();
85
+ }
86
+ };
87
+
88
+ if (visible === false) return null;
89
+
90
+ return (
91
+ <SafeAreaView style={styles.container} edges={['top']}>
92
+ {/* Header */}
93
+ <ScreenHeader
94
+ title="Log Call"
95
+ onBackPress={handleBack}
96
+ showCrossOnLeft={showCrossOnLeft}
97
+ />
98
+
99
+ <ScrollView style={styles.content}>
100
+ {/* Contact Info */}
101
+ <View style={styles.contactSection}>
102
+ <View
103
+ style={[styles.avatar, { backgroundColor: contactAvatarColor }]}
104
+ >
105
+ <Text style={styles.avatarText}>{contactAvatar}</Text>
106
+ </View>
107
+ <Text style={styles.contactName}>{contactName}</Text>
108
+ </View>
109
+
110
+ {/* Follow up task */}
111
+ <View style={styles.followUpSection}>
112
+ <View style={styles.followUpRow}>
113
+ <View style={styles.iconWrapper}>
114
+ <Text style={styles.calendarIcon}>📅</Text>
115
+ </View>
116
+ <Text style={styles.followUpText}>Follow up task</Text>
117
+ <TouchableOpacity style={styles.dropdown}>
118
+ <Text style={styles.dropdownText}>{selectedFollowUp}</Text>
119
+ <Text style={styles.dropdownArrow}>▼</Text>
120
+ </TouchableOpacity>
121
+ </View>
122
+ </View>
123
+
124
+ {/* Call outcome */}
125
+ <View style={styles.section}>
126
+ <Text style={styles.sectionTitle}>Call outcome</Text>
127
+ <View style={styles.optionsGrid}>
128
+ {callOutcomes.map((outcome) => (
129
+ <TouchableOpacity
130
+ key={outcome}
131
+ style={[
132
+ styles.optionButton,
133
+ selectedOutcome === outcome && styles.optionButtonSelected,
134
+ ]}
135
+ onPress={() => setSelectedOutcome(outcome)}
136
+ >
137
+ <Text
138
+ style={[
139
+ styles.optionText,
140
+ selectedOutcome === outcome && styles.optionTextSelected,
141
+ ]}
142
+ >
143
+ {outcome}
144
+ </Text>
145
+ </TouchableOpacity>
146
+ ))}
147
+ </View>
148
+ </View>
149
+
150
+ {/* Lead stage */}
151
+ <View style={styles.section}>
152
+ <Text style={styles.sectionTitle}>Lead stage</Text>
153
+ <Text style={styles.sectionSubtitle}>
154
+ Stage is same as lead stage
155
+ </Text>
156
+ <View style={styles.optionsGrid}>
157
+ {leadStages.map((stage) => (
158
+ <TouchableOpacity
159
+ key={stage}
160
+ style={[
161
+ styles.optionButton,
162
+ selectedStage === stage && styles.optionButtonSelected,
163
+ ]}
164
+ onPress={() => setSelectedStage(stage)}
165
+ >
166
+ <Text
167
+ style={[
168
+ styles.optionText,
169
+ selectedStage === stage && styles.optionTextSelected,
170
+ ]}
171
+ >
172
+ {stage}
173
+ </Text>
174
+ </TouchableOpacity>
175
+ ))}
176
+ </View>
177
+ </View>
178
+ </ScrollView>
179
+
180
+ {/* Save Button */}
181
+ <View style={styles.footer}>
182
+ <TouchableOpacity style={styles.saveButton} onPress={handleSave}>
183
+ <Text style={styles.saveButtonText}>Save</Text>
184
+ </TouchableOpacity>
185
+ </View>
186
+ </SafeAreaView>
187
+ );
188
+ };
189
+
190
+ export default LogCallScreen;
191
+
192
+ const styles = StyleSheet.create({
193
+ container: {
194
+ flex: 1,
195
+ backgroundColor: Colors.white,
196
+ },
197
+ content: {
198
+ flex: 1,
199
+ },
200
+ contactSection: {
201
+ alignItems: 'center',
202
+ paddingVertical: verticalScale(24),
203
+ },
204
+ avatar: {
205
+ width: scale(80),
206
+ height: scale(80),
207
+ borderRadius: moderateScale(40),
208
+ justifyContent: 'center',
209
+ alignItems: 'center',
210
+ marginBottom: verticalScale(12),
211
+ },
212
+ avatarText: {
213
+ fontSize: moderateScale(36),
214
+ fontWeight: '700',
215
+ color: Colors.white,
216
+ },
217
+ contactName: {
218
+ fontSize: moderateScale(24),
219
+ fontWeight: '700',
220
+ color: Colors.black,
221
+ },
222
+ followUpSection: {
223
+ paddingHorizontal: scale(16),
224
+ marginBottom: verticalScale(24),
225
+ },
226
+ followUpRow: {
227
+ flexDirection: 'row',
228
+ alignItems: 'center',
229
+ backgroundColor: '#F5F5F5',
230
+ borderRadius: moderateScale(12),
231
+ padding: scale(16),
232
+ borderWidth: 1,
233
+ borderColor: '#E0E0E0',
234
+ },
235
+ iconWrapper: {
236
+ marginRight: scale(12),
237
+ },
238
+ calendarIcon: {
239
+ fontSize: moderateScale(24),
240
+ },
241
+ followUpText: {
242
+ flex: 1,
243
+ fontSize: moderateScale(16),
244
+ fontWeight: '600',
245
+ color: Colors.black,
246
+ },
247
+ dropdown: {
248
+ flexDirection: 'row',
249
+ alignItems: 'center',
250
+ paddingHorizontal: scale(12),
251
+ paddingVertical: verticalScale(6),
252
+ },
253
+ dropdownText: {
254
+ fontSize: moderateScale(16),
255
+ color: Colors.black,
256
+ marginRight: scale(4),
257
+ },
258
+ dropdownArrow: {
259
+ fontSize: moderateScale(12),
260
+ color: Colors.black,
261
+ },
262
+ section: {
263
+ paddingHorizontal: scale(16),
264
+ marginBottom: verticalScale(32),
265
+ },
266
+ sectionTitle: {
267
+ fontSize: moderateScale(20),
268
+ fontWeight: '700',
269
+ color: Colors.black,
270
+ marginBottom: verticalScale(8),
271
+ },
272
+ sectionSubtitle: {
273
+ fontSize: moderateScale(14),
274
+ color: '#666',
275
+ marginBottom: verticalScale(16),
276
+ },
277
+ optionsGrid: {
278
+ flexDirection: 'row',
279
+ flexWrap: 'wrap',
280
+ gap: scale(12),
281
+ },
282
+ optionButton: {
283
+ paddingHorizontal: scale(20),
284
+ paddingVertical: verticalScale(12),
285
+ borderRadius: moderateScale(24),
286
+ borderWidth: 1,
287
+ borderColor: '#E0E0E0',
288
+ backgroundColor: Colors.white,
289
+ },
290
+ optionButtonSelected: {
291
+ borderColor: '#FF9800',
292
+ borderWidth: 2,
293
+ },
294
+ optionText: {
295
+ fontSize: moderateScale(15),
296
+ fontWeight: '500',
297
+ color: Colors.black,
298
+ },
299
+ optionTextSelected: {
300
+ color: '#FF9800',
301
+ fontWeight: '600',
302
+ },
303
+ footer: {
304
+ padding: scale(16),
305
+ paddingBottom: verticalScale(32),
306
+ },
307
+ saveButton: {
308
+ backgroundColor: '#46bdd3',
309
+ paddingVertical: verticalScale(16),
310
+ borderRadius: moderateScale(12),
311
+ alignItems: 'center',
312
+ },
313
+ saveButtonText: {
314
+ fontSize: moderateScale(18),
315
+ fontWeight: '700',
316
+ color: Colors.white,
317
+ },
318
+ });
@@ -0,0 +1,95 @@
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 TopTabsProps {
6
+ selectedTab: 'leads' | 'prospects' | 'contacts';
7
+ onSelectTab: (tab: 'leads' | 'prospects' | 'contacts') => void;
8
+ counts: {
9
+ leads: number;
10
+ prospects: number;
11
+ contacts: number;
12
+ };
13
+ }
14
+
15
+ export const TopTabs: React.FC<TopTabsProps> = ({
16
+ selectedTab,
17
+ onSelectTab,
18
+ counts,
19
+ }) => {
20
+ return (
21
+ <View style={styles.topTabsContainer}>
22
+ <TouchableOpacity
23
+ style={[styles.topTab, selectedTab === 'leads' && styles.topTabActive]}
24
+ onPress={() => onSelectTab('leads')}
25
+ >
26
+ <Text
27
+ style={[
28
+ styles.topTabText,
29
+ selectedTab === 'leads' && styles.topTabTextActive,
30
+ ]}
31
+ >
32
+ Leads({counts.leads})
33
+ </Text>
34
+ </TouchableOpacity>
35
+ <TouchableOpacity
36
+ style={[
37
+ styles.topTab,
38
+ selectedTab === 'prospects' && styles.topTabActive,
39
+ ]}
40
+ onPress={() => onSelectTab('prospects')}
41
+ >
42
+ <Text
43
+ style={[
44
+ styles.topTabText,
45
+ selectedTab === 'prospects' && styles.topTabTextActive,
46
+ ]}
47
+ >
48
+ Prospects({counts.prospects})
49
+ </Text>
50
+ </TouchableOpacity>
51
+ <TouchableOpacity
52
+ style={[
53
+ styles.topTab,
54
+ selectedTab === 'contacts' && styles.topTabActive,
55
+ ]}
56
+ onPress={() => onSelectTab('contacts')}
57
+ >
58
+ <Text
59
+ style={[
60
+ styles.topTabText,
61
+ selectedTab === 'contacts' && styles.topTabTextActive,
62
+ ]}
63
+ >
64
+ Contacts({counts.contacts})
65
+ </Text>
66
+ </TouchableOpacity>
67
+ </View>
68
+ );
69
+ };
70
+
71
+ const styles = StyleSheet.create({
72
+ topTabsContainer: {
73
+ flexDirection: 'row',
74
+ backgroundColor: Colors.white,
75
+ paddingHorizontal: scale(8),
76
+ },
77
+ topTab: {
78
+ flex: 1,
79
+ paddingVertical: verticalScale(16),
80
+ alignItems: 'center',
81
+ borderBottomWidth: 3,
82
+ borderBottomColor: 'transparent',
83
+ },
84
+ topTabActive: {
85
+ borderBottomColor: '#FF9800',
86
+ },
87
+ topTabText: {
88
+ fontSize: moderateScale(16),
89
+ fontWeight: '600',
90
+ color: Colors.black,
91
+ },
92
+ topTabTextActive: {
93
+ color: '#FF9800',
94
+ },
95
+ });
@@ -0,0 +1,10 @@
1
+ // CRM Screen Components
2
+ export { FilterDropdown } from './FilterDropdown';
3
+ export { TopTabs } from './TopTabs';
4
+ export { InfoCard } from './InfoCard';
5
+ export { CategoryTabs } from './CategoryTabs';
6
+ export { ContactItem } from './ContactItem';
7
+ export { LeadCard } from './LeadCard';
8
+ export { FunnelChart } from './FunnelChart';
9
+ export { AddContactModal } from './AddContactModal';
10
+ export { default as LogCallScreen } from './LogCallScreen';
@@ -0,0 +1,37 @@
1
+ import { View, Text, StyleSheet, ScrollView } from 'react-native';
2
+ import { scale, moderateScale } from 'react-native-size-matters';
3
+ import { SafeAreaView } from 'react-native-safe-area-context';
4
+ import { Colors } from '../constants/Colors';
5
+
6
+ const ReportsScreen: React.FC = () => {
7
+ return (
8
+ <SafeAreaView style={styles.container} edges={['bottom']}>
9
+ <View style={styles.header}>
10
+ <Text style={styles.headerTitle}>Reports</Text>
11
+ </View>
12
+ <ScrollView style={styles.scrollView} />
13
+ </SafeAreaView>
14
+ );
15
+ };
16
+
17
+ export default ReportsScreen;
18
+
19
+ const styles = StyleSheet.create({
20
+ container: {
21
+ flex: 1,
22
+ backgroundColor: Colors.background,
23
+ },
24
+ header: {
25
+ backgroundColor: Colors.white,
26
+ padding: scale(16),
27
+ },
28
+ headerTitle: {
29
+ fontSize: moderateScale(20),
30
+ fontWeight: '600',
31
+ color: Colors.black,
32
+ textAlign: 'center',
33
+ },
34
+ scrollView: {
35
+ flex: 1,
36
+ },
37
+ });
@@ -0,0 +1,25 @@
1
+ import { StyleSheet, ScrollView } from 'react-native';
2
+ import { SafeAreaView } from 'react-native-safe-area-context';
3
+ import { Colors } from '../../constants/Colors';
4
+ import TabsHeader from '../../components/TabsHeader';
5
+
6
+ const ActivityAnalytics: React.FC = () => {
7
+ return (
8
+ <SafeAreaView style={styles.container} edges={['top', 'bottom']}>
9
+ <TabsHeader title="Analytics" />
10
+ <ScrollView style={styles.scrollView} />
11
+ </SafeAreaView>
12
+ );
13
+ };
14
+
15
+ export default ActivityAnalytics;
16
+
17
+ const styles = StyleSheet.create({
18
+ container: {
19
+ flex: 1,
20
+ backgroundColor: Colors.background,
21
+ },
22
+ scrollView: {
23
+ flex: 1,
24
+ },
25
+ });