{"version":3,"file":"668.55c94d91e165b0a0.js","mappings":"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","names":["i0","types","AddNewProjectButtonComponent","_AddNewProjectButtonComponent","constructor","this","isEvent","selectors","inputs","standalone","features","decls","vars","consts","template","rf","ctx","AddNewProjectButtonComponent_div_3_Template","AddNewProjectButtonComponent_ng_template_4_Template","notEvent_r1","IonIcon","IonButton","NgIf","TranslatePipe","styles","AddNewStackButtonComponent","_AddNewStackButtonComponent","FsAddNewItemButtonComponent","_FsAddNewItemButtonComponent","ngOnInit","itemType","className","getComponentName","console","warn","componentRef","slide","createComponent","instance","name","charAt","toUpperCase","toLowerCase","slice","viewQuery","ViewContainerRef","FsAddNewItemButtonComponent_ng_template_0_Template","ctx_r1","role","level","item","title","views","votes","members","length","mission","tmp_7_0","subscriptionBy","undefined","owner","subscriptionStatus","eventDate","$event","_r1","onClicked","ProjectSlideComponent_ng_template_1_div_3_Template","ProjectSlideComponent_ng_template_1_div_4_Template","ProjectSlideComponent_ng_template_1_ng_template_5_Template","ProjectSlideComponent_ng_template_1_div_7_Template","hero","defaultItemTpl_r3","ProjectSlideComponent","_ProjectSlideComponent","router","itemClick","EventEmitter","isModerated","canModerate","canShare","showAvatar","isProjectMember","event","navigate","PROJECT_DETAIL_ROUTE","id","emit","ITEM_TYPE","Projects","Array","isArray","projectMembersMap","_keyBy","filter","member","isActive","hasOwnProperty","currentUsername","SubscriptionStatus","Active","subscriptionLevel","i1","outputs","ProjectSlideComponent_ng_container_0_Template","ProjectSlideComponent_ng_template_1_Template","ProjectSlideComponent_ng_template_3_Template","hasItem_r4","hasNoItem_r5","changeDetection","tmp_6_0","projects","onClick","UserSlideComponent_ng_template_1_div_0_div_8_Template","userId","currentMemberId$","avatarFallback","username","tmp_8_0","showProjects","UserSlideComponent_ng_template_1_div_0_Template","hasNoItem_r3","StackSlideComponent","stack_slide_component","r","UserSlideComponent","_UserSlideComponent","store","select","selectCurrentMemberId","DEFAULT_USER_AVATAR_TERTIARY","user","Users","UserSlideComponent_ng_container_0_Template","UserSlideComponent_ng_template_1_Template","UserSlideComponent_ng_template_3_Template","ImageFadeInDirective","ImageFallbackDirective","AsyncPipe","AvatarUrlPipe","IonAvatar","IonSpinner","FsSlideComponent","_FsSlideComponent","isStackSlide","ngOnChanges","changes","propName","currentValue","firstChange","previousValue","updateInstanceInputs","key","val","ngOnDestroy","destroy","FsSlideComponent_ng_template_0_Template","heading","_r3","addNewItemButtonClick","options","_r4","item_r5","_r6","item_r7","FsCarouselComponent_ng_container_13_fs_slide_1_Template","_c1","CarouselOptions","LayoutOptions","opts","super","Object","entries","value","getOwnPropertyNames","includes","forEach","FsCarouselComponent","_FsCarouselComponent","obj","_options","userService","platform","isLoadingMore","newItemClick","loadMore","scrolledLeft$","Subject","scrolledRight$","itemTypes","loadMoreEmittedForItemAmount","ready","then","showAddNewItemButtonForItemAmount","is","getUsername","ngAfterViewInit","_this","_asyncToGenerator","Promise","resolve","setTimeout","calculateScrolls","_this2","carousel","items","currentItemValue","previousItemValue","currentUsernameValue","previousUsernameValue","scrollLeftWas","nativeElement","scrollLeft","clearTimeout","_timeoutScrollTo","scrollItemIntoView","scrollWidth","clientWidth","next","canLoadMore","direction","left","Math","min","max","scrollTo","top","behavior","trackByFn","_index","projectId","stackId","getStackId","getClipId","origScrollLeft","_scrollTimeout","container","selected","querySelector","offsetLeft","OFFSET_PADDING","environment","production","log","error","i2","FsCarouselComponent_div_6_Template","FsCarouselComponent_fs_add_new_item_button_10_Template","FsCarouselComponent_fs_slide_11_Template","FsCarouselComponent_fs_add_new_item_button_12_Template","FsCarouselComponent_ng_container_13_Template","FsCarouselComponent_ng_container_16_Template","Stacks","Clips","hasNewItemButtonAtEnd","hasAddNewItemButton","NgFor","open","openPopover","canPlay","canCollaborate","popoverOpen$","dteSaved","shares","playlist","isCollaborative","hlsSrc","isApproved","_StackSlideComponent","isMine","canApprove","popoverCtrl","navCtrl","dtePublished","navigateForward","WATCH_ROUTE","EDIT_ROUTE","state","autoOpenCapture","popover","create","component","StackPopoverActionsComponent","componentProps","stack","canAddToStack","canFeature","present","onWillDismiss","StackSlideComponent_ng_container_0_Template","StackSlideComponent_ng_template_1_Template","StackSlideComponent_ng_template_3_Template","hasItem_r3","hasNoItem_r4","ThumbnailPosterComponent","EllipsisButtonComponent","UploaderStatsComponent","ClipPopoverActionsComponent","_ClipPopoverActionsComponent","mystackService","modalCtrl","alertCtrl","clipService","videoService","toaster","route","translate","canEdit","showText","actions","didAddUserActions","onDestroy$","get","pipe","take","subscribe","translated","push","type","text","icon","unshift","clip","userId$","takeUntil","a","userIsGlobalAdmin$","isAdmin","youtube_id","complete","onSelected","setClipIsApproved","returnUrl","url","EDIT_CLIP_ROUTE","queryParams","modal","getTop","dismiss","addClipsToMyStack","instant","ModalReportComponent","reportedItem","confirmDelete","confirmTranscode","cssClass","header","subHeader","message","buttons","handler","deleteClip","catch","_this3","confirmSendClipForHLSTranscode","i3","i4","i5","i6","i7","i8","ActionPopoverComponent","toggleClipInMyStacks","ClipTileComponent_ng_template_1_div_8_ng_container_3_Template","ClipTileComponent_ng_template_1_div_8_ng_container_4_Template","isAddedToMyStack","openModal","ClipTileComponent_ng_template_1_div_8_Template","openActions","currentUserId","created","numStacks","ClipTileComponent","_ClipTileComponent","Utils","tryPreventDefault","tryStopPropagation","removeClipFromMyStack","ClipTileDetailModal","all","__webpack_require__","e","bind","ClipTileComponent_ng_container_0_Template","ClipTileComponent_ng_template_1_Template","ClipTileComponent_ng_template_3_Template","DatePipe","SentenceCasePipe","asStack","item_r1","FsGridComponent_ng_container_3_div_1_Template","asClip","item_r3","myStackClipIds_r4","indexOf","FsGridComponent_ng_container_4_ng_container_1_ng_container_1_Template","FsGridComponent_ng_container_4_ng_container_1_div_2_Template","FsGridComponent_ng_container_4_ng_container_1_ng_container_3_Template","isLoading","FsGridComponent_ng_container_4_ng_container_1_Template","myStackClipIds$","GridOptions","FsGridComponent","_FsGridComponent","selectMyStackClipIds","onClickItem","getId","FsGridComponent_ng_container_3_Template","FsGridComponent_ng_container_4_Template","ctx_r0","duration","actionIcon","ThumbnailPosterComponent_div_3_ion_icon_1_Template","ThumbnailPosterComponent_div_3_ng_template_2_Template","isLockedNoPlay","canPlayIcon_r2","avatarUrl","ThumbnailPosterComponent_div_4_div_1_Template","ThumbnailPosterComponent_div_4_img_2_Template","ThumbnailPosterComponent_div_6_ion_icon_3_Template","_ThumbnailPosterComponent","_item","posterBgImg","poster","posterFallback","_a","isStack","_b","isPlaying","memberService","isCurrent","wasPlayed","showActionIcon","showDuration","hasProvider","DEFAULT_USER_AVATAR","getUserAvatar","isClip","providerId","STACK_DEFAULT_POSTER","selectProject","p","proj","ThumbnailPosterComponent_div_2_Template","ThumbnailPosterComponent_div_3_Template","ThumbnailPosterComponent_div_4_Template","ThumbnailPosterComponent_div_5_Template","ThumbnailPosterComponent_div_6_Template","DurationRenderPipe","UploaderStatsComponent_div_3_div_1_span_3_Template","viewsTitle","moreViews","likes","UploaderStatsComponent_div_3_div_1_Template","UploaderStatsComponent_div_3_div_2_Template","UploaderStatsComponent_div_3_div_3_Template","UploaderStatsComponent_div_3_span_7_Template","UploaderStatsComponent_div_3_div_8_Template","UploaderStatsComponent_div_3_div_9_Template","UploaderStatsComponent_div_3_div_10_Template","UploaderStatsComponent_div_3_div_11_Template","stacksTitle","stacks","moreStacks","indicateNotHls","indicateNeedsApproved","UploaderStatsComponent_div_4_ion_avatar_1_img_1_Template","UploaderStatsComponent_div_4_ion_avatar_1_Template","username$","_UploaderStatsComponent","showStats","showUploader","getPublicUsername","date","UploaderStatsComponent_div_3_Template","UploaderStatsComponent_div_4_Template","_ImageFadeInDirective","opacity","transition","onLoaded","hostVars","hostBindings","_ImageFallbackDirective","fallback","onError","src","load","checkUrlExists","reject","xhr","XMLHttpRequest","onreadystatechange","readyState","HEADERS_RECEIVED","status","abort","onerror","send","_AvatarUrlPipe","transform","args","AVATAR_URL_PREFIX","color","DEFAULT_USER_AVATAR_DARK","pure","_DurationRenderPipe","str","times","split","len","i","isNaN","parseInt","shift","map","time","d","padZero","join","_SentenceCasePipe","substring","ListStackItemsComponent_ng_container_1_ion_item_1_Template","_c0","i_r2","featured","ListStackItemsComponent_ng_container_2_ion_item_1_ion_icon_5_Template","ListStackItemsComponent_ng_container_2_ion_item_1_div_6_Template","$implicit","ctx_r3","toggleFeatured","ListStackItemsComponent_ng_container_2_ion_item_1_ng_container_11_Template","ListStackItemsComponent_ng_container_2_ion_item_1_ng_container_12_Template","ListStackItemsComponent_ng_container_2_ion_item_1_div_13_Template","isDraggable","isNumerable","ListStackItemsComponent_ng_container_2_ion_item_1_Template","ListStackItemsComponent_ng_container_2_div_2_Template","trackByItem","ListStackItemsComponent","_ListStackItemsComponent","stackService","loadingCtrl","index","reorder","customEvent","loading","detail","from","to","thisStack","newFeatured","checkIndex","setStackFeatured","fromIdx","toIdx","ListStackItemsComponent_ng_container_1_Template","ListStackItemsComponent_ng_container_2_Template","DecimalPipe","IonReorderGroup","IonItem","IonSkeletonText","IonReorder","IonButtons","ListOptions","FsListComponent","_FsListComponent","IonList","addNewStackButtonClick","layout","StackListComponent_4_ng_template_0_Template","StackListComponent","_StackListComponent","layoutTypes","LAYOUT_TYPE","searchFields","STACK_SEARCH_FIELDS","newStackClick","navWatchStack","navEditStack","StackListComponent_ng_container_1_Template","StackListComponent_ng_container_2_Template","StackListComponent_ng_container_3_Template","StackListComponent_4_Template","Carousel","Grid","List","NgSwitch","NgSwitchCase","NgSwitchDefault"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/shared/components/fs-carousel/fs-add-new-item-button/add-new-project-button/add-new-project-button.component.html","./src/app/shared/components/fs-carousel/fs-add-new-item-button/fs-add-new-item-button.component.ts","./src/app/shared/components/fs-carousel/fs-add-new-item-button/add-new-project-button/add-new-project-button.component.ts","./src/app/shared/components/fs-carousel/fs-add-new-item-button/add-new-stack-button/add-new-stack-button.component.ts","./src/app/shared/components/fs-carousel/fs-add-new-item-button/add-new-stack-button/add-new-stack-button.component.html","./src/app/shared/components/fs-carousel/fs-slide/project-slide/project-slide.component.html","./src/app/shared/components/fs-carousel/fs-slide/project-slide/project-slide.component.ts","./src/app/shared/components/fs-carousel/fs-slide/user-slide/user-slide.component.html","./src/app/shared/components/fs-carousel/fs-slide/fs-slide.component.ts","./src/app/shared/components/fs-carousel/fs-slide/user-slide/user-slide.component.ts","./src/app/shared/components/fs-carousel/fs-carousel.component.html","./src/app/shared/components/fs-carousel/fs-carousel.component.ts","./src/app/shared/components/fs-carousel/fs-slide/stack-slide/stack-slide.component.html","./src/app/shared/components/fs-carousel/fs-slide/stack-slide/stack-slide.component.ts","./src/app/shared/components/fs-grid/clip-tile/clip-popover-actions/clip-popover-actions.component.ts","./src/app/shared/components/fs-grid/clip-tile/clip-popover-actions/clip-popover-actions.component.html","./src/app/shared/components/fs-grid/clip-tile/clip-tile.component.html","./src/app/shared/components/fs-grid/clip-tile/clip-tile.component.ts","./src/app/shared/components/fs-grid/fs-grid.component.html","./src/app/shared/components/fs-grid/fs-grid.component.ts","./src/app/shared/components/thumbnail-poster/thumbnail-poster.component.html","./src/app/shared/components/thumbnail-poster/thumbnail-poster.component.ts","./src/app/shared/components/ui/upload-stats/uploader-stats.component.html","./src/app/shared/components/ui/upload-stats/uploader-stats.component.ts","./src/app/shared/directives/image-fade-in.directive.ts","./src/app/shared/directives/image-fallback.directive.ts","./src/app/shared/pipes/avatar-url.pipe.ts","./src/app/shared/pipes/duration-render.pipe.ts","./src/app/shared/pipes/sentence-case.pipe.ts","./src/app/shared/components/fs-list/list-stack-items/list-stack-items.component.html","./src/app/shared/components/fs-list/list-stack-items/list-stack-items.component.ts","./src/app/shared/components/fs-list/fs-list.component.ts","./src/app/shared/components/fs-list/fs-list.component.html","./src/app/stacks/shared/components/stack-list/stack-list.component.html","./src/app/stacks/shared/components/stack-list/stack-list.component.ts"],"sourcesContent":["<div class=\"add-project\" [class.active-event]=\"isEvent\">\n    <ion-button shape=\"circle\" size=\"large\">\n        <ion-icon name=\"add-outline\"></ion-icon>\n    </ion-button>\n    <div *ngIf=\"isEvent else notEvent\" class=\"add-project__title\">{{\n        'PROJECT.CREATE_EVENT' | translate\n    }}</div>\n    <ng-template #notEvent>\n        <div class=\"add-project__title\">{{'STUDIO.PROJECTS.CREATE' | translate}}</div>\n    </ng-template>\n</div>","/** @format */\n\nimport { Component, Input, OnInit, ViewChild, ViewContainerRef } from '@angular/core';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { AddNewProjectButtonComponent } from './add-new-project-button/add-new-project-button.component';\nimport { AddNewStackButtonComponent } from './add-new-stack-button/add-new-stack-button.component';\n\nconst types = {\n  AddNewProjectButtonComponent,\n  AddNewStackButtonComponent,\n};\n\n@Component({\n  selector: 'fs-add-new-item-button',\n  template: `<ng-template #slide></ng-template>`,\n  styleUrls: ['./fs-add-new-item-button.component.scss'],\n  standalone: true,\n})\nexport class FsAddNewItemButtonComponent implements OnInit {\n  @Input() itemType: ITEM_TYPE;\n  @Input() isEvent: boolean = false;\n\n  @ViewChild('slide', { static: true, read: ViewContainerRef })\n  private slide: ViewContainerRef;\n\n  ngOnInit(): void {\n    if (this.itemType) {\n      const className = this.getComponentName(this.itemType);\n\n      if (!types[className]) {\n        console.warn(`[fs-add-new-item-button] Type '${className}' NOT FOUND: `, types);\n        return;\n      }\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const componentRef: any = this.slide.createComponent(types[className]);\n      if (className === 'AddNewProjectButtonComponent') {\n        // console.log('className', className);\n        componentRef.instance.isEvent = this.isEvent;\n      }\n    }\n  }\n\n  getComponentName(name: string) {\n    return `AddNew${name.charAt(0).toUpperCase()}${name.toLowerCase().slice(1, -1)}ButtonComponent`;\n  }\n}\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\n\n@Component({\n  selector: 'app-add-new-project-button',\n  templateUrl: './add-new-project-button.component.html',\n  styleUrls: ['./add-new-project-button.component.scss'],\n  standalone: true,\n  imports: [IonIcon, IonButton, NgIf, TranslatePipe],\n})\nexport class AddNewProjectButtonComponent {\n  @Input() isEvent = false;\n}\n","/** @format */\n\nimport { Component } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\n\n@Component({\n  selector: 'app-add-new-stack-button',\n  templateUrl: './add-new-stack-button.component.html',\n  styleUrls: ['./add-new-stack-button.component.scss'],\n  standalone: true,\n  imports: [IonIcon, IonButton, TranslatePipe],\n})\nexport class AddNewStackButtonComponent {}\n","<div class=\"add-stack\">\n    <ion-button shape=\"circle\" size=\"large\">\n        <ion-icon name=\"add-outline\"></ion-icon>\n    </ion-button>\n    <h3 class=\"add-stack__title\">{{'STUDIO.FILMSTACKS.CREATE' | translate}}</h3>\n</div>","<ng-container *ngIf=\"item; then hasItem; else hasNoItem\"> </ng-container>\n\n<ng-template #hasItem>\n  <div class=\"project-slide\" [class.active-event]=\"isEvent\" (click)=\"onClicked($event, item)\">\n    <div\n      class=\"project-slide__image\"\n      [style.background-image]=\"'url(' + item.hero + ')'\"\n    ></div>\n    <div class=\"project-slide__tint\"></div>\n\n    <div *ngIf=\"role\" class=\"project-slide__role\">\n      {{ role }}\n    </div>\n    <div *ngIf=\"level\" class=\"project-slide__level subscription-color subscription-chip light\">\n      {{ level }}\n    </div>\n\n    <ng-template #defaultItemTpl>\n      <div class=\"project-slide__title\">\n        {{ item.title }}\n      </div>\n  \n      <div class=\"project-slide__content\">\n        <div class=\"project-slide__content__stats\">\n          <div class=\"project-slide__content__stats__item\">\n            <ion-icon name=\"play-sharp\"></ion-icon>&nbsp;{{ item.views }}\n          </div>\n          <div class=\"project-slide__content__stats__item\">\n            <ion-icon name=\"heart-sharp\"></ion-icon>&nbsp;{{ item.votes }}\n          </div>\n          <div class=\"project-slide__content__stats__item\">\n            <ion-icon name=\"film-sharp\"></ion-icon>&nbsp;{{ 0 }}\n          </div>\n          <div class=\"project-slide__content__stats__item\">\n            <ion-icon name=\"people-sharp\"></ion-icon>&nbsp;{{ item.members && item.members.length ? item.members.length : 0 }}\n          </div>\n        </div>\n        <div class=\"project-slide__content__text\">\n          {{ item.mission }}\n        </div>\n      </div>\n    </ng-template>\n\n    <div *ngIf=\"isEvent else defaultItemTpl\" class=\"project-event\">\n      <div class=\"project-slide__title\">\n        {{ item.title }}\n      </div>\n      <!-- \n          Owner: Username (not shown if my event on edit studio)\n          Status : Active: Expired\n          Expires: Renews: \n          Event Date\n      -->\n      <div class=\"project-slide__content ion-text-capitalize\">\n        <div class=\"project-slide__content__event\">\n          <div>\n            <span class=\"italic\">{{ 'COMMON.OWNER' | translate }}: </span><b>{{ item?.subscriptionBy ?? item.owner }}</b>\n          </div>\n          <div>\n            <span class=\"italic\">{{ 'AUTH.STATUS' | translate }}: </span><b>{{ (item.subscriptionStatus === 1 ? 'COMMON.ACTIVE' : 'COMMON.INACTIVE') | translate }}</b>\n          </div>\n\n          <!-- TODO:\n              COMMON.EXPIRES \n              COMMON.RENEWS -->\n          <!-- <div *ngIf=\"item\">\n            <span class=\"italic\">{{ 'COMMON.EXPIRES_OR_RENEWS' | translate }}: </span><b>{{ 'GET DATE' }}</b>\n          </div> -->\n          <!-- <div>\n            <span class=\"italic\">{{ 'AUTH.PLANS.SUBSCRIPTION_LEVEL' | translate }}: </span><b>{{ project.eventConfig?.subscriptionLevel ?? project.subscriptionLevel }}</b>\n          </div> -->\n          <div>\n            <span class=\"italic\">{{ 'COMMON.EVENT_DATE' | translate }}: </span>{{ item.eventDate }}\n          </div>\n        </div>\n        <!-- <div class=\"project-slide__content__text\">\n          {{ item.mission }}\n        </div> -->\n      </div>\n    </div>\n  </div>\n</ng-template>\n\n<ng-template #hasNoItem>\n  <div class=\"project-slide\"></div>\n</ng-template>\n","/** @format */\n\nimport _keyBy from 'lodash/keyBy';\nimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { DiscoverCardClick, ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { SubscriptionStatus } from '@app/billing/shared/billing.model';\nimport { Project, PROJECT_MEMBER_ROLE } from '@app/projects/shared/project.model';\n\n@Component({\n  selector: 'app-project-slide',\n  templateUrl: './project-slide.component.html',\n  styleUrls: ['./project-slide.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [NgIf, TranslatePipe, IonIcon],\n})\nexport class ProjectSlideComponent {\n  @Input() item: Project;\n  @Input() currentUsername: string;\n  @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n  /** Showing on a Project.isModerated page */\n  @Input() isModerated = false;\n  @Input() canModerate = false;\n  @Input() canShare = true;\n  @Input() showAvatar = true;\n  @Input() isProjectMember = false;\n  @Input() isEvent = false;\n\n  constructor(private router: Router) {}\n\n  onClicked(event, item: Project) {\n    this.router.navigate([`/${PROJECT_DETAIL_ROUTE}`, item.id]);\n    this.itemClick.emit({ event, item, itemType: ITEM_TYPE.Projects });\n  }\n\n  get role(): PROJECT_MEMBER_ROLE {\n    if (!this.item || !Array.isArray(this.item.members)) {\n      return null;\n    }\n    const projectMembersMap = _keyBy(\n      this.item.members.filter((member) => member.isActive),\n      'username'\n    );\n\n    return projectMembersMap.hasOwnProperty(this.currentUsername) && projectMembersMap[this.currentUsername].role\n      ? projectMembersMap[this.currentUsername].role\n      : null;\n  }\n\n  get level(): string {\n    return this.item && this.item.subscriptionStatus === SubscriptionStatus.Active && this.item.subscriptionLevel\n      ? this.item.subscriptionLevel\n      : '';\n  }\n}\n","<ng-container *ngIf=\"item; then hasItem; else hasNoItem\"> </ng-container>\n\n<ng-template #hasItem>\n  <div *ngIf=\"item.userId?.length > 0 else hasNoItem\"\n    class=\"user-slide community-user\" \n    [class.user-slide__selected]=\"item.userId === (currentMemberId$ | async)\"\n    (click)=\"onClick($event, item)\">\n    <div class=\"user-slide__content\">\n      <ion-avatar class=\"user-slide__avatar\" draggable=\"false\">\n        <img\n          class=\"user-slide__avatar__image\"\n          [src]=\"item.userId | avatarUrl:'dark'\"\n          [fallback]=\"avatarFallback\"\n          imageFadeIn\n          [alt]=\"item.username ?? item.userId\"\n          [title]=\"item.username ?? item.userId\"\n          draggable=\"false\"\n        />\n      </ion-avatar>\n      <div class=\"user-slide__name\">\n        {{ item.username || item.userId }}\n      </div>\n      <div *ngIf=\"showProjects && item.projects?.length > 0\" class=\"user-slide__projects\" title=\"{{ 'COMMON.PROJECTS' | translate }}\">\n        <ion-icon name=\"folder-outline\" class=\"no-pointer-events\"></ion-icon>\n        <span class=\"project-count\">{{ item.projects?.length ?? 0 }}</span>\n      </div>\n    </div>\n  </div>\n</ng-template>\n\n<ng-template #hasNoItem>\n  <div class=\"user-slide\">\n    <ion-spinner class=\"loading-spinner\"></ion-spinner>\n  </div>\n</ng-template>\n","/** @format */\n\nimport {\n  Component,\n  OnInit,\n  Input,\n  ViewChild,\n  ViewContainerRef,\n  OnDestroy,\n  OnChanges,\n  SimpleChanges,\n  Output,\n  EventEmitter,\n  ComponentRef,\n} from '@angular/core';\nimport { DiscoverCardClick, ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { User } from '@app/shared/models/user.model';\nimport { Project, ProjectMember } from '@app/projects/shared/project.model';\nimport { ProjectSlideComponent } from './project-slide/project-slide.component';\nimport { StackSlideComponent } from './stack-slide/stack-slide.component';\nimport { UserSlideComponent } from './user-slide/user-slide.component';\n\nconst types = {\n  ProjectSlideComponent,\n  StackSlideComponent,\n  UserSlideComponent,\n};\n\n@Component({\n  selector: 'fs-slide',\n  template: ` <ng-template #slide></ng-template> `,\n  styleUrls: ['./fs-slide.component.scss'],\n  standalone: true,\n  imports: [ProjectSlideComponent, StackSlideComponent, UserSlideComponent],\n})\nexport class FsSlideComponent implements OnInit, OnDestroy, OnChanges {\n  @Input() item: Partial<Clip> | Partial<Stack> | Partial<Project> | Partial<ProjectMember> | Partial<User> | null;\n  @Input() itemType: ITEM_TYPE;\n  @Input() currentUsername: string;\n  /** Showing on a Project.isModerated page */\n  @Input() isModerated = false;\n  @Input() canModerate = false;\n  @Input() canShare = true;\n  @Input() showAvatar = true;\n  @Input() isProjectMember = false;\n  @Input() isEvent = false;\n  // set canModerate(bool: boolean) {\n  //   // not getting pciked up fro new slides ?\n  //   if (this.isStackSlide) { // ProjectSlide does not have/need this Input prop\n  //     this.updateInstanceInputs('canModerate', bool);\n  //   }\n  // }\n  @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n  @ViewChild('slide', { static: true, read: ViewContainerRef })\n  private slide: ViewContainerRef;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private componentRef: ComponentRef<any>;\n  private isStackSlide = false;\n\n  ngOnChanges(changes: SimpleChanges) {\n    for (const propName in changes) {\n      if (changes.hasOwnProperty(propName)) {\n        const { currentValue, firstChange, previousValue } = changes[propName];\n\n        if (firstChange || currentValue !== previousValue) {\n          this.updateInstanceInputs(propName, currentValue);\n        }\n      }\n    }\n  }\n\n  ngOnInit() {\n    /**\n     * Should have a way to get component type dynamically\n     * 2020-07-01 JD Fix Error \"No component factory found for undefined\" (finally applied 2021-04-01 with warn return)\n     */\n    if (this.itemType) {\n      const className = this.getComponentName(this.itemType);\n      // console.log(\"Class name: \", className);\n\n      if (!types[className]) {\n        console.warn(`[fs-slide] Type '${className}' NOT FOUND: `, types);\n        return;\n      }\n\n      this.isStackSlide = className === 'StackSlideComponent';\n\n      /**\n       * @deprecated note in lint:\n       * Angular no longer requires component factories to dynamically create components.\n       * Use different signature of the createComponent method, which allows passing Component class directly.\n       *\n       * Note: since v13, dynamic component creation via ViewContainerRef.createComponent does not require resolving component factory: component class can be used directly\n       * @see https://dev.to/railsstudent/dynamically-load-components-in-angular-13-5474\n       * @see https://stackoverflow.com/questions/70946038/replace-deprecated-angular-componentfactoryresolver-componentfactory\n       *\n       * 2026-06-27 jd fixed based on links above\n       *\n       */\n      this.componentRef = this.slide.createComponent(types[className]);\n      // const componentFactory = this.componentFactoryResolver.resolveComponentFactory(\n      //   types[className]\n      // );\n      // this.componentRef = this.slide.createComponent(componentFactory);\n      this.componentRef.instance.item = this.item;\n      this.componentRef.instance.currentUsername = this.currentUsername;\n      if (this.isStackSlide) {\n        // ProjectSlide does not have/need this Input prop\n        this.componentRef.instance.isModerated = this.isModerated;\n        // how to allow updates after init? in setter?\n        this.componentRef.instance.canModerate = this.canModerate;\n        this.componentRef.instance.canShare = this.canShare;\n        this.componentRef.instance.isProjectMember = this.isProjectMember;\n      }\n      if (this.isStackSlide || className === 'ClipSlideComponent') {\n        this.componentRef.instance.showAvatar = this.showAvatar;\n      }\n      if (className === 'ProjectSlideComponent') {\n        this.componentRef.instance.isEvent = this.isEvent;\n      }\n      // connect the Outputs too, apparently..\n      this.componentRef.instance.itemClick = this.itemClick;\n    }\n  }\n\n  updateInstanceInputs(key, val) {\n    // this.componentRef.instance.currentUsername = this.currentUsername;\n    // not getting picked up for new slides ?\n    if (this.componentRef && this.componentRef.instance) {\n      if (key === 'isModerated' || key === 'canModerate') {\n        // ProjectSlide does not have/need this Input prop\n        if (this.isStackSlide) {\n          this.componentRef.instance[key] = val;\n        }\n      } else {\n        this.componentRef.instance[key] = val;\n      }\n    }\n  }\n\n  getComponentName(name: string) {\n    return name.charAt(0).toUpperCase() + name.toLowerCase().slice(1, -1) + 'SlideComponent';\n  }\n\n  ngOnDestroy() {\n    if (this.componentRef && typeof this.componentRef.destroy === 'function') {\n      // hotfix(Sentry-22): Cannot read property 'destroy' of undefined\n      this.componentRef.destroy();\n    }\n  }\n}\n","/** @format */\n\nimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonAvatar, IonIcon, IonSpinner } from '@ionic/angular/standalone';\nimport { Store } from '@ngrx/store';\nimport { selectCurrentMemberId } from '@store/selectors/members.selectors';\nimport { DiscoverCardClick, ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { User, DEFAULT_USER_AVATAR_TERTIARY } from '@app/shared/models/user.model';\nimport { AvatarUrlPipe } from '@app/shared/pipes/avatar-url.pipe';\nimport { ImageFadeInDirective } from '@app/shared/directives/image-fade-in.directive';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\n\n@Component({\n  selector: 'app-user-slide',\n  templateUrl: './user-slide.component.html',\n  styleUrls: ['./user-slide.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [\n    NgIf,\n    ImageFadeInDirective,\n    ImageFallbackDirective,\n    AsyncPipe,\n    TranslatePipe,\n    AvatarUrlPipe,\n    IonAvatar,\n    IonIcon,\n    IonSpinner,\n  ],\n})\nexport class UserSlideComponent {\n  @Input() item: User;\n  // @Input() currentUsername: string;\n\n  @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n  currentMemberId$ = this.store.select(selectCurrentMemberId);\n\n  showProjects = false;\n  avatarFallback = DEFAULT_USER_AVATAR_TERTIARY;\n\n  constructor(private store: Store) {}\n\n  onClick(event, user: User) {\n    this.itemClick.emit({ event, item: user, itemType: ITEM_TYPE.Users });\n  }\n}\n","<div\n  class=\"carousel carousel--with-navigation\"\n  [class.carousel--has-vertical-text]=\"heading\"\n>\n  <div class=\"navigation\">\n    <ion-icon\n      class=\"navigation__item navigation__item--left\"\n      [class.navigation__item--inactive]=\"\n        (scrolledLeft$ | async) || !items || items.length === 0\n      \"\n      (click)=\"navigate('left')\"\n      name=\"chevron-back-outline\"\n    ></ion-icon>\n    <ion-icon\n      class=\"navigation__item navigation__item--right\"\n      [class.navigation__item--inactive]=\"\n        (scrolledRight$ | async) || !items || items.length === 0\n      \"\n      (click)=\"navigate('right')\"\n      name=\"chevron-forward-outline\"\n    ></ion-icon>\n  </div>\n  <div *ngIf=\"heading\" class=\"carousel__vertical-text\">\n    {{ heading }}\n  </div>\n  <div\n    #carousel\n    class=\"carousel__container\"\n    [class.carousel__container--stacks]=\"itemType === itemTypes.Stacks\"\n    [class.carousel__container--projects]=\"itemType === itemTypes.Projects\"\n    [class.carousel__container--clips]=\"itemType === itemTypes.Clips\"\n    [class.active-event]=\"options.isEvent\"\n    [class.carousel__container--users]=\"itemType === itemTypes.Users\"\n    (scroll)=\"calculateScrolls()\"\n    (window:resize)=\"calculateScrolls()\"\n  >\n    <div\n      class=\"carousel__container__content\"\n      [class.carousel__container__content--has-more]=\"canLoadMore\"\n      [class.carousel__container__content--loading-more]=\"isLoadingMore\"\n    >\n\n      <fs-add-new-item-button\n        *ngIf=\"!options.hasNewItemButtonAtEnd && options.hasAddNewItemButton && items?.length < showAddNewItemButtonForItemAmount\"\n        [itemType]=\"itemType\"\n        [isEvent]=\"options.isEvent\"\n        (click)=\"addNewItemButtonClick()\"\n      ></fs-add-new-item-button>\n\n      <fs-slide\n        *ngFor=\"let item of items; let i = index; trackBy: trackByFn\"\n        [itemType]=\"itemType\"\n        [item]=\"item\"\n        [currentUsername]=\"currentUsername\"\n        [isModerated]=\"isModerated\"\n        [canModerate]=\"canModerate\"\n        [canShare]=\"canShare\"\n        [showAvatar]=\"options.showAvatar\"\n        [isProjectMember]=\"isProjectMember\"\n        [isEvent]=\"options.isEvent\"\n        (itemClick)=\"itemClick.emit($event)\"\n      ></fs-slide>\n\n      <fs-add-new-item-button\n        *ngIf=\"options.hasNewItemButtonAtEnd\"\n        [itemType]=\"itemType\"\n        [isEvent]=\"options.isEvent\"\n        (click)=\"addNewItemButtonClick()\"\n      ></fs-add-new-item-button>\n      \n\n      <!-- undefined: items are still being loaded -->\n      <ng-container *ngIf=\"!items\">\n        <fs-slide\n          *ngFor=\"let item of [null, null, null, null]; let i = index\"\n          [itemType]=\"itemType\"\n          [item]=\"item\"\n          [showAvatar]=\"false\"\n        ></fs-slide>\n      </ng-container>\n\n      <!-- loading more spinner -->\n      <div class=\"carousel__container__content__spinner\">\n        <ion-spinner slot=\"start\" name=\"crescent\"></ion-spinner>\n      </div>\n\n      <!-- empty array: items are loaded but there are no actual items -->\n      <ng-container *ngIf=\"!options.hasAddNewItemButton && items?.length === 0\">\n        <div class=\"carousel__container__empty\">\n          {{ 'LISTS.NO_ITEMS' | translate }}\n        </div>\n      </ng-container>\n    </div>\n  </div>\n</div>\n","/** @format */\n\nimport {\n  Component,\n  Input,\n  ChangeDetectionStrategy,\n  Output,\n  EventEmitter,\n  ViewChild,\n  ElementRef,\n  AfterViewInit,\n  OnChanges,\n  OnInit,\n  SimpleChanges,\n} from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonIcon, IonSpinner, Platform } from '@ionic/angular/standalone';\nimport { Subject } from 'rxjs';\nimport { getId as getStackId } from '@store/selectors/stacks.selectors';\nimport { getId as getClipId } from '@store/selectors/clips.selectors';\nimport { UserService } from '@app/core/services/user.service';\nimport { DiscoverCardClick } from '@app/shared/models/layout.model';\nimport { ITEM_TYPE, FlexiblePartialItem, LayoutOptions } from '@app/shared/models/layout.model';\nimport { FsAddNewItemButtonComponent } from './fs-add-new-item-button/fs-add-new-item-button.component';\nimport { FsSlideComponent } from './fs-slide/fs-slide.component';\nimport { environment } from 'src/environments/environment';\n\nexport class CarouselOptions extends LayoutOptions {\n  // inherited from LayoutOptions:\n  // hasAddNewItemButton = false;\n  // hasNewItemButtonAtEnd = false;\n  // isEvent = false;\n\n  constructor(opts: object) {\n    super(opts);\n    if (opts != null) {\n      Object.entries(opts)\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        .filter(([key, value]) => Object.getOwnPropertyNames(this).includes(key))\n        .forEach(([key, value]) => (this[key] = value));\n    }\n  }\n}\n\nconst DEBUG_LOGS = false;\n\n@Component({\n  // eslint-disable-next-line @angular-eslint/component-selector\n  selector: 'fs-carousel',\n  templateUrl: './fs-carousel.component.html',\n  styleUrls: ['./fs-carousel.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [NgIf, NgFor, AsyncPipe, TranslatePipe, FsAddNewItemButtonComponent, FsSlideComponent, IonIcon, IonSpinner],\n})\nexport class FsCarouselComponent implements AfterViewInit, OnInit, OnChanges {\n  @Input() items: FlexiblePartialItem[];\n  // we need to know if more items can be loaded after the end has been reached\n  @Input() canLoadMore: boolean;\n  @Input() isLoadingMore = false;\n  @Input() itemType: ITEM_TYPE;\n  @Input() heading?: string;\n  /** Showing on a Project.isModerated page */\n  @Input() isModerated = false;\n  @Input() canModerate = false;\n  @Input() canShare = true;\n  @Input() isProjectMember = false;\n  @Input() currentUsername;\n\n  /**\n   * @Input Setter Getter\n   * https://stackoverflow.com/a/40764091/4982169\n   */\n  @Input()\n  set options(obj: object) {\n    this._options = new CarouselOptions(obj);\n  }\n  get options(): CarouselOptions {\n    return this._options;\n  }\n\n  @Output() newItemClick = new EventEmitter<void>();\n  @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n  @Output() loadMore = new EventEmitter<void>();\n\n  scrolledLeft$ = new Subject<boolean>();\n  scrolledRight$ = new Subject<boolean>();\n  itemTypes = ITEM_TYPE;\n  // loadMore will only emit once for if the user has scrolled to the end and items.length !== loadMoreEmittedForItemAmount\n  loadMoreEmittedForItemAmount = 0;\n  showAddNewItemButtonForItemAmount: number;\n\n  @ViewChild('carousel', { static: false }) carousel: ElementRef;\n\n  private _options: CarouselOptions;\n  private _timeoutScrollTo;\n\n  constructor(private userService: UserService, private platform: Platform) {}\n\n  ngOnInit(): void {\n    this.platform.ready().then(() => {\n      /**\n       * \"Add New item for desktop when user has less than 3 items in carousel. Show on mobile only when no items.\"\n       * https://filmstacker.atlassian.net/browse/MVP-1178\n       */\n      this.showAddNewItemButtonForItemAmount = this.platform.is('desktop') ? 3 : 1;\n    });\n    if (!this.currentUsername) {\n      this.currentUsername = this.userService.getUsername();\n    }\n  }\n\n  async ngAfterViewInit() {\n    // @note setTimeout hack because its children is disconnected from life cycle hook due to componentFactory\n    await new Promise((resolve) => setTimeout(resolve));\n    this.calculateScrolls();\n  }\n\n  async ngOnChanges(changes: SimpleChanges) {\n    if (this.carousel) {\n      // @note setTimeout hack because its children is disconnected from life cycle hook due to componentFactory\n      await new Promise((resolve) => setTimeout(resolve));\n      this.calculateScrolls();\n\n      // scroll to items when length or currentUser changes\n      if (this.itemType === this.itemTypes.Users) {\n        const {\n          items: { currentValue: currentItemValue = [], previousValue: previousItemValue = null } = {},\n          currentUsername: {\n            currentValue: currentUsernameValue = [],\n            previousValue: previousUsernameValue = null,\n          } = {},\n        } = changes;\n        if (\n          (currentItemValue?.length > 0 && currentItemValue.length !== previousItemValue?.length) ||\n          (currentUsernameValue && currentUsernameValue !== previousUsernameValue)\n        ) {\n          // console.log({ msg: 'do it', currentUsernameValue, itemType: this.itemType });\n          const scrollLeftWas = this.carousel?.nativeElement?.scrollLeft;\n          clearTimeout(this._timeoutScrollTo);\n          this._timeoutScrollTo = setTimeout(() => {\n            this.scrollItemIntoView(scrollLeftWas);\n          }, 2000);\n        }\n      }\n    }\n  }\n\n  addNewItemButtonClick() {\n    this.newItemClick.emit();\n  }\n\n  calculateScrolls() {\n    const { scrollLeft, scrollWidth, clientWidth } = this.carousel.nativeElement;\n    this.scrolledRight$.next(scrollLeft + clientWidth === scrollWidth);\n    this.scrolledLeft$.next(scrollLeft === 0);\n    // check if the end of the carousel has been reached and if loadMore needs to be emitted\n    const width = scrollWidth - clientWidth;\n    if (\n      this.items &&\n      this.items.length > 0 &&\n      this.canLoadMore &&\n      scrollLeft === width &&\n      this.items.length !== this.loadMoreEmittedForItemAmount\n    ) {\n      this.loadMoreEmittedForItemAmount = this.items.length;\n      this.loadMore.emit();\n    }\n  }\n\n  navigate(direction: 'right' | 'left') {\n    const { scrollLeft, scrollWidth, clientWidth } = this.carousel.nativeElement;\n    const buffer = 125;\n    const left =\n      direction === 'right'\n        ? Math.min(scrollLeft + clientWidth - buffer, scrollWidth - clientWidth)\n        : Math.max(scrollLeft - clientWidth + buffer, 0);\n    this.carousel.nativeElement.scrollTo({\n      top: 0,\n      left,\n      behavior: 'smooth',\n    });\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  trackByFn(_index: number, item: any) {\n    // NOTE: this.itemType is not defined...\n    if (!item) {\n      return _index;\n    }\n    if (item.projectId && item.stackId) {\n      return getStackId(item.projectId, item.stackId);\n    } else if (item.projectId && item.id) {\n      return getClipId(item.projectId, item.id);\n    } else if (item.id) {\n      return item.id;\n    } else if (item.userId) {\n      return item.userId;\n    } else {\n      return _index;\n    }\n  }\n\n  /* eslint-disable @typescript-eslint/member-ordering */\n  private _scrollTimeout;\n  private _closeTimeout;\n  private _itemSelectedTimeout;\n  /* eslint-enable @typescript-eslint/member-ordering */\n\n  private scrollItemIntoView(origScrollLeft = 0) {\n    clearTimeout(this._scrollTimeout);\n    this._scrollTimeout = setTimeout(() => {\n      try {\n        const OFFSET_PADDING = 100;\n        if (this.carousel && this.carousel.nativeElement) {\n          const container = this.carousel.nativeElement;\n          const selected = container.querySelector('.carousel__container__content .user-slide.user-slide__selected');\n          if (selected?.offsetLeft > 0) {\n            // if the user has moved the scroller, don't animate, plz\n            if (container.scrollLeft === origScrollLeft) {\n              const offsetLeft = selected.offsetLeft;\n              DEBUG_LOGS &&\n                console.log(`scrollItemIntoView`, {\n                  offsetLeft,\n                  scrollLeft: container.scrollLeft,\n                  origScrollLeft,\n                  selected,\n                  container,\n                });\n              // container.scrollLeft = selected[0].offsetLeft;\n              this.carousel.nativeElement.scrollTo({\n                top: 0,\n                left: offsetLeft > OFFSET_PADDING ? offsetLeft - OFFSET_PADDING : 0,\n                behavior: 'smooth',\n              });\n            } else {\n              DEBUG_LOGS &&\n                console.log('Skipping scroll since it was changed...', {\n                  scrollLeft: container.scrollLeft,\n                  origScrollLeft,\n                  selected,\n                });\n            }\n          } else {\n            !environment.production && console.log('User carousel selected item not found?', { container, selected });\n          }\n        }\n      } catch (error) {\n        console.log(`Caught Error in scrollItemIntoView`, error);\n      }\n    }, 500); // 500ms animation\n  }\n}\n","<ng-container *ngIf=\"item; then hasItem; else hasNoItem\"> </ng-container>\n\n<ng-template #hasItem>\n  <div class=\"stack-slide\" [class.is-locked]=\"!canPlay && !canCollaborate\">\n    <fs-thumbnail-poster\n      [item]=\"item\"\n      [isModerated]=\"isModerated\"\n      [canModerate]=\"canModerate\"\n      [currentUserId]=\"currentUsername\"\n      [canCollaborate]=\"canCollaborate\"\n      [isProjectMember]=\"isProjectMember\"\n      (click)=\"open($event, item)\"\n    ></fs-thumbnail-poster>\n    <fs-ellipsis-button\n      class=\"stack-slide__more\"\n      [class.stack-slide__more--active]=\"(popoverOpen$ | async) === true\"\n      (click)=\"openPopover($event)\"\n    ></fs-ellipsis-button>\n    <h3 class=\"stack-slide__title\" (click)=\"open($event, item)\">\n      {{ item.title }}\n    </h3>\n    <!-- tood: [likes]=\"item.likes\" -->\n    <fs-uploader-stats\n      [date]=\"item.dteSaved\"\n      [views]=\"item.views\"\n      [shares]=\"item.shares\"\n      [likes]=\"-1\"\n      [stacks]=\"item.playlist?.length\"\n      [stacksTitle]=\"'CLIP.CLIPS_IN_PLAYLIST' | translate\"\n      [showAvatar]=\"showAvatar\"\n      [userId]=\"item.userId\"\n      [isCollaborative]=\"item.isCollaborative\"\n      [indicateNotHls]=\"!item.hlsSrc\"\n      [indicateNeedsApproved]=\"isModerated && !item.isApproved\"\n    >\n    </fs-uploader-stats>\n    <!-- moved to uploader stats -->\n    <!-- <div *ngIf=\"item.isCollaborative\" class=\"indicator-icon\" [title]=\"'STACK.COLLABORATIVE_DRAFT' | translate\">\n      <ion-icon name=\"people-outline\" class=\"no-pointer-events\"></ion-icon>\n    </div> -->\n\n    <!-- <div *ngIf=\"isModerated && !item.isApproved\" class=\"approved-indicator\" [title]=\"'STACK.ACTIONS.REQUIRES_MODERATION' | translate\">\n      <ion-button size=\"small\" fill=\"clear\" color=\"medium\" (click)=\"moderate($event)\">\n        {{ 'STACK.ACTIONS.NEEDS_REVIEW' | translate }}\n        <ion-icon name=\"lock-closed-outline\" slot=\"icon-only\"></ion-icon>\n      </ion-button>\n    </div> -->\n    <!-- for dev - to be removed -->\n    <!-- <div *ngIf=\"item.hlsSrc\" class=\"hls-indicator\" title=\"Premiere Quality\">\n      <ion-icon name=\"aperture-sharp\" class=\"no-pointer-events\"></ion-icon>\n    </div>\n    <div *ngIf=\"item.isApproved\" class=\"approved-indicator\" title=\"Moderated\">\n      <ion-icon name=\"thumbs-up-outline\" class=\"no-pointer-events\"></ion-icon>\n    </div> -->\n    <!-- end remove -->\n  </div>\n</ng-template>\n\n<ng-template #hasNoItem>\n  <div class=\"stack-slide\">\n    <div class=\"stack-slide__image\"></div>\n    <div\n      class=\"stack-slide__title\"\n      style=\"background: var(--background); width: 40%; height: 20px\"\n    ></div>\n    <div\n      class=\"stack-slide__content\"\n      style=\"background: var(--background); width: 80%; height: 20px\"\n    ></div>\n  </div>\n</ng-template>\n","/** @format */\n\nimport { Component, Input, EventEmitter, Output } from '@angular/core';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { PopoverController, NavController } from '@ionic/angular/standalone';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { EDIT_ROUTE, WATCH_ROUTE } from '@app/app.routes';\nimport { DiscoverCardClick, ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { EllipsisButtonComponent } from '@app/shared/components/ui/buttons/ellipsis-button/ellipsis-button.component';\nimport { ThumbnailPosterComponent } from '@app/shared/components/thumbnail-poster/thumbnail-poster.component';\nimport { UploaderStatsComponent } from '@app/shared/components/ui/upload-stats/uploader-stats.component';\nimport { StackPopoverActionsComponent } from './stack-popover-actions/stack-popover-actions.component';\n\n@Component({\n  selector: 'app-stack-slide',\n  templateUrl: './stack-slide.component.html',\n  styleUrls: ['./stack-slide.component.scss'],\n  standalone: true,\n  imports: [NgIf, ThumbnailPosterComponent, EllipsisButtonComponent, UploaderStatsComponent, AsyncPipe, TranslatePipe],\n})\nexport class StackSlideComponent {\n  @Input() item: Stack;\n  /** should be currentUserId, really */\n  @Input() currentUsername: string;\n  /** Showing on a Project.isModerated page */\n  @Input() isModerated = false;\n  /** isProjectAdmin, canFeature too */\n  @Input() canModerate = false;\n  @Input() canShare = true;\n  @Input() showAvatar = true;\n  @Input() isProjectMember = false;\n\n  @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n  popoverOpen$ = new Subject<boolean>();\n\n  get isMine(): boolean {\n    return this.currentUsername === this.item.userId;\n  }\n  // if i am crew and this is a moderated stack, i can play it\n  get canPlay(): boolean {\n    return (\n      this.isMine ||\n      this.isProjectMember ||\n      !this.isModerated ||\n      this.canModerate ||\n      (this.isModerated && this.item.isApproved)\n    );\n  }\n  get canApprove(): boolean {\n    return this.isModerated && this.canModerate;\n  }\n  get canCollaborate(): boolean {\n    return this.isProjectMember && this.item && this.item.isCollaborative && this.item.isCollaborative > 0;\n  }\n\n  constructor(private popoverCtrl: PopoverController, private navCtrl: NavController) {}\n\n  open(event, item: Stack) {\n    if (!item || !item.projectId || !item.stackId) {\n      console.warn(`[StackSlide] open !item or ids?`, item);\n      return;\n    }\n    if (!this.canPlay && !this.canCollaborate) {\n      console.log(`Stack must be Moderated first... (${this.isProjectMember})`);\n      return;\n    }\n    if (item.dtePublished) {\n      this.navCtrl.navigateForward(`/${WATCH_ROUTE}/${item.projectId}/${item.stackId}`);\n    } else {\n      /**\n       * we are defaulting to an open stack action,\n       * if it's a collaborative Draft & i can collaborate -> autoOpenCapture\n       */\n      this.navCtrl.navigateForward(`/${EDIT_ROUTE}/${item.projectId}/${item.stackId}`, {\n        ...(!this.isMine && item.isCollaborative && this.canCollaborate\n          ? {\n              state: {\n                autoOpenCapture: true,\n              },\n            }\n          : {}),\n      });\n    }\n    this.itemClick.emit({ event, item, itemType: ITEM_TYPE.Stacks });\n  }\n\n  async openPopover(event: MouseEvent) {\n    this.popoverOpen$.next(true);\n    const popover = await this.popoverCtrl.create({\n      component: StackPopoverActionsComponent,\n      componentProps: {\n        stack: this.item,\n        // add the moderation actions\n        isModerated: this.isModerated,\n        canAddToStack: this.canPlay,\n        canShare: this.canShare && this.canPlay,\n        canApprove: this.canApprove,\n        canFeature: this.canModerate,\n        isProjectMember: this.isProjectMember,\n      },\n      event,\n    });\n    await popover.present();\n    await popover.onWillDismiss();\n    this.popoverOpen$.next(false);\n  }\n}\n","/** @format */\n\nimport { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { PopoverController, NavController, ModalController, AlertController } from '@ionic/angular/standalone';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { filter, take, takeUntil } from 'rxjs/operators';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { ClipsCoreService } from '@app/core/services/clips.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { VideoService } from '@app/core/services/video.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { ModalReportComponent } from '@app/shared/components/modal-report/modal-report.component';\nimport { ActionPopoverComponent, PopoverAction } from '@app/shared/components/action-popover/action-popover.component';\nimport { EDIT_CLIP_ROUTE } from '@app/app.routes';\n\n@Component({\n  selector: 'app-clip-popover-actions',\n  templateUrl: './clip-popover-actions.component.html',\n  styleUrls: ['./clip-popover-actions.component.scss'],\n  standalone: true,\n  imports: [ActionPopoverComponent],\n})\nexport class ClipPopoverActionsComponent implements OnInit, OnDestroy {\n  @Input() clip: Clip;\n  @Input() canEdit = false;\n  @Input() canAddToStack = true;\n  @Input() canApprove = false;\n  @Input() showText = true;\n\n  actions: PopoverAction[] = [];\n\n  private didAddUserActions = false;\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private popoverCtrl: PopoverController,\n    private mystackService: MyStackService,\n    private navCtrl: NavController,\n    private modalCtrl: ModalController,\n    private alertCtrl: AlertController,\n    private userService: UserService,\n    private clipService: ClipsCoreService,\n    private videoService: VideoService,\n    private toaster: ToasterService,\n    private route: ActivatedRoute,\n    private router: Router,\n    private translate: TranslateService\n  ) {}\n\n  ngOnInit() {\n    this.translate\n      .get([\n        'STACK.ACTIONS.REPORT',\n        'STACK.ACTIONS.ADD_TO_STACK',\n        'CLIP.APPROVE',\n        'CLIP.UNAPPROVE',\n        'CLIP.EDIT',\n        'COMMON.DELETE',\n      ])\n      .pipe(take(1))\n      .subscribe((translated) => {\n        this.actions.push({ type: 'flag', text: translated['STACK.ACTIONS.REPORT'], icon: 'flag-outline' });\n\n        if (this.canAddToStack) {\n          this.actions.unshift({\n            type: 'add-to-stack',\n            text: translated['STACK.ACTIONS.ADD_TO_STACK'],\n            icon: 'add-outline',\n          });\n        }\n        if (this.canApprove) {\n          if (this.clip.isApproved) {\n            // remove-circle-outline\n            this.actions.unshift({\n              type: 'un-approve',\n              text: translated['CLIP.UNAPPROVE'],\n              icon: 'lock-closed-outline',\n            });\n          } else {\n            this.actions.unshift({ type: 'approve', text: translated['CLIP.APPROVE'], icon: 'checkmark' });\n          }\n        }\n        this.userService.userId$.pipe(takeUntil(this.onDestroy$)).subscribe((userId) => {\n          // console.log(`sub userId '${userId}' clip:`, this.clip);\n          if (userId && this.clip && this.clip.userId === userId) {\n            // IS the current user's clip\n            if (!this.didAddUserActions) {\n              this.didAddUserActions = true;\n              this.actions.push({\n                type: 'edit',\n                text: translated['CLIP.EDIT'],\n                icon: 'create-outline',\n              });\n              this.actions.push({\n                type: 'delete',\n                text: translated['COMMON.DELETE'],\n                icon: 'trash-outline',\n              });\n            }\n          } else if (this.canEdit) {\n            this.actions.push({\n              type: 'edit',\n              text: translated['CLIP.EDIT'],\n              icon: 'create-outline',\n            });\n          } else if (this.didAddUserActions) {\n            // they might have just logged off\n            this.actions = this.actions.filter((a) => a.type !== 'delete' && a.type !== 'edit');\n            this.didAddUserActions = false;\n          }\n        });\n\n        /**\n         * Check currentUser Cognito Groups for Admin access to platform\n         * DEV HLS TRANSCODE MVP-742\n         */\n        this.userService.userIsGlobalAdmin$\n          .pipe(\n            takeUntil(this.onDestroy$),\n            filter((isAdmin) => !!isAdmin)\n          )\n          .subscribe(() => {\n            if (this.clip && !this.clip.hlsSrc && !this.clip.youtube_id) {\n              this.actions.push({ type: 'admin_hls', text: 'Transcode HLS', icon: 'aperture-sharp' }); // aperture-sharp\n            }\n          });\n      });\n  }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  async onSelected(type: string) {\n    // console.log(type);\n    switch (type) {\n      case 'approve': {\n        this.clipService.setClipIsApproved({\n          projectId: this.clip.projectId,\n          id: this.clip.id,\n          userId: this.clip.userId,\n          isApproved: true,\n        });\n        break;\n      }\n      case 'un-approve': {\n        this.clipService.setClipIsApproved({\n          projectId: this.clip.projectId,\n          id: this.clip.id,\n          userId: this.clip.userId,\n          isApproved: false,\n        });\n        break;\n      }\n      case 'edit': {\n        const returnUrl = this.router.url;\n        this.navCtrl.navigateForward(`/${EDIT_CLIP_ROUTE}/${this.clip.projectId}/${this.clip.id}`, {\n          state: { returnUrl },\n          queryParams: { returnUrl },\n        });\n        // in case the actions are displayed in a modal we want to close the modal\n        const modal = await this.modalCtrl.getTop();\n        if (modal) {\n          modal.dismiss();\n        }\n        break;\n      }\n      case 'add-to-stack': {\n        if (this.clip && this.clip.id) {\n          this.mystackService.addClipsToMyStack([this.clip]);\n        } else {\n          this.toaster.present(this.translate.instant('CLIP.ERROR_NOT_FOUND'));\n        }\n        break;\n      }\n      case 'flag': {\n        const modal = await this.modalCtrl.create({\n          component: ModalReportComponent,\n          componentProps: { reportedItem: this.clip },\n        });\n        await modal.present();\n        break;\n      }\n      case 'delete': {\n        this.confirmDelete();\n        break;\n      }\n      case 'admin_hls': {\n        // this.toaster.present(`Transcode to HLS...`);\n        this.confirmTranscode();\n        break;\n      }\n      default:\n        console.log(`@todo action ${type}`);\n    }\n    const popover = await this.popoverCtrl.getTop();\n    if (popover) {\n      popover.dismiss();\n    }\n  }\n\n  async confirmDelete() {\n    const alert = await this.alertCtrl.create({\n      cssClass: 'alert-confirm-delete',\n      header: this.translate.instant('CLIP.CONFIRM_DELETE'),\n      subHeader: this.translate.instant('CLIP.ACTION_CONFIRM'),\n      message: this.translate.instant('CLIP.CONFIRM_DELETE_MSG', {\n        title: this.clip.title\n          ? this.translate.instant('CLIP.CONFIRM_DELETE_TITLE', { value: this.clip.title })\n          : this.translate.instant('CLIP.CONFIRM_DELETE_NO_TITLE'),\n      }),\n      buttons: [\n        {\n          text: this.translate.instant('COMMON.CANCEL'),\n          role: 'cancel',\n          handler: () => {\n            console.log('Confirm Canceled...');\n          },\n        },\n        {\n          text: this.translate.instant('COMMON.DELETE'),\n          cssClass: 'ion-color-secondary',\n          handler: () =>\n            this.clipService\n              .deleteClip(this.clip)\n              .then(() => {\n                this.toaster.present(this.translate.instant('CLIP.DELETED'));\n              })\n              .catch((error) => {\n                console.warn(`[ClipPopover] deleteClip caught:`, error);\n                this.toaster.present(this.translate.instant('ERRORS.GENERIC_OOPS'));\n              }),\n        },\n      ],\n    });\n    return await alert.present();\n  }\n\n  /**\n   * DEV HLS TRANSCODE MVP-742\n   */\n  async confirmTranscode() {\n    return await this.videoService.confirmSendClipForHLSTranscode(this.clip);\n  }\n}\n","<app-action-popover [actions]=\"actions\" [showText]=\"showText\" (selected)=\"onSelected($event)\">\n</app-action-popover>\n","<ng-container *ngIf=\"item; then hasItem; else hasNoItem\"> </ng-container>\n\n<ng-template #hasItem>\n  <div class=\"clip-tile\" [class.clip-tile--added]=\"isAddedToMyStack\" [class.clip-tile--no-click]=\"!canAddToStack\">\n    <!-- includesmoderation ui -->\n    <fs-thumbnail-poster\n      [item]=\"item\"\n      [isModerated]=\"isModerated\"\n      [canModerate]=\"canModerate\"\n      [currentUserId]=\"currentUserId\"\n      (click)=\"openModal($event)\"\n      class=\"clip-tile__image\"\n    ></fs-thumbnail-poster>\n    <!-- <div\n      class=\"clip-tile__image\"\n      [style.background-image]=\"'url(' + item.poster + ')'\"\n      (click)=\"openModal($event)\"\n      ></div> -->\n      <!-- <div class=\"clip-tile__duration\">\n        {{ item.duration | duration }}\n      </div> -->\n    <div class=\"clip-tile__content\">\n      <h3 class=\"clip-tile__content__title\" (click)=\"openModal($event)\">\n        {{ (item.title || item.id) | sentenceCase }} \n      </h3>\n      <fs-uploader-stats\n        [date]=\"item.created | date\"\n        [userId]=\"item.userId\"\n        [showAvatar]=\"true\"\n        [showStats]=\"true\"\n        [stacks]=\"item.numStacks\"\n        [indicateNotHls]=\"!(item?.hlsSrc?.length > 0)\"\n        [indicateNeedsApproved]=\"isModerated && !item.isApproved\"\n        [views]=\"-1\"\n      ></fs-uploader-stats>\n \n      <div *ngIf=\"canAddToStack\" class=\"clip-tile__content__quick-action\">\n        <ion-button\n          color=\"medium\"\n          style=\"height: 48px; width: 48px\"\n          [fill]=\"isAddedToMyStack ? 'solid' : 'outline'\"\n          (click)=\"toggleClipInMyStacks(item, $event)\"\n        >\n          <div style=\"font-size: 30px; display: flex\">\n            <ng-container *ngIf=\"isAddedToMyStack\">\n              <ion-icon name=\"checkmark-outline\"></ion-icon>\n            </ng-container>\n            <ng-container *ngIf=\"!isAddedToMyStack\">\n              <ion-icon name=\"add-outline\"></ion-icon>\n            </ng-container>\n          </div>\n        </ion-button>\n      </div>\n      <div class=\"clip-tile__content__action\">\n        <fs-ellipsis-button (click)=\"openActions($event)\"></fs-ellipsis-button>\n      </div>\n    </div>\n  </div>\n</ng-template>\n\n<ng-template #hasNoItem>\n  <div class=\"clip-tile\">{{ 'LISTS.NO_ITEM' | translate }}</div>\n</ng-template>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf, DatePipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonButton, ModalController, PopoverController, IonIcon } from '@ionic/angular/standalone';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { EllipsisButtonComponent } from '@app/shared/components/ui/buttons/ellipsis-button/ellipsis-button.component';\nimport { SentenceCasePipe } from '@app/shared/pipes/sentence-case.pipe';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { Utils } from '@app/shared/utils';\nimport { ThumbnailPosterComponent } from '@app/shared/components/thumbnail-poster/thumbnail-poster.component';\nimport { UploaderStatsComponent } from '@app/shared/components/ui/upload-stats/uploader-stats.component';\nimport { ClipPopoverActionsComponent } from './clip-popover-actions/clip-popover-actions.component';\n\n@Component({\n  selector: 'app-clip-tile',\n  templateUrl: './clip-tile.component.html',\n  styleUrls: ['./clip-tile.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    TranslatePipe,\n    DatePipe,\n    SentenceCasePipe,\n    ThumbnailPosterComponent,\n    UploaderStatsComponent,\n    EllipsisButtonComponent,\n    IonButton,\n    IonIcon,\n  ],\n})\nexport class ClipTileComponent {\n  @Input() item: Clip;\n  @Input() isAddedToMyStack: boolean;\n  @Input() canEdit: boolean = false;\n  /** Showing on a Project.isModerated page */\n  @Input() isModerated = false;\n  @Input() canModerate = false;\n  @Input() showAvatar = false;\n  @Input() currentUserId: string;\n\n  get isMine(): boolean {\n    return this.currentUserId && this.currentUserId === this.item.userId;\n  }\n  get canApprove(): boolean {\n    return this.isModerated && this.canModerate;\n  }\n  get canAddToStack(): boolean {\n    return this.isMine || !this.isModerated || this.canModerate || (this.isModerated && this.item.isApproved);\n  }\n\n  constructor(\n    private popoverCtrl: PopoverController,\n    private modalCtrl: ModalController,\n    private mystackService: MyStackService\n  ) {}\n\n  async openActions(event: MouseEvent) {\n    Utils.tryPreventDefault(event);\n    Utils.tryStopPropagation(event);\n    const popover = await this.popoverCtrl.create({\n      component: ClipPopoverActionsComponent,\n      componentProps: {\n        clip: this.item,\n        canEdit: this.canEdit,\n        canAddToStack: this.canAddToStack,\n        canApprove: this.canApprove,\n      },\n      event,\n    });\n    return await popover.present();\n  }\n\n  async toggleClipInMyStacks(item: Clip, event: MouseEvent) {\n    Utils.tryPreventDefault(event); // why is the search form getting selected on ios?!\n    Utils.tryStopPropagation(event);\n    if (this.isAddedToMyStack) {\n      /**\n       * FIXED: Property 'removeClipFromMyStack' does not exist on type 'MyStackService'.\n       */\n      this.mystackService.removeClipFromMyStack(item);\n    } else {\n      this.mystackService.addClipsToMyStack([item]);\n    }\n  }\n\n  async openModal(event: MouseEvent) {\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    const { ClipTileDetailModal } = await import(\n      /* webpackPrefetch: true */\n      '@app/clips/shared/components/clip-tile-detail/clip-tile-detail.modal'\n    );\n    Utils.tryPreventDefault(event);\n    Utils.tryStopPropagation(event);\n    if (!this.canAddToStack) {\n      return console.log(`Clip awaiting moderation..`);\n    }\n    // console.log('item', this.item);\n    const modal = await this.modalCtrl.create({\n      component: ClipTileDetailModal,\n      componentProps: {\n        title: this.item.title,\n        item: this.item,\n        canEdit: this.canEdit,\n      },\n      cssClass: 'modal-lg',\n    });\n    return await modal.present();\n  }\n}\n","<div class=\"grid\">\n  <div class=\"container\">\n    <div class=\"row\">\n      <!-- STACKS -->\n      <ng-container *ngIf=\"itemType === itemTypes.Stacks\">\n        <div\n          class=\"col-lg-3 col-md-4 col-sm-6 col-12\"\n          *ngFor=\"let item of items\"\n        >\n          <app-stack-slide \n            [item]=\"asStack(item)\" \n            [showAvatar]=\"options.showAvatar\"\n            [isModerated]=\"isModerated\"> </app-stack-slide>\n        </div>\n      </ng-container>\n\n      <!-- CLIPS -->\n      <ng-container *ngIf=\"itemType === itemTypes.Clips\">\n        <ng-container *ngIf=\"myStackClipIds$ | async as myStackClipIds\">\n          <ng-container *ngIf=\"isLoading\">\n            <div class=\"grid__container__empty\">\n              <ion-spinner></ion-spinner> <span class=\"loading-spinner-text\">Loading...</span>\n            </div>\n          </ng-container>\n          <div\n            class=\"col-xl-3 col-lg-4 col-md-6 col-12\"\n            *ngFor=\"let item of items\"\n          >\n            <app-clip-tile\n              [item]=\"asClip(item)\"\n              [isAddedToMyStack]=\"myStackClipIds.indexOf(getClipId(item)) !== -1\"\n              [canEdit]=\"canEdit\"\n              [currentUserId]=\"userService.userId$ | async\"\n              [isModerated]=\"isModerated\"\n              [canModerate]=\"canModerate\"\n              [showAvatar]=\"options.showAvatar\"\n            >\n            </app-clip-tile>\n          </div>\n\n          <!-- empty array: items are loaded but there are no actual items -->\n          <ng-container *ngIf=\"!isLoading && items && items.length === 0\">\n            <div class=\"grid__container__empty\">\n              {{ 'LISTS.NO_ITEMS' | translate }}\n            </div>\n          </ng-container>\n        </ng-container>\n      </ng-container>\n    </div>\n  </div>\n</div>\n","/** @format */\n\nimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonSpinner } from '@ionic/angular/standalone';\nimport { Observable } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { selectMyStackClipIds } from '@store/selectors/mystack.selectors';\nimport { getId } from '@store/selectors/clips.selectors';\nimport { UserService } from '@app/core/services/user.service';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { ClipTileComponent } from '@app/shared/components/fs-grid/clip-tile/clip-tile.component';\n\nimport { StackSlideComponent } from '@app/shared/components/fs-carousel/fs-slide/stack-slide/stack-slide.component';\nimport { ITEM_TYPE, LayoutOptions, DiscoverCardClick, FlexiblePartialItem } from '@app/shared/models/layout.model';\n\nexport class GridOptions extends LayoutOptions {}\n\n@Component({\n  // eslint-disable-next-line @angular-eslint/component-selector\n  selector: 'fs-grid',\n  templateUrl: './fs-grid.component.html',\n  styleUrls: ['./fs-grid.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [NgIf, NgFor, AsyncPipe, TranslatePipe, StackSlideComponent, ClipTileComponent, IonSpinner],\n})\nexport class FsGridComponent {\n  @Input() items: FlexiblePartialItem[];\n  @Input() itemType: ITEM_TYPE;\n  @Input() heading?: string;\n  @Input() isLoading = false;\n  @Input() canEdit: boolean = false;\n  /** Showing on a Project.isModerated page */\n  @Input() isModerated = false;\n  @Input() canModerate = false;\n\n  /**\n   * @Input Setter Getter\n   * https://stackoverflow.com/a/40764091/4982169\n   */\n  @Input()\n  set options(obj: object) {\n    this._options = new GridOptions(obj);\n  }\n  get options(): GridOptions {\n    return this._options;\n  }\n\n  myStackClipIds$: Observable<string[]> = this.store.select(selectMyStackClipIds);\n\n  @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n  itemTypes = ITEM_TYPE;\n\n  private _options: GridOptions;\n\n  constructor(private store: Store<State>, public userService: UserService) {}\n\n  onClickItem(item) {\n    this.itemClick.emit(item);\n  }\n\n  // getClipId = getId;\n  public getClipId(item: FlexiblePartialItem): string {\n    const { projectId, id } = item as Clip;\n    return getId(projectId, id);\n  }\n\n  public asStack(item: FlexiblePartialItem): Stack {\n    return item as Stack;\n  }\n\n  public asClip(item: FlexiblePartialItem): Clip {\n    return item as Clip;\n  }\n}\n","<div\n  class=\"thumbnail-poster\"\n  [class.thumbnail-poster--needs-moderation]=\"isModerated && !item.isApproved\"\n  [class.thumbnail-poster--can-moderate]=\"canModerate\"\n  [class.thumbnail-poster--is-playing]=\"isPlaying\"\n  [class.thumbnail-poster--is-current]=\"isCurrent\"\n  [class.thumbnail-poster--is-mine]=\"isMine\"\n  [class.thumbnail-poster--is-collab-draft]=\"!isMine && canCollaborate\"\n  [class.thumbnail-poster--can-play]=\"canPlay\"\n  [class.thumbnail-poster--clip]=\"isClip(item)\"\n  [class.thumbnail-poster--stack]=\"isStack(item)\"\n>\n  <!-- why is this not updating? <div class=\"thumbnail-poster__image\" data-[style.background-image]=\"'url(' + item.poster + '), url(' + fallbackImg + ')'\"></div> -->\n  <div class=\"thumbnail-poster__image\" [style.background-image]=\"posterBgImg\"></div>\n  <div *ngIf=\"showDuration\" class=\"thumbnail-poster__duration\">{{ item.duration | duration }}</div>\n  <div *ngIf=\"showActionIcon\" class=\"thumbnail-poster__play\">\n    <ion-icon *ngIf=\"isLockedNoPlay else canPlayIcon\" name=\"lock-closed\" class=\"smaller-icon\"></ion-icon>\n    <ng-template #canPlayIcon>\n      <ion-icon\n        [name]=\"actionIcon\"\n      ></ion-icon>\n    </ng-template>\n  </div>\n  <div *ngIf=\"showAvatar\" class=\"thumbnail-poster__avatar\">\n    <!-- placeholder -->\n    <div *ngIf=\"!avatarUrl\" class=\"thumbnail-poster__avatar__image\"></div>\n    <!-- actual avatar -->\n    <img\n      class=\"thumbnail-poster__avatar__image\"\n      *ngIf=\"avatarUrl\"\n      [src]=\"avatarUrl\"\n      [fallback]=\"avatarFallback\"\n      imageFadeIn\n    />\n  </div>\n  <div *ngIf=\"hasProvider\" class=\"thumbnail-poster__provider\">\n    <ion-icon size=\"default\" color=\"medium\" name=\"logo-youtube\"></ion-icon>\n  </div>\n  <div *ngIf=\"isModerated && !item.isApproved\" class=\"thumbnail-poster__approved-indicator\" [title]=\"'STACK.ACTIONS.REQUIRES_MODERATION' | translate\">\n    <ion-button size=\"small\" fill=\"clear\" color=\"primary\" [disabled]=\"!canModerate\">\n      <ion-icon *ngIf=\"canModerate\" name=\"lock-closed\" slot=\"start\"></ion-icon>\n      {{ 'STACK.ACTIONS.' + (canModerate ? 'REVIEW_APPROVE' : 'NEEDS_REVIEW') | translate }}\n    </ion-button>\n  </div>\n</div>\n","/** @format */\n\nimport { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonIcon, IonButton } from '@ionic/angular/standalone';\nimport { filter, take } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { selectProject } from '@store/selectors/projects.selectors';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { Stack, STACK_DEFAULT_POSTER } from '@app/shared/models/stack.model';\nimport { DEFAULT_USER_AVATAR } from '@app/shared/models/user.model';\nimport { DurationRenderPipe } from '@app/shared/pipes/duration-render.pipe';\nimport { ImageFadeInDirective } from '@app/shared/directives/image-fade-in.directive';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\n\nconst FALLBACK_IMG = '/assets/images/default-stack-poster-sm.png'; // appended to the style.background-image as second url, in case poster 404\n\n@Component({\n  selector: 'fs-thumbnail-poster',\n  templateUrl: './thumbnail-poster.component.html',\n  styleUrls: ['./thumbnail-poster.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [IonButton, IonIcon, NgIf, ImageFadeInDirective, ImageFallbackDirective, TranslatePipe, DurationRenderPipe],\n})\nexport class ThumbnailPosterComponent implements OnInit {\n  @Input() isPlaying = false;\n  @Input() isCurrent = false;\n  @Input() wasPlayed = false; // todo: handle addional actions like add to stack\n  /** Showing on a Project.isModerated page */\n  @Input() isModerated = false;\n  @Input() canModerate = false;\n  @Input() currentUserId: string;\n  @Input() showAvatar = false;\n  @Input() showActionIcon = true;\n  @Input() showDuration = true;\n  @Input() canCollaborate = false;\n  @Input() isProjectMember = false;\n  // @Input() posterFallback = FALLBACK_IMG;\n\n  @Input() set item(value: Clip | Stack) {\n    this._item = value;\n\n    this.posterBgImg = value?.poster ? 'url(' + value.poster + ')' : 'url(' + this.posterFallback + ')';\n  }\n  get item(): Clip | Stack {\n    return this._item;\n  }\n\n  /** If not canPlay, then Locked */\n  get canPlay(): boolean {\n    return (\n      this.isMine ||\n      this.isProjectMember ||\n      !this.isModerated ||\n      this.item?.isApproved ||\n      this.canModerate ||\n      this.canCollaborate\n    );\n  }\n  get isLockedNoPlay(): boolean {\n    return !this.canPlay;\n  }\n\n  get actionIcon(): string {\n    if (this.isStack(this.item)) {\n      const isPublished = (this.item as Stack)?.dtePublished?.length > 0;\n      if (isPublished) {\n        return 'play-circle-outline';\n      }\n      if (this.isMine) {\n        return 'create-outline';\n      }\n      if (this.canCollaborate) {\n        return 'add-circle-outline';\n      }\n      return 'lock-closed';\n    } else {\n      // isClip\n      return this.isPlaying ? 'pause-circle-outline' : 'play-circle-outline';\n    }\n  }\n\n  posterFallback = FALLBACK_IMG;\n  isMine = false;\n  hasProvider = false;\n  avatarUrl: string;\n  avatarFallback = DEFAULT_USER_AVATAR;\n  posterBgImg = 'url(' + this.posterFallback + ')'; //'url(' + item.poster + '), url(' + this.fallbackImg + ')';\n\n  private _item: Clip | Stack;\n\n  constructor(private store: Store, private memberService: ProjectMemberService) {}\n\n  ngOnInit() {\n    this.isMine = this.currentUserId === this.item.userId;\n    if (this.showAvatar && this.item && this.item.userId) {\n      this.avatarUrl = this.memberService.getUserAvatar(this.item.userId);\n    }\n    if (this.isClip(this.item) && (this.item.providerId || this.item.youtube_id)) {\n      /**\n       * @todo handle Vimeo too\n       * Currently, hasProvider => logo-youtube\n       */\n      this.hasProvider = true;\n    }\n    if (this.isStack(this.item) && (!this.item.poster || this.item.poster === STACK_DEFAULT_POSTER)) {\n      this.store\n        .select(selectProject(this.item.projectId))\n        .pipe(\n          filter((p) => !!p?.id),\n          take(1)\n        )\n        .subscribe((proj) => {\n          if (proj.hero) {\n            this.posterBgImg = 'url(' + proj.hero + ')';\n          }\n        });\n    }\n  }\n\n  public isStack(item: Clip | Stack): item is Stack {\n    return 'stackId' in item;\n  }\n\n  /**\n   * if it's a youtube/vimeo clip there may not be sources or a source\n   */\n  public isClip(item: Clip | Stack): item is Clip {\n    return 'source' in item || 'sources' in item || 'providerId' in item;\n  }\n}\n","<div class=\"uploader-stats__date\">\n  {{ date | date: 'mediumDate' }}\n</div>\n<div *ngIf=\"showStats\" class=\"uploader-stats__content\">\n  <div *ngIf=\"views > -1\" class=\"uploader-stats__content__stats\" title=\"{{ viewsTitle }}\">\n    <ion-icon name=\"play-sharp\" class=\"no-pointer-events\"></ion-icon>&nbsp;{{ views || 0 }}<span *ngIf=\"moreViews\">+</span>\n  </div>\n  <div *ngIf=\"shares > -1\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.SHARES' | translate\">\n    <ion-icon ios=\"share-outline\" md=\"share-social-outline\" class=\"no-pointer-events\"></ion-icon>&nbsp;{{ shares || 0 }}\n  </div>\n  <div *ngIf=\"likes > -1\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.LIKES' | translate\">\n    <ion-icon name=\"heart-sharp\" class=\"no-pointer-events\"></ion-icon>&nbsp;{{ likes || 0 }}\n  </div>\n  <div class=\"uploader-stats__content__stats\" title=\"{{ stacksTitle }}\">\n    <ion-icon name=\"film-sharp\" class=\"no-pointer-events\"></ion-icon>&nbsp;{{ stacks || 0 }}<span *ngIf=\"moreStacks\">+</span>\n  </div>\n  <div *ngIf=\"members !== undefined\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.MEMBERS' | translate\">\n    <ion-icon name=\"person-sharp\" class=\"no-pointer-events\"></ion-icon>&nbsp;{{ members || 0 }}\n  </div>\n  <div *ngIf=\"isCollaborative\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.COLLABORATIVE' | translate\">\n    <ion-icon name=\"people-outline\" class=\"no-pointer-events\"></ion-icon>\n  </div>\n  <!-- changed to NOT HLS indicator -->\n  <div *ngIf=\"indicateNotHls\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.NOT_PREMIERE_QUALITY' | translate\">\n    <ion-icon name=\"aperture-sharp\" class=\"no-pointer-events\"></ion-icon>\n  </div>\n  <!-- <div *ngIf=\"indicateApproved\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.MODERATED' | translate\">\n    <ion-icon name=\"thumbs-up-outline\" class=\"no-pointer-events\"></ion-icon>\n  </div> -->\n  <div\n    *ngIf=\"indicateNeedsApproved\"\n    class=\"uploader-stats__content__stats\"\n    [title]=\"'STACK.ACTIONS.REQUIRES_MODERATION' | translate\"\n  >\n    <ion-icon name=\"lock-closed\" class=\"no-pointer-events\"></ion-icon>\n  </div>\n</div>\n<div *ngIf=\"showUploader\" class=\"uploader-stats__profile\">\n  <ion-avatar *ngIf=\"showAvatar\" class=\"uploader-stats__profile__avatar\">\n    <img class=\"uploader-stats__profile__avatar__image\" *ngIf=\"avatarUrl\" [src]=\"avatarUrl\" [fallback] imageFadeIn />\n  </ion-avatar>\n  <div class=\"uploader-stats__profile__name\">{{ username$ | async }}</div>\n</div>\n","/** @format */\n\nimport { Component, OnInit, Input } from '@angular/core';\nimport { NgIf, AsyncPipe, DatePipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonAvatar, IonIcon } from '@ionic/angular/standalone';\nimport { Observable } from 'rxjs';\nimport { DEFAULT_USER_AVATAR } from '@app/shared/models/user.model';\nimport { ImageFadeInDirective } from '@app/shared/directives/image-fade-in.directive';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\n\n@Component({\n  selector: 'fs-uploader-stats',\n  templateUrl: './uploader-stats.component.html',\n  styleUrls: ['./uploader-stats.component.scss'],\n  standalone: true,\n  imports: [NgIf, ImageFadeInDirective, ImageFallbackDirective, AsyncPipe, DatePipe, TranslatePipe, IonIcon, IonAvatar],\n})\nexport class UploaderStatsComponent implements OnInit {\n  @Input() date: string;\n  @Input() views: number;\n  @Input() likes: number;\n  @Input() shares: number;\n  @Input() members: number;\n  @Input() stacks: number;\n  @Input() userId: string;\n  @Input() showStats = true;\n  @Input() showUploader = true;\n  @Input() showAvatar = false;\n  @Input() indicateNotHls = false;\n  @Input() indicateNeedsApproved = false;\n  @Input() isCollaborative = 0;\n\n  @Input() viewsTitle = 'Views';\n  @Input() stacksTitle = 'Stacks';\n\n  /** handle more items to load (+) */\n  @Input() moreViews: boolean = false;\n  @Input() moreStacks: boolean = false;\n\n  avatarUrl: string;\n  username$: Observable<string>;\n  avatarFallback = DEFAULT_USER_AVATAR;\n\n  constructor(private memberService: ProjectMemberService) {}\n\n  async ngOnInit() {\n    if (this.userId) {\n      this.username$ = this.memberService.getPublicUsername(this.userId);\n\n      if (this.showAvatar) {\n        this.avatarUrl = this.memberService.getUserAvatar(this.userId);\n      }\n    }\n  }\n}\n","/** @format */\n\nimport { Directive, HostListener, HostBinding } from '@angular/core';\n\n@Directive({\n  // eslint-disable-next-line @angular-eslint/directive-selector\n  selector: '[imageFadeIn]',\n  standalone: true,\n})\nexport class ImageFadeInDirective {\n  @HostBinding('style.opacity') opacity = '0';\n  @HostBinding('style.transition') transition = 'opacity 0.4s ease-in-out';\n  @HostListener('load') onLoaded() {\n    this.opacity = '1';\n  }\n}\n","/**\n * eslint-disable @typescript-eslint/naming-convention\n *\n * @format\n */\n\n/* eslint-disable @angular-eslint/directive-selector, @typescript-eslint/naming-convention */\n/**\n * An image directive based on\n * https://medium.com/@sub.metu/angular-fallback-for-broken-images-5cd05c470f08\n */\nimport { Directive, Input, HostBinding } from '@angular/core';\nimport { DEFAULT_USER_AVATAR } from '@app/shared/models/user.model';\n\n@Directive({\n  selector: 'img[fallback]',\n  /**\n   * @todo refactor to support https://angular.io/styleguide#style-06-03\n   * HostBinding & HostListener instead of host metadata\n   */\n  // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n  host: {\n    '(error)': 'onError()',\n    '(load)': 'load()',\n    '[src]': 'src',\n    // '[attr.src]': 'finalImage'    //the attribute of the host element we want to update. in this case, <img 'src' />\n  },\n  standalone: true,\n})\nexport class ImageFallbackDirective {\n  @Input() src: string;\n  @Input() fallback: string = DEFAULT_USER_AVATAR;\n  // @Input() loading: string = '/assets/images/loading-spinner.svg';\n  // @Input('img-src') targetSource: string;\n  @HostBinding('class') className;\n\n  // finalImage: any; //property bound to our host attribute.\n\n  // ngAfterViewInit() {\n  //   console.log(`imgFallback targetSource='${this.src}' fallback='${this.fallback}'`);\n  // }\n\n  onError() {\n    // console.log(`ImgFallback onError ${this.src}`);\n    this.src = this.fallback;\n    this.className = 'image-fallback';\n  }\n  load() {\n    this.className = 'image-loaded';\n  }\n\n  /**\n   * when getting from S3, we will see a 404 if DNE\n   * send an xhr for HEAD of the image\n   */\n  checkUrlExists(url: string): Promise<string> {\n    return new Promise((resolve, reject) => {\n      const xhr = new XMLHttpRequest();\n      xhr.open('HEAD', url, true);\n\n      xhr.onreadystatechange = () => {\n        if (xhr.readyState >= XMLHttpRequest.HEADERS_RECEIVED && xhr.status >= 200 && xhr.status < 400) {\n          // console.log(`xhr`, { status: xhr.status, readyState: xhr.readyState, url });\n          resolve(url);\n        } else if (xhr.readyState >= XMLHttpRequest.HEADERS_RECEIVED && xhr.status >= 400) {\n          // console.log(`xhr error`, { status: xhr.status, readyState: xhr.readyState, url });\n          reject(xhr.status);\n        }\n        xhr.abort();\n      };\n      xhr.onerror = (e) => {\n        reject(e);\n      };\n      xhr.send();\n    });\n  }\n}\n","/** @format */\n\nimport { Pipe, PipeTransform } from '@angular/core';\nimport { AVATAR_URL_PREFIX } from '@app/app.config';\nimport {\n  DEFAULT_USER_AVATAR,\n  DEFAULT_USER_AVATAR_DARK,\n  DEFAULT_USER_AVATAR_TERTIARY,\n} from '@app/shared/models/user.model';\n\n@Pipe({\n  name: 'avatarUrl',\n  standalone: true,\n})\nexport class AvatarUrlPipe implements PipeTransform {\n  transform(userId: string, ...args: unknown[]): string {\n    if (userId) {\n      return `${AVATAR_URL_PREFIX}${userId}.jpg`;\n    }\n    const [color] = args;\n    switch (color) {\n      case 'dark':\n        return DEFAULT_USER_AVATAR_DARK;\n      case 'tertiary':\n        return DEFAULT_USER_AVATAR_TERTIARY;\n      default:\n        return DEFAULT_USER_AVATAR;\n    }\n    // return userId ? `${AVATAR_URL_PREFIX}${userId}.jpg` : defaultAvatar;\n  }\n}\n","/** @format */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Display Durations by hiding hours if none\n */\n@Pipe({\n    name: 'duration',\n    standalone: true,\n})\nexport class DurationRenderPipe implements PipeTransform {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  transform(value: string, ...args: unknown[]): string {\n    const str = value && typeof value === 'string' ? value : '';\n    const times = str ? str.split(':') : [];\n    // console.log(`DurationRenderPipe times:`, times);\n    // if there's only min:sec then it'll be 2, what we want to return\n    if (times.length < 3) {\n      // console.log(`DurationRenderPipe times < 3 -> return`, times.length);\n      return str;\n    }\n\n    // for each time greater than sec & mins (greater than length minus 2)\n    const len = times.length - 2;\n    for (let i = 0; i < len; i++) {\n      const time = isNaN(parseInt(times[i], 10)) ? 0 : parseInt(times[i], 10);\n      if (time <= 0) {\n        times.shift();\n      }\n    }\n\n    const padZero = (d) => ('0' + d).slice(-2);\n\n    return times.map((time) => padZero(time)).join(':');\n  }\n}\n","/** @format */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'sentenceCase',\n  standalone: true,\n})\nexport class SentenceCasePipe implements PipeTransform {\n  transform(value: string): string {\n    if (!value || typeof value.substring !== 'function') {\n      return '';\n    }\n    const first = value.substring(0, 1).toUpperCase();\n    return first + value.substring(1);\n  }\n}\n","<ion-reorder-group\n  [disabled]=\"!options.isDraggable\"\n  (ionItemReorder)=\"reorder($event)\"\n>\n  <ng-container *ngIf=\"!items\">\n    <ion-item\n      *ngFor=\"let item of [1, 2, 3, 4, 5, 6, 7]\"\n      lines=\"inset\"\n      class=\"list-stack-item ion-no-padding\"\n      style=\"--border-color: transparent;\"\n    >\n      <div slot=\"start\">\n        <div class=\"list-stack-item__start\">\n          <div class=\"list-stack-item__start__reorder\"></div>\n          <ion-skeleton-text\n            class=\"list-stack-item__start__poster d-none d-sm-block\"\n          ></ion-skeleton-text>\n        </div>\n      </div>\n      <div class=\"list-stack-item__content\">\n        <ion-skeleton-text style=\"height: 20px;\"></ion-skeleton-text>\n      </div>\n    </ion-item>\n  </ng-container>\n\n  <ng-container *ngIf=\"items\">\n    <ion-item\n      *ngFor=\"let item of items; index as i; trackBy: trackByItem\"\n      lines=\"inset\"\n      class=\"list-stack-item ion-no-padding\"\n    >\n      <div slot=\"start\">\n        <div class=\"list-stack-item__start\">\n          <ion-reorder>\n            <div class=\"list-stack-item__start__reorder\">\n              <ion-icon\n                *ngIf=\"options.isDraggable\"\n                name=\"reorder-two-outline\"\n                style=\"font-size: 24px;\"\n              ></ion-icon>\n              <div *ngIf=\"options.isNumerable\">\n                {{ i + 1 | number: '2.0' }}\n              </div>\n            </div>\n          </ion-reorder>\n          <ion-reorder>\n            <img\n              class=\"list-stack-item__start__poster d-none d-sm-block\"\n              imageFadeIn\n              loading=\"lazy\"\n              [src]=\"item.poster\"\n              [alt]=\"item.title\"\n            />\n          </ion-reorder>\n        </div>\n      </div>\n      <ion-buttons\n        style=\"flex-direction: row-reverse;\"\n        slot=\"end\"\n      >\n        <!-- width: 150px; -->\n        <ion-button class=\"add-remove-text-btn ion-text-wrap\" (click)=\"toggleFeatured(item)\">\n          <ng-container *ngIf=\"item.featured\">\n            <!-- <ion-icon slot=\"icon-only\" name=\"star\"></ion-icon> -->\n            {{ 'STACK.ACTIONS.REMOVE_FROM_FEATURED' | translate }}\n          </ng-container>\n          <ng-container *ngIf=\"!item.featured\">\n            {{ 'STACK.ACTIONS.ADD_TO_FEATURED' | translate }}\n          </ng-container>\n        </ion-button>\n        <div *ngIf=\"options.isDraggable\" class=\"ion-text-center ion-color-medium\">\n          <small>\n            {{ item.featured }}\n          </small>\n        </div>\n      </ion-buttons>\n\n      <div class=\"list-stack-item__content\">\n        <div\n          class=\"list-stack-item__content__title\"\n          style=\"flex-grow: 2;\"\n          (click)=\"open(item)\"\n        >\n          {{ item.title }}\n        </div>\n\n        <div class=\"list-stack-item__content__user d-none d-lg-block\">\n          <img\n            class=\"list-stack-item__content__user__image\"\n            src=\"/assets/images/default-avatar.png\"\n          />\n          {{ item.userId }}\n        </div>\n\n        <div class=\"d-none d-lg-block\">\n          {{ item.dtePublished | date: 'mediumDate' }}\n        </div>\n\n        <div class=\"d-none d-sm-block\">\n          {{ item.duration | duration }}\n        </div>\n      </div>\n    </ion-item>\n    <div class=\"list-stack-item__empty\" *ngIf=\"items.length === 0\">{{ 'LISTS.NO_ITEMS' | translate }}</div>\n  </ng-container>\n</ion-reorder-group>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf, NgFor, DecimalPipe, DatePipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport {\n  ItemReorderCustomEvent,\n  LoadingController,\n  NavController,\n  IonReorderGroup,\n  IonItem,\n  IonSkeletonText,\n  IonIcon,\n  IonReorder,\n  IonButtons,\n  IonButton,\n} from '@ionic/angular/standalone';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { DurationRenderPipe } from '@app/shared/pipes/duration-render.pipe';\nimport { ImageFadeInDirective } from '@app/shared/directives/image-fade-in.directive';\nimport { StackService } from '@app/stacks/shared/services/stack.service';\nimport { DraggableList, ListOptions } from '../fs-list.component';\nimport { WATCH_ROUTE } from '@app/app.routes';\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[ListStackItems]';\n\n@Component({\n  selector: 'app-list-stack-items',\n  templateUrl: './list-stack-items.component.html',\n  styleUrls: ['./list-stack-items.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    NgFor,\n    ImageFadeInDirective,\n    DecimalPipe,\n    DatePipe,\n    TranslatePipe,\n    DurationRenderPipe,\n    IonReorderGroup,\n    IonItem,\n    IonSkeletonText,\n    IonIcon,\n    IonReorder,\n    IonButtons,\n    IonButton,\n  ],\n})\nexport class ListStackItemsComponent implements DraggableList {\n  @Input() items: Stack[];\n  @Input() options: ListOptions;\n\n  constructor(\n    private stackService: StackService,\n    private loadingCtrl: LoadingController,\n    private navCtrl: NavController\n  ) {}\n\n  trackByItem(index: number, item: Stack) {\n    return item?.stackId ?? index;\n  }\n\n  open(item: Stack) {\n    this.navCtrl.navigateForward(`/${WATCH_ROUTE}/${item.projectId}/${item.stackId}`);\n  }\n\n  /**\n   * reorder v2 - featured is descending (larger = more featured)\n   * if dragging up, make featured 1 more than the next\n   * if dragging down, make featured 1 less than the previous\n   */\n  async reorder(event: Event) {\n    const customEvent = event as ItemReorderCustomEvent;\n    const loading = await this.loadingCtrl.create({\n      message: 'Updating stacks...',\n    });\n    await loading.present();\n    customEvent.detail.complete();\n    // eslint-disable-next-line prefer-const\n    let { from, to } = customEvent.detail;\n\n    // if the item was dragged past the bottom of the list, 'to' will be ==items.length (outside array indexes)\n    if (to >= this.items.length) {\n      if (from === to - 1) {\n        // we just dragged the last one and didn't change the value\n        DEBUG_LOGS && console.warn(`${PAGE} moved past the end!`, { to, from, oldLen: this.items.length });\n        loading.dismiss();\n        return;\n      }\n      to = this.items.length - 1; // make it the last one in the array\n    }\n\n    const thisStack = this.items[from];\n\n    const items = [...this.items];\n    [items[from], items[to]] = [items[to], items[from]];\n\n    /**\n     * find the featured value of item we dragged past in list,\n     * if dragging up, make featured 1 more than the next\n     * if dragging down, make featured 1 less than the previous\n     * or if last, make it a 1\n     */\n    let newFeatured = 1;\n    if (from > to) {\n      // moved up list\n      const checkIndex = to + 1;\n      newFeatured = items[checkIndex].featured + 1;\n      DEBUG_LOGS &&\n        console.log(`${PAGE} moved up list`, { to, checkIndex, newFeatured, title: items[checkIndex].title });\n    } else {\n      // moved down list\n      const checkIndex = to - 1;\n      DEBUG_LOGS && console.log(`${PAGE} checkIndex`, { checkIndex, len: items.length, items });\n      if (checkIndex >= items.length - 1) {\n        newFeatured = 1;\n        DEBUG_LOGS && console.log(`${PAGE} moved down list to bottom, make 1`);\n      } else {\n        newFeatured = items[checkIndex].featured - 1;\n        DEBUG_LOGS &&\n          console.log(`${PAGE} moved down list`, { to, checkIndex, newFeatured, title: items[checkIndex].title });\n      }\n    }\n    if (newFeatured <= 0) {\n      newFeatured = 1;\n    }\n\n    // await this.stacksService.updateStack(thisStack, [\n    //   { prop: 'featured', value: newFeatured },\n    // ]);\n    this.stackService.setStackFeatured({\n      projectId: thisStack.projectId,\n      stackId: thisStack.stackId,\n      featured: newFeatured,\n      fromIdx: from,\n      toIdx: to,\n    });\n\n    // reload stacks - not needed, since we're subscribed to them from teh store, they will be updated automatically\n    loading.dismiss();\n  }\n\n  async toggleFeatured(item: Stack) {\n    // const loading = await this.loadingCtrl.create({\n    //   message: 'Updating stacks...',\n    // });\n    // await loading.present();\n    // v1: const featuredItemsLength = this.items.filter((i) => i.featured > 0).length; // just make it feature = 1\n    // await this.stacksService.updateStack(item, [\n    //   {\n    //     prop: 'featured',\n    //     // if the stack has a number value for featured > 0, make it zero, else 1\n    //     value: typeof item.featured === 'number' && item.featured > 0 ? 0 : 1,\n    //   },\n    // ]);\n    this.stackService.setStackFeatured({\n      projectId: item.projectId,\n      stackId: item.stackId,\n      featured: typeof item.featured === 'number' && item.featured > 0 ? 0 : 1,\n    });\n    // reload stacks - not needed, since we're subscribed to them from the store, they will be updated automatically\n    // loading.dismiss();\n  }\n}\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { IonList, ItemReorderEventDetail } from '@ionic/angular/standalone';\nimport { ITEM_TYPE, LayoutOptions } from '@app/shared/models/layout.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { ListStackItemsComponent } from './list-stack-items/list-stack-items.component';\n\nexport class ListOptions extends LayoutOptions {\n  isDraggable = false;\n  isNumerable = false;\n\n  constructor(opts: object) {\n    super(opts);\n    Object.entries(opts)\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      .filter(([key, value]) => Object.getOwnPropertyNames(this).includes(key))\n      .forEach(([key, value]) => (this[key] = value));\n  }\n}\n\nexport interface DraggableList {\n  reorder(event: CustomEvent<ItemReorderEventDetail>);\n  toggleFeatured(item: Stack);\n}\n\n@Component({\n  selector: 'fs-list',\n  templateUrl: './fs-list.component.html',\n  styleUrls: ['./fs-list.component.scss'],\n  standalone: true,\n  imports: [IonList, ListStackItemsComponent],\n})\nexport class FsListComponent {\n  @Input() items: Stack[];\n  @Input() itemType: ITEM_TYPE;\n  /** Showing on a Project.isModerated page */\n  @Input() isModerated = false;\n  @Input() canModerate = false;\n\n  /**\n   * @Input Setter Getter\n   * https://stackoverflow.com/a/40764091/4982169\n   */\n  @Input()\n  set options(obj: object) {\n    this._options = new ListOptions(obj);\n  }\n  get options(): ListOptions {\n    return this._options;\n  }\n\n  private _options: ListOptions;\n}\n","<ion-list>\n  <!-- STACKS -->\n  <app-list-stack-items\n    [items]=\"items\"\n    [options]=\"options\"\n  ></app-list-stack-items>\n</ion-list>\n","<!-- @format -->\n\n<section [ngSwitch]=\"layout.type\">\n  <ng-container *ngSwitchCase=\"layoutTypes.Carousel\">\n    <fs-carousel\n      [items]=\"items\"\n      [canLoadMore]=\"canLoadMore\"\n      [isLoadingMore]=\"isLoading\"\n      [itemType]=\"itemTypes.Stacks\"\n      [heading]=\"heading\"\n      [options]=\"layout.options\"\n      [isModerated]=\"isModerated\"\n      [canModerate]=\"canModerate\"\n      [canShare]=\"canShare\"\n      [isProjectMember]=\"isProjectMember\"\n      (itemClick)=\"onClickItem($event)\"\n      (loadMore)=\"loadMore.emit($event)\"\n      (newItemClick)=\"addNewStackButtonClick()\"\n    ></fs-carousel>\n  </ng-container>\n  <ng-container *ngSwitchCase=\"layoutTypes.Grid\">\n    <fs-grid\n      [items]=\"items\"\n      [itemType]=\"itemTypes.Stacks\"\n      [options]=\"layout.options\"\n      [isModerated]=\"isModerated\"\n      [canModerate]=\"canModerate\"\n    ></fs-grid>\n  </ng-container>\n  <ng-container *ngSwitchCase=\"layoutTypes.List\">\n    <fs-list\n      [items]=\"items\"\n      [itemType]=\"itemTypes.Stacks\"\n      [options]=\"layout.options\"\n      [isModerated]=\"isModerated\"\n      [canModerate]=\"canModerate\"\n    ></fs-list>\n  </ng-container>\n  <ng-template *ngSwitchDefault> Unknown Layout... </ng-template>\n</section>\n","/** @format */\n\nimport { Component, Input, Output, ChangeDetectionStrategy, EventEmitter } from '@angular/core';\nimport { NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';\nimport { NavController } from '@ionic/angular/standalone';\nimport { EDIT_ROUTE, WATCH_ROUTE } from '@app/app.routes';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { DiscoverCardClick, LAYOUT_TYPE, ITEM_TYPE, LAYOUT_SETTINGS } from '@app/shared/models/layout.model';\nimport { STACK_SEARCH_FIELDS, Stack } 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 { FsListComponent } from '@app/shared/components/fs-list/fs-list.component';\n\n@Component({\n  selector: 'app-stack-list',\n  templateUrl: './stack-list.component.html',\n  styleUrls: ['./stack-list.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [NgSwitch, NgSwitchCase, NgSwitchDefault, FsCarouselComponent, FsGridComponent, FsListComponent],\n})\nexport class StackListComponent {\n  public itemTypes = ITEM_TYPE;\n  public layoutTypes = LAYOUT_TYPE;\n  public searchFields = STACK_SEARCH_FIELDS;\n\n  @Input() items: Stack[] | undefined; // undefined => loading state, array => fully loaded\n  @Input() canLoadMore = false;\n  @Input() isLoading = false;\n  @Input() layout: LAYOUT_SETTINGS;\n  @Input() heading?: string;\n  /** Showing on a Project.isModerated page */\n  @Input() isModerated = false;\n  @Input() canModerate = false;\n  @Input() canShare = true;\n  @Input() isProjectMember = false;\n  @Output() loadMore = new EventEmitter<void>();\n  @Output() newStackClick = new EventEmitter<void>();\n  @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n  constructor(private navCtrl: NavController, private toaster: ToasterService) {}\n\n  onClickItem(event: DiscoverCardClick) {\n    this.itemClick.emit(event);\n    if (event.item && (event.item as Stack).dtePublished) {\n      this.navWatchStack(event);\n    } else {\n      this.navEditStack(event);\n    }\n  }\n\n  addNewStackButtonClick() {\n    this.newStackClick.emit();\n  }\n\n  navWatchStack(event: DiscoverCardClick) {\n    const stack: Stack | null = event && event.item ? (event.item as Stack) : null;\n    if (stack && stack.projectId && stack.stackId) {\n      this.navCtrl.navigateForward(`/${WATCH_ROUTE}/${stack.projectId}/${stack.stackId}`);\n    } else {\n      this.toaster.present(`Oops! There was an error opening that Stack. Please Try Again.`);\n    }\n  }\n  navEditStack(event: DiscoverCardClick) {\n    const stack: Stack | null = event && event.item ? (event.item as Stack) : null;\n    if (stack && stack.projectId && stack.stackId) {\n      this.navCtrl.navigateForward(`/${EDIT_ROUTE}/${stack.projectId}/${stack.stackId}`);\n    } else {\n      this.toaster.present(`Oops! There was an error opening that Stack. Please Try Again.`);\n    }\n  }\n}\n"],"x_google_ignoreList":[]}