All files / src/app/shell/header/header-default header-default.component.ts

47.36% Statements 9/19
54.16% Branches 13/24
62.5% Functions 5/8
47.36% Lines 9/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 872x   2x                                             2x 11x         11x                   23x               22x                   11x       11x                                              
import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from '@angular/core';
 
import { DeviceType } from 'ish-core/models/viewtype/viewtype.types';
 
type CollapsibleComponent = 'search' | 'navbar' | 'minibasket';
 
/**
 * The Header Component displays the page header.
 *
 * It uses the {@link LoginStatusComponent} for rendering the users login status.
 * It uses the {@link ProductCompareStatusComponent} for rendering the product compare button and count.
 * It uses the {@link MobileBasketComponent} for rendering the mobile basket button and basket item count.
 * It uses the {@link LanguageSwitchComponent} for rendering the language selection dropdown.
 * It uses the {@link SearchBoxComponent} for rendering the search box.
 * It uses the {@link HeaderNavigationComponent} for rendering the pages main navigation.
 * It uses the {@link MiniBasketComponent} for rendering mini basket on desktop sized viewports.
 *
 * @example
 * <ish-header></ish-header>
 */
@Component({
  selector: 'ish-header-default',
  templateUrl: './header-default.component.html',
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class HeaderDefaultComponent implements OnChanges {
  @Input() isSticky = false;
  @Input() deviceType: DeviceType;
  // not-dead-code
  @Input() reset: unknown;
 
  private activeComponent: CollapsibleComponent = 'search';
 
  ngOnChanges(changes: SimpleChanges) {
    Iif (changes.reset) {
      this.activeComponent = 'search';
    }
    this.toggleSpecialStatusOfSearch();
  }
 
  get showSearch() {
    return (
      this.activeComponent === 'search' &&
      // always show for sticky header
      (this.deviceType === 'mobile' || this.isSticky)
    );
  }
 
  get showNavBar() {
    return (
      this.activeComponent === 'navbar' ||
      // always show for desktop
      this.deviceType === 'desktop' ||
      // always show for tablet on top
      (this.deviceType === 'tablet' && !this.isSticky)
    );
  }
 
  get showDesktopLogoLink() {
    return (!this.isSticky && this.deviceType === 'tablet') || this.deviceType === 'desktop';
  }
 
  get showMobileLogoLink() {
    return (this.isSticky && this.deviceType !== 'desktop') || this.deviceType === 'mobile';
  }
 
  private toggleSpecialStatusOfSearch() {
    // deactivate search when switching to sticky header
    Iif (this.isSticky && this.activeComponent === 'search') {
      this.activeComponent = undefined;
    }
    // activate search when scrolling to top and no other is active
    Iif (!this.isSticky && !this.activeComponent) {
      this.activeComponent = 'search';
    }
  }
 
  toggle(component: CollapsibleComponent) {
    if (this.activeComponent === component) {
      // activate search bar when on top and no other is active
      this.activeComponent = !this.isSticky ? 'search' : undefined;
    } else {
      this.activeComponent = component;
    }
  }
}