{"version":3,"file":"6826.e08018827506b854.js","mappings":"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","names":["i0","_r1","ctx_r1","handleClick","btnText","_r3","PAGE","PromoCardComponent","_PromoCardComponent","constructor","navCtrl","this","title","btnAction","btnActionUrl","smallCard","console","log","openPage","info","openStack","id","openProject","openChannel","name","params","navigateForward","i1","selectors","inputs","standalone","features","ngContentSelectors","_c0","decls","vars","consts","template","rf","ctx","PromoCardComponent_ion_button_4_Template","PromoCardComponent_ng_template_5_Template","smallerBtn_r4","IonButton","IonCard","NgIf","styles","list_r2","ngIf","ctx_r2","loadMoreStacks","layoutType","Carousel","stackList_r4","items$","nextToken","loading","label","DiscoverPage_div_7_app_stack_list_1_Template","isFeatured","list$","myProjects_r5","DiscoverPage_div_11_div_9_Template","numProjects$","toString","featuredProjects","tmp_6_0","myProjects","length","LIST_ID_STACKS_FEATURED","LIST_ID_STACKS_RECENT","LIST_ID_STACKS_MOST_VIEWED","LIST_ID_PROJECTS_FEATURED","LIST_ID_PROJECTS_MINE","DiscoverPage","_DiscoverPage","userService","stackService","projectService","activatedRoute","store","translate","returnUrl","segmentSelected","showProjects","SHOW_PROJECTS_IN_DISCOVER","stackLists","map","item","select","selectList","selectStackListItems","userId$","numStacks$","BehaviorSubject","selectProjectListItems","selectMyProjects","combineLatest","pipe","discoverLayoutId","topRightIndicator","INDICATOR_PROP","Role","LAYOUT_TYPE","itemType","ITEM_TYPE","isLoading","searchPlaceholder","didCreateLists","onDestroy$","Subject","ngOnInit","get","take","subscribe","res","list","index","queryParamMap","takeUntil","queryParams","searchChanged","searchText","filter","GLOBAL_QUERY_ID","q","dispatch","setFilter","stackActions","listId","filters","type","FilterEntityTypes","Featured","Recent","MostViewed","projectActions","scrollToTop","setTimeout","ngOnDestroy","next","complete","ionViewDidEnter","ionViewWillLeave","content","i2","i3","i4","i5","i6","i7","viewQuery","IonContent","DiscoverPage_fs_list_title_5_Template","DiscoverPage_div_7_Template","DiscoverPage_div_10_Template","DiscoverPage_div_11_Template","NgFor","CarouselGuidesComponent","ListTitleComponent","ProjectListComponent","StackListComponent","TopNavbarComponent","FooterComponent","IonHeader","AsyncPipe","TranslatePipe","$event","onClickItem","addNewProjectButtonClick","items","heading","itemTypes","Projects","layout","options","_ProjectListComponent","toaster","newProjectClick","EventEmitter","layoutTypes","searchFields","STACK_SEARCH_FIELDS","event","navWatchProject","emit","project","PROJECT_DETAIL_ROUTE","present","instant","outputs","ProjectListComponent_ng_container_1_Template","ProjectListComponent_ng_container_2_Template","ProjectListComponent_ng_container_3_Template","Grid","NgSwitch","NgSwitchCase","FsCarouselComponent","FsGridComponent","NgSwitchDefault","changeDetection","_FooterComponent","theme","copyrightYear","Date","getFullYear","FooterComponent_ng_container_4_Template","FooterComponent_ng_container_5_Template","RouterLink","headingWithDefault","_c1","stackList","_CarouselGuidesComponent","showListIfEmpty","labelWithDefault","shareReplay","projectId","GUIDES_PROJECT","CarouselGuidesComponent_ng_container_0_Template","tmp_0_0"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/shared/components/promo-card/promo-card.component.html","./src/app/shared/components/promo-card/promo-card.component.ts","./src/app/pages/discover/discover.page.html","./src/app/pages/discover/discover.page.ts","./src/app/projects/project-list/project-list.component.html","./src/app/projects/project-list/project-list.component.ts","./src/app/shared/components/footer/footer.component.html","./src/app/shared/components/footer/footer.component.ts","./src/app/stacks/carousels/carousel-guides/carousel-guides.component.html","./src/app/stacks/carousels/carousel-guides/carousel-guides.component.ts"],"sourcesContent":["\n<ion-card class=\"bg-orange promo-card\">\n <div class=\"card-title\">{{title}}</div>\n\n <!-- slot content goes here -->\n <ng-content></ng-content>\n\n\t\t<ion-button *ngIf=\"!smallCard; else smallerBtn;\" size=\"large\" shape=\"round\" color=\"primary\" class=\"promo-card-button\" (click)=\"handleClick()\">\n {{btnText}}\n </ion-button >\n <ng-template #smallerBtn>\n <ion-button shape=\"round\" color=\"primary\" class=\"promo-card-button smaller\" (click)=\"handleClick()\">\n {{btnText}}\n </ion-button >\n </ng-template>\n</ion-card>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { NavController, IonCard, IonButton } from '@ionic/angular/standalone';\n\nconst PAGE = 'PromoCard';\n\n@Component({\n selector: 'app-promo-card',\n templateUrl: './promo-card.component.html',\n styleUrls: ['./promo-card.component.scss'],\n standalone: true,\n imports: [IonButton, IonCard, NgIf],\n})\nexport class PromoCardComponent {\n @Input() title: string = '';\n @Input() btnText: string = 'Go!';\n @Input() btnAction: string = 'openPage';\n @Input() btnActionUrl: string = 'home';\n\n @Input() smallCard: boolean = false;\n\n constructor(private navCtrl: NavController) {}\n\n handleClick = () => {\n console.log(`[${PAGE}] click:`, this.btnAction, this.btnActionUrl);\n switch (this.btnAction) {\n case 'openPage':\n this.openPage(this.btnActionUrl);\n break;\n default:\n console.info(`[${PAGE}] click: UNHANDLED`, this.btnAction, this.btnActionUrl);\n }\n };\n\n /*\n NAV\n */\n openStack(id: string) {\n this.openPage('stack', { id });\n }\n openProject(id: string) {\n this.openPage('project', { id });\n }\n openChannel(id: string) {\n this.openPage('channel', { id });\n }\n\n openPage(name: string, params: { id?: string } = {}) {\n // push to the nav stack and get a back button\n this.navCtrl.navigateForward([`/${name}`, params]);\n }\n}\n","<ion-header>\n <app-top-navbar \n [title]=\"title\" \n [backButtonReturnUrl]=\"returnUrl\"\n [drawerEnabled]=\"true\"\n [expandSearchIfQuery]=\"true\"\n >\n <!-- SLOT: anything added here will go below the ion-navbar -->\n\n <div class=\"diet-limit-width\">\n <!-- <ion-segment *ngIf=\"showTopSegmentSelect\" (ionChange)=\"segmentChanged($event)\" [value]=\"segmentSelected\" class=\"top-segment\">\n <ion-segment-button value=\"stacks\" layout=\"icon-start\">\n <ion-label>Stacks</ion-label>\n <ion-icon name=\"layers-outline\" class=\"ion-hide-sm-down\"></ion-icon>\n </ion-segment-button>\n <ion-segment-button value=\"projects\" layout=\"icon-start\">\n <ion-label>Projects</ion-label>\n <ion-icon name=\"folder\" class=\"ion-hide-sm-down\"></ion-icon>\n </ion-segment-button>\n <ion-segment-button value=\"all\" layout=\"icon-start\">\n <ion-label>All</ion-label>\n <ion-icon name=\"layers-outline\" class=\"ion-hide-sm-down\"></ion-icon>\n <ion-icon name=\"folder\" class=\"ion-hide-sm-down\"></ion-icon>\n </ion-segment-button>\n </ion-segment> -->\n\n <!-- (MVP-699) -->\n <!-- <div *ngIf=\"showFilterToolbar\" class=\"wrap-filter-toolbar\">\n <app-filterable-toolbar\n [options]=\"['Featured', 'Recent']\"\n [selectedOption]=\"'Featured'\"\n [searchPlaceholder]=\"searchPlaceholder\"\n (onSearch)=\"onSearch($event)\"\n ></app-filterable-toolbar>\n </div> -->\n\n <!-- keep for reference of filter implementation, for now -->\n <!-- <ion-grid *ngIf=\"showSearchFilters\">\n <ion-row class=\"ion-justify-content-end\">\n <ion-col>\n <ion-item lines=\"none\" class=\"disc-search\">\n <ion-input [placeholder]=\"searchPlaceholder\"></ion-input>\n <ion-buttons slot=\"end\">\n <ion-button>\n <ion-icon slot=\"icon-only\" name=\"search\"></ion-icon>\n </ion-button>\n \n <ion-button fill=\"clear\" class=\"options-toggle\" (click)=\"toggleShowFilters()\">\n <ion-icon slot=\"icon-only\" name=\"filter\" color=\"tertiary\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-item>\n </ion-col>\n </ion-row>\n <ion-row class=\"collapsible ion-justify-content-end\" [style.max-height.px]=\"filtersShown ? 44 : 0\">\n <ion-list class=\"top-filters ion-justify-content-end\">\n \n <ion-button *ngFor=\"let filter of filters; let i = index\" size=\"small\" fill=\"clear\" [color]=\"filter.active ? 'light' : 'medium'\" \n [class.selected]=\"filter.active\" (click)=\"onClickFilter(filter, i)\">\n {{ filter.name }}\n <ion-icon slot=\"end\" *ngIf=\"filter.active\" name=\"close\"></ion-icon>\n </ion-button>\n \n </ion-list>\n </ion-row>\n <ion-row class=\"chips collapsible ion-justify-content-end\" [style.max-height.px]=\"filtersShown ? 44 : 0\">\n <ion-chip *ngFor=\"let tag of tags; let i = index\" [class.selected]=\"tag.active\" (click)=\"onClickTag(tag, i)\">\n <ion-label color=\"light\">\n {{ tag.name }}\n <ion-icon *ngIf=\"tag.active\" name=\"close\"></ion-icon>\n </ion-label>\n </ion-chip>\n </ion-row>\n </ion-grid> -->\n </div>\n </app-top-navbar>\n</ion-header>\n\n<ion-content class=\"ion-padding-vertical\">\n <div\n class=\"container\"\n [hidden]=\"!(segmentSelected === 'all' || segmentSelected === 'stacks')\"\n >\n <fs-list-title *ngIf=\"showProjects\" icon=\"layers-outline\">\n {{ 'COMMON.FILMSTACKS' | translate }}\n <!-- [small]=\"numStacks$ | async\" -->\n </fs-list-title>\n\n <div class=\"layout-wrap\">\n <div *ngFor=\"let stackList of stackLists\" class=\"list-wrap list-spacing\" [class.list-featured-stacks]=\"stackList.isFeatured\">\n <!-- @todo add [filterId] of some stringified value of FilterEntity so we can use trackBy inside the carousel -->\n <app-stack-list\n *ngIf=\"stackList.list$ | async as list\"\n [layout]=\"{\n type: layoutType.Carousel\n }\"\n [items]=\"stackList.items$ | async\"\n [canLoadMore]=\"!!list.nextToken\"\n [isLoading]=\"list.loading\"\n [heading]=\"stackList.label\"\n (loadMore)=\"loadMoreStacks(list)\"\n ></app-stack-list>\n </div>\n\n <fs-carousel-guides></fs-carousel-guides>\n\n <!-- <div *ngIf=\"!stackLists || stackLists.length < 1\" class=\"ion-text-center\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div> -->\n\n <div class=\"load-more ion-text-center\">\n <div *ngIf=\"isLoading;\" class=\"ion-padding ion-margin-top\">\n Loading...\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"container\" *ngIf=\"showProjects\">\n <fs-list-title\n icon=\"folder-outline\"\n [small]=\"(numProjects$ | async).toString()\"\n >{{ 'COMMON.PROJECTS' | translate }}</fs-list-title\n >\n\n <div class=\"layout-wrap project-list\">\n <app-project-list\n [layout]=\"{\n type: layoutType.Carousel\n }\"\n [heading]=\"'COMMON.FEATURED' | translate\"\n [items]=\"featuredProjects.items$ | async\"\n ></app-project-list>\n </div>\n <div *ngIf=\"(myProjects.items$ | async)?.length > 0 && myProjects.items$ | async as myProjects\" class=\"layout-wrap project-list\">\n <app-project-list\n [layout]=\"{\n type: layoutType.Carousel\n }\"\n [heading]=\"'COMMON.MY_PROJECTS' | translate\"\n [items]=\"myProjects\"\n ></app-project-list>\n </div>\n </div>\n\n <!-- TODO: https://ionicframework.com/docs/api/infinite-scroll -->\n\n <app-promo-card\n title=\"{{ 'DISCOVER.PROMO_CARD.TITLE' | translate }}\"\n btnText=\"{{ 'DISCOVER.PROMO_CARD.BUTTON' | translate }}\"\n btnAction=\"openPage\"\n btnActionUrl=\"/stack/social\"\n class=\"card\"\n ></app-promo-card>\n\n <div class=\"tab-bottom-spacer\"></div>\n\n <app-footer></app-footer>\n</ion-content>\n","/** @format */\n\nimport { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { IonContent, NavController, IonHeader } from '@ionic/angular/standalone';\nimport { BehaviorSubject, Observable, Subject, combineLatest } from 'rxjs';\nimport { map, take, takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { setFilter } from '@store/actions/viewstate.actions';\nimport * as projectActions from '@store/actions/projects.actions';\nimport * as stackActions from '@store/actions/stacks.actions';\nimport { List, selectList, selectProjectListItems, selectStackListItems } from '@store/selectors/lists.selectors';\nimport { selectMyProjects } from '@store/selectors/projects.selectors';\nimport { FilterEntity, FilterEntityTypes, GLOBAL_QUERY_ID } from '@store/selectors/viewstate.selectors';\nimport { SHOW_PROJECTS_IN_DISCOVER } from '@app/app.config';\nimport { StacksService } from '@app/core/services/stacks.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { INDICATOR_PROP, ITEM_TYPE, LAYOUT_TYPE } from '@app/shared/models/layout.model';\nimport { ListTitleComponent } from '@app/shared/components/ui/list-title/list-title.component';\nimport { PromoCardComponent } from '@app/shared/components/promo-card/promo-card.component';\nimport { FooterComponent } from '@app/shared/components/footer/footer.component';\nimport { TopNavbarComponent } from '@app/shared/components/top-navbar/top-navbar.component';\nimport { ProjectListComponent } from '@app/projects/project-list/project-list.component';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { CarouselGuidesComponent } from '@app/stacks/carousels/carousel-guides/carousel-guides.component';\nimport { StackListComponent } from '@app/stacks/shared/components/stack-list/stack-list.component';\n\nconst DEBUG_LOGS = false;\nconst LIST_ID_STACKS_FEATURED = 'discover_stacks_featured';\nconst LIST_ID_STACKS_RECENT = 'discover_stacks_recent';\n// const LIST_ID_STACKS_TRENDING = 'discover_stacks_trending';\nexport const LIST_ID_STACKS_MOST_VIEWED = 'discover_stacks_mostviewed';\nexport const LIST_ID_PROJECTS_FEATURED = 'featured_projects';\nexport const LIST_ID_PROJECTS_MINE = 'my_projects';\n\n@Component({\n selector: 'app-discover',\n templateUrl: './discover.page.html',\n styleUrls: ['./discover.page.scss'],\n standalone: true,\n imports: [\n NgIf,\n NgFor,\n CarouselGuidesComponent,\n ListTitleComponent,\n ProjectListComponent,\n StackListComponent,\n PromoCardComponent,\n TopNavbarComponent,\n FooterComponent,\n IonHeader,\n IonContent,\n AsyncPipe,\n TranslatePipe,\n ],\n})\nexport class DiscoverPage implements OnInit, OnDestroy {\n // showFilterToolbar = false; // @todo: enable this once it's working (MVP-699)\n\n @ViewChild(IonContent) content: IonContent;\n\n returnUrl = '';\n segmentSelected: 'all' | 'projects' | 'stacks' = 'all';\n showProjects = SHOW_PROJECTS_IN_DISCOVER;\n title = 'Discover';\n stackLists = [\n {\n id: LIST_ID_STACKS_FEATURED,\n label: 'Featured', // will be translated OnInit\n isFeatured: true,\n },\n {\n id: LIST_ID_STACKS_MOST_VIEWED,\n label: 'Most Viewed', // will be translated OnInit\n // label: 'Trending', // will be translated OnInit\n },\n {\n id: LIST_ID_STACKS_RECENT,\n label: 'Recent', // will be translated OnInit\n },\n ].map((item) => ({\n ...item,\n /** MVP-970 ngrx deprecated selectorWithProps */\n list$: this.store.select(selectList(item.id)), // loading, nextToken, ...\n items$: this.store.select(selectStackListItems(item.id)), // array of stacks\n }));\n\n userId$ = this.userService.userId$;\n numStacks$: BehaviorSubject<number> = new BehaviorSubject(0);\n featuredProjects = {\n id: LIST_ID_PROJECTS_FEATURED,\n label: 'Featured', // will be translated OnInit\n list$: this.store.select(selectList(LIST_ID_PROJECTS_FEATURED)),\n items$: this.store.select(selectProjectListItems(LIST_ID_PROJECTS_FEATURED)),\n };\n myProjects = {\n id: LIST_ID_PROJECTS_MINE,\n label: 'My Projects', // will be translated in template\n // list$: this.store.select(selectList(LIST_ID_MY_PROJECTS)),\n items$: this.store.select(selectMyProjects),\n };\n\n /**\n * Display the total num of projects in UI\n * ((myProjects.items$ | async)?.length ?? 0) + ((featuredProjects.items$ | async)?.length ?? 0).toString()\n */\n numProjects$: Observable<number> = combineLatest([this.featuredProjects.items$, this.myProjects.items$]).pipe(\n map(([featuredProjects = [], myProjects = []]) => (myProjects?.length ?? 0) + (featuredProjects?.length ?? 0))\n );\n\n discoverLayoutId = 'discover-page';\n topRightIndicator = INDICATOR_PROP.Role;\n layoutType = LAYOUT_TYPE;\n itemType = ITEM_TYPE;\n\n isLoading = true;\n searchPlaceholder = 'Discover Filmstacks and Projects'; // will be translated OnInit\n\n private searchText: string;\n private didCreateLists = false;\n private onDestroy$ = new Subject<void>();\n\n constructor(\n private userService: UserService,\n private stackService: StacksService,\n private projectService: ProjectService,\n private navCtrl: NavController,\n private activatedRoute: ActivatedRoute,\n private store: Store<State>,\n private translate: TranslateService\n ) {}\n\n ngOnInit() {\n this.translate\n .get([\n 'DISCOVER.SEARCH_PLACEHOLDER',\n 'COMMON.FEATURED',\n 'COMMON.RECENT',\n 'COMMON.MOST_VIEWED',\n 'COMMON.TRENDING',\n 'COMMON.MY_PROJECTS',\n ])\n .pipe(take(1))\n .subscribe((res) => {\n this.searchPlaceholder = res['DISCOVER.SEARCH_PLACEHOLDER'];\n this.featuredProjects.label = res['COMMON.FEATURED'];\n this.myProjects.label = res['COMMON.MY_PROJECTS'];\n // const idx = this.stackLists.findIndex((list) => list?.id === LIST_ID_STACKS_FEATURED);\n this.stackLists.map((list, index) => {\n switch (list?.id) {\n case LIST_ID_STACKS_FEATURED:\n this.stackLists[index].label = res['COMMON.FEATURED'];\n break;\n case LIST_ID_STACKS_RECENT:\n this.stackLists[index].label = res['COMMON.RECENT'];\n break;\n case LIST_ID_STACKS_MOST_VIEWED:\n this.stackLists[index].label = res['COMMON.MOST_VIEWED'];\n // this.stackLists[index].label = res['COMMON.TRENDING'];\n break;\n }\n return list;\n });\n });\n\n // listen to filter changes and dispatch actions according to them\n this.activatedRoute.queryParamMap.pipe(takeUntil(this.onDestroy$)).subscribe((queryParams) => {\n this.returnUrl = queryParams.get('returnUrl');\n const searchChanged = this.searchText !== queryParams.get('q');\n this.searchText = queryParams.get('q');\n const filter: FilterEntity = {\n id: GLOBAL_QUERY_ID,\n q: this.searchText,\n };\n DEBUG_LOGS && console.log(`[Discover] setFilter:`, { searchText: this.searchText, searchChanged, filter });\n // set filter for components to use\n // if the user arrives on the discover page with query params, we need to set them, too\n // later during runtime the components themselves will call setFilter\n this.store.dispatch(setFilter({ filter }));\n // dispatch actions that are the discover page\n\n if (!this.didCreateLists || searchChanged) {\n this.didCreateLists = true;\n // dispatch featured stacks\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: LIST_ID_STACKS_FEATURED,\n filters: { type: FilterEntityTypes.Featured, ...filter },\n })\n );\n // dispatch recent stacks\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: LIST_ID_STACKS_RECENT,\n filters: { type: FilterEntityTypes.Recent, ...filter },\n })\n );\n // trending\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: LIST_ID_STACKS_MOST_VIEWED,\n filters: { type: FilterEntityTypes.MostViewed, ...filter },\n })\n );\n\n // needed to display the amount of stacks in the title.\n // @todo this needs to change to total_items from the paging response.\n // this.stacks$ = combineLatest(this.stackLists.map((list) => list.items$)).pipe(\n // map((items) => [].concat(...items).filter(Boolean)),\n // );\n\n if (this.showProjects) {\n // passing down filters anyway, so the api call can react to it or not\n this.store.dispatch(\n projectActions.loadFilteredProjects({\n listId: LIST_ID_PROJECTS_FEATURED,\n filters: { type: FilterEntityTypes.Featured, ...filter },\n })\n );\n }\n }\n\n // when the query changes, scrollToTop\n this.scrollToTop();\n });\n\n // wait a second before showing LoadMore\n setTimeout(() => {\n this.isLoading = false;\n // this.canLoadMore = true;\n }, 1500);\n }\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n ionViewDidEnter() {\n this.scrollToTop();\n }\n ionViewWillLeave() {\n // reset any lingering topnav-drawer playlist actions\n this.store.dispatch(stackActions.resetAddToStackPlaylist());\n }\n\n scrollToTop() {\n if (this.content && typeof this.content.scrollToTop === 'function') {\n this.content.scrollToTop(400);\n }\n }\n\n loadMoreStacks(list: List) {\n // console.log(\n // `listLoadMore (note that this gets called automatically if list is init'd with less items than one full scroll width... [jd's hypothesis why])`,\n // );\n this.store.dispatch(\n stackActions.loadMoreFilteredStacks({\n listId: list.id,\n filters: list.filters,\n nextToken: list.nextToken,\n })\n );\n }\n}\n","<section [ngSwitch]=\"layout.type\">\n <ng-container *ngSwitchCase=\"layoutTypes.Carousel\">\n <fs-carousel\n [items]=\"items\"\n [heading]=\"heading\"\n [canLoadMore]=\"false\"\n [isLoadingMore]=\"false\"\n [itemType]=\"itemTypes.Projects\"\n [options]=\"layout.options\"\n (itemClick)=\"onClickItem($event)\"\n (newItemClick)=\"addNewProjectButtonClick()\"\n ></fs-carousel>\n </ng-container>\n <ng-container *ngSwitchCase=\"layoutTypes.Grid\">\n <fs-grid\n [items]=\"items\"\n [heading]=\"heading\"\n [itemType]=\"itemTypes.Projects\"\n [options]=\"layout.options\"\n (itemClick)=\"onClickItem($event)\"\n ></fs-grid>\n </ng-container>\n <ng-container *ngSwitchDefault>\n Unknown Layout...\n </ng-container>\n</section>\n","/** @format */\n\nimport { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\nimport { NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';\nimport { TranslateService } from '@ngx-translate/core';\nimport { NavController } from '@ionic/angular/standalone';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { DiscoverCardClick } from '@app/shared/models/layout.model';\nimport { LAYOUT_TYPE, LAYOUT_SETTINGS } from '@app/shared/models/layout.model';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { STACK_SEARCH_FIELDS } from '@app/shared/models/stack.model';\nimport { FsCarouselComponent } from '@app/shared/components/fs-carousel/fs-carousel.component';\nimport { FsGridComponent } from '@app/shared/components/fs-grid/fs-grid.component';\nimport { Project } from '@app/projects/shared/project.model';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\n\n@Component({\n selector: 'app-project-list',\n templateUrl: './project-list.component.html',\n styleUrls: ['./project-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgSwitch, NgSwitchCase, FsCarouselComponent, FsGridComponent, NgSwitchDefault],\n})\nexport class ProjectListComponent {\n @Input() items: Project[];\n @Input() heading: string;\n @Input() layout: LAYOUT_SETTINGS;\n @Output() newProjectClick = new EventEmitter<void>();\n\n public itemTypes = ITEM_TYPE;\n public layoutTypes = LAYOUT_TYPE;\n public searchFields = STACK_SEARCH_FIELDS;\n\n constructor(private navCtrl: NavController, private toaster: ToasterService, private translate: TranslateService) {}\n\n onClickItem(event: DiscoverCardClick) {\n this.navWatchProject(event);\n }\n\n addNewProjectButtonClick() {\n this.newProjectClick.emit();\n }\n\n navWatchProject(event: DiscoverCardClick) {\n const project: Project = event && event.item && (event.item as Project).id ? (event.item as Project) : null;\n if (project) {\n this.navCtrl.navigateForward([`/${PROJECT_DETAIL_ROUTE}`, project.id]);\n } else {\n this.toaster.present(this.translate.instant('ERRORS.OPENING_PROJECT'));\n }\n }\n}\n","<!-- @format -->\n\n<footer>\n <div class=\"footer container\">\n <div class=\"footer__side footer__side--left\">\n <div [ngSwitch]=\"theme\">\n <ng-container *ngSwitchCase=\"'light'\">\n <!-- if light theme, use blue logo -->\n <img class=\"logo\" src=\"/assets/images/logos/Filmstacker-logo-teal.png\" alt=\"Filmstacker\" />\n </ng-container>\n <ng-container *ngSwitchDefault>\n <img class=\"logo\" src=\"/assets/images/filmstacker-logo.png\" alt=\"Filmstacker\" />\n </ng-container>\n </div>\n </div>\n <div class=\"footer__side\">\n <div class=\"footer__side__item\">\n <a routerLink=\"/about\">{{ 'COMMON.ABOUT' | translate }}</a>\n </div>\n <!-- <div class=\"footer__side__item\">\n <a routerLink=\"/support\">{{ 'COMMON.SUPPORT' | translate }}</a>\n </div> -->\n <div class=\"footer__side__item\">\n <a routerLink=\"/community-rules\">{{ 'COMMON.COMMUNITY_GUIDELINES' | translate }}</a>\n </div>\n <div class=\"footer__side__item\">\n <a routerLink=\"/privacy\">{{ 'POLICIES.PRIVACY_POLICY' | translate }}</a>\n </div>\n <div class=\"footer__side__item\">\n <a routerLink=\"/terms\">{{ 'POLICIES.TERMS_USE' | translate }}</a>\n </div>\n <div class=\"footer__side__item\">©{{ copyrightYear }} Filmstacker Inc. {{ 'POLICIES.RIGHTS_RESERVED' | translate }}.</div>\n </div>\n </div>\n <div class=\"tab-bottom-spacer\"></div>\n</footer>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\n\n@Component({\n selector: 'app-footer',\n templateUrl: './footer.component.html',\n styleUrls: ['./footer.component.scss'],\n standalone: true,\n imports: [NgSwitch, NgSwitchCase, NgSwitchDefault, RouterLink, TranslatePipe],\n})\nexport class FooterComponent {\n /** manages which logo */\n @Input() theme: 'light' | 'dark' = 'dark';\n\n copyrightYear = new Date().getFullYear();\n}\n","<ng-container *ngIf=\"((stackList.items$ | async)?.length > 0 || showListIfEmpty) && (stackList.list$ | async) as list\">\n <h3>{{ headingWithDefault }}</h3>\n <app-stack-list \n [layout]=\"{\n type: layoutType.Carousel,\n options: {\n hasAddNewItemButton: false\n }\n }\"\n [items]=\"stackList.items$ | async\"\n [canLoadMore]=\"!!list.nextToken\"\n [isLoading]=\"list.loading\"\n [heading]=\"stackList.label\"\n (loadMore)=\"loadMoreStacks(list)\"\n ></app-stack-list>\n</ng-container>\n\n","/** @format */\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { shareReplay } from 'rxjs/operators';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport * as stackActions from '@store/actions/stacks.actions';\nimport { List, selectList, selectStackListItems } from '@store/selectors/lists.selectors';\nimport { FilterEntityTypes } from '@store/selectors/viewstate.selectors';\nimport { GUIDES_PROJECT } from '@app/app.config';\nimport { LAYOUT_TYPE } from '@app/shared/models/layout.model';\nimport { StackList } from '@app/shared/models/list.model';\nimport { StackListComponent } from '@app/stacks/shared/components/stack-list/stack-list.component';\n\nconst CAROUSEL_GUIDES_LIST_ID = 'carousel_guides';\nconst CAROUSEL_GUIDES_HEADING = 'DISCOVER.GUIDES.HEADING';\nconst CAROUSEL_GUIDES_LABEL = 'DISCOVER.GUIDES.LABEL';\n\n@Component({\n selector: 'fs-carousel-guides',\n templateUrl: './carousel-guides.component.html',\n styleUrls: ['./carousel-guides.component.scss'],\n standalone: true,\n imports: [NgIf, AsyncPipe, StackListComponent],\n})\nexport class CarouselGuidesComponent implements OnInit {\n stackList: StackList;\n layoutType = LAYOUT_TYPE;\n\n @Input() heading: string;\n @Input() label: string;\n @Input() listId = CAROUSEL_GUIDES_LIST_ID;\n @Input() showListIfEmpty = true;\n\n constructor(private translate: TranslateService, private store: Store<State>) {}\n\n ngOnInit() {\n this.stackList = {\n id: this.listId,\n label: this.labelWithDefault,\n list$: this.store.select(selectList(this.listId)),\n items$: this.store.select(selectStackListItems(this.listId)).pipe(shareReplay(1)),\n };\n\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: this.listId,\n filters: {\n // : FilterEntity\n projectId: GUIDES_PROJECT,\n type: FilterEntityTypes.Featured,\n id: this.listId,\n q: null,\n },\n })\n );\n }\n\n get labelWithDefault() {\n return this.label ?? this.translate.instant(CAROUSEL_GUIDES_LABEL);\n }\n\n get headingWithDefault() {\n return this.heading ?? this.translate.instant(CAROUSEL_GUIDES_HEADING);\n }\n\n loadMoreStacks(list: List) {\n this.store.dispatch(\n stackActions.loadMoreFilteredStacks({\n listId: list.id,\n filters: list.filters,\n nextToken: list.nextToken,\n })\n );\n }\n}\n"],"x_google_ignoreList":[]}