Created
March 28, 2024 17:19
-
-
Save EvandroNeris/714fe4448d0049789b079bc859554a4f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { Component, OnDestroy, OnInit, HostBinding, HostListener, ViewEncapsulation } from '@angular/core'; | |
import { MediaObserver } from '@angular/flex-layout'; | |
import * as _ from 'lodash'; | |
import { Subject } from 'rxjs'; | |
import { takeUntil } from 'rxjs/operators'; | |
import { TranslateService } from '@ngx-translate/core'; | |
import { AuthenticationService } from 'app/auth/service'; | |
import { CoreSidebarService } from '@core/components/core-sidebar/core-sidebar.service'; | |
import { CoreConfigService } from '@core/services/config.service'; | |
import { CoreMediaService } from '@core/services/media.service'; | |
import { User } from 'app/auth/models'; | |
import { coreConfig } from 'app/app-config'; | |
import { Router } from '@angular/router'; | |
import { ProfileFormService } from 'app/views/profile/profile-form/profile-form.service'; | |
@Component({ | |
selector: 'app-navbar', | |
templateUrl: './navbar.component.html', | |
styleUrls: ['./navbar.component.scss'], | |
encapsulation: ViewEncapsulation.None | |
}) | |
export class NavbarComponent implements OnInit, OnDestroy { | |
public horizontalMenu: boolean; | |
public hiddenMenu: boolean; | |
public coreConfig: any; | |
public currentSkin: string; | |
public prevSkin: string; | |
public currentUser: User; | |
public languageOptions: any; | |
public navigation: any; | |
public selectedLanguage: any; | |
@HostBinding('class.fixed-top') | |
public isFixed = false; | |
@HostBinding('class.navbar-static-style-on-scroll') | |
public windowScrolled = false; | |
// Add .navbar-static-style-on-scroll on scroll using HostListener & HostBinding | |
@HostListener('window:scroll', []) | |
onWindowScroll() { | |
if ( | |
(window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop > 100) && | |
this.coreConfig.layout.navbar.type == 'navbar-static-top' && | |
this.coreConfig.layout.type == 'horizontal' | |
) { | |
this.windowScrolled = true; | |
} else if ( | |
(this.windowScrolled && window.pageYOffset) || | |
document.documentElement.scrollTop || | |
document.body.scrollTop < 10 | |
) { | |
this.windowScrolled = false; | |
} | |
} | |
// Private | |
private _unsubscribeAll: Subject<any>; | |
/** | |
* Constructor | |
* | |
* @param {Router} _router | |
* @param {AuthenticationService} _authenticationService | |
* @param {CoreConfigService} _coreConfigService | |
* @param {CoreSidebarService} _coreSidebarService | |
* @param {CoreMediaService} _coreMediaService | |
* @param {MediaObserver} _mediaObserver | |
* @param {TranslateService} _translateService | |
*/ | |
constructor( | |
private _router: Router, | |
private _authenticationService: AuthenticationService, | |
private _coreConfigService: CoreConfigService, | |
private _coreMediaService: CoreMediaService, | |
private _coreSidebarService: CoreSidebarService, | |
private _mediaObserver: MediaObserver, | |
public _translateService: TranslateService, | |
private _profileFormService: ProfileFormService | |
) { | |
this._authenticationService.currentUser.subscribe(x => (this.currentUser = x)); | |
this.languageOptions = { | |
en: { | |
title: 'English', | |
flag: 'us' | |
}, | |
fr: { | |
title: 'French', | |
flag: 'fr' | |
}, | |
de: { | |
title: 'German', | |
flag: 'de' | |
}, | |
pt: { | |
title: 'Portuguese', | |
flag: 'pt' | |
} | |
}; | |
// Set the private defaults | |
this._unsubscribeAll = new Subject(); | |
} | |
/** | |
* On init | |
*/ | |
ngOnInit(): void { | |
// get the currentUser details from localStorage | |
this.currentUser = JSON.parse(localStorage.getItem('currentUser')); | |
// Subscribe to the config changes | |
this._coreConfigService.config.pipe(takeUntil(this._unsubscribeAll)).subscribe(config => { | |
this.coreConfig = config; | |
this.horizontalMenu = config.layout.type === 'horizontal'; | |
this.hiddenMenu = config.layout.menu.hidden === true; | |
this.currentSkin = config.layout.skin; | |
// Fix: for vertical layout if default navbar fixed-top than set isFixed = true | |
if (this.coreConfig.layout.type === 'vertical') { | |
setTimeout(() => { | |
if (this.coreConfig.layout.navbar.type === 'fixed-top') { | |
this.isFixed = true; | |
} | |
}, 0); | |
} | |
}); | |
// Horizontal Layout Only: Add class fixed-top to navbar below large screen | |
if (this.coreConfig.layout.type == 'horizontal') { | |
// On every media(screen) change | |
this._coreMediaService.onMediaUpdate.pipe(takeUntil(this._unsubscribeAll)).subscribe(() => { | |
const isFixedTop = this._mediaObserver.isActive('bs-gt-xl'); | |
if (isFixedTop) { | |
this.isFixed = false; | |
} else { | |
this.isFixed = true; | |
} | |
}); | |
} | |
// Set the selected language from default languageOptions | |
this.selectedLanguage = _.find(this.languageOptions, { | |
id: this._translateService.currentLang | |
}); | |
this._profileFormService.onProfileUpdate.subscribe((updatedData) => { | |
this.currentUser = updatedData; | |
}); | |
} | |
// Public Methods | |
// ----------------------------------------------------------------------------------------------------- | |
/** | |
* Toggle sidebar open | |
* | |
* @param key | |
*/ | |
toggleSidebar(key): void { | |
this._coreSidebarService.getSidebarRegistry(key).toggleOpen(); | |
} | |
/** | |
* Set the language | |
* | |
* @param language | |
*/ | |
setLanguage(language): void { | |
// Set the selected language for the navbar on change | |
this.selectedLanguage = language; | |
// Use the selected language id for translations | |
this._translateService.use(language); | |
this._coreConfigService.setConfig({ app: { appLanguage: language } }, { emitEvent: true }); | |
} | |
/** | |
* Toggle Dark Skin | |
*/ | |
toggleDarkSkin() { | |
// Get the current skin | |
this._coreConfigService | |
.getConfig() | |
.pipe(takeUntil(this._unsubscribeAll)) | |
.subscribe(config => { | |
this.currentSkin = config.layout.skin; | |
}); | |
// Toggle Dark skin with prevSkin skin | |
this.prevSkin = localStorage.getItem('prevSkin'); | |
if (this.currentSkin === 'dark') { | |
this._coreConfigService.setConfig( | |
{ layout: { skin: this.prevSkin ? this.prevSkin : 'default' } }, | |
{ emitEvent: true } | |
); | |
localStorage.setItem('selectedSkin', 'default') | |
} else { | |
localStorage.setItem('prevSkin', this.currentSkin); | |
this._coreConfigService.setConfig({ layout: { skin: 'dark' } }, { emitEvent: true }); | |
localStorage.setItem('selectedSkin', 'dark') | |
} | |
} | |
/** | |
* Logout method | |
*/ | |
logout() { | |
this._authenticationService.logout(); | |
this._router.navigate(['/login']); | |
} | |
// Lifecycle Hooks | |
// ----------------------------------------------------------------------------------------------------- | |
handleNavigate(path: string): void { | |
const currentCompanyId = this._router.url.split('/')[2]; | |
this._router.navigate([`/app/${currentCompanyId}${path}`]); | |
} | |
/** | |
* On destroy | |
*/ | |
ngOnDestroy(): void { | |
// Unsubscribe from all subscriptions | |
this._unsubscribeAll.next(); | |
this._unsubscribeAll.complete(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment