/* * Copyright (C) 2022 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ import {Component, OnInit} from '@angular/core'; import {ActivatedRoute, Router} from '@angular/router'; import {AlertController, AnimationController} from '@ionic/angular'; import {combineLatest} from 'rxjs'; import {debounceTime, distinctUntilChanged, startWith, take} from 'rxjs/operators'; import {NGXLogger} from 'ngx-logger'; import {SCThings} from '@openstapps/core'; import {DataProvider} from '../../../data/data.provider'; import {DataRoutingService} from '../../../data/data-routing.service'; import {SearchPageComponent} from '../../../data/list/search-page.component'; import {PositionService} from '../../../map/position.service'; import {SettingsProvider} from '../../../settings/settings.provider'; import {FavoritesService} from '../../../favorites/favorites.service'; import {ContextMenuService} from '../../../menu/context/context-menu.service'; import {ConfigProvider} from '../../../config/config.provider'; /** * Shows a section with meals of the chosen mensa */ @Component({ selector: 'stapps-favorites-section', templateUrl: 'favorites-section.component.html', styleUrls: ['favorites-section.component.scss'], }) export class FavoritesSectionComponent extends SearchPageComponent implements OnInit { constructor( protected readonly alertController: AlertController, protected dataProvider: DataProvider, protected readonly contextMenuService: ContextMenuService, protected readonly settingsProvider: SettingsProvider, protected readonly logger: NGXLogger, protected dataRoutingService: DataRoutingService, protected router: Router, route: ActivatedRoute, positionService: PositionService, private favoritesService: FavoritesService, configProvider: ConfigProvider, animationController: AnimationController, ) { super( alertController, dataProvider, contextMenuService, settingsProvider, logger, dataRoutingService, router, route, positionService, configProvider, animationController, ); } async initialize() { this.subscriptions.push( combineLatest([ this.queryTextChanged.pipe( debounceTime(this.searchQueryDueTime), distinctUntilChanged(), startWith(this.queryText), ), this.favoritesService.favoritesChanged$, ]).subscribe(async () => { await this.fetchAndUpdateItems(); this.queryChanged.next(); }), ); } /** * Fetches/updates the favorites (search page component's method override) */ async fetchAndUpdateItems() { this.favoritesService .search(this.queryText, this.filterQuery, this.sortQuery) .pipe(take(1)) .subscribe(result => { this.items = new Promise(resolve => { resolve(result.data && result.data.filter(item => !this.isMensaThing(item))); }); }); } /** * Helper function as 'typeof' is not accessible in HTML * * @param item TODO */ isMensaThing(item: SCThings): boolean { return ( this.hasCategories(item) && ((item.categories as string[]).includes('canteen') || (item.categories as string[]).includes('cafe') || (item.categories as string[]).includes('student canteen') || (item.categories as string[]).includes('restaurant')) ); } /** * TODO * * @param item TODO */ hasCategories(item: SCThings): item is SCThings & {categories: string[]} { return typeof (item as {categories: string[]}).categories !== 'undefined'; } /** * Emit event that an item was selected */ notifySelect(item: SCThings) { this.dataRoutingService.emitChildEvent(item); } /** * Action when user clicked edit to this section */ onSectionEdit() { void this.router.navigate(['/search']); } }