diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/index.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/index.ts
index 06b6d5339c..6c4de6cf21 100644
--- a/npm/ng-packs/packages/theme-basic/src/lib/components/index.ts
+++ b/npm/ng-packs/packages/theme-basic/src/lib/components/index.ts
@@ -2,6 +2,8 @@ export * from './account-layout/account-layout.component';
export * from './application-layout/application-layout.component';
export * from './empty-layout/empty-layout.component';
export * from './logo/logo.component';
+export * from './nav-items/current-user.component';
+export * from './nav-items/languages.component';
export * from './nav-items/nav-items.component';
export * from './routes/routes.component';
export * from './validation-error/validation-error.component';
diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html
index cb86773db5..955ccb8878 100644
--- a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html
+++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html
@@ -1,81 +1,16 @@
-
-
- 0" class="nav-item">
-
-
-
+
+
-
-
-
- {{
- 'AbpAccount::Login' | abpLocalization
- }}
+
+
-
-
+
diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.ts
index 6819807cd7..7a5ee9b37a 100644
--- a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.ts
+++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.ts
@@ -1,125 +1,12 @@
-import {
- ABP,
- ApplicationConfiguration,
- AuthService,
- ConfigState,
- SessionState,
- SetLanguage,
- takeUntilDestroy,
-} from '@abp/ng.core';
-import {
- AfterViewInit,
- Component,
- Input,
- OnDestroy,
- TemplateRef,
- TrackByFunction,
- ViewChild,
-} from '@angular/core';
-import { Navigate, RouterState } from '@ngxs/router-plugin';
-import { Select, Store } from '@ngxs/store';
-import compare from 'just-compare';
-import { Observable } from 'rxjs';
-import { filter, map } from 'rxjs/operators';
-import snq from 'snq';
-import { AddNavigationElement } from '../../actions/layout.actions';
-import { eNavigationElementNames } from '../../enums/navigation-element-names';
-import { Layout } from '../../models/layout';
-import { LayoutState } from '../../states/layout.state';
+import { NavItem, NavItemsService } from '@abp/ng.theme.shared';
+import { Component, Input, TrackByFunction } from '@angular/core';
@Component({
selector: 'abp-nav-items',
templateUrl: 'nav-items.component.html',
})
-export class NavItemsComponent implements AfterViewInit, OnDestroy {
- @Select(LayoutState.getNavigationElements)
- navElements$: Observable;
+export class NavItemsComponent {
+ trackByFn: TrackByFunction = (_, element) => element.id;
- @Select(ConfigState.getOne('currentUser'))
- currentUser$: Observable;
-
- @Select(ConfigState.getDeep('localization.languages'))
- languages$: Observable;
-
- @ViewChild('currentUser', { static: false, read: TemplateRef })
- currentUserRef: TemplateRef;
-
- @ViewChild('language', { static: false, read: TemplateRef })
- languageRef: TemplateRef;
-
- @Input()
- smallScreen: boolean;
-
- rightPartElements: TemplateRef[] = [];
-
- trackByFn: TrackByFunction = (_, element) => element.name;
-
- get defaultLanguage$(): Observable {
- return this.languages$.pipe(
- map(
- languages =>
- snq(
- () => languages.find(lang => lang.cultureName === this.selectedLangCulture).displayName,
- ),
- '',
- ),
- );
- }
-
- get dropdownLanguages$(): Observable {
- return this.languages$.pipe(
- map(
- languages =>
- snq(() => languages.filter(lang => lang.cultureName !== this.selectedLangCulture)),
- [],
- ),
- );
- }
-
- get selectedLangCulture(): string {
- return this.store.selectSnapshot(SessionState.getLanguage);
- }
-
- constructor(private store: Store, private authService: AuthService) {}
-
- ngAfterViewInit() {
- const navigations = this.store
- .selectSnapshot(LayoutState.getNavigationElements)
- .map(({ name }) => name);
-
- if (navigations.indexOf(eNavigationElementNames.Language) < 0) {
- this.store.dispatch(
- new AddNavigationElement([
- { element: this.languageRef, order: 4, name: eNavigationElementNames.Language },
- { element: this.currentUserRef, order: 5, name: eNavigationElementNames.User },
- ]),
- );
- }
-
- this.navElements$
- .pipe(
- map(elements => elements.map(({ element }) => element)),
- filter(elements => !compare(elements, this.rightPartElements)),
- takeUntilDestroy(this),
- )
- .subscribe(elements => {
- setTimeout(() => (this.rightPartElements = elements), 0);
- });
- }
-
- ngOnDestroy() {}
-
- onChangeLang(cultureName: string) {
- this.store.dispatch(new SetLanguage(cultureName));
- }
-
- logout() {
- this.authService.logout().subscribe(() => {
- this.store.dispatch(
- new Navigate(['/'], null, {
- state: { redirectUrl: this.store.selectSnapshot(RouterState).state.url },
- }),
- );
- });
- }
+ constructor(public readonly navItems: NavItemsService) {}
}