import { Component, OnInit, ChangeDetectorRef, NgZone } from '@angular/core'; import { AnimationController, ModalController, Platform } from '@ionic/angular'; import { SearchPage } from 'src/app/pages/search/search.page'; import { Router } from '@angular/router'; import { LoginUserRespose } from 'src/app/models/user.model'; import { ProfilePage } from 'src/app/modals/profile/profile.page'; import { StorageService } from '../../services/storage.service'; import { SessionStore } from 'src/app/store/session.service'; import { environment } from 'src/environments/environment'; import { ThemeService } from '../../services/theme.service'; import { RouteService } from 'src/app/services/route.service'; import { PermissionList } from 'src/app/models/permission/permissionList'; import { PermissionService } from 'src/app/services/permission.service'; import { EventTrigger } from 'src/app/services/eventTrigger.service' import { ActiveTabService } from 'src/app/services/active-tab.service'; import { NotificationsService } from 'src/app/services/notifications.service'; import { AttachmentsService } from 'src/app/services/attachments.service'; import { NotificationHolderService } from 'src/app/store/notification-holder.service'; @Component({ selector: 'app-header', templateUrl: './header.page.html', styleUrls: ['./header.page.scss'], }) export class HeaderPage implements OnInit { searchSubject: string = ''; showSearch = false; loggeduser: LoginUserRespose; hideSearchBtn: boolean = false; notificationdata: any[] = []; DataArray: Array = []; notificationLength: number = 0; SessionStore = SessionStore check: boolean; production = environment.production environment = environment canOpenSearch = false showProfileModal = false permissionList = new PermissionList(); notificationCount: number = 0; profilePicture = ""; constructor( private router: Router, private modalController: ModalController, private animationController: AnimationController, private storageservice: StorageService, public platform: Platform, public ThemeService: ThemeService, public RouteService: RouteService, public p: PermissionService, private eventTriger: EventTrigger, public ActiveTabService: ActiveTabService, private notificationService: NotificationsService, private cdRef: ChangeDetectorRef, private storageService: StorageService, private zone: NgZone, private attachmentService: AttachmentsService, public NotificationHolderService: NotificationHolderService ) { this.loggeduser = SessionStore.user; router.events.subscribe((val) => { this.hideSearch(); this.showSearch = false; this.canOpenSearch = true; this.showProfileModal = false }); this.updateReciveNotification(); this.updateDeleteNotification(); /* this.notificationService.notificationReceived.subscribe(() => { console.log('header', 'event.notification') this.notificationLengthData() }); */ } ngOnInit() { this.hideSearch(); console.log('Profile picture guid ', this.SessionStore.user.UserPhoto) this.getProfilpicture(); } reloadComponent(self: boolean, urlToNavigateTo?: string) { //skipLocationChange:true means dont update the url to / when navigating console.log("Current route I am on header:", this.router.url); const url = self ? this.router.url : urlToNavigateTo; this.zone.run(() => this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => { this.zone.run(() => this.router.navigate([`/${url}`]).then(() => { console.log(`After navigation I am on header:${this.router.url}`) })) })) } getProfilpicture() { if (this.SessionStore.user.UserPhoto) { this.attachmentService.getUserProfilePhoto(this.SessionStore.user.UserPhoto).subscribe((base) => { this.storageService.store(this.SessionStore.user.RoleID.toString(), 'data:image/jpeg;base64,' + base).then((value) => { this.profilePicture = 'data:image/jpeg;base64,' + base; console.log('picture saved') }).catch((error) => { console.log('picture not saved') }); }, (error) => { console.log('profile picture errro: ', error) this.storageService.get(this.SessionStore.user.RoleID.toString()).then((picture) => { /* console.log(picture) */ this.profilePicture = picture }).catch((error) => { this.profilePicture = ""; }) }) } else { this.profilePicture = ""; } } updateReciveNotification() { this.eventTriger.getObservable().subscribe((event) => { if (event.notification == "recive") { console.log('header', event.notification) this.notificationLengthData() } }); } updateDeleteNotification() { this.eventTriger.getObservable().subscribe((event) => { if (event.notification == "deleted") { console.log('header', event.notification) this.notificationLengthData() } }); } async notificationLengthData() { console.log('Call notification data') await this.storageservice.get("Notifications").then((value) => { console.log('Get notification data',) this.zone.run(() => { this.notificationLength = value.length; console.log('Call notification data', this.notificationLength) }); }).catch((error) => { if (!error) { this.zone.run(() => { console.error('header storage get notification', error) this.notificationLength = 0; }); } else { console.error('header storage get notification', error) } }) } hideSearch() { if (this.router.url.startsWith('/home/events') || this.router.url.startsWith('/home/chat')) { this.hideSearchBtn = true; } else { this.hideSearchBtn = false; } } async openSearch() { let classs, showSearchInput, type; if (window.innerWidth < 1366) { classs = 'modal modal-width-100' showSearchInput = true } else { classs = 'modal modal-desktop desktop-search' showSearchInput = false } if (window.location.pathname.startsWith('/home/agenda')) { type = "Agenda" } else if (window.location.pathname.startsWith('/home/gabinete-digital')) { type = "AccoesPresidenciais & ArquivoDespachoElect" } else if (window.location.pathname.startsWith('/home/publications')) { type = "AccoesPresidenciais" } if (this.canOpenSearch) { this.canOpenSearch = false const modal = await this.modalController.create({ component: SearchPage, cssClass: classs, componentProps: { type: type, showSearchInput: showSearchInput, select: false } }); modal.onDidDismiss().then(() => { this.canOpenSearch = true; }); await modal.present(); } } changeRoute(path) { this.router.navigateByUrl(path) } async openProfile() { const enterAnimation = (baseEl: any) => { const backdropAnimation = this.animationController.create() .addElement(baseEl.querySelector('ion-backdrop')!) .fromTo('opacity', '0.01', 'var(--backdrop-opacity)'); const wrapperAnimation = this.animationController.create() .addElement(baseEl.querySelector('.modal-wrapper')!) .keyframes([ { offset: 0, opacity: '1', right: '-100%' }, { offset: 1, opacity: '1', right: '0px' } ]); return this.animationController.create() .addElement(baseEl) .easing('ease-out') .duration(500) .addAnimation([backdropAnimation, wrapperAnimation]); } const leaveAnimation = (baseEl: any) => { return enterAnimation(baseEl).direction('reverse'); } if (!this.showProfileModal) { this.showProfileModal = true const modal = await this.modalController.create({ component: ProfilePage, cssClass: 'model profile-modal search-submodal', componentProps: { } }); modal.onDidDismiss().then(() => { this.notificationLengthData() this.getProfilePictureSorage() this.showProfileModal = false }) await modal.present(); } } async dynamicSearch() { if (window['dynamicSearch']) { window['dynamicSearch'](this.searchSubject) } else { setTimeout(() => { this.dynamicSearch() }, 100) } } async closeSearch() { this.modalController.dismiss() } /** * @description set empty value to searchSubject */ clearSearchInput() { this.searchSubject = ""; window['dynamicSearch'](this.searchSubject) } async basicSearch() { if (window['searchTriger']) { window['searchTriger']() } else { setTimeout(() => { this.basicSearch() }, 100) } } getProfilePictureSorage() { this.storageService.get(this.SessionStore.user.RoleID.toString()).then((picture) => { /* console.log(picture) */ this.profilePicture = picture }).catch((error) => { this.profilePicture = ""; }) } }