@chat21/chat21-ionic 3.0.65-rc2 → 3.0.65

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 (24) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/deploy_amazon_prod.sh +2 -2
  3. package/package.json +3 -3
  4. package/src/app/app.component.ts +14 -33
  5. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +0 -10
  6. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +1 -1
  7. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +18 -30
  8. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +1 -1
  9. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.scss +2 -0
  10. package/src/app/components/project-item/project-item.component.ts +5 -0
  11. package/src/app/components/sidebar/sidebar.component.ts +8 -15
  12. package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +12 -23
  13. package/src/app/components/sidebar-user-details/sidebar-user-details.component.scss +3 -0
  14. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +88 -136
  15. package/src/app/directives/truncate.pipe.ts +0 -1
  16. package/src/app/pages/authentication/login/login.page.ts +0 -1
  17. package/src/app/pages/conversation-detail/conversation-detail.page.ts +40 -44
  18. package/src/app/pages/conversations-list/conversations-list.page.ts +25 -5
  19. package/src/assets/i18n/ar.json +266 -0
  20. package/src/chat21-core/providers/firebase/firebase-archivedconversations-handler.ts +26 -21
  21. package/src/chat21-core/providers/firebase/firebase-conversations-handler.ts +62 -55
  22. package/src/chat21-core/utils/constants.ts +1 -1
  23. package/src/global.scss +2 -2
  24. package/deploy_prod.sh +0 -14
@@ -1,3 +1,4 @@
1
+ import { AppStorageService } from 'src/chat21-core/providers/abstract/app-storage.service';
1
2
  import { ArchivedConversationsHandlerService } from 'src/chat21-core/providers/abstract/archivedconversations-handler.service'
2
3
  import { Component, OnInit, ViewChild } from '@angular/core'
3
4
  import { IonContent, ModalController } from '@ionic/angular'
@@ -17,6 +18,8 @@ import {
17
18
  closeModal,
18
19
  convertMessage,
19
20
  isGroup,
21
+ searchIndexInArrayForUid,
22
+ compareValues,
20
23
  } from '../../../chat21-core/utils/utils'
21
24
 
22
25
  import { EventsService } from '../../services/events-service'
@@ -118,6 +121,7 @@ export class ConversationListPage implements OnInit {
118
121
  public appConfigProvider: AppConfigProvider,
119
122
  public platform: Platform,
120
123
  private networkService: NetworkService,
124
+ private appStorageService: AppStorageService
121
125
  ) {
122
126
  this.listenToAppCompConvsLengthOnInitConvs()
123
127
  this.listenToLogoutEvent()
@@ -168,6 +172,7 @@ export class ConversationListPage implements OnInit {
168
172
  ngOnInit() {
169
173
  this.watchToConnectionStatus()
170
174
  this.getAppConfigToHideDiplayBtns()
175
+
171
176
  }
172
177
 
173
178
  ngOnChanges() {
@@ -226,7 +231,7 @@ export class ConversationListPage implements OnInit {
226
231
  this.logger.log('Called ionViewDidEnter')
227
232
  this.logger.log('[CONVS-LIST-PAGE] ionViewWillEnter uidConvSelected',this.uidConvSelected )
228
233
  this.listnerStart()
229
-
234
+ // this.conversations = this.manageStoredConversations()
230
235
  // exit from app with hardware back button
231
236
  this.subscription = this.platform.backButton.subscribe(() => {
232
237
  navigator['app'].exitApp()
@@ -335,6 +340,7 @@ export class ConversationListPage implements OnInit {
335
340
  // Init convrsation handler
336
341
  // ------------------------------------------------------------------ //
337
342
  initConversationsHandler() {
343
+ // this.conversations = this.manageStoredConversations()
338
344
  this.conversations = this.conversationsHandlerService.conversations
339
345
  this.logger.log('[CONVS-LIST-PAGE] - CONVERSATIONS ', this.conversations.length, this.conversations)
340
346
  // save conversationHandler in chatManager
@@ -342,6 +348,19 @@ export class ConversationListPage implements OnInit {
342
348
  this.showPlaceholder = false
343
349
  }
344
350
 
351
+ private manageStoredConversations(): ConversationModel[] {
352
+ let conversationsStored = []
353
+ if(this.appStorageService.getItem('conversations')){
354
+ conversationsStored = JSON.parse(this.appStorageService.getItem('conversations'))
355
+ if(conversationsStored && conversationsStored.length > 0) {
356
+ // this.conversationsHandlerService.conversations = conversationsStored
357
+ this.logger.log('[CONVS-LIST-PAGE] retrive conversations from storage --> ', conversationsStored.length)
358
+ this.events.publish('appcompSubscribeToConvs:loadingIsActive', false);
359
+ }
360
+ }
361
+ return conversationsStored
362
+ }
363
+
345
364
  initArchivedConversationsHandler() {
346
365
  const keysConversation = ['CLOSED', 'Resolve']
347
366
  this.translationMapConversation = this.translateService.translateLanguage( keysConversation )
@@ -648,16 +667,15 @@ export class ConversationListPage implements OnInit {
648
667
  let conversationSelected
649
668
  if (conversationType === 'active') {
650
669
  conversationSelected = this.conversations.find((item) => item.uid === this.uidConvSelected)
651
- this.conversationsHandlerService.uidConvSelected = conversationSelected.uid
652
670
  } else if (conversationType === 'archived') {
653
- conversationSelected = this.archivedConversations.find((item) => item.uid === this.uidConvSelected)
654
- this.archivedConversationsHandlerService.uidConvSelected = conversationSelected.uid
671
+ conversationSelected = this.archivedConversations.find((item) => item.uid === this.uidConvSelected)
655
672
  }
656
673
  if (conversationSelected) {
657
674
  this.logger.log('[CONVS-LIST-PAGE] conversationSelected', conversationSelected)
658
675
  this.logger.log('[CONVS-LIST-PAGE] the conversation ', this.conversationSelected, ' has already been loaded')
659
676
  this.conversationSelected = conversationSelected
660
677
  this.logger.log('[CONVS-LIST-PAGE] setUidConvSelected: ', this.conversationSelected)
678
+ conversationType === 'active'? this.conversationsHandlerService.uidConvSelected = conversationSelected.uid : this.archivedConversationsHandlerService.uidConvSelected = conversationSelected.uid
661
679
  }
662
680
  }
663
681
  }
@@ -922,7 +940,9 @@ export class ConversationListPage implements OnInit {
922
940
  this.logger.log('[CONVS-LIST-PAGE] - onCloseConversation (closeSupportGroup) CONVS ',this.conversations)
923
941
  this.logger.log('[CONVS-LIST-PAGE] - onCloseConversation (closeSupportGroup) CONVS LENGHT ',this.conversations.length)
924
942
  this.events.publish('conversationhasbeenclosed', conversationId)
925
- this.navigateByUrl('archived', conversationId)
943
+ if(conversationId === this.uidConvSelected){
944
+ this.navigateByUrl('archived', conversationId)
945
+ }
926
946
  })
927
947
  }
928
948
 
@@ -0,0 +1,266 @@
1
+ {
2
+ "LABEL_TU": "أنت: ",
3
+ "LABEL_MSG_PUSH_START_CHAT": "لا محادثة حتى الآن",
4
+ "LABEL_MSG_START_CHAT": "ابدأ الدردشة",
5
+ "LABEL_ACTIVE_NOW": "متوفرة",
6
+ "LABEL_AVAILABLE": "متوفرة",
7
+ "LABEL_NOT_AVAILABLE": "غير متاح",
8
+ "LABEL_NO_MSG_HERE": "لا توجد رسالة هنا حتى الآن ...",
9
+ "LABEL_TODAY": "اليوم",
10
+ "LABEL_TOMORROW": "في الامس",
11
+ "LABEL_LAST_ACCESS": "آخر ولوج",
12
+ "LABEL_TO": "في",
13
+ "ARRAY_DAYS": [
14
+ "الاثنين",
15
+ "يوم الثلاثاء",
16
+ "الأربعاء",
17
+ "يوم الخميس",
18
+ "جمعة",
19
+ "السبت",
20
+ "الأحد"
21
+ ],
22
+ "LABEL_SEND": "إرسال",
23
+ "ID_CONVERSATION": "معرف محادثة",
24
+ "LABEL_CREATED_THE": "تم إنشاء المجموعة في",
25
+ "LABEL_INFO_ATTRIBUTE": "صفات",
26
+ "LABEL_INFO_ADVANCED": "متقدم",
27
+ "LABEL_CLIENT": "عميل ",
28
+ "LABEL_SOURCEPAGE": "مصدر ",
29
+ "LABEL_DEPARTMENT_ID": "معرف القسم ",
30
+ "LABEL_DEPARTMENT_NAME": " قسم، أقسام ",
31
+ "requester_id": "معرف مقدم الطلب",
32
+ "projectId": "معرف المشروع ",
33
+ "LABEL_NAME": "اسم االمستخدم ",
34
+ "LABEL_EMAIL": "بريد الالكتروني ",
35
+ "LABEL_MEMBERS": "مشاركون",
36
+ "LABEL_INFO_MESSAGE": "رسالة معلومات",
37
+ "LABEL_READ_BY": "قرأ من قبل",
38
+ "LABEL_STATUS_MESSAGE": "حالة",
39
+ "LABEL_SENT_THE": "أرسلت في",
40
+ "LABEL_SENT_BY": "من",
41
+ "LABEL_GUEST": "زائر",
42
+ "LABEL_CREATE_TICKET": "إنشاء تذكرة",
43
+ "LABEL_SEND_BY_EMAIL": "ارسل بالبريد الإلكترونى",
44
+ "LABEL_VIDEO_CHAT": "مكالمة فيديو",
45
+ "LABEL_LEAVE_GROUP": "اترك المجموعة",
46
+ "LABEL_CLOSE_GROUP": "اغلاق",
47
+ "ALERT_TITLE": "انتباه!",
48
+ "CLOSE_ALERT_CONFIRM_LABEL": "موافق",
49
+ "CLOSE_ALERT_CANCEL_LABEL": "إلغاء",
50
+ "LEAVE_ALERT_MSG": "مغادرة المجموعة؟",
51
+ "CLOSE_ALERT_MSG": "أغلق المحادثة؟",
52
+ "VIDEOCHAT_ALERT_MSG": "الخدمة غير متوفرة",
53
+ "CLOSING_CONVERSATION_SPINNER_MSG": "أرجو الإنتظار.<br> نحن نغلق المحادثة",
54
+ "CONVERSATION_CLOSED_ALERT_MSG": "تم إغلاق المحادثة بنجاح.",
55
+ "CANNOT_CLOSE_CONVERSATION_ALERT_MSG": "تعذر إغلاق المحادثة",
56
+ "LEAVING_GROUP_SPINNER_MSG": "أرجو الإنتظار.<br> أنت تغادر المجموعة",
57
+ "CONVERSATION_LEFT_ALERT_MSG": "تم ترك المجموعة بنجاح.",
58
+ "CANNOT_LEAVE_GROUP_ALERT_MSG": "لا يمكن ترك المجموعة",
59
+ "GREETING": "مرحبًا {{ value }}",
60
+ "ARCHIVED_CONVERSATIONS_PAGE_NO_CONVERSATIONS_ARCHIVED": "لا توجد محادثة في الأرشيف",
61
+ "INFO_SUPPORT_USER_ADDED_SUBJECT": "أنت",
62
+ "INFO_SUPPORT_USER_ADDED_YOU_VERB": "تمت إضافته إلى ",
63
+ "INFO_SUPPORT_USER_ADDED_VERB": "انضم",
64
+ "INFO_SUPPORT_USER_ADDED_COMPLEMENT": "المحادثة",
65
+ "INFO_SUPPORT_USER_ADDED_MESSAGE": "{{ subject }} {{ verb }} {{ complement }}",
66
+ "INFO_SUPPORT_CHAT_REOPENED": "تمت إعادة فتح الدردشة",
67
+ "INFO_SUPPORT_CHAT_CLOSED": "الدردشة مغلقة",
68
+ "INFO_A_NEW_SUPPORT_REQUEST_HAS_BEEN_ASSIGNED_TO_YOU": "تم تعيين طلب دعم جديد لك",
69
+ "LABEL_PROFILE": "الملف الشخصي",
70
+ "LABEL_CLOSE": "مغلق",
71
+ "LABEL_DISCONNECT": "قطع الاتصال",
72
+ "LABEL_NEW_CHAT": "محادثة جديدة",
73
+ "LABEL_FORGOT_PASSWORD": "هل نسيت كلمة المرور الخاصة بك؟",
74
+ "LABEL_SIGNIN": "تسجيل الدخول",
75
+ "LABEL_SIGNIN_TO": "تسجيل الدخول إلى",
76
+ "LABEL_SIGNIN_ERROR": "خطأ في تسجيل الدخول",
77
+ "LABEL_PASSWORD": "كلمة المرور",
78
+ "LABEL_ERROR_EMAIL": "أدخل عنوان بريد إلكتروني صالح.",
79
+ "LABEL_ERROR_PASSWORD": "يجب أن تتكون كلمة المرور من 6 أحرف على الأقل.",
80
+ "LABEL_LOGIN": "تسجيل الدخول",
81
+ "LABEL_LOGOUT": "تسجيل خروج",
82
+ "LABEL_WELCOME_TO": "مرحبا بك في",
83
+ "LABEL_SIGNUP": "اشتراك",
84
+ "LABEL_ALREDY_HAVE_AN_ACCOUNT": "هل لديك حساب؟",
85
+ "LABEL_DONT_HAVE_AN_ACCOUNT_YET": "لا تملك حسابا حتى الآن؟",
86
+ "LABEL_FORGOT_YOUR_PASSWORD": "نسيت رقمك السري؟",
87
+ "LABEL_CLICK_HERE": "انقر هنا",
88
+ "LABEL_REGISTRATION": "تسجيل",
89
+ "LABEL_PLACEHOLDER_EMAIL": "بريدك الالكتروني",
90
+ "LABEL_PLACEHOLDER_PASSWORD": "كلمة السر خاصتك",
91
+ "LABEL_PLACEHOLDER_NAME": "اسمك",
92
+ "LABEL_PLACEHOLDER_LAST_NAME": "اسمك الاخير",
93
+ "LABEL_LAST_NAME": "الكنية",
94
+ "LABEL_FIELD_NOT_EMPTY": "لا يمكن أن يكون الحقل فارغًا.",
95
+ "LABEL_NEW_PASSWORD": "أنشئ كلمة مرور جديدة",
96
+ "LABEL_CLOSED": "مغلق",
97
+ "LABEL_INFO": "معلومات",
98
+ "ALERT_NOTIFICATION": "تحذير: إرسال الإخطارات معطل ، يغير إعدادات المتصفح للسماح بإرسال الإشعارات.",
99
+ "LABEL_EXTERNAL_ID": "معرف خارجي",
100
+ "LABEL_IAT": "إيات",
101
+ "LABEL_REQUEST_DETAIL": "طلب التفاصيل",
102
+ "LABEL_ENTER_MSG": "أدخل رسالة أو اضغط على / للردود الجاهزة",
103
+ "LABEL_ENTER_MSG_SHORT": "أدخل رسالة",
104
+ "LABEL_ENTER_MSG_SHORTER": "يدخل...",
105
+ "LABEL_MSG_LOGIN_TILEDESK": "اذهب إلى تسجيل الدخول لبدء الدردشة",
106
+ "LABEL_ARCHIVED": "مؤرشف",
107
+ "LABEL_INFO_CONVERSATION": "محادثة معلومات",
108
+ "LABEL_INFO_USER": "مستخدم المعلومات",
109
+ "LABEL_IS_WRITING": "الكتابة",
110
+ "LABEL_VERSION": "الإصدار",
111
+ "LABEL_CONTACTS": "جهات الاتصال",
112
+ "LABEL_PLACEHOLDER": "اكتب رسالتك ..",
113
+ "LABEL_START_NW_CONV": "محادثة جديدة",
114
+ "LABEL_FIRST_MSG": "صِف مشكلتك بعد قليل ، وسيتواصل معك أحد الوكلاء.",
115
+ "LABEL_FIRST_MSG_NO_AGENTS": "🤔 جميع المشغلين غير متصلين في الوقت الحالي. يمكنك على أي حال وصف مشكلتك. سيتم تعيينه لفريق الدعم الذي سيرد عليك في أقرب وقت ممكن.",
116
+ "LABEL_SELECT_TOPIC": "اختر عنوانا",
117
+ "LABEL_COMPLETE_FORM": "أكمل النموذج لبدء محادثة مع الوكيل المتاح التالي.",
118
+ "LABEL_FIELD_NAME": "اسم",
119
+ "LABEL_ERROR_FIELD_NAME": "حقل مطلوب (بحد أدنى 5 أحرف).",
120
+ "LABEL_FIELD_EMAIL": "بريد الالكتروني",
121
+ "LABEL_ERROR_FIELD_EMAIL": "أدخل عنوان بريد إلكتروني صالح.",
122
+ "LABEL_WRITING": "يكتب...",
123
+ "AGENT_NOT_AVAILABLE": " غير متصل على الانترنت",
124
+ "AGENT_AVAILABLE": " متصل",
125
+ "GUEST_LABEL": "زائر",
126
+ "ALL_AGENTS_OFFLINE_LABEL": "جميع المشغلين غير متصلون في الوقت الحالي",
127
+ "LABEL_LOADING": "جار التحميل...",
128
+ "CALLOUT_TITLE_PLACEHOLDER": "تحتاج مساعدة؟",
129
+ "CALLOUT_MSG_PLACEHOLDER": "انقر هنا وابدأ الدردشة معنا!",
130
+ "CUSTOMER_SATISFACTION": "رضا العملاء",
131
+ "YOUR_OPINION_ON_OUR_CUSTOMER_SERVICE": "رأيك في خدمة العملاء لدينا",
132
+ "DOWNLOAD_TRANSCRIPT": "تنزيل النص",
133
+ "BACK": "عودة",
134
+ "YOUR_RATING": "تقييمك",
135
+ "WRITE_YOUR_OPINION": "أكتب رأيك ... (اختياري)",
136
+ "SUBMIT": "إرسال",
137
+ "THANK_YOU_FOR_YOUR_EVALUATION": "شكرا لتقييمك",
138
+ "YOUR_RATING_HAS_BEEN_RECEIVED": "لقد تم استلام تقييمك",
139
+ "ALERT_LEAVE_CHAT": "هل تريد مغادرة الدردشة؟",
140
+ "YES": "نعم",
141
+ "NO": "رقم",
142
+ "BUTTON_CLOSE_TO_ICON": "تصغير الدردشة",
143
+ "BUTTON_EDIT_PROFILE": "تحديث الملف",
144
+ "RATE_CHAT": "معدل الدردشة",
145
+ "WELLCOME_TITLE": "مرحبًا ، مرحبًا بك في Tiledesk 👋",
146
+ "WELLCOME_MSG": "كيف يمكن أن نساعد؟",
147
+ "WELLCOME": "مرحبا",
148
+ "OPTIONS": "والخيارات",
149
+ "SOUND_OFF": "الصوت مقفل",
150
+ "SOUND_ON": "الصوت مفعل",
151
+ "LOGOUT": "تسجيل خروج",
152
+ "CLOSE": "أغلق",
153
+ "PREV_CONVERSATIONS": "محادثاتك",
154
+ "YOU": "أنت",
155
+ "SHOW_ALL_CONV": "عرض الكل",
156
+ "START_A_CONVERSATION": "بدء محادثة",
157
+ "NO_CONVERSATION": "لا محادثة",
158
+ "SEE_PREVIOUS": "انظر السابق",
159
+ "WAITING_TIME_FOUND": "يرد الفريق عادةً بـ $reply_time",
160
+ "WAITING_TIME_NOT_FOUND": "سيقوم الفريق بالرد في أقرب وقت ممكن",
161
+ "CLOSED": "مغلق",
162
+ "PleaseSelectChatToStartMessaging": "الرجاء تحديد دردشة لبدء المراسلة",
163
+ "FromThisAreNew": "------------------",
164
+ "Preview": "معاينة",
165
+ "AddACaption": "إضافة تسمية توضيحية",
166
+ "AnErrorOccurredWhileUnsubscribingFromNotifications": "عفواً! حدث خطأ أثناء إلغاء الاشتراك من الإشعارات",
167
+ "SIGNIN_ERROR_USER_NOT_FOUND": "المصادقة فشلت. المستخدم ليس موجود.",
168
+ "SIGNIN_ERROR_USER_WRONG_PSW": "المصادقة فشلت. كلمة مرور خاطئة.",
169
+ "Email is required": "البريد الالكتروني مطلوب.",
170
+ "Email must be a valid email": "يجب أن يكون البريد الإلكتروني بريدًا إلكترونيًا صالحًا.",
171
+ "Password is required": "كلمة المرور مطلوبة.",
172
+ "Password must be at least 6 characters long": "الرقم السري يجب الا يقل عن 6 احرف على الاقل.",
173
+ "UPLOAD_FILE_ERROR": "حدث خطأ غير متوقع أثناء تحميل الملف",
174
+ "DROP_IMAGE_HERE_TO_SEND_IT": "أفلت الصورة هنا لإرسالها",
175
+ "ONLY_IMAGE_FILES_ARE_ALLOWED_TO_PASTE": "يُسمح فقط بلصق ملفات الصور والنصوص",
176
+ "FAILED_TO_UPLOAD_THE_FORMAT_IS_NOT_SUPPORTED": "فشل التحميل: التنسيق غير مدعوم",
177
+ "SENT_AN_IMAGE": "أرسل صورة",
178
+ "SENT_AN_ATTACHMENT": "أرسل مرفقًا",
179
+ "NO_INFORMATION_AVAILABLE": "لا توجد معلومات متاحة",
180
+ "CONTACT_ID": "معرف جهة الاتصال",
181
+ "USER_ID": "معرف المستخدم",
182
+ "CLOSE_TOAST": "قريب",
183
+ "WAITING_FOR_NETWORK": "في انتظار الشبكة",
184
+ "Available": "متوفرة",
185
+ "Unavailable": "غير متوفره",
186
+ "Busy": "مشغول",
187
+ "YouAreAboutToJoinThisChat": "أنت على وشك الانضمام إلى هذه الدردشة",
188
+ "Cancel": "يلغي",
189
+ "AreYouSure": "هل أنت متأكد؟",
190
+ "UnassignedConversations": "المحادثات غير المعينة",
191
+ "NewConversations": "محادثات جديدة",
192
+ "UPLOAD": "تحميل",
193
+ "CANNED_RESPONSES": "الردود الجاهزة",
194
+ "NO_CANNED_RESPONSES": "لا توجد ردود جاهزة",
195
+ "THERE_ARE_NO_CANNED_RESPONSES_AVAILABLE": "لا توجد ردود جاهزة متاحة",
196
+ "TO_CREATE_THEM_GO_TO_THE_PROJECT": "لإنشائها ، انتقل إلى المشروع (يمكنك النقر فوق اسم المشروع المتاح في الشريط الجانبي الأيمن) وتحت عنصر القائمة \"الإعدادات\" في الشريط الجانبي للوحة التحكم ، انقر فوق \"الردود الجاهزة\" ثم على الزر \"إنشاء رد\"",
197
+ "YES_CANNED_RESPONSES": "عرض الردود الجاهزة بالنقر فوق الزر ⚡️ أو عن طريق كتابة / في منطقة النص ، يمكنك أيضًا تصفية القائمة عن طريق الكتابة بعد /",
198
+ "VIEW_ALL_CONVERSATIONS": "عرض جميع المحادثات",
199
+ "CONVERSATIONS_IN_QUEUE": "المحادثات في قائمة الانتظار ، اختر واحدة",
200
+ "CONVERSATION_IN_QUEUE": "محادثة في قائمة الانتظار ، اخترها",
201
+ "NO_CONVERSATION_IN_QUEUE": "لا محادثة في قائمة الانتظار",
202
+ "PIN_A_PROJECT": "تثبيت مشروع",
203
+ "PINNED_PROJECT": "مشروع مثبت",
204
+ "CHANGE_PINNED_PROJECT": "تغيير المشروع المثبت",
205
+ "CHANGE_TO_AVAILABLE_UNAVAILABLE": "التغيير إلى متاح / غير متاح",
206
+ "CHANGE_TO_YOUR_STATUS_TO_AVAILABLE": "تغيير حالتك إلى متاح",
207
+ "CHANGE_TO_YOUR_STATUS_TO_UNAVAILABLE": "تغيير حالتك إلى غير متوفر",
208
+ "ALL_CONVS_SERVED": "هل تم تقديم جميع المحادثات؟ أحسنت!",
209
+ "PaydPlanName": "{{projectprofile}} خطة",
210
+ "PaydPlanNamePro": "خطة احترافية",
211
+ "PaydPlanNameEnterprise": "خطة المؤسسة",
212
+ "ProPlanTrial": "خطة Pro (نسخة تجريبية)",
213
+ "FreePlan": "خطة مجانية",
214
+ "SubscriptionPaymentProblem": "مشكلة دفع الاشتراك",
215
+ "ThePlanHasExpired": "انتهت صلاحية الخطة",
216
+ "owner": "صاحب",
217
+ "admin": "مدير",
218
+ "agent": "وكيل",
219
+ "Conversations": "المحادثات",
220
+ "Apps": "تطبيقات",
221
+ "Analytics": "تحليلات",
222
+ "Activities": "أنشطة",
223
+ "History": "تاريخ",
224
+ "Settings": "إعدادات",
225
+ "Resolve": "حل",
226
+ "Archive": "أرشيف",
227
+ "ActionNotAllowed": "الإجراء غير مسموح به",
228
+ "YouAreNoLongerAmongTheTeammatesManagingThisConversation": "لم تعد من بين زملائك في الفريق الذين يديرون هذه المحادثة",
229
+ "TicketSuccessfullyCreated":"تم إنشاء التذكرة بنجاح",
230
+ "Continue":"استمر",
231
+ "ViewArchivedConversations":"المحادثات المؤرشفة",
232
+ "ViewContactsList":"قائمة جهات الاتصال",
233
+ "AddAsCannedResponse":"إضافة كإجابة جاهزة",
234
+ "AddNewCannedResponse":"إضافة رد جاهز جديد",
235
+ "TitleIsRequired":"العنوان مطلوب",
236
+ "MessageIsRequired":"الرسالة مطلوبة",
237
+ "Already_present_in_the_dashboard_json":"........",
238
+ "CreateTicket": "إنشاء تذكرة",
239
+ "Requester": "مقدم الطلب",
240
+ "ViewRequesterDetails": "عرض تفاصيل مقدم الطلب",
241
+ "Priority": "أولوية",
242
+ "urgent": "العاجلة",
243
+ "high": "عالٍ",
244
+ "medium": "متوسطة",
245
+ "low": "منخفض",
246
+ "SelectRequester": "حدد مقدم الطلب",
247
+ "AddRequester": "إضافة مقدم الطلب",
248
+ "Subject": "المادة",
249
+ "SelectAssignee": "حدد المحال إليه",
250
+ "Message": "رسالة",
251
+ "CreateNewRequester": "إنشاء متقدم جديد",
252
+ "Name": "الاسم",
253
+ "NameIsRequired": "مطلوب اسم",
254
+ "EnterValidEmail": "أدخل عنوان بريد إلكتروني صالح",
255
+ "Title": "عنوان",
256
+ "Add": "يضيف",
257
+ "AddCustomization": "أضف التخصيص",
258
+ "SelectACustomizationToAddToYourMessage": "حدد قيمة التخصيص لإضافتها إلى الرسالة",
259
+ "recipient_name_desc": "ستتم إضافة الاسم الأول للشخص الذي يرد عليه الوكيل إلى الرسالة.",
260
+ "agent_name_desc": "سيتم إضافة اسم الوكيل الذي يقوم بالرد على الرسالة.",
261
+ "First_name_of_recipient": "الاسم الأول للمستلم",
262
+ "First_name_of_agent": "الاسم الأول للوكيل",
263
+ "EnterCannedResponseTitle": "أدخل عنوان الرد الجاهز",
264
+ "WriteMsgToSendToYourVisitors": "اكتب رسالة رد جاهزة لإرسالها إلى الزائرين",
265
+ "EditProfile": "تعديل الملف الشخصي"
266
+ }
@@ -1,4 +1,3 @@
1
- import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
2
1
  import { Injectable } from '@angular/core';
3
2
  import { BehaviorSubject } from 'rxjs';
4
3
 
@@ -13,17 +12,11 @@ import 'firebase/storage';
13
12
  // models
14
13
  import { ConversationModel } from '../../models/conversation';
15
14
 
16
- // services
17
- import { ConversationsHandlerService } from '../abstract/conversations-handler.service';
18
-
19
-
20
15
  // utils
21
16
  import { avatarPlaceholder, getColorBck } from '../../utils/utils-user';
22
17
  import { compareValues, getFromNow, searchIndexInArrayForUid, archivedConversationsPathForUserId, isGroup } from '../../utils/utils';
23
- import { ImageRepoService } from '../abstract/image-repo.service';
24
- import { FirebaseImageRepoService } from './firebase-image-repo';
25
18
  import { ArchivedConversationsHandlerService } from '../abstract/archivedconversations-handler.service';
26
- import { CustomLogger } from '../logger/customLogger';
19
+ import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
27
20
  import { LoggerInstance } from '../logger/loggerInstance';
28
21
 
29
22
 
@@ -54,6 +47,8 @@ export class FirebaseArchivedConversationsHandler extends ArchivedConversationsH
54
47
  private logger: LoggerService = LoggerInstance.getInstance()
55
48
  private ref: firebase.database.Query;
56
49
 
50
+ private subscribe: any;
51
+
57
52
  constructor(
58
53
  //public databaseProvider: DatabaseProvider
59
54
  ) {
@@ -183,23 +178,33 @@ export class FirebaseArchivedConversationsHandler extends ArchivedConversationsH
183
178
  // this.BSConversationDetail.next(conversationSelected);
184
179
  } else {
185
180
  // const urlNodeFirebase = '/apps/' + this.tenant + '/users/' + this.loggedUserId + '/archived_conversations/' + conversationId;
186
- const urlNodeFirebase = archivedConversationsPathForUserId(this.tenant, this.loggedUserId) + '/' + conversationId;
181
+ const urlNodeFirebase = archivedConversationsPathForUserId(this.tenant, this.loggedUserId) // + '/' + conversationId;
187
182
  this.logger.log('[FIREBASEArchivedConversationsHandlerSERVICE] urlNodeFirebase conversationDetail *****', urlNodeFirebase)
188
183
  const firebaseMessages = firebase.database().ref(urlNodeFirebase);
189
- firebaseMessages.on('value', (childSnapshot) => {
190
- const childData: ConversationModel = childSnapshot.val();
191
- this.logger.log('[FIREBASEArchivedConversationsHandlerSERVICE] childData *****', childData)
192
- // if (childSnapshot && childSnapshot.key && childData.uid) {
193
- if (childSnapshot && childSnapshot.key && childData) {
194
- childData.uid = childSnapshot.key;
195
- const conversation = this.completeConversation(childData);
196
- if (conversation) {
197
- callback(conversation)
198
- } else {
199
- callback(null)
184
+ if(this.subscribe){
185
+ this.logger.log('[FIREBASEArchivedConversationsHandlerSERVICE] getConversationDetail ALREADY SUBSCRIBED')
186
+ return;
187
+ }
188
+
189
+ this.subscribe = firebaseMessages.on('value', (snap) => {
190
+ const childSnapshot = snap.child('/'+conversationId)
191
+ if(!childSnapshot.exists()){
192
+ this.logger.log('[FIREBASEArchivedConversationsHandlerSERVICE] getConversationDetail archived conversation NOT exist', conversationId)
193
+ callback(null)
194
+ } else {
195
+ const childData: ConversationModel = childSnapshot.val();
196
+ this.logger.log('[FIREBASEArchivedConversationsHandlerSERVICE] getConversationDetail archived conversation exist', childData)
197
+ if (childSnapshot && childSnapshot.key && childData) {
198
+ childData.uid = childSnapshot.key;
199
+ const conversation = this.completeConversation(childData);
200
+ if (conversation) {
201
+ callback(conversation)
202
+ } else {
203
+ callback(null)
204
+ }
200
205
  }
206
+ // this.BSConversationDetail.next(conversation);
201
207
  }
202
- // this.BSConversationDetail.next(conversation);
203
208
  });
204
209
  }
205
210
  }
@@ -53,6 +53,7 @@ export class FirebaseConversationsHandler extends ConversationsHandlerService {
53
53
  private BASE_URL: string;
54
54
  // private audio: any;
55
55
  // private setTimeoutSound: any;
56
+ private subscribe: any
56
57
 
57
58
  constructor(
58
59
  //public databaseProvider: DatabaseProvider
@@ -121,62 +122,47 @@ export class FirebaseConversationsHandler extends ConversationsHandlerService {
121
122
  this.ref = firebase.database().ref(urlNodeFirebase).orderByChild('timestamp').limitToLast(200);
122
123
 
123
124
  // this.ref.once('value').then(snapshot => {
124
- // snapshot.forEach(childSnapshot => {
125
- // const childData: ConversationModel = childSnapshot.val();
126
- // childData.uid = childSnapshot.key
127
- // that.added(childData)
128
- // lastConversationTimestamp = childData.timestamp
129
- // });
125
+ // if(snapshot && snapshot.val()){
126
+
127
+
128
+ // snapshot.forEach(childSnapshot => {
129
+ // // const childData: ConversationModel = childSnapshot.val();
130
+ // // childData.uid = childSnapshot.key
131
+ // // that.added(childData)
132
+ // // lastConversationTimestamp = childData.timestamp
133
+ // that.added(childSnapshot)
134
+ // });
135
+ // this.logger.debug('[FIREBASEConversationsHandlerSERVICE] # of remote conversations on Firebase:', Object.keys(snapshot.val()).length)
136
+ // this.logger.debug('[FIREBASEConversationsHandlerSERVICE] # of conversation added:', that.conversations)
137
+ // callback(that.conversations)
138
+ // return lastConversationTimestamp
139
+ // }
130
140
 
131
- // callback(that.conversations)
132
- // return lastConversationTimestamp
133
- // }).then((timestamp)=> {
134
- // console.log('timestampppppp',timestamp)
135
- // this.ref.startAt(timestamp).on('child_changed', (childSnapshot) => {
136
- // const conv: ConversationModel = childSnapshot.val();
137
- // conv.uid = childSnapshot.key
138
- // that.changed(conv);
141
+ // }).then(()=> {
142
+ // this.ref.on('child_changed', (childSnapshot) => {
143
+ // that.changed(childSnapshot);
139
144
  // });
140
- // this.ref.startAt(timestamp).on('child_removed', (childSnapshot) => {
141
- // const conv: ConversationModel = childSnapshot.val();
142
- // conv.uid = childSnapshot.key
143
- // that.removed(conv);
145
+ // this.ref.on('child_removed', (childSnapshot) => {
146
+ // that.removed(childSnapshot);
144
147
  // });
145
- // this.ref.startAt(timestamp).on('child_added', (childSnapshot) => {
146
- // const conv: ConversationModel = childSnapshot.val();
147
- // console.log('addedddd', conv)
148
- // conv.uid = childSnapshot.key
149
- // that.added(conv);
148
+ // this.ref.on('child_added', (childSnapshot) => {
149
+ // that.added(childSnapshot);
150
150
  // });
151
- // });
152
- // this.ref.on('value', (snaps) => {
153
- // if(snaps){
154
- // console.log('convvvvvv', snaps.val(), snaps.val().length)
155
- // for(let item=0; item<snaps.val().length; item++){
156
- // that.added(snaps.val()[item])
157
- // }
158
- // callback(this.conversations)
159
- // }
160
151
  // })
161
- this.ref.startAt(lastConversationTimestamp).on('child_changed', (childSnapshot) => {
152
+
153
+ this.ref.on('child_changed', (childSnapshot) => {
162
154
  that.changed(childSnapshot);
163
155
  });
164
- this.ref.startAt(lastConversationTimestamp).on('child_removed', (childSnapshot) => {
156
+ this.ref.on('child_removed', (childSnapshot) => {
165
157
  that.removed(childSnapshot);
166
158
  });
167
- this.ref.startAt(lastConversationTimestamp).on('child_added', (childSnapshot) => {
159
+ this.ref.on('child_added', (childSnapshot) => {
168
160
  that.added(childSnapshot);
169
161
  });
170
162
 
171
-
172
-
173
163
  setTimeout(() => {
174
164
  callback()
175
165
  }, 2000);
176
- // SET AUDIO
177
- // this.audio = new Audio();
178
- // this.audio.src = URL_SOUND;
179
- // this.audio.load();
180
166
  }
181
167
 
182
168
  /**
@@ -316,24 +302,44 @@ export class FirebaseConversationsHandler extends ConversationsHandlerService {
316
302
  } else {
317
303
  this.logger.log('[FIREBASEConversationsHandlerSERVICE] getConversationDetail ***** ELSE')
318
304
  // const urlNodeFirebase = '/apps/' + this.tenant + '/users/' + this.loggedUserId + '/conversations/' + conversationId;
319
- const urlNodeFirebase = conversationsPathForUserId(this.tenant, this.loggedUserId) + '/' + conversationId;
305
+ const urlNodeFirebase = conversationsPathForUserId(this.tenant, this.loggedUserId) // + '/' + conversationId;
320
306
  this.logger.log('[FIREBASEConversationsHandlerSERVICE] conversationDetail urlNodeFirebase *****', urlNodeFirebase)
321
307
  const firebaseMessages = firebase.database().ref(urlNodeFirebase);
322
- firebaseMessages.on('value', (childSnapshot) => {
323
- const childData: ConversationModel = childSnapshot.val();
324
- this.logger.log('[FIREBASEConversationsHandlerSERVICE] conversationDetail childSnapshot.val() *****', childSnapshot.val());
325
- this.logger.log('[FIREBASEConversationsHandlerSERVICE] conversationDetail childSnapshot *****', childSnapshot)
326
- // && childData.uid
327
- if (childSnapshot && childSnapshot.key && childData) {
328
- childData.uid = childSnapshot.key;
329
- const conversation = this.completeConversation(childData);
330
- if (conversation) {
331
- callback(conversation)
332
- } else {
333
- callback(null)
334
- }
308
+ if(this.subscribe){
309
+ this.logger.log('[FIREBASEConversationsHandlerSERVICE] getConversationDetail ALREADY SUBSCRIBED')
310
+ return;
311
+ }
335
312
 
313
+ this.subscribe = firebaseMessages.on('value', (snap) => {
314
+ const childSnapshot = snap.child('/'+conversationId)
315
+ if(!childSnapshot.exists()){
316
+ this.logger.log('[FIREBASEConversationsHandlerSERVICE] getConversationDetail conversation NOT exist', conversationId)
317
+ callback(null)
318
+ } else {
319
+ const childData: ConversationModel = childSnapshot.val();
320
+ this.logger.debug('[FIREBASEConversationsHandlerSERVICE] getConversationDetail conversation exist', childSnapshot.val(), childSnapshot.key)
321
+ if (childSnapshot && childSnapshot.key && childData) {
322
+ childData.uid = childSnapshot.key;
323
+ const conversation = this.completeConversation(childData);
324
+ if (conversation) {
325
+ callback(conversation)
326
+ } else {
327
+ callback(null)
328
+ }
329
+ }
330
+ // this.BSConversationDetail.next(conversation);
336
331
  }
332
+ // const childData: ConversationModel = childSnapshot.val();
333
+ // this.logger.debug('[FIREBASEConversationsHandlerSERVICE] conversationDetail childSnapshot *****', childSnapshot.val())
334
+ // if (childSnapshot && childSnapshot.key && childData) {
335
+ // childData.uid = childSnapshot.key;
336
+ // const conversation = this.completeConversation(childData);
337
+ // if (conversation) {
338
+ // callback(conversation)
339
+ // } else {
340
+ // callback(null)
341
+ // }
342
+ // }
337
343
  // this.BSConversationDetail.next(conversation);
338
344
  });
339
345
  }
@@ -656,3 +662,4 @@ export class FirebaseConversationsHandler extends ConversationsHandlerService {
656
662
  // END PRIVATE FUNCTIONS
657
663
  // ---------------------------------------------------------- //
658
664
  }
665
+
@@ -110,7 +110,7 @@ export const LogLevel = {
110
110
  'DEBUG': 3
111
111
  }
112
112
 
113
- export const tranlatedLanguage = ['it', 'en', 'de', 'es', 'pt', 'fr', 'ru', 'tr', 'sr']
113
+ export const tranlatedLanguage = ['it', 'en', 'de', 'es', 'pt', 'fr', 'ru', 'tr', 'sr', 'ar']
114
114
 
115
115
 
116
116
 
package/src/global.scss CHANGED
@@ -25,7 +25,7 @@
25
25
  @import "~@ionic/angular/css/text-transformation.css";
26
26
  @import "~@ionic/angular/css/flex-utils.css";
27
27
 
28
- @import "~material-design-icons/iconfont/material-icons.css";
28
+ @import 'material-icons/iconfont/material-icons.css';
29
29
  @import "variables.scss";
30
30
 
31
31
  // http://ionicframework.com/docs/v2/theming/
@@ -974,7 +974,7 @@ ul.dropdown-menu > li > a {
974
974
 
975
975
  .sidebar .nav i {
976
976
  // font-size: 20px;
977
- float: left;
977
+ // float: left;
978
978
  // margin-right: 15px;
979
979
  // line-height: 30px;
980
980
  width: 60px;