{"version":3,"file":"6471.84bf2911753e8360.js","mappings":"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","names":["i0","item_r1","value","text","ctx_r1","hint","errorMessage","FormSelectComponent","_FormSelectComponent","BaseFormComponent","constructor","translate","super","this","interface","disabled","interfaceOptions","side","cssClass","i1","selectors","inputs","items","placeholder","standalone","features","decls","vars","consts","template","rf","ctx","isReadyForValidation","$event","updateProp","detail","FormSelectComponent_ion_select_option_2_Template","FormSelectComponent_span_3_Template","label","control","FormItemComponent","NgFor","NgIf","IonSelect","IonSelectOption","styles","ImageFallbackDirective","_ImageFallbackDirective","fallback","DEFAULT_USER_AVATAR","onError","src","className","load","checkUrlExists","url","Promise","resolve","reject","xhr","XMLHttpRequest","open","onreadystatechange","readyState","HEADERS_RECEIVED","status","abort","onerror","e","send","hostVars","hostBindings","SelectInputOnClickDirective","_SelectInputOnClickDirective","el","selectAll","nativeEl","nativeElement","querySelector","setSelectionRange","length","select","error","console","log","DurationRenderPipe","_DurationRenderPipe","transform","args","str","times","split","len","i","isNaN","parseInt","shift","map","time","d","slice","padZero","join","pure","SentenceCasePipe","_SentenceCasePipe","substring","toUpperCase","posterUrl_r2","_r1","$implicit","ctx_r2","selectPoster","currentPoster","PosterImageSelectorComponent","_PosterImageSelectorComponent","modalCtrl","getPosters","posters","indexOf","Set","posterUrl","dismiss","selected","PosterImageSelectorComponent_ion_col_7_Template","IonHeader","IonToolbar","IonTitle","IonContent","IonGrid","IonRow","IonCol","ctx_r0","heading","TaggerInputComponent","_TaggerInputComponent","placeholderType","val","_placeholderType","initialPlaceholder","autocompleteItems","tagSelected","EventEmitter","tagRemoved","tagAdded","appendToBody","onTagSelected","item","emit","onTagRemoved","onTagAdded","ngOnInit","ALL_TAGS","some","push","id","outputs","TaggerInputComponent_ion_label_0_Template","IonLabel","errorMsg","_r3","stack_r4","ngIf","openPosterSelector","stackForm","get","clips","_r5","allTagItems","StackFormDetails_ng_container_0_p_42_ion_spinner_1_Template","isSaving","dteSaved","StackFormDetails_ng_container_0_h3_5_Template","StackFormDetails_ng_container_0_div_6_Template","publishStack","StackFormDetails_ng_container_0_div_8_Template","onPropChanged","StackFormDetails_ng_container_0_fs_form_item_29_Template","StackFormDetails_ng_container_0_p_31_Template","StackFormDetails_ng_container_0_h3_32_Template","StackFormDetails_ng_container_0_p_33_Template","cancel","StackFormDetails_ng_container_0_ion_spinner_38_Template","StackFormDetails_ng_container_0_span_39_Template","StackFormDetails_ng_container_0_span_40_Template","StackFormDetails_ng_container_0_p_42_Template","hasClipsTranscoding","hasClips","title","projectOptions","stackId","_c1","_c0","enableTags","isCollaborative","dtePublished","valid","isPublishing","StackFormDetails","_StackFormDetails","store","userService","projectService","clipService","formBuilder","mystackService","save","isFormSaving","publish","group","poster","STACK_DEFAULT_POSTER","Validators","compose","required","minLength","maxLength","description","privacy","STACK_PRIVACY","PUBLIC","projectId","array","tags","myProjects$","selectMyProjects","stack$","selectMyStack","userId$","isLoggedIn$","onDestroy$","Subject","pipe","takeUntil","subscribe","stack","Array","isArray","setControl","clip","getDoneTranscoding","firstClipWithPoster","find","patchValue","getProjectsFromStoreByIds","take","projects","ngOnDestroy","next","complete","getFormValues","reduce","acc","showSaving","timeout","clearTimeout","_loadingTimeout","setTimeout","then","selectedPoster","event","_this","_asyncToGenerator","Utils","tryStopPropagation","getPoster","filter","index","modal","create","component","componentProps","present","data","onWillDismiss","updatePoster","stackTags","removeFromArray","addToArrayUnique","toLowerCase","key","updateTitle","updateDescription","Object","values","includes","updatePrivacy","warn","saveStack","instant","i2","i3","i4","i5","i6","i7","i8","StackFormDetails_ng_container_0_Template","FormsModule","ReactiveFormsModule","IonFabButton","IonIcon","FormInputComponent","FormTextareaComponent","FormRadioComponent","IonButton","IonSpinner","AsyncPipe","DatePipe","TranslatePipe","FormControlCastPipe","message","PublishModalComponent_div_2_ng_container_1_ng_container_1_div_1_Template","PublishModalComponent_div_2_ng_container_1_ng_container_1_div_2_Template","confirmPublishStack","stack_r3","closeModal","PublishModalComponent_div_2_ng_container_1_ng_container_1_Template","isProjAdmin","userId","notMine_r4","PublishModalComponent_div_2_ng_container_1_Template","PublishModalComponent_div_2_ng_template_3_Template","PublishModalComponent","_PublishModalComponent","publishService","alertCtrl","router","Boolean","tap","action","stackDetails","_ref","mystack","header","buttons","role","handler","_x","apply","arguments","_this2","combineLatest","username$","_ref2","username","credits","createdStack","resetMyStack","_x2","dismissAction","_this3","_ref3","saveStackUpdates","_x3","viewQuery","BaseModalComponent","PublishModalComponent_div_2_Template","PublishModalComponent_ng_template_4_Template","notLoggedIn_r5","LoginFormComponent","PageTitleComponent","_PageTitleComponent","ngContentSelectors","PublishSuccessModalComponent_div_2_ng_container_27_ion_spinner_3_Template","optimizingStack","share","shareToOptions","FACEBOOK","TWITTER","LINKEDIN","CLIPBOARD","watchStack","PublishSuccessModalComponent_div_2_ng_container_27_Template","PublishSuccessModalComponent_div_2_ng_template_28_Template","newStack","shareItem","shareUrl","readyToWatch_r3","PublishSuccessModalComponent","_PublishSuccessModalComponent","socialSharingService","SHARING_METHOD","type","ITEM_TYPE","Stacks","selectStackEntities","entities","getStackId","entity","hlsSrc","shareTo","result","catch","socialSharingServiceProvider","PublishSuccessModalComponent_div_2_Template","PublishSuccessModalComponent_ng_template_3_Template","noItem_r4","ListTitleComponent","IonItem","IonInput","CollapseDirective","_CollapseDirective","appCollapse","isExpanded","measureHeight","toggle","speed","isCollapsed","isCollapse","isCollapsing","h","elem","scrollHeight","hide","show","height","_r2","onClickFavorite","ClipDetailActionsComponent_ion_toolbar_0_ion_button_2_ion_icon_2_Template","ClipDetailActionsComponent_ion_toolbar_0_ion_button_2_ion_icon_3_Template","isFavorite","_r4","onClickAddToStack","onClickWatchLater","_r6","onClickShare","_r8","onClickEdit","_r9","onClickTrim","_r10","onClickDelete","ClipDetailActionsComponent_ion_toolbar_0_ng_container_10_ion_button_1_Template","ClipDetailActionsComponent_ion_toolbar_0_ng_container_10_ion_button_2_Template","ClipDetailActionsComponent_ion_toolbar_0_ng_container_10_ion_button_3_Template","_r7","onClickMoveTop","onClickMoveBottom","canEdit","showTrim","canRemove","playlistLength","_r11","onClickAdminHls","_r12","ClipDetailActionsComponent_ion_toolbar_0_div_1_Template","ClipDetailActionsComponent_ion_toolbar_0_ion_button_2_Template","ClipDetailActionsComponent_ion_toolbar_0_ion_fab_button_3_Template","ClipDetailActionsComponent_ion_toolbar_0_ion_button_4_Template","ClipDetailActionsComponent_ion_toolbar_0_ion_button_5_Template","onClickFlag","ClipDetailActionsComponent_ion_toolbar_0_ion_icon_8_Template","ClipDetailActionsComponent_ion_toolbar_0_ion_icon_9_Template","ClipDetailActionsComponent_ion_toolbar_0_ng_container_10_Template","ClipDetailActionsComponent_ion_toolbar_0_ion_button_11_Template","ClipDetailActionsComponent_ion_toolbar_0_ion_fab_button_12_Template","currentPage","showFavorite","showAddToStack","showWatchLater","showShare","isFlagged","adminHls","ClipDetailActionsComponent","_ClipDetailActionsComponent","configService","events","toaster","videoService","moveTop","moveBottom","deleteClip","trimClip","editClip","closed","ENABLE_FEATURE_WATCH_LATER","ENABLE_CLIP_SHARE","ENABLE_FEATURE_TRIM_CLIPS","appConfig","config","allowSharing","confirmSendClipForHLSTranscode","ModalReportComponent","reportedItem","addClipsToMyStack","onClickClose","ClipDetailActionsComponent_ion_toolbar_0_Template","close","isAdmin","segment","onSegmentClick","playClip","clipDesc","name_r6","openProject","projectTitle$","ClipDetailComponent_div_3_div_1_div_1_Template","ClipDetailComponent_div_3_div_1_div_2_Template","ClipDetailComponent_div_3_div_1_h3_8_Template","ClipDetailComponent_div_3_div_1_div_20_Template","isPopover","userAvatarUrl","clipOwner$","avatarFallback","views","votes","numStacks","language","transcript","ClipDetailComponent_div_3_div_1_Template","ClipDetailComponent_div_3_div_2_Template","tag_r9","ClipDetailComponent_div_4_ion_chip_2_Template","PAGE","ClipDetailComponent","_ClipDetailComponent","memberService","modalController","navCtrl","showSegmentBar","emotions","isCollapsedDetails","getClipEmotions","getClipTax","getPublicUsername","getUserAvatar","getDescription","getProjectPreview","p","proj","getProjectNameFromId","projId","dashedToTitleCase","getClipEmotionsString","getClipTaxArray","projUrl","stopPropagation","navigateForward","PROJECT_DETAIL_ROUTE","openChannel","channelUrl","openPage","name","params","ClipDetailComponent_ion_fab_0_Template","ClipDetailComponent_app_clip_detail_actions_1_Template","ClipDetailComponent_div_2_Template","ClipDetailComponent_div_3_Template","ClipDetailComponent_div_4_Template","ClipDetailComponent_ng_template_5_Template","noClip_r10","NgSwitch","NgClass","NgSwitchCase","NgStyle","IonFab","IonSegmentButton","IonAvatar","IonChip","tooLong","duration","onClickPlay","onClickPause","MyStackItemComponent_div_13_ion_icon_2_Template","dateFilmed","name_r4","toggleDetails","onMoveTop","onMoveBottom","onDeleteClip","onTrimClip","onEditClip","isMyClip","isMyStack","MyStackItemComponent","_MyStackItemComponent","displayIndex","isPreviewOpen","isVideoPlaying","playClipIndex","pauseClipIndex","deleteClipIndex","DEFAULT_POSTER","bDisplayIndex","subManager","Subscription","onCloseCollapse","filmingDate","created","getFilmingDate","convertDurationToSeconds","MAX_VIDEO_CAPTURE_LENGTH_SECONDS","subCloseDeets","add","unsubscribe","onClickItem","toggleCollapse","closeSlider","slidingItem","currentIndex","onSwipeDelete","delete","ClipperComponent","selectedSegment","ClipperSegments","Trim","isModal","Settings","hasSurpassedSlidingThreshold","getOpenAmount","openAmount","slidingRation","getSlidingRatio","MyStackItemComponent_div_3_Template","MyStackItemComponent_div_4_Template","MyStackItemComponent_div_5_Template","MyStackItemComponent_ion_button_7_Template","MyStackItemComponent_ion_button_8_Template","MyStackItemComponent_div_13_Template","MyStackItemComponent_div_14_Template","MyStackItemComponent_ion_label_20_Template","MyStackItemComponent_ion_button_22_Template","MyStackItemComponent_ion_button_23_Template","MyStackItemComponent_app_clip_detail_32_Template","IonReorder","IonThumbnail","IonItemOptions","IonItemOption","checkTranscodeComplete","transcodingCheckClicked","MyStackCaptureItemComponent","_MyStackCaptureItemComponent","stackEditPage","sentryService","progressType","progressValue","progressBuffer","loadingStatus","posterText","transcodingCheckTimedout","progressBarColor","ngOnChanges","changes","currentValue","hlsMeta","tryParseJSON","msg","objToString","captureError","window","location","reload","percentComplete","currentStatus","titleCase","hls","firstChange","confirmDelete","waitForTranscodeComplete","waitForClipTranscoded","res","source","uploading","updateClipStore","err","info","MyStackCaptureItemComponent_div_3_Template","MyStackCaptureItemComponent_div_4_Template","MyStackCaptureItemComponent_div_13_Template","MyStackCaptureItemComponent_ion_button_17_Template","IonProgressBar","addClips","MyStackComponent_ng_template_0_div_5_ion_icon_8_Template","MyStackComponent_ng_template_0_span_2_Template","MyStackComponent_ng_template_0_div_5_Template","MyStackComponent_ng_template_0_ng_template_6_Template","isMine","canCollaborate","openInvite","noEdit_r4","onPlayClipIndex","onPauseClipIndex","deleteClipByIndex","clip_r7","i_r8","slidingItem_r9","MyStackComponent_ion_item_sliding_3_app_my_stack_item_2_Template","MyStackComponent_ion_item_sliding_3_ng_template_3_Template","sources","uploadingItem_r11","updatedBy","MyStackComponent_div_4_div_1_b_4_Template","MyStackComponent_div_4_div_1_i_5_Template","MyStackComponent_div_4_div_1_b_6_Template","sortByTitle","_r13","clearStack","_r14","MyStackComponent_div_4_ion_button_6_ion_icon_3_Template","watchRoute","_r16","acceptInvite","MyStackComponent_div_4_ng_template_7_div_0_Template","MyStackComponent_div_4_ng_template_7_div_1_Template","_r15","reStack","MyStackComponent_div_4_div_1_Template","MyStackComponent_div_4_ion_button_3_Template","MyStackComponent_div_4_ion_button_4_Template","MyStackComponent_div_4_ion_button_6_Template","MyStackComponent_div_4_ng_template_7_Template","startNewStack_r17","collabShareUrl","_r18","showingQr","MyStackComponent_div_5_div_1_div_5_span_7_Template","MyStackComponent_div_5_div_1_div_5_span_8_Template","MyStackComponent_div_5_div_1_div_5_ion_icon_11_Template","MyStackComponent_div_5_div_1_div_5_ion_icon_12_Template","MyStackComponent_div_5_div_1_div_5_app_qr_code_13_Template","copyLink","removeCrew","MyStackComponent_div_5_div_1_div_5_Template","_r19","inviteCrew","MyStackComponent_div_5_ng_template_2_div_0_Template","_r20","continuePublish","MyStackComponent_div_5_div_1_Template","MyStackComponent_div_5_ng_template_2_Template","MyStackComponent_div_5_ion_button_5_Template","mineNotCollab_r21","MyStackComponent","_MyStackComponent","_clips","_currentIndex","scrollToItem","stackService","disableReorder","playerId","closePreviewPlayer","href","WATCH_ROUTE","translatePath","TRANSLATE_ROOT","userIsGlobalAdmin$","calcCollabShareUrl","stackShareUrl","arrayMove","fromIndex","toIndex","reorderClips","removeClipByIndex","sortDate","confirmClearStack","clearAllClips","trackByStackItem","obj","Math","floor","random","doReorder","ev","from","to","toggleReorderGroup","reorderGroup","CollabModalComponent","removeCollaborative","i9","i10","IonReorderGroup","MyStackComponent_ng_template_0_Template","MyStackComponent_ion_item_sliding_3_Template","MyStackComponent_div_4_Template","MyStackComponent_div_5_Template","noClips_r22","RouterLink","ButtonComponent","QrCodeComponent","IonItemSliding","StackEditPage_ng_container_1_div_5_ng_template_2_div_1_ng_container_1_Template","StackEditPage_ng_container_1_div_5_ng_template_2_div_1_ng_template_2_Template","notMineCollabDescText_r4","StackEditPage_ng_container_1_div_5_ng_template_2_ng_template_2_div_0_div_1_Template","StackEditPage_ng_container_1_div_5_ng_template_2_ng_template_2_div_0_ng_template_2_Template","hasStackClips","notCollabNoClipsText_r5","StackEditPage_ng_container_1_div_5_ng_template_2_ng_template_2_div_0_Template","StackEditPage_ng_container_1_div_5_ng_template_2_ng_template_2_div_1_Template","StackEditPage_ng_container_1_div_5_ng_template_2_div_1_Template","StackEditPage_ng_container_1_div_5_ng_template_2_ng_template_2_Template","notCollabDescText_r6","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ion_button_1_ion_spinner_1_Template","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ion_button_1_ion_icon_2_Template","_c2","newDraft","captureDevice","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ng_template_2_ion_button_0_Template","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ng_template_2_ion_button_1_Template","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ng_template_2_ion_button_2_Template","isPublished","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ng_template_4_ion_button_0_Template","actionClick","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ion_button_6_ion_spinner_1_Template","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ion_button_1_Template","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ng_template_2_Template","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ng_template_4_Template","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_ion_button_6_Template","startNewStack_r12","notMineContinueButton_r13","StackEditPage_ng_container_1_div_5_ng_container_4_ng_container_1_Template","StackEditPage_ng_container_1_div_5_div_1_Template","StackEditPage_ng_container_1_div_5_ng_template_2_Template","StackEditPage_ng_container_1_div_5_ng_container_4_Template","StackEditPage_ng_container_1_div_5_ng_template_5_Template","defaultDesctext_r14","noStackBtn_r15","closePreview","draftDrawerExpanded","StackEditPage_ng_container_1_div_5_Template","StackEditPage_ng_container_1_div_6_Template","returnUrl","drawerOpenOnLoad","topDrawerExpand$","topDrawerClose$","_r17","onPlayerHeight","onPlayerEnded","onPlaylistDone","stack_r18","currentPlaylistIndex$","StackEditPage_section_3_div_1_Template","restack","captureSuccess","stack_r20","captureClipEvent","StackEditPage_ng_container_8_div_1_Template","StackEditPage_ng_container_8_ng_template_2_Template","noStackId_r21","StackEditPage_div_12_p_1_Template","StackEditPage_div_12_ng_template_3_Template","_r22","routeDiscover","notAuthedDiscoverText_r23","projectUrl","_r25","_r26","captureYoutube","_r27","_r28","StackEditPage_ion_fab_16_ng_container_12_ion_chip_1_Template","StackEditPage_ion_fab_16_ng_container_12_ng_template_2_Template","notCollaborative_r29","_r30","StackEditPage_ion_fab_16_ion_chip_5_Template","_r24","StackEditPage_ion_fab_16_ion_chip_11_Template","StackEditPage_ion_fab_16_ng_container_12_Template","StackEditPage_ion_fab_16_ion_chip_13_Template","tmp_4_0","showYoutubeFab","STACK_EDIT_PLAYER_ID","StackEditPage","_StackEditPage","videoPlayerService","publishStackService","route","changeDetectorRef","hasStackClipsTranscoding","hasMyClips","isStackLoading","hasStackClipTooLong","selectMyStackCurrentIndex","currentClip$","selectMyStackCurrentClip","isTabFabShown","BehaviorSubject","inviteProjectEventActive","_incExpandEvent","_incCloseEvent","onOrientationChange","orient","timeoutAutoCapture","dispatch","stackActions","queryParamMap","queryParams","checkCurrentNavForAutoCapture","_c","_b","_a","getCurrentNavigation","extras","state","autoOpenCapture","environment","production","NavigationEnd","startsWith","_d","distinctUntilChanged","a","b","selectIdEdit","idEdit","getId","isEditRoute","ROOT_EDIT_URL","mystackActions","navigateNoAnimation","getProject","project","isEventActive","clipDoneTranscoding","myProjects","checkIsAdmin","ionViewWillLeave","tabFab","pause","detectChanges","ionViewWillEnter","interval","s","w","expandDraftDrawer","clipIds","opentabFab","onDidDismiss","navigateRoot","animated","openPublishSuccessModal","showCreateForm","closeDraftDrawer","activated","path","play","currentPlaylistIndex","addAllClipsToStack","playlist","isCreateNew","_this4","presentCaptureModal","_this5","CaptureClipModalComponent","filesUploaded","file","removeFileExt","filename","uploadTags","sortUserUploadSuccessByTitle","isCaptureAllowed$","isAllowed","exists","triggerCapture","openPlansModal","addMember","member","isActive","PROJECT_MEMBER_ROLE","CREW","handleActiveEvent","routeStudio","STUDIO_PAGE","DISCOVER_PAGE","routeProject","triggerTimeout","_this6","PlansModalComponent","i11","StackEditPage_ng_container_1_Template","StackEditPage_section_3_Template","StackEditPage_ng_container_8_Template","StackEditPage_ng_template_10_Template","StackEditPage_div_12_Template","StackEditPage_div_13_Template","StackEditPage_ion_fab_16_Template","noStack_r31","TopNavbarComponent","VideoPlayerComponent","CaptureClipButtonComponent","TabFabContainerComponent","IonFabList"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/shared/components/ui/form/form-select/form-select.component.html","./src/app/shared/components/ui/form/form-select/form-select.component.ts","./src/app/shared/directives/image-fallback.directive.ts","./src/app/shared/directives/select-input-on-click.directive.ts","./src/app/shared/pipes/duration-render.pipe.ts","./src/app/shared/pipes/sentence-case.pipe.ts","./src/app/stacks/poster-image-selector/poster-image-selector.component.html","./src/app/stacks/poster-image-selector/poster-image-selector.component.ts","./src/app/modules/tagger-input/tagger-input.component.html","./src/app/modules/tagger-input/tagger-input.component.ts","./src/app/stacks/shared/components/form-details/stack-form-details.component.html","./src/app/stacks/shared/components/form-details/stack-form-details.component.ts","./src/app/stacks/shared/components/publish-modal/publish-modal.component.html","./src/app/stacks/shared/components/publish-modal/publish-modal.component.ts","./src/app/shared/components/ui/page-title/page-title.component.ts","./src/app/shared/components/ui/page-title/page-title.component.html","./src/app/stacks/shared/components/publish-success-modal/publish-success-modal.component.html","./src/app/stacks/shared/components/publish-success-modal/publish-success-modal.component.ts","./src/app/shared/directives/collapse.directive.ts","./src/app/shared/components/clip-detail/clip-detail-actions/clip-detail-actions.component.html","./src/app/shared/components/clip-detail/clip-detail-actions/clip-detail-actions.component.ts","./src/app/shared/components/clip-detail/clip-detail.component.html","./src/app/shared/components/clip-detail/clip-detail.component.ts","./src/app/modules/my-stack/my-stack-item/my-stack-item.component.html","./src/app/modules/my-stack/my-stack-item/my-stack-item.component.ts","./src/app/modules/my-stack/my-stack-capture-item/my-stack-capture-item.component.html","./src/app/modules/my-stack/my-stack-capture-item/my-stack-capture-item.component.ts","./src/app/modules/my-stack/my-stack.component.html","./src/app/modules/my-stack/my-stack.component.ts","./src/app/stacks/stack-edit/stack-edit.page.html","./src/app/stacks/stack-edit/stack-edit.page.ts"],"sourcesContent":["<fs-form-item [label]=\"label\" [errorMessage]=\"errorMessage\" class=\"fs-form-select\">\n  <ion-select\n    mode=\"md\"\n    [interfaceOptions]=\"interfaceOptions\"\n    [placeholder]=\"placeholder\"\n    [label]=\"label\"\n    [value]=\"control.value\"\n    [disabled]=\"disabled\"\n    [interface]=\"interface\"\n    (ionBlur)=\"isReadyForValidation = true\"\n    (ionChange)=\"isReadyForValidation = true; updateProp($any($event).detail.value)\"\n  >\n    <!-- \n      weirdly this is not working. haven't investigated why:\n      [style.border-color]=\"errorMessage ? 'var(--ion-color-danger)' : 'none'\"\n    -->\n    <ion-select-option *ngFor=\"let item of items\" [value]=\"item.value\">{{\n      item.text\n    }}</ion-select-option>\n  </ion-select>\n  <span class=\"fs-form-select__hint\" *ngIf=\"hint || errorMessage\" [innerHTML]=\"hint + ' ' + (errorMessage ? errorMessage : '')\"></span>\n</fs-form-item>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgFor, NgIf } from '@angular/common';\nimport { IonSelect, IonSelectOption } from '@ionic/angular/standalone';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BaseFormComponent } from '../base-form.component';\nimport { FormItemComponent } from '../form-item/form-item.component';\n\n@Component({\n  selector: 'fs-form-select',\n  templateUrl: './form-select.component.html',\n  styleUrls: ['./form-select.component.scss'],\n  standalone: true,\n  imports: [FormItemComponent, NgFor, NgIf, IonSelect, IonSelectOption],\n})\nexport class FormSelectComponent extends BaseFormComponent {\n  @Input() items: { text: string; value: string | number | boolean }[];\n  @Input() interface = 'popover';\n  @Input() placeholder: string;\n  @Input() hint: string = '';\n  @Input() disabled: boolean = false;\n  @Input() interfaceOptions = {\n    side: 'top',\n    cssClass: 'form-select',\n  };\n\n  constructor(translate: TranslateService) {\n    super(translate);\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 { Directive, ElementRef, HostListener } from '@angular/core';\n\n/**\n * Based on https://forum.ionicframework.com/t/ion-input-select-all-text-on-focus/79406/2\n */\n@Directive({\n  // eslint-disable-next-line @angular-eslint/directive-selector\n  selector: 'ion-searchbar[selectAllOnClick], ion-input[selectAllOnClick]',\n  standalone: true,\n})\nexport class SelectInputOnClickDirective {\n  constructor(private el: ElementRef) {}\n\n  @HostListener('click')\n  selectAll() {\n    try {\n      // access to the native input element\n      const nativeEl: HTMLInputElement = this.el.nativeElement.querySelector('input');\n\n      if (nativeEl) {\n        if (nativeEl.setSelectionRange) {\n          // select the text from start to end\n          return nativeEl.setSelectionRange(0, nativeEl.value.length);\n        }\n        nativeEl.select();\n      }\n    } catch (error) {\n      console.log(`Caught error in SelectInputOnClickDirective.selectAll`, error);\n    }\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-header>\n  <ion-toolbar color=\"dark\">\n    <ion-title>Select Stack Poster Image</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <ion-grid>\n    <ion-row>\n      <ion-col size=\"6\" *ngFor=\"let posterUrl of getPosters()\">\n        <div\n          class=\"poster\"\n          [class.poster--selected]=\"posterUrl === currentPoster\"\n          (click)=\"selectPoster(posterUrl)\"\n        >\n          <img [src]=\"posterUrl\" />\n        </div>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n</ion-content>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgFor } from '@angular/common';\nimport {\n  ModalController,\n  IonHeader,\n  IonToolbar,\n  IonTitle,\n  IonContent,\n  IonGrid,\n  IonRow,\n  IonCol,\n} from '@ionic/angular/standalone';\n\n@Component({\n  selector: 'app-poster-image-selector',\n  templateUrl: './poster-image-selector.component.html',\n  styleUrls: ['./poster-image-selector.component.scss'],\n  standalone: true,\n  imports: [NgFor, IonHeader, IonToolbar, IonTitle, IonContent, IonGrid, IonRow, IonCol],\n})\nexport class PosterImageSelectorComponent {\n  @Input() posters: string[];\n  @Input() currentPoster: string;\n\n  constructor(private modalCtrl: ModalController) {}\n\n  /**\n   * to display the uploaded poster as well.\n   * @note: uploaded posters aren't displayed anymore if they aren't selected the next time.\n   */\n  getPosters() {\n    return this.currentPoster && this.posters.indexOf(this.currentPoster) !== -1\n      ? [...new Set([this.currentPoster, ...this.posters])]\n      : this.posters;\n  }\n\n  selectPoster(posterUrl: string) {\n    this.modalCtrl.dismiss({\n      selected: posterUrl,\n    });\n  }\n}\n","\n<ion-label *ngIf=\"heading\" class=\"tag-heading\">{{heading}}</ion-label>\n<!-- https://github.com/Gbuomprisco/ngx-chips -->\n<!-- events:\n  (onBlur)=\"onInputBlurred($event)\"\n  (onFocus)=\"onInputFocused($event)\"\n  (onTextChange)=\"onTagTextChange($event)\"\n  [editable]='true' (onTagEdited)=\"onTagEdited($event)\"\n  -->\n<!-- <tag-input \n    [inputId]=\"id\"\n    [modelAsStrings]=\"true\"\n    [inputClass]=\"'tagger-input'\"\n    [(ngModel)]='items'\n    (onSelect)=\"onTagSelected($event)\"\n    (onRemove)=\"onTagRemoved($event)\"\n    (onAdd)=\"onTagAdded($event)\"\n    [placeholder]=\"placeholder\"\n    [secondaryPlaceholder]=\"initialPlaceholder\"\n    theme='dark' \n    [addOnBlur]='true'\n    [addOnPaste]='false'\n    [separatorKeys]=\"[',',';']\"\n  > -->\n  <!-- TODO custom theme: https://github.com/gbuomprisco/ngx-chips/blob/master/docs/custom-themes.md -->\n  <!-- <tag-input-dropdown [autocompleteItems]=\"autocompleteItems\" [appendToBody]=\"appendToBody\">\n  </tag-input-dropdown>\n</tag-input> -->\n\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\n// had to import these for ngx-chips, per: https://github.com/Gbuomprisco/ngx-chips/issues/607\nimport { ALL_TAGS } from './tags';\nimport { NgIf } from '@angular/common';\nimport { IonLabel } from '@ionic/angular/standalone';\n\nconst DEBUG_LOGS = false;\nconst PAGE = \"[TaggerInput]\";\n\n@Component({\n    selector: 'app-tagger-input',\n    templateUrl: './tagger-input.component.html',\n    styleUrls: ['./tagger-input.component.scss'],\n    standalone: true,\n    imports: [NgIf, IonLabel],\n})\nexport class TaggerInputComponent implements OnInit {\n\n  @Input() id: string;\n  @Input() heading: string;\n  @Input() \n  set placeholderType(val) {\n    // console.log(`set placeholderType`, val)\n    if (val) {\n      this._placeholderType = val;\n      this.placeholder = `+ ${val} (then &crarr; or ,)`;\n      this.initialPlaceholder = `Add ${val}s (then &crarr; or ,)`;\n    }\n  }\n  get placeholderType(): string {\n    return this._placeholderType || 'Tag'; \n  }\n  \n  @Input() placeholder: string = `+ ${this.placeholderType} (Enter,tab,comma)`;\n  /**\n   * String that sets the placeholder of the input for entering new terms when there are 0 items entered.\n   */\n  @Input() initialPlaceholder: string = `Add ${this.placeholderType}s (Enter, tab, comma)`;\n\n  @Input() items: string[] = [];// https://github.com/Gbuomprisco/ngx-chips#using-an-array-of-objects\n  @Input() autocompleteItems: string[] = [];// https://github.com/Gbuomprisco/ngx-chips#using-an-array-of-objects\n\n  @Output() tagSelected = new EventEmitter<string>();\n  @Output() tagRemoved = new EventEmitter<string>();\n  @Output() tagAdded = new EventEmitter<string>();\n\n  /**\n   * appendToBody\n   * If set to false, the dropdown will not be appended to the body, \n   * but will remain in its parent element. Useful when using the components inside popups or dropdowns. Defaults to true.\n   */\n  appendToBody: boolean = true; // @todo: is the flex center-xy causing issues here?\n\n  private _placeholderType: string = \"Tag\";\n  \n  constructor() {\n    DEBUG_LOGS && console.log(`${PAGE} init`);//id is undefined still...\n  }\n\n  // ngOnInit() {\n  //   console.log(`${PAGE} init id=${this.id}`);//input is avail here, not in construct\n  // }\n\n  // getTagsFromMultiTagItems() {\n  //   return this.multiTagItems.reduce((prev, curr) => {\n  //     return [...prev, curr.display];\n  //   }, []);\n  // }\n\n  onTagSelected(item) {\n    DEBUG_LOGS && console.log(`${PAGE} onTagSelected: %o`,item);\n    this.tagSelected.emit(item);\n  }\n\n  onTagRemoved(item) {\n      DEBUG_LOGS && console.log(`${PAGE} onTagRemoved: %o`,item);\n      this.tagRemoved.emit(item);\n  }\n\n  onTagAdded(item) {\n    DEBUG_LOGS && console.log(`${PAGE} onTagAdded: %o`,item);\n    this.tagAdded.emit(item.value);\n  }\n\n  ngOnInit() {\n    const allTags = ALL_TAGS;\n    // todo: check the timing here, does the input exist with project.tags at OnInit?\n    allTags.map(str => {\n      if (!this.autocompleteItems.some(e => e === str)) {\n        // dne\n        const pusher: string = str;\n        this.autocompleteItems.push(pusher);\n      }\n    });\n  }\n}\n\n","<!-- @format -->\n\n<ng-container *ngIf=\"stack$ | async as stack\">\n  <div class=\"stack-form__heading ion-padding-horizontal ion-margin-horizontal\">\n    <h1>\n      {{ 'EDITOR.PUBLISH_STACK' | translate }} \n      <!-- <span *ngIf=\"!stack.dtePublished\">{{ 'STACK.DRAFT' | translate }}</span> -->\n    </h1>\n    <h3 *ngIf=\"hasClipsTranscoding\"> {{ 'EDITOR.CLIPS_TRANSCODING' | translate }} </h3>\n  </div>\n\n  <div *ngIf=\"errorMsg\">\n    <div class=\"stack-form__error\">\n      <strong>Error:</strong> {{ errorMsg }}\n    </div>\n  </div>\n\n  <form \n    [formGroup]=\"stackForm\"\n    (ngSubmit)=\"publishStack()\"\n    class=\"update-stack-form\"\n  >\n    <div *ngIf=\"hasClips\"\n      class=\"stack-form__thumbnail\"\n      [style.background-image]=\"'url(' + stackForm.get('poster').value + ')'\"\n      (click)=\"openPosterSelector($event, stack)\"\n    >\n      <ion-fab-button\n        (click)=\"openPosterSelector($event, stack)\"\n        class=\"stack-form__thumbnail__button\"\n        title=\"Choose Stack Poster\"\n        [disabled]=\"!stack.clips || stack.clips.length < 1\"\n      >\n        <ion-icon name=\"images\"></ion-icon>\n      </ion-fab-button>\n    </div>\n\n    <!-- if (change) [debounce]=\"1000\" -->\n    <fs-form-input class=\"form-item\"\n      [placeholder]=\"'EDITOR.FORM.TITLE_PLACEHOLDER' | translate\"\n      [hint]=\"'EDITOR.FORM.TITLE_HINT' | translate\"\n      [control]=\"stackForm.get('title') | formControlCast\"\n      [initValue]=\"stack?.title\"\n      [debounce]=\"1000\"\n      (blur)=\"onPropChanged('title', $event)\" \n    ></fs-form-input>\n\n    <!-- if (change) [debounce]=\"1000\" -->\n    <fs-form-textarea class=\"form-item\"\n      [placeholder]=\"'EDITOR.FORM.DESC_PLACEHOLDER' | translate\"\n      [hint]=\"'EDITOR.FORM.DESC_HINT' | translate\"\n      [control]=\"stackForm.get('description') | formControlCast\"\n      \n      (blur)=\"onPropChanged('description', $event)\" \n    ></fs-form-textarea>\n\n    <!-- \n      Try using... but it can't change anyways!\n      <app-form-select-myprojects\n        (selected)=\"projectChanged($event)\"\n      >\n      </app-form-select-myprojects>\n      ...and remove all the code for myProjects!\n    -->\n    <fs-form-select\n      [label]=\"'EDITOR.FORM.PROJECT_LABEL' | translate\"\n      [placeholder]=\"'EDITOR.FORM.PROJECT_PLACEHOLDER' | translate\"\n      [items]=\"projectOptions\"\n      [control]=\"stackForm.get('projectId') | formControlCast\"\n      [disabled]=\"true\"\n      [hint]=\"stack.stackId ? ('EDITOR.FORM.PROJECT_HINT_CHANGE' | translate) : ''\"\n    ></fs-form-select>\n    <!-- \n      [initValue]=\"stack.projectId\" causing issue?\n      (change)=\"setProjectId($event)\" not changeable in curent usage \n    -->\n\n    <!--\n      TODO: MVP-1283\n        'PUBLIC': { \n          title: 'COMMON.PUBLIC' | translate,\n          description: 'EDITOR.FORM.PUBLIC_DESC' | translate\n        },\n        'UNLISTED': {\n          title: 'EDITOR.FORM.UNLISTED_LABEL' | translate,\n          description: 'EDITOR.FORM.UNLISTED_DESC' | translate\n        },\n        'PRIVATE': {\n          title: 'COMMON.PRIVATE' | translate,\n          description: 'EDITOR.FORM.PRIVATE_DESC' | translate\n        }\n    -->\n    <fs-form-radio\n      [values]=\"{\n        'PUBLIC': { \n          title: 'COMMON.PUBLIC' | translate,\n          description: 'EDITOR.FORM.PUBLIC_DESC' | translate\n        },\n        'PRIVATE': {\n          title: 'COMMON.PRIVATE' | translate,\n          description: 'EDITOR.FORM.PRIVATE_DESC' | translate\n        }\n      }\"\n      [header]=\"'COMMON.PRIVACY' | translate\"\n      [control]=\"stackForm.get('privacy') | formControlCast\"\n      (change)=\"onPropChanged('privacy', $event)\" \n    ></fs-form-radio>\n\n    <fs-form-item *ngIf=\"enableTags\" [label]=\"'COMMON.ADD_TAGS' | translate\">\n      <app-tagger-input\n        [id]=\"'stack_form'\"\n        [items]=\"stackForm.get('tags').value\"\n        [autocompleteItems]=\"allTagItems\"\n        (tagRemoved)=\"onTagRemoved($event)\"\n        (tagAdded)=\"onTagAdded($event)\"\n      ></app-tagger-input>\n    </fs-form-item>\n\n    <div class=\"ion-text-center ion-margin-top ion-padding-top\">\n      <p *ngIf=\"!stack.clips || stack.clips.length < 1\">{{ 'EDITOR.FORM.ADD_CLIPS' | translate }}</p>\n      <h3 *ngIf=\"hasClipsTranscoding\" class=\"ion-text-left ion-padding\"> {{ 'EDITOR.CLIPS_TRANSCODING_WAIT' | translate }} </h3>\n      \n      <p *ngIf=\"stack.isCollaborative && !stack.dtePublished\">{{ 'EDITOR.PUBLISH.COLLAB_NOTE' | translate }}</p>\n\n      <ion-button\n        [disabled]=\"!stackForm.valid\"\n        size=\"large\"\n        fill=\"outline\"\n        class=\"ion-padding-horizontal ion-margin-top\"\n        (click)=\"cancel.emit()\"\n      >\n        {{ 'EDITOR.BACK_TO_EDIT' | translate }}\n        <!-- &nbsp;<span *ngIf=\"stack.dtePublished\">{{ 'COMMON.STACK' | translate }} </span>\n        <span *ngIf=\"!stack.dtePublished\">{{ 'STACK.DRAFT' | translate }} </span> -->\n      </ion-button>\n\n      <ion-button\n        type=\"submit\"\n        [disabled]=\"!stackForm.valid || isPublishing || hasClipsTranscoding\"\n        size=\"large\"\n        class=\"ion-padding-horizontal ion-margin-top\"\n      >\n        <ion-spinner *ngIf=\"isPublishing\" slot=\"start\" name=\"crescent\"></ion-spinner>\n        <span *ngIf=\"!stack.dtePublished\">{{ 'COMMON.PUBLISH_STACK' | translate }} </span>\n        <span *ngIf=\"stack.dtePublished\">{{ 'COMMON.REPUBLISH_STACK' | translate }} </span>\n        <ion-icon slot=\"end\" name=\"send-outline\"></ion-icon>\n      </ion-button>\n\n      <p *ngIf=\"stack.dteSaved\" class=\"ion-padding ion-margin-horizontal indicate-saved\">\n        <ion-spinner *ngIf=\"isSaving\" slot=\"start\" name=\"crescent\"></ion-spinner>\n        Last Saved: {{ stack.dteSaved | date:'medium' }}\n      </p>\n\n    </div>\n  </form>\n\n</ng-container>\n","/** @format */\n\nimport { Component, OnInit, OnDestroy, Output, EventEmitter, Input } from '@angular/core';\nimport { NgIf, AsyncPipe, DatePipe } from '@angular/common';\nimport { UntypedFormBuilder, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ModalController, IonFabButton, IonIcon, IonButton, IonSpinner } from '@ionic/angular/standalone';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { selectMyStack } from '@store/selectors/mystack.selectors';\nimport { selectMyProjects } from '@store/selectors/projects.selectors';\n\nimport { ClipsCoreService } from '@app/core/services/clips.service';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { FormControlCastPipe } from '@app/shared/pipes/form-control-cast.pipe';\nimport { getDoneTranscoding } from '@app/shared/models/clip.model';\nimport { Stack, STACK_PRIVACY, STACK_DEFAULT_POSTER } from '@app/shared/models/stack.model';\nimport { FormTextareaComponent } from '@app/shared/components/ui/form/form-textarea/form-textarea.component';\nimport { FormInputComponent } from '@app/shared/components/ui/form/form-input/form-input.component';\nimport { FormSelectComponent } from '@app/shared/components/ui/form/form-select/form-select.component';\nimport { FormRadioComponent } from '@app/shared/components/ui/form/form-radio/form-radio.component';\nimport { FormItemComponent } from '@app/shared/components/ui/form/form-item/form-item.component';\nimport { Utils } from '@app/shared/utils';\nimport { Project } from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { PosterImageSelectorComponent } from '@app/stacks/poster-image-selector/poster-image-selector.component';\nimport { ALL_TAGS } from '@app/modules/tagger-input/tags';\nimport { TaggerInputComponent } from '@app/modules/tagger-input/tagger-input.component';\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[StackFormDetails]';\n\n@Component({\n  selector: 'app-stack-form-details',\n  templateUrl: './stack-form-details.component.html',\n  styleUrls: ['./stack-form-details.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    FormsModule,\n    ReactiveFormsModule,\n    IonFabButton,\n    IonIcon,\n    FormInputComponent,\n    FormTextareaComponent,\n    FormSelectComponent,\n    FormRadioComponent,\n    FormItemComponent,\n    TaggerInputComponent,\n    IonButton,\n    IonSpinner,\n    AsyncPipe,\n    DatePipe,\n    TranslatePipe,\n    FormControlCastPipe,\n  ],\n})\nexport class StackFormDetails implements OnInit, OnDestroy {\n  @Input() isSaving = false;\n  @Input() isPublishing = false;\n\n  @Output() cancel = new EventEmitter<void>();\n  @Output() save = new EventEmitter<Partial<Stack>>();\n  @Output() isFormSaving = new EventEmitter<boolean>();\n  @Output() publish = new EventEmitter<Partial<Stack>>();\n\n  /** @todo reenable tags with refactor */\n  enableTags = false;\n  allTagItems = ALL_TAGS;\n  stackForm = this.formBuilder.group({\n    poster: [STACK_DEFAULT_POSTER],\n    title: ['', Validators.compose([Validators.required, Validators.minLength(3), Validators.maxLength(64)])],\n    description: ['', Validators.compose([Validators.maxLength(360)])],\n    // change from private<boolean> to privacy enum\n    // isPublic: [true],\n    privacy: [STACK_PRIVACY.PUBLIC],\n    projectId: ['', Validators.required],\n    clips: this.formBuilder.array([]),\n    tags: this.formBuilder.array([]),\n  });\n\n  projectOptions = [];\n  myProjects$ = this.store.select(selectMyProjects);\n  /** @todo this will change to be the stackById from store */\n  stack$ = this.store.select(selectMyStack);\n  stackId = '';\n\n  userId$ = this.userService.userId$;\n  isLoggedIn$ = this.userService.isLoggedIn$;\n\n  errorMsg = '';\n  hasClips = false;\n  hasClipsTranscoding = false;\n\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private store: Store<State>,\n    private modalCtrl: ModalController,\n    private userService: UserService,\n    private projectService: ProjectService,\n    private clipService: ClipsCoreService,\n    private formBuilder: UntypedFormBuilder,\n    private mystackService: MyStackService,\n    private translate: TranslateService\n  ) {}\n\n  ngOnInit() {\n    // we need to disable the stackForm.projectId, since we are not currently able to change that\n    // this.stackForm.get('projectId').disable();\n\n    /**\n     * watch mystack and update form when it's updated\n     * @see publish-stack.page\n     */\n    this.stack$.pipe(takeUntil(this.onDestroy$)).subscribe((stack: Stack) => {\n      if (!stack) return;\n\n      this.stackId = stack.stackId ? stack.stackId : '';\n\n      const clips = Array.isArray(stack.clips) ? stack.clips : [];\n      this.stackForm.setControl('clips', this.formBuilder.array(clips));\n      // check if there's transcoding clips\n      this.hasClipsTranscoding = clips.some((clip) => !getDoneTranscoding(clip));\n      this.hasClips = clips.some((clip) => getDoneTranscoding(clip));\n\n      let poster = STACK_DEFAULT_POSTER;\n      if (stack && stack.poster && stack.poster !== STACK_DEFAULT_POSTER) {\n        poster = stack.poster;\n      } else if (stack && (!stack.poster || stack.poster === STACK_DEFAULT_POSTER)) {\n        // get the first clip poster that is not the default, to pre-select the stack poster\n        const firstClipWithPoster = (Array.isArray(stack.clips) ? stack.clips : []).find(\n          (clip) => clip && clip.poster && clip.poster !== STACK_DEFAULT_POSTER\n        );\n        if (firstClipWithPoster) {\n          poster = firstClipWithPoster.poster;\n        }\n      }\n\n      // consider the collab drafts content\n      if (stack.isCollaborative && !stack.description) {\n        // MVP-1335 : do not set description to be collab-instructions - confusing, reverted\n        // this.translate.get('STACK.COLLAB_DEFAULT_STACK_DESC').pipe(take(1)).subscribe((res) => {\n        this.stackForm.patchValue({\n          title: stack.title,\n          privacy: stack.privacy,\n          poster,\n          // description: res\n        });\n        // });\n      } else if (stack.description) {\n        this.stackForm.patchValue({\n          title: stack.title,\n          privacy: stack.privacy,\n          // isPublic: !stack.private,\n          poster,\n          description: stack.description,\n        });\n      } else {\n        this.stackForm.patchValue({\n          title: stack.title,\n          privacy: stack.privacy,\n          // isPublic: !stack.private,\n          poster,\n        });\n      }\n\n      /**\n       * it appears to matter if we set projectId to an empty string, since that is not a valid option\n       * if we do, the set/patchValue in combineLatest, below, does not update the UI\n       */\n      if (stack.projectId) {\n        // build project options\n        this.projectService\n          .getProjectsFromStoreByIds([stack.projectId])\n          .pipe(take(1))\n          .subscribe((projects: Project[]) => {\n            this.projectOptions =\n              projects.length > 0 && projects[0].id\n                ? [\n                    {\n                      text: projects[0].title,\n                      value: projects[0].id,\n                    },\n                  ]\n                : [\n                    {\n                      text: 'Unknown Project?',\n                      value: -1,\n                    },\n                  ];\n\n            if (this.stackForm.get('projectId').value !== stack.projectId) {\n              this.stackForm.patchValue({\n                projectId: stack.projectId,\n              });\n            }\n          });\n      } else {\n        // console.warn(`Did not set up the project dropdown!`);\n        // this happens when the stack is published and reset...\n      }\n\n      /**\n       * get the tags currently in the formControl\n       * if there are none, add the ones from the stack\n       * @todo fix this is persisting the previous stack tags with new ones..\n       */\n      // const currentTags = this.stackForm.get('tags').value;\n      // if (!Array.isArray(currentTags) || currentTags.length < 1) {\n      //   const tags = this.formBuilder.array(this.getTagsArray(stack));\n      //   this.stackForm.setControl('tags', tags);\n      // }\n      if (Array.isArray(stack.tags) && stack.tags.length > 0) {\n        this.stackForm.patchValue({\n          tags: stack.tags,\n        });\n      } else if (!Array.isArray(this.stackForm.get('tags').value) || this.stackForm.get('tags').value.length > 0) {\n        // reset it\n        this.stackForm.patchValue({\n          tags: this.formBuilder.array([]),\n        });\n      }\n    });\n  }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  getFormValues() {\n    return {\n      stackId: this.stackId,\n      title: this.stackForm.get('title').value,\n      description: this.stackForm.get('description').value,\n      // isPublic: this.stackForm.get('isPublic').value,\n      privacy: this.stackForm.get('privacy').value,\n      projectId: this.stackForm.get('projectId').value,\n      /** clips needs updated when re-arranging */\n      clips: this.stackForm.get('clips').value,\n      poster: this.stackForm.get('poster').value,\n      tags: (this.stackForm.get('tags').value || []).reduce((acc, item) => {\n        acc.push(item.value);\n        return acc;\n      }, []),\n    };\n  }\n\n  // eslint-disable-next-line @typescript-eslint/member-ordering\n  private _loadingTimeout;\n  showSaving(timeout = 900) {\n    this.isSaving = true;\n    this.isFormSaving.emit(true);\n    clearTimeout(this._loadingTimeout);\n    this._loadingTimeout = setTimeout(() => {\n      // just making it show loading for a bit, since we only dispatched actions here\n      this.isSaving = false;\n      this.isFormSaving.emit(false);\n    }, timeout);\n  }\n\n  /**\n   * Form submit handler\n   */\n  publishStack() {\n    // check poster not set, prompt\n    const poster = this.stackForm.get('poster').value;\n    if (!poster || poster === STACK_DEFAULT_POSTER) {\n      this.stack$.pipe(take(1)).subscribe((stack) => {\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        this.openPosterSelector({}, stack).then((selectedPoster) => {\n          this.publish.emit(this.getFormValues());\n        });\n      });\n    } else {\n      this.publish.emit(this.getFormValues());\n    }\n  }\n\n  // resetMyStack() {\n  //   this.mystackService.resetMyStack();\n  //   this.stackForm.reset();\n  //   // reset stackForm will be done on mystackService.resetMyStack action in stack$.pipe\n  // }\n\n  async openPosterSelector(event, stack: Stack) {\n    Utils.tryStopPropagation(event);\n\n    if (!stack || !Array.isArray(stack.clips) || stack.clips.length < 1) {\n      return;\n    }\n    const posters = stack.clips\n      .map((clip) => this.clipService.getPoster(clip, 'high'))\n      .filter((clip, index, clips) => clips.indexOf(clip) === index);\n    const currentPoster = this.stackForm.get('poster').value;\n    const modal = await this.modalCtrl.create({\n      component: PosterImageSelectorComponent,\n      componentProps: {\n        posters,\n        currentPoster,\n      },\n    });\n\n    await modal.present();\n\n    const { data } = await modal.onWillDismiss();\n    if (data && data.selected) {\n      this.stackForm.patchValue({ poster: data.selected });\n      this.mystackService.updatePoster(data.selected); // update the poster to save it on refresh\n      return data.selected;\n    }\n    return '';\n  }\n\n  /**\n   * @todo update the mystack store on change\n   */\n  onTagRemoved(item: string) {\n    let stackTags = this.stackForm.get('tags').value;\n    stackTags = Utils.removeFromArray(stackTags, item);\n    this.stackForm.patchValue({ tags: stackTags });\n    DEBUG_LOGS && console.log(`${PAGE} onTagItemRemoved: %o`, item, stackTags);\n  }\n\n  /**\n   * @todo update the mystack store on change\n   */\n  onTagAdded(item: string) {\n    const stackTags = this.stackForm.get('tags').value;\n    Utils.addToArrayUnique(stackTags, item.toLowerCase());\n    DEBUG_LOGS && console.log(`${PAGE} onTagItemAdded: %o`, item, stackTags);\n  }\n\n  /**\n   * MVP-1082 Feature: updates on change, persist, with loading state for buttons\n   */\n  onPropChanged(key, value) {\n    this.stack$.pipe(take(1)).subscribe((stack) => {\n      switch (key) {\n        case 'title':\n          if (typeof value === 'string' && value !== stack[key]) {\n            DEBUG_LOGS && console.log(`onPropChanged`, { key, value });\n            this.showSaving();\n            this.mystackService.updateTitle(value);\n          }\n          break;\n        case 'description':\n          if (typeof value === 'string' && value !== stack[key]) {\n            DEBUG_LOGS && console.log(`onPropChanged`, { key, value });\n            this.showSaving();\n            this.mystackService.updateDescription(value);\n          }\n          break;\n        case 'privacy':\n          DEBUG_LOGS && console.log(`onPropChanged`, { key, value, stack, stackVal: stack[key] });\n          if (Object.values(STACK_PRIVACY).includes(value) && value !== stack[key]) {\n            this.showSaving();\n            this.mystackService.updatePrivacy(value);\n          }\n          break;\n        // case 'isPublic':\n        //   this.showSaving();\n        //   key = 'private';\n        //   // switching from isPublic to private..\n        //   if (typeof value === 'string') {\n        //     value = value === 'false';\n        //   } else {\n        //     value = !value;\n        //   }\n        //   if (typeof value === 'boolean' && value !== stack[key]) {\n        //     DEBUG_LOGS && console.warn(`IGNORING onPropChanged`, { key, value, stack, stackVal: stack[key] });\n        //     this.showSaving();\n        //     // this.mystackService.updatePrivacy(value);\n        //   }\n        //   break;\n        default:\n          console.warn(`unhandled propChange: '${key}'`);\n      }\n    });\n  }\n\n  /**\n   * @deprecated\n   * This should no longer be necessary, as the save is happening on form changes..\n   */\n  private saveStack() {\n    console.log(`saveStack`, { stackForm: this.stackForm });\n    if (!this.stackForm.valid) {\n      this.errorMsg = this.translate.instant('EDITOR.ERROR_FORM');\n      return;\n    }\n    this.errorMsg = '';\n    // this.showSaving(); // do this in parent\n    this.save.emit(this.getFormValues());\n  }\n}\n","<fs-base-modal title=\"\" #modal>\n  <div *ngIf=\"(isLoggedIn$ | async) === true; else notLoggedIn\" class=\"container reduced-top-margin\">\n    <!-- <h2 class=\"ion-padding-horizontal ion-margin-horizontal top-margin\">{{ 'COMMON.PUBLISH_STACK' | translate }}</h2> -->\n    <ng-container \n      *ngIf=\"stack$ | async as stack\">\n      <ng-container \n        *ngIf=\"isProjAdmin || (stack?.userId && (userId$ | async) === stack.userId); else notMine\">\n\n        <div *ngIf=\"isSaving || isFormSaving\" class=\"indicate-saving-top\">\n          <ion-spinner></ion-spinner>\n          {{ 'COMMON.SAVING' | translate }}\n        </div>\n\n        <div *ngIf=\"message\" class=\"error\">\n          {{ message }}\n        </div>\n\n        <app-stack-form-details \n          [isPublishing]=\"isPublishing\"\n          [isSaving]=\"isSaving\"\n          (isFormSaving)=\"isFormSaving = $event\"\n          (publish)=\"confirmPublishStack($event)\"\n          (cancel)=\"closeModal({ stack })\"\n        ></app-stack-form-details>\n        \n      </ng-container>\n    </ng-container>\n    <ng-template #notMine>\n      <p class=\"ion-text-center\">\n        {{ 'EDITOR.ERROR_NOT_YOURS' | translate }}\n      </p>\n    </ng-template>\n  </div>\n  \n  <ng-template #notLoggedIn>\n    <!-- LOGGED OUT -->\n    <div class=\"container top-margin\">\n      <h2 class=\"ion-padding-horizontal ion-margin-horizontal\">{{ 'AUTH.LOGIN_TO_CONTINUE' | translate }}</h2>\n      <fs-login-form></fs-login-form>\n      <!-- [routeOnSuccess]=\"returnUrl\" -->\n    </div>\n  </ng-template>\n\n</fs-base-modal>","/** @format */\n\nimport { Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { AlertController, ModalController, IonSpinner } from '@ionic/angular/standalone';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { combineLatest, Subject } from 'rxjs';\nimport { filter, take, tap } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { selectMyProjects } from '@store/selectors/projects.selectors';\nimport { selectMyStack } from '@store/selectors/mystack.selectors';\nimport { UserService } from '@app/core/services/user.service';\nimport { PublishStackService } from '@app/core/services/publish-stack.service';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { Stack, StackPublishInput } from '@app/shared/models/stack.model';\nimport { LoginFormComponent } from '@app/shared/components/login/login-form.component';\nimport { BaseModalComponent } from '@app/shared/components/ui/modal/base-modal.component';\nimport { StackFormDetails } from '@app/stacks/shared/components/form-details/stack-form-details.component';\n\nconst DEBUG_LOGS = false;\n\n@Component({\n  selector: 'app-publish-modal',\n  templateUrl: './publish-modal.component.html',\n  styleUrls: ['./publish-modal.component.scss'],\n  standalone: true,\n  imports: [NgIf, BaseModalComponent, StackFormDetails, LoginFormComponent, IonSpinner, AsyncPipe, TranslatePipe],\n})\nexport class PublishModalComponent implements OnInit, OnDestroy {\n  // todo: MVP-1204 handle admins being able to edit the info on a stack\n  @Input() isProjAdmin = false;\n\n  @ViewChild('modal', { static: false, read: BaseModalComponent })\n  modal: BaseModalComponent;\n\n  isLoggedIn$ = this.userService.isLoggedIn$;\n  userId$ = this.userService.userId$;\n\n  myProjects$ = this.store.select(selectMyProjects);\n\n  stack$ = this.store.select(selectMyStack).pipe(\n    filter(Boolean),\n    tap((stack: Stack) => {\n      DEBUG_LOGS && console.log(`PublishModal stack:`, stack);\n      // this.isStackLoading = false;\n      if (Array.isArray(stack.clips)) {\n        // check that the clips are done transcoding before publish\n        // ref: mystack.component.html clip?.sources?.length > 0; else uploadingItem\n        // const clipDoneTranscoding = stack.clips.filter(clip => getDoneTranscoding(clip));\n        // this.hasStackClips = clipDoneTranscoding.length > 0;\n        // this.hasStackClipsTranscoding = clipDoneTranscoding.length !== stack.clips.length;\n        // // this.hasStackClips = !!stack.clips.length;\n        // this.hasStackClipTooLong = stack.clips.some(\n        //   (clip) => Utils.convertDurationToSeconds(clip.duration) > MAX_VIDEO_CAPTURE_LENGTH_SECONDS\n        // );\n      }\n    })\n    // shareReplay(1) // do we need refCount()?\n  );\n\n  /** internal saving for form to be used only in template */\n  isFormSaving = false;\n  isSaving = false;\n  isPublishing = false;\n  message = '';\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private store: Store<State>,\n    private userService: UserService,\n    private publishService: PublishStackService,\n    private mystackService: MyStackService,\n    private alertCtrl: AlertController,\n    private modalCtrl: ModalController,\n    private router: Router,\n    private translate: TranslateService\n  ) {}\n\n  // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method\n  ngOnInit(): void {\n    // this.returnUrl = this.router.url;\n    // handled instead in template:\n    // *ngIf=\"isProjAdmin || (stack?.userId && (userId$ | async) === stack.userId); else notMine\">\n    // combineLatest([this.stack$, this.userId$])\n    //   .pipe(takeUntil(this.onDestroy$))\n    //   .subscribe(([stack, userId]) => {\n    //     if (stack.userId !== userId && this.isProjAdmin) {\n    //       // todo: MVP-1204 handle admins being able to edit the info on a stack\n    //       console.log(`Todo: Allow isProjAdmin Edits`);\n    //     }\n    //   });\n  }\n\n  closeModal({ action = 'cancel', stack = {} }) {\n    this.modal.dismiss({ action, stack });\n  }\n\n  async confirmPublishStack(stackDetails) {\n    this.stack$.pipe(take(1)).subscribe(async (mystack) => {\n      // the stack arg is only the modifications from stack-form-details, we also need the local stack\n      const stack: Partial<Stack> = {\n        ...mystack,\n        ...stackDetails,\n      };\n      // confirm this will be published for the project to see, are you sure?\n      const alert = await this.alertCtrl.create({\n        header: this.translate.instant('EDITOR.PUBLISH.CONFIRM'),\n        message: this.translate.instant('EDITOR.PUBLISH.CONFIRM_MSG'),\n        buttons: [\n          {\n            text: this.translate.instant('EDITOR.PUBLISH.BUTTON_CANCEL'),\n            role: 'cancel',\n            handler: () => {\n              this.saveStack(stack);\n            },\n          },\n          {\n            text: this.translate.instant('EDITOR.PUBLISH.BUTTON_WATCH'),\n            handler: () => {\n              try {\n                this.saveStack(stack, 'play');\n              } catch (error) {\n                console.error(error);\n                this.message = 'Oops! Save not successful.';\n              }\n            },\n          },\n          {\n            text: this.translate.instant('EDITOR.PUBLISH.BUTTON_PROCEED'),\n            handler: () => {\n              this.publishStack(stack);\n            },\n          },\n        ],\n      });\n      return await alert.present();\n    });\n  }\n\n  async publishStack(stack: Partial<Stack>) {\n    this.isPublishing = true;\n    try {\n      combineLatest([this.userId$, this.userService.username$])\n        .pipe(take(1))\n        .subscribe(async ([userId, username]) => {\n          if (!(stack?.clips?.length > 0)) {\n            // No playlist found - please add clips and try again\n            this.isPublishing = false;\n            this.message = this.translate.instant('ERRORS.NO_PLAYLIST_FOUND');\n            return;\n          }\n          // don't overwrite the creator at publish, but do update the credits if userId matches\n          if (stack.userId === userId) {\n            stack.credits = username;\n          }\n\n          if (stack.description === this.translate.instant('STACK.COLLAB_DEFAULT_STACK_DESC')) {\n            // the default content should not get published\n            stack.description = '';\n          }\n\n          const createdStack = await this.publishService.publishStack(stack as StackPublishInput);\n\n          // in all cases resetMyStack\n          this.mystackService.resetMyStack();\n\n          this.closeModal({ action: 'publish', stack: createdStack });\n          this.isPublishing = false;\n\n          // doing this in the parent..\n          // // now open the publish success modal\n          // this.openPublishSuccessModal(createdStack);\n        });\n    } catch (error) {\n      console.error(error);\n      this.message = this.translate.instant('ERRORS.GENERIC_OOPS');\n      this.isPublishing = false;\n    }\n  }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  /**\n   * stack-form-details is no longer emitting an event, so this is internal to the modal\n   */\n  private saveStack(stack: Partial<Stack>, dismissAction = 'save') {\n    console.log(`saveStack`, { stack });\n    this.isSaving = true;\n\n    try {\n      combineLatest([this.userId$, this.userService.username$])\n        .pipe(take(1))\n        .subscribe(async ([userId, username]) => {\n          stack.userId = userId;\n          stack.credits = username;\n\n          this.publishService.saveStackUpdates(stack); // dispatches actions\n\n          setTimeout(() => {\n            // just making it show loading for a bit, since we only dispatched actions here\n            this.isSaving = false;\n            this.closeModal({ action: dismissAction, stack });\n          }, 900);\n        });\n    } catch (error) {\n      console.error(error);\n      this.message = this.translate.instant('ERRORS.GENERIC_OOPS');\n      this.isSaving = false;\n    }\n  }\n}\n","/** @format */\n\nimport { Component } from '@angular/core';\n\n@Component({\n  selector: 'fs-page-title',\n  templateUrl: './page-title.component.html',\n  styleUrls: ['./page-title.component.scss'],\n  standalone: true,\n})\nexport class PageTitleComponent {}\n","<h1><ng-content></ng-content></h1>\n","<fs-base-modal [title]=\"''\" #modal>\n  <div *ngIf=\"shareItem else noItem\" class=\"container\">\n    \n    <div class=\"\">\n      <fs-list-title class=\"ion-text-uppercase\">{{ 'STACK.PUBLISHED' | translate }}</fs-list-title>\n      <fs-page-title>{{ 'STACK.CHECK_OUT_SHARE' | translate }}</fs-page-title>\n    </div>\n\n    <div class=\"share-buttons row ion-padding\">\n      <ion-button fill=\"outline\" shape=\"round\" color=\"light\" (click)=\"share(shareToOptions.FACEBOOK)\"\n        [title]=\"'SOCIAL.SHARE_FACEBOOK' | translate\">\n        <ion-icon slot=\"icon-only\" name=\"logo-facebook\"></ion-icon>\n      </ion-button>\n      <ion-button fill=\"outline\" shape=\"round\" color=\"light\" (click)=\"share(shareToOptions.TWITTER)\"\n        [title]=\"'SOCIAL.SHARE_TWITTER' | translate\">\n        <ion-icon slot=\"icon-only\" name=\"logo-twitter\"></ion-icon>\n      </ion-button>\n      <ion-button fill=\"outline\" shape=\"round\" color=\"light\" (click)=\"share(shareToOptions.LINKEDIN)\"\n        [title]=\"'SOCIAL.SHARE_LINKEDIN' | translate\">\n        <ion-icon slot=\"icon-only\" name=\"logo-linkedin\"></ion-icon>\n      </ion-button>\n    </div>\n\n    <div class=\"row\">\n      <!-- \n        todo: how to implement a named input and pass readonly attr to fs-input? (how to accomplish the below?)\n      -->\n      <!-- <fs-input #inputShareUrl label=\"Share URL\" [value]=\"[shareUrl]\"></fs-input> -->\n      <ion-item class=\"share-item\">\n        <ion-input #inputShareUrl readonly selectAllOnClick [value]=\"shareItem?.shareUrl\"></ion-input>\n        <ion-button shape=\"round\" (click)=\"share(shareToOptions.CLIPBOARD, $event)\"\n          [title]=\"'SOCIAL.COPY_TO_CLIPBOARD' | translate\">\n          <ion-icon name=\"link\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n      </ion-item>\n    </div>\n\n    <div class=\"action-buttons row ion-padding\">\n      <ion-button [disabled]=\"optimizingStack\" fill=\"outline\" color=\"light\" (click)=\"watchStack()\">\n        <!-- timeout here -->\n        <ng-container *ngIf=\"optimizingStack else readyToWatch\">\n          {{ 'STACK.OPTIMIZING_STACK' | translate }}\n          <ion-spinner *ngIf=\"optimizingStack\" slot=\"start\" name=\"crescent\"></ion-spinner>\n        </ng-container>\n        <ng-template #readyToWatch>\n          <ion-icon slot=\"start\" name=\"play\"></ion-icon>\n          {{ 'EDITOR.WATCH_STACK' | translate }}\n        </ng-template>\n      </ion-button>\n      \n      <ion-button fill=\"outline\" color=\"light\"  (click)=\"newStack()\">\n        <ion-icon slot=\"start\" name=\"refresh\"></ion-icon>\n        {{ 'EDITOR.CREATE_NEW_STACK' | translate }}\n      </ion-button>\n    </div>\n  </div>\n  <ng-template #noItem>\n    <p>\n      {{ 'ERRORS.MISSING_DATA' | translate }}\n    </p>\n  </ng-template>\n</fs-base-modal>\n","/** @format */\n\nimport { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { ModalController, IonButton, IonIcon, IonItem, IonInput, IonSpinner } from '@ionic/angular/standalone';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { filter, map, takeUntil } from 'rxjs/operators';\nimport { ShareableItem, SHARING_METHOD } from '@app/core/social-sharing/social-sharing.model';\nimport { SocialSharingService, socialSharingServiceProvider } from '@app/core/social-sharing/social-sharing.service';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { ListTitleComponent } from '@app/shared/components/ui/list-title/list-title.component';\nimport { PageTitleComponent } from '@app/shared/components/ui/page-title/page-title.component';\nimport { BaseModalComponent } from '@app/shared/components/ui/modal/base-modal.component';\n\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { getId as getStackId } from '@store/selectors/stacks.selectors';\nimport { selectStackEntities } from '@store/selectors/stacks.selectors';\n\nconst OPTIMIZING_TIMEOUT_BEFORE_WATCH = 9000;\n\n@Component({\n  selector: 'app-publish-success-modal',\n  templateUrl: './publish-success-modal.component.html',\n  styleUrls: ['./publish-success-modal.component.scss'],\n  providers: [socialSharingServiceProvider],\n  standalone: true,\n  imports: [\n    BaseModalComponent,\n    NgIf,\n    ListTitleComponent,\n    PageTitleComponent,\n    IonButton,\n    IonIcon,\n    IonItem,\n    IonInput,\n    IonSpinner,\n    TranslatePipe,\n  ],\n})\nexport class PublishSuccessModalComponent implements OnInit, OnDestroy {\n  @Input() stack: Stack;\n\n  optimizingStack = true;\n  shareItem: ShareableItem;\n  public shareToOptions = SHARING_METHOD;\n\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private store: Store<State>,\n    private socialSharingService: SocialSharingService,\n    private modalCtrl: ModalController\n  ) {}\n\n  ngOnInit(): void {\n    if (!this.stack || !this.stack.stackId) {\n      console.warn(`Missing stack info?`, this.stack);\n      return;\n    }\n    // console.log(this.stack);\n    this.shareItem = {\n      id: this.stack.stackId,\n      title: this.stack.title,\n      description: this.stack.description,\n      shareUrl: this.stack.shareUrl,\n      // tags: ['CreateTogether'],\n      type: ITEM_TYPE.Stacks,\n    };\n\n    /**\n     * @todo refactor this to watchById..\n     * watch for updates to hlsSrc\n     */\n    try {\n      this.store\n        .select(selectStackEntities)\n        .pipe(\n          takeUntil(this.onDestroy$),\n          filter(\n            (entities) =>\n              entities &&\n              entities[getStackId(this.stack.projectId, this.stack.stackId)] &&\n              entities[getStackId(this.stack.projectId, this.stack.stackId)].stackId.length > 0\n          ),\n          map((entities) => entities[getStackId(this.stack.projectId, this.stack.stackId)])\n        )\n        .subscribe((entity) => {\n          if (entity && entity.hlsSrc) {\n            this.optimizingStack = false;\n          }\n        });\n    } catch (error) {\n      console.error(`Caught Error:`, error);\n    }\n    // allow to watch if that didn't work..\n    setTimeout(() => {\n      this.optimizingStack = false;\n    }, OPTIMIZING_TIMEOUT_BEFORE_WATCH);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  share(shareTo: SHARING_METHOD, event?: MouseEvent) {\n    console.log({ shareTo, shareItem: this.shareItem });\n    this.socialSharingService\n      .shareTo(this.shareItem, shareTo)\n      .then((result) => {\n        console.log(result);\n      })\n      .catch((error) => {\n        console.error(error);\n      });\n  }\n\n  watchStack() {\n    this.dismiss({ action: 'play' });\n  }\n\n  newStack() {\n    this.dismiss({ action: 'clear' });\n  }\n\n  dismiss(data = {}) {\n    this.modalCtrl.dismiss(data);\n  }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n}\n","/**\n * Collapse Component Directive\n * Creates a collapsible on an element\n *\n * the .collapse css is in app/app.scss\n *\n * // ex: https://embed.plnkr.co/oVoPIA0ZbMMauth812Ls/\n * @format\n */\n\nimport { Directive, Input, HostBinding, ElementRef } from '@angular/core';\n\n@Directive({\n  selector: '[appCollapse]',\n  standalone: true,\n})\nexport class CollapseDirective {\n  private speed: number = 4; // ms speed of timeout\n\n  // style\n  @HostBinding('style.max-height')\n  private height: string;\n  // shown\n  @HostBinding('class.in')\n  @HostBinding('attr.aria-expanded')\n  private isExpanded: boolean = true;\n  // hidden\n  @HostBinding('attr.aria-hidden')\n  private isCollapsed: boolean = false;\n  // stale state\n  @HostBinding('class.collapse')\n  private isCollapse: boolean = true; //add the css via class\n  // animation state\n  @HostBinding('class.collapsing')\n  private isCollapsing: boolean = false;\n\n  @Input()\n  private set appCollapse(value: boolean) {\n    this.isExpanded = value;\n    this.measureHeight(); // get the initial height\n    this.toggle();\n    // if(value!==undefined){\n    //   if(value){\n    //     this.hide();\n    //   }else {\n    //     this.show();\n    //   }\n    // }\n  }\n\n  private get appCollapse(): boolean {\n    return this.isExpanded;\n  }\n\n  private h: number = 50; // internal int height tracking, defaulted\n\n  constructor(private el: ElementRef) {\n    // console.log('Hello Collapse Directive');\n    // this.measureHeight(); // elem has no height at this point\n  }\n\n  measureHeight() {\n    const elem = this.el.nativeElement;\n    //lets be sure the element has display:block style\n    // elem.className = elem.className.replace('collapse', '');\n    if (elem.scrollHeight > 0) {\n      this.h = elem.scrollHeight;\n    }\n    // console.log(\"[collapse] elem.scrollHeight\",elem.scrollHeight)//this is always zero?\n  }\n  toggle() {\n    if (this.isExpanded) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n  hide() {\n    // this.height = this.h +'px'\n    // this.isCollapse = false;//do we need this?\n    this.isCollapsing = true;\n    this.isExpanded = false;\n    this.isCollapsed = true; //aria-hidden\n    setTimeout(() => {\n      this.height = '0px';\n      this.isCollapse = true;\n      this.isCollapsing = false;\n    }, this.speed);\n  }\n  show() {\n    // this.height = '0px'\n    // this.isCollapse = false;//do we need this?\n    this.isCollapsing = true;\n    this.isExpanded = true;\n    this.isCollapsed = false; //aria-expanded\n    setTimeout(() => {\n      this.height = this.h + 'px';\n      this.isCollapse = true;\n      this.isCollapsing = false;\n    }, this.speed);\n  }\n}\n","<ion-toolbar *ngIf=\"clip\" class=\"clip-actions ion-no-border-top ion-no-padding \">\n    <!-- <div class=\"btns-wrap\"> -->\n        <div *ngIf=\"currentPage === 'info'\" class=\"spacer\" style=\"width:24px;\"></div>\n\n        <ion-button *ngIf=\"showFavorite\" fill=\"clear\" color=\"light\" [title]=\"'COMMON.FAVORITE' | translate\" (click)=\"onClickFavorite($event)\">\n            <ion-icon *ngIf=\"isFavorite\" slot=\"icon-only\" name=\"heart\"></ion-icon>\n            <ion-icon *ngIf=\"!isFavorite\" slot=\"icon-only\" name=\"heart-outline\"></ion-icon>\n        </ion-button>\n\n        <ion-fab-button *ngIf=\"showAddToStack\" center-abs color=\"primary\" [title]=\"'STACK.ACTIONS.ADD_TO_STACK' | translate\" (click)=\"onClickAddToStack($event)\">\n            <ion-icon name=\"add-circle-outline\"></ion-icon>\n        </ion-fab-button>\n\n        <ion-button *ngIf=\"showWatchLater\" fill=\"clear\" color=\"light\" [title]=\"'COMMON.WATCH_LATER' | translate\" (click)=\"onClickWatchLater($event)\">\n            <ion-icon slot=\"icon-only\" name=\"time-outline\"></ion-icon>\n        </ion-button>\n\n        <ion-button *ngIf=\"showShare\" fill=\"clear\" color=\"light\" [title]=\"'COMMON.SHARE' | translate\" (click)=\"onClickShare($event)\">\n            <ion-icon slot=\"icon-only\" name=\"share-alt\"></ion-icon>\n        </ion-button>\n\n        <ion-button fill=\"clear\" color=\"light\" [title]=\"'COMMON.FLAG' | translate\" (click)=\"onClickFlag($event)\">\n            <ion-icon *ngIf=\"isFlagged\" slot=\"icon-only\" name=\"flag\"></ion-icon>\n            <ion-icon *ngIf=\"!isFlagged\" slot=\"icon-only\" name=\"flag-outline\" class=\"not-flagged\"></ion-icon>\n        </ion-button>\n        \n        <!-- Editor Page: if canEdit (mine) -->\n        <ng-container *ngIf=\"currentPage === 'editor'\">    \n            <ion-button *ngIf=\"canEdit\" fill=\"clear\" color=\"light\" [title]=\"'CLIP.EDIT' | translate\" (click)=\"onClickEdit($event)\">\n                <ion-icon slot=\"icon-only\" name=\"create-outline\"></ion-icon>\n            </ion-button>\n            <ion-button *ngIf=\"showTrim && canEdit\" fill=\"clear\" color=\"light\" [title]=\"'CLIP.SETTINGS.TRIM' | translate\" (click)=\"onClickTrim($event)\">\n                <ion-icon slot=\"icon-only\" name=\"cut\"></ion-icon>\n            </ion-button>\n            <ion-button *ngIf=\"canRemove\" fill=\"clear\" color=\"light\" [title]=\"'EDITOR.REMOVE' | translate\" (click)=\"onClickDelete($event)\">\n                <ion-icon slot=\"icon-only\" name=\"remove-circle-outline\"></ion-icon>\n            </ion-button>\n            <!-- Editor Page: new nav actions -->\n            <ion-button class=\"actions-btns-right\" fill=\"clear\" color=\"light\" \n                [title]=\"'EDITOR.MOVE_TOP' | translate\" \n                [disabled]=\"index === 0\"\n                (click)=\"onClickMoveTop($event)\">\n                    {{ 'EDITOR.TOP' | translate }}\n                    <ion-icon name=\"arrow-up\"></ion-icon>\n                    <!-- <ion-icon slot=\"icon-only\" name=\"arrow-up\"></ion-icon> -->\n            </ion-button>\n            <ion-button class=\"actions-btns-right\" fill=\"clear\" color=\"light\" \n                [title]=\"'EDITOR.MOVE_BOTTOM' | translate\" \n                [disabled]=\"index === (playlistLength - 1)\"\n                (click)=\"onClickMoveBottom($event)\">\n                    {{ 'EDITOR.MOVE_BOTTOM' | translate }}\n                    <ion-icon name=\"arrow-down\"></ion-icon>\n                    <!-- <ion-icon slot=\"icon-only\" name=\"arrow-down\"></ion-icon> -->\n            </ion-button>\n        </ng-container>\n        \n\n        <ion-button *ngIf=\"adminHls\" fill=\"clear\" color=\"light\" title=\"Upgrade\" (click)=\"onClickAdminHls($event)\">\n            <ion-icon slot=\"icon-only\" name=\"aperture\"></ion-icon>\n        </ion-button>\n\n\n        <ion-fab-button *ngIf=\"currentPage === 'info'\" size=\"small\" color=\"primary\" [title]=\"'STACK.ACTIONS.ADD_TO_STACK' | translate\" (click)=\"onClickAddToStack($event)\">\n            <ion-icon name=\"add-circle-outline\"></ion-icon>\n        </ion-fab-button>\n\n    <!-- </div> -->\n\n</ion-toolbar>\n","/** @format */\n\nimport { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ModalController, IonToolbar, IonButton, IonIcon, IonFabButton } from '@ionic/angular/standalone';\nimport { ENABLE_FEATURE_WATCH_LATER, ENABLE_CLIP_SHARE, ENABLE_FEATURE_TRIM_CLIPS } from '@app/app.config';\nimport { ConfigService } from '@app/core/config/config.service';\nimport { EventsService } from '@app/core/services/events.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { VideoService } from '@app/core/services/video.service';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { ModalReportComponent } from '@app/shared/components/modal-report/modal-report.component';\nimport { Utils } from '@app/shared/utils';\n\nconst PAGE = '[ClipDetailActions]';\n\n@Component({\n  selector: 'app-clip-detail-actions',\n  templateUrl: './clip-detail-actions.component.html',\n  styleUrls: ['./clip-detail-actions.component.scss'],\n  standalone: true,\n  imports: [NgIf, TranslatePipe, IonToolbar, IonButton, IonIcon, IonFabButton],\n})\nexport class ClipDetailActionsComponent implements OnInit {\n  @Input() clip: Clip;\n  @Input() currentPage: string;\n  @Input() showAddToStack: boolean = false;\n  @Input() showFavorite: boolean = false;\n  @Input() adminHls = false;\n  @Input() canEdit = false;\n  @Input() canRemove = false;\n  @Input() playlistLength: number = 0; // to know when we're last\n  @Input() index = 0;\n\n  @Output() moveTop = new EventEmitter<MouseEvent>();\n  @Output() moveBottom = new EventEmitter<MouseEvent>();\n  @Output() deleteClip = new EventEmitter<MouseEvent>();\n  @Output() trimClip = new EventEmitter<MouseEvent>();\n  @Output() editClip = new EventEmitter<MouseEvent>();\n  @Output() closed = new EventEmitter<MouseEvent>();\n\n  public isFavorite: boolean = false;\n  public isFlagged: boolean = false;\n\n  public showWatchLater: boolean = ENABLE_FEATURE_WATCH_LATER;\n  public showShare: boolean = ENABLE_CLIP_SHARE; // do not share Clips\n  public showTrim: boolean = ENABLE_FEATURE_TRIM_CLIPS;\n\n  constructor(\n    // private store: Store<fromStore.State>,\n    private configService: ConfigService,\n    private events: EventsService,\n    private mystackService: MyStackService,\n    private toaster: ToasterService,\n    private modalCtrl: ModalController,\n    private videoService: VideoService\n  ) {}\n\n  ngOnInit() {\n    this.configService.appConfig.then((config) => {\n      this.showShare = this.showShare && config.allowSharing;\n    });\n  }\n\n  async onClickAdminHls(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    return await this.videoService.confirmSendClipForHLSTranscode(this.clip);\n  }\n\n  onClickShare(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.toaster.present(`Share Feature Coming Soon... ${this.clip.title}`);\n  }\n  async onClickFlag(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    const modal = await this.modalCtrl.create({\n      component: ModalReportComponent,\n      componentProps: { reportedItem: this.clip },\n    });\n    await modal.present();\n  }\n  onClickAddToStack(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.mystackService.addClipsToMyStack([this.clip]);\n  }\n  onClickWatchLater(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    // this.store.dispatch(watchLaterActions.addClip({ clip: this.clip }));\n    this.toaster.present(`Feature Coming Soon! Add to Watch Later: ${this.clip.title}`);\n  }\n\n  onClickMoveTop(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.moveTop.emit(event);\n  }\n  onClickMoveBottom(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.moveBottom.emit(event);\n  }\n  onClickDelete(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.deleteClip.emit(event);\n  }\n  onClickTrim(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.trimClip.emit(event);\n  }\n  onClickEdit(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.editClip.emit(event);\n  }\n\n  onClickFavorite(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.isFavorite = !this.isFavorite;\n    console.log(`${PAGE} (TODO) Favorite... ${this.clip.title}`);\n  }\n\n  onClickClose() {\n    this.closed.emit();\n  }\n}\n","<ion-fab *ngIf=\"isPopover\" vertical=\"top\" horizontal=\"start\" slot=\"fixed\" class=\"close-fab\">\n  <ion-fab-button class=\"close-btn\" size=\"small\" (click)=\"close()\">\n    <ion-icon name=\"close\"></ion-icon>\n  </ion-fab-button>\n</ion-fab>\n<app-clip-detail-actions\n  *ngIf=\"clip\"\n  [clip]=\"clip\"\n  [canEdit]=\"canEdit\"\n  [canRemove]=\"canRemove\"\n  [adminHls]=\"isAdmin && !(clip?.hlsSrc?.length > 0)\"\n  [currentPage]=\"currentPage\"\n  [playlistLength]=\"playlistLength\"\n  [index]=\"index\"\n  (moveTop)=\"moveTop.emit($event)\"\n  (moveBottom)=\"moveBottom.emit($event)\"\n  (deleteClip)=\"deleteClip.emit($event)\"\n  (trimClip)=\"trimClip.emit($event)\"\n  (editClip)=\"editClip.emit($event)\"\n  (closed)=\"close()\"\n></app-clip-detail-actions>\n<div *ngIf=\"showSegmentBar\" class=\"segment-bar\">\n  <ion-segment [(ngModel)]=\"segment\" color=\"dark\" mode=\"md\">\n    <ion-segment-button value=\"details\" (click)=\"onSegmentClick($event)\">\n      <ion-label> Details </ion-label>\n    </ion-segment-button>\n    <ion-segment-button value=\"transcript\" (click)=\"onSegmentClick($event)\">\n      <ion-label> Transcript </ion-label>\n    </ion-segment-button>\n  </ion-segment>\n</div>\n\n<div [ngSwitch]=\"segment\" *ngIf=\"clip; else noClip\" class=\"segment-view\" [ngClass]=\"{ popover: isPopover }\">\n  <div *ngSwitchCase=\"'details'\" class=\"details\">\n    <div *ngIf=\"isPopover\">\n      <div class=\"embed-responsive embed-responsive-16by9\">\n        <div\n          (click)=\"playClip()\"\n          class=\"poster embed-responsive-item\"\n          [ngStyle]=\"{ 'background-image': 'url(' + getPoster() + ')' }\"\n        ></div>\n      </div>\n      <h3 class=\"clip-title\">{{ clip.title }}</h3>\n      <!-- <p *ngIf=\"clip.description\" class=\"clip-desc\">\n          {{clip.description}}\n      </p> -->\n\n      <!-- <clip-detail-actions [clip]=\"clip\" class=\"player-toolbar\"></clip-detail-actions> -->\n    </div>\n    <!--end isPopover-->\n\n    <div *ngIf=\"clipDesc\" class=\"clip-desc\">\n      {{ clipDesc }}\n    </div>\n\n    <ion-item class=\"ion-text-wrap ion-no-padding\" lines=\"none\">\n      <ion-avatar slot=\"start\">\n        <img [src]=\"userAvatarUrl\" [alt]=\"clipOwner$ | async\" [fallback]=\"avatarFallback\" />\n      </ion-avatar>\n      <ion-label>\n        <h3 *ngIf=\"clipOwner$ | async as name\">{{ name }}</h3>\n\n        <div hidden class=\"stats\">\n          <!-- Hiding, pending favorite & restack functionality -->\n          <div class=\"ion-float-left\">\n            <ion-icon name=\"play-sharp\"></ion-icon>\n            {{ clip.views }}\n          </div>\n          <div class=\"ion-float-left\">\n            <ion-icon name=\"heart\"></ion-icon>\n            {{ clip.votes }}\n          </div>\n          <div class=\"ion-float-left\">\n            <ion-icon name=\"layers-outline\"></ion-icon>\n            {{ clip.numStacks }}\n          </div>\n        </div>\n      </ion-label>\n    </ion-item>\n\n    <div *ngIf=\"clip.projectId\" class=\"project-details\">\n      {{ 'COMMON.PROJECT' | translate }}:\n      <ion-button class=\"btn-link-inline\" (click)=\"openProject($event, clip.projectId)\">{{ projectTitle$ | async }}</ion-button>\n    </div>\n  </div>\n  <!--/end details -->\n\n  <div *ngSwitchCase=\"'transcript'\" class=\"transcript\">\n    <ion-item class=\"ios-no-padding\">\n      <ion-label>Language</ion-label>\n      <ion-select [(ngModel)]=\"language\">\n        <ion-select-option value=\"en\">English</ion-select-option>\n      </ion-select>\n    </ion-item>\n    <p class=\"clip-subtitle\">{{ clip.transcript }}</p>\n  </div>\n  <!--/end transcript -->\n</div>\n<!--/end segments -->\n\n<div class=\"additional\" *ngIf=\"clip\">\n  <div class=\"tags\">\n    <ion-chip *ngFor=\"let tag of tags\">\n      <ion-label>{{ tag }}</ion-label>\n    </ion-chip>\n  </div>\n\n  <!--   <clip-detail-actions\n      [clip]=\"clip\" \n      [currentPage]=\"currentPage\"\n      (deleteClip)=\"onDeleteClip($event)\"\n      (close)=\"close($event)\"\n  ></clip-detail-actions> -->\n</div>\n\n<ng-template #noClip>\n  <p>{{ 'ERRORS.NO_CLIP_FOUND' | translate }}</p>\n</ng-template>\n","/** @format */\n\nimport { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { NgIf, NgSwitch, NgClass, NgSwitchCase, NgStyle, NgFor, AsyncPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport {\n  NavController,\n  ModalController,\n  IonFab,\n  IonFabButton,\n  IonIcon,\n  IonSegmentButton,\n  IonLabel,\n  IonItem,\n  IonAvatar,\n  IonButton,\n  IonSelectOption,\n  IonChip,\n} from '@ionic/angular/standalone';\nimport { Observable } from 'rxjs';\nimport { filter, map, take } from 'rxjs/operators';\nimport { ClipsCoreService } from '@app/core/services/clips.service';\nimport { Clip, getClipTaxArray, getClipEmotionsString } from '@app/shared/models/clip.model';\nimport { DEFAULT_USER_AVATAR } from '@app/shared/models/user.model';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport { Utils } from '@app/shared/utils';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { ClipDetailActionsComponent } from './clip-detail-actions/clip-detail-actions.component';\n\nconst PAGE = '[ClipDetail]';\n\n@Component({\n  selector: 'app-clip-detail',\n  templateUrl: './clip-detail.component.html',\n  styleUrls: ['./clip-detail.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    NgSwitch,\n    NgClass,\n    NgSwitchCase,\n    NgStyle,\n    NgFor,\n    AsyncPipe,\n    TranslatePipe,\n    FormsModule,\n    ImageFallbackDirective,\n    ClipDetailActionsComponent,\n    IonFab,\n    IonFabButton,\n    IonIcon,\n    IonSegmentButton,\n    IonLabel,\n    IonItem,\n    IonAvatar,\n    IonButton,\n    IonSelectOption,\n    IonChip,\n  ],\n})\nexport class ClipDetailComponent implements OnInit {\n  @Input() clip: Clip;\n  @Input() currentPage: string;\n  /** user is GLOBAL admin */\n  @Input() isAdmin = false;\n  @Input() canEdit = false;\n  @Input() canRemove = false;\n  @Input() playlistLength: number = 0; // to know when we're last\n  @Input() index = 0;\n\n  @Output() moveTop = new EventEmitter<MouseEvent>();\n  @Output() moveBottom = new EventEmitter<MouseEvent>();\n  @Output() deleteClip = new EventEmitter<MouseEvent>();\n  @Output() trimClip = new EventEmitter<MouseEvent>();\n  @Output() editClip = new EventEmitter<MouseEvent>();\n\n  showSegmentBar = false;\n\n  segment: string = 'details';\n  language: string = 'en';\n  // clip: Clip;\n  tags: Array<string> = [];\n  emotions: string = '';\n\n  userAvatarUrl: string;\n  clipOwner$: Observable<string>;\n  projectTitle$: Observable<string>;\n  clipDesc = '';\n\n  isPopover: boolean = false;\n\n  isCollapsedDetails: boolean = true;\n  avatarFallback = DEFAULT_USER_AVATAR;\n\n  constructor(\n    private projectService: ProjectService,\n    private memberService: ProjectMemberService,\n    private clipService: ClipsCoreService,\n    // private youtubeService: YoutubeService,\n    private modalController: ModalController,\n    private navCtrl: NavController\n  ) {}\n\n  ngOnInit() {\n    if (this.clip) {\n      this.emotions = this.getClipEmotions();\n      this.tags = this.getClipTax();\n      this.showSegmentBar = this.clip.transcript ? true : false;\n\n      this.clipOwner$ = this.memberService.getPublicUsername(this.clip.userId);\n      this.userAvatarUrl = this.memberService.getUserAvatar(this.clip.userId);\n\n      this.clipDesc = this.clipService.getDescription(this.clip);\n\n      this.projectTitle$ = this.projectService.getProjectPreview(this.clip.projectId).pipe(\n        filter((p) => p && p.id && p.id.length > 0),\n        take(1),\n        map((proj) => (proj && proj.title ? proj.title : this.getProjectNameFromId(this.clip.projectId)))\n      );\n    } else {\n      console.warn(`${PAGE} init !clip!`);\n    }\n  }\n\n  onSegmentClick(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n  }\n\n  close() {\n    if (this.isPopover) {\n      this.modalController.dismiss();\n    } else {\n      console.log(`${PAGE} Inline Close not handled`);\n    }\n  }\n\n  playClip() {\n    console.log(`${PAGE} PLAY clip:`, this.clip);\n  }\n\n  getPoster() {\n    return this.clipService.getPoster(this.clip);\n  }\n\n  getProjectNameFromId(projId: string): string {\n    return Utils.dashedToTitleCase(projId);\n  }\n\n  getClipEmotions() {\n    // console.log(`${PAGE} getClipEmotions...`);\n    return getClipEmotionsString(this.clip);\n  }\n\n  getClipTax() {\n    // console.log(`${PAGE} getClipTax...`);\n    return getClipTaxArray(this.clip);\n  }\n\n  openProject(event, projUrl: string) {\n    event.stopPropagation(); // do not open the item collapse\n    this.navCtrl.navigateForward(`/${PROJECT_DETAIL_ROUTE}/${projUrl}`);\n  }\n  openChannel(event, channelUrl: string) {\n    event.stopPropagation(); // do not open the item collapse\n    this.openPage('channel', { id: channelUrl });\n  }\n\n  openPage(name: string, params: { id?: string } = {}) {\n    // push to the nav stack and get a back button\n    this.navCtrl.navigateForward([`/${name}`, params]);\n  }\n\n  // getChannelFromProject(project: string) {\n  //   // TODO: lookup project by projectId and get ChannelById...\n  //   return 'Global';\n  // }\n}\n","<ion-item [class.current]=\"index === currentIndex\" lines=\"none\" \n          [attr.text-wrap]=\"isCollapsedDetails ? null : true\" \n          (click)=\"onClickItem($event)\"\n          class=\"mystack-item\">\n\n  \n  <!-- the display:block style forces the thumbnail to appear even if drag is disabled -->\n  <ion-reorder slot=\"start\" style=\"display:block;\">\n    <ion-thumbnail class=\"poster\">\n      <div *ngIf=\"clip?.poster\" class=\"handle clip-poster\" [ngStyle]=\"{'background-image': 'url(' + clip.poster + ')'}\"></div>\n\n      <div *ngIf=\"clip?.duration\" class=\"clip-length\" [class.too-long]=\"tooLong\">{{clip?.duration | duration}}</div> \n      \n      <div *ngIf=\"bDisplayIndex\" class=\"clip-index\">{{index}}</div> \n    </ion-thumbnail>\n  </ion-reorder>\n\n  <div slot=\"start\" class=\"poster-play-wrap\">\n    <ion-button *ngIf=\"!isVideoPlaying || index !== currentIndex\" \n      fill=\"clear\" size=\"large\" color=\"light\" \n      class=\"poster-play ion-no-margin\" \n      (click)=\"onClickPlay($event)\">\n        <ion-icon slot=\"icon-only\" name=\"play-sharp\"></ion-icon>\n    </ion-button>\n    <ion-button *ngIf=\"isVideoPlaying && index === currentIndex\" \n      fill=\"clear\" size=\"large\" color=\"light\" \n      class=\"poster-play ion-no-margin\" \n      (click)=\"onClickPause($event)\">\n        <ion-icon slot=\"icon-only\" name=\"pause-sharp\"></ion-icon>\n    </ion-button>\n  </div>\n  \n  <ion-label>\n    <h2 class=\"clip-title keep-top ion-text-wrap\">{{ clip?.title | sentenceCase }}</h2>\n    <div *ngIf=\"!tooLong\" class=\"date\">\n      {{ dateFilmed }}\n      <ion-icon *ngIf=\"clip?.hlsSrc?.length > 0\" name=\"aperture-sharp\" style=\"height:10px;\"></ion-icon>\n    </div>\n    <div *ngIf=\"tooLong\" class=\"duration-warning\">Trim Before Publish - Max Duration exceeded</div>\n    <div class=\"clip-user\">\n      <ion-item class=\"ion-text-wrap ion-no-padding\" lines=\"none\">\n        <ion-avatar slot=\"start\">\n          <img [src]=\"userAvatarUrl\" [alt]=\"clipOwner$ | async\" [fallback]=\"avatarFallback\" draggable=\"false\" />\n        </ion-avatar>\n        <ion-label *ngIf=\"clipOwner$ | async as name\" class=\"\">{{ name }}</ion-label>\n      </ion-item>\n    </div>\n  </ion-label>\n          \n      \n  <ion-button *ngIf=\"isCollapsedDetails\" slot=\"end\" fill=\"clear\" color=\"light\" title=\"See details...\" (click)=\"toggleDetails($event)\">\n    <ion-icon slot=\"icon-only\" name=\"ellipsis-vertical\"></ion-icon>\n  </ion-button>\n  <ion-button *ngIf=\"!isCollapsedDetails\" slot=\"end\" fill=\"clear\" color=\"light\" title=\"Close details\" (click)=\"toggleDetails($event)\">\n    <ion-icon slot=\"icon-only\" name=\"ellipsis-vertical-outline\"></ion-icon>\n  </ion-button>\n\n  \n  <ion-reorder slot=\"end\">\n    <ion-icon name=\"reorder-two-outline\" size=\"large\" class=\"handle\" color=\"light\"></ion-icon>\n  </ion-reorder>\n\n</ion-item>\n\n<ion-item-options side=\"end\" (click)=\"closeSlider()\" (ionSwipe)=\"onSwipeDelete($event)\">\n  <ion-item-option expandable [disabled]=\"!isMyStack && !isMyClip\" (click)=\"deleteClip()\" color=\"secondary\" class=\"expandable-option\">\n    <ion-icon slot=\"top\" name=\"remove-circle-outline\"></ion-icon>\n    {{ 'EDITOR.REMOVE' | translate }}\n  </ion-item-option>\n</ion-item-options>\n\n<div [appCollapse]=\"isCollapsedDetails\" class=\"mystack-clip-details ion-text-wrap\" [class.current]=\"index === currentIndex\" (click)=\"toggleDetails($event)\">\n  <app-clip-detail *ngIf=\"clip\"\n    [clip]=\"clip\" \n    [currentPage]=\"'editor'\"\n    [index]=\"index\"\n    [playlistLength]=\"playlistLength\"\n    [isAdmin]=\"isAdmin\"\n    [canEdit]=\"isMyClip\"\n    [canRemove]=\"isMyStack || isMyClip\"\n    (moveTop)=\"onMoveTop($event)\"\n    (moveBottom)=\"onMoveBottom($event)\"\n    (deleteClip)=\"onDeleteClip($event)\"\n    (trimClip)=\"onTrimClip($event)\"\n    (editClip)=\"onEditClip($event)\"\n  ></app-clip-detail>\n</div>\n","/** @format */\n\nimport { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core';\nimport { NgIf, NgStyle, AsyncPipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport {\n  IonItemSliding,\n  ModalController,\n  IonItem,\n  IonReorder,\n  IonThumbnail,\n  IonButton,\n  IonIcon,\n  IonLabel,\n  IonAvatar,\n  IonItemOptions,\n  IonItemOption,\n} from '@ionic/angular/standalone';\nimport { Observable, Subscription } from 'rxjs';\nimport { MAX_VIDEO_CAPTURE_LENGTH_SECONDS } from '@app/app.config';\nimport { ClipsCoreService } from '@app/core/services/clips.service';\nimport { EventsService } from '@app/core/services/events.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { Clip, getFilmingDate, DEFAULT_POSTER } from '@app/shared/models/clip.model';\nimport { DEFAULT_USER_AVATAR } from '@app/shared/models/user.model';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport { CollapseDirective } from '@app/shared/directives/collapse.directive';\nimport { ClipDetailComponent } from '@app/shared/components/clip-detail/clip-detail.component';\nimport { DurationRenderPipe } from '@app/shared/pipes/duration-render.pipe';\nimport { SentenceCasePipe } from '@app/shared/pipes/sentence-case.pipe';\nimport { Utils } from '@app/shared/utils';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\nimport { ClipperComponent, ClipperSegments } from '@app/modules/clipper/clipper.component';\n\nconst DEBUG_LOGS = false;\n\nconst PAGE = '[MyStackItem]';\n\n@Component({\n  selector: 'app-my-stack-item',\n  templateUrl: './my-stack-item.component.html',\n  styleUrls: ['./my-stack-item.component.scss'],\n  standalone: true,\n  imports: [\n    IonItem,\n    IonReorder,\n    IonThumbnail,\n    NgIf,\n    NgStyle,\n    IonButton,\n    IonIcon,\n    IonLabel,\n    IonAvatar,\n    ImageFallbackDirective,\n    IonItemOptions,\n    IonItemOption,\n    CollapseDirective,\n    ClipDetailComponent,\n    AsyncPipe,\n    TranslatePipe,\n    DurationRenderPipe,\n    SentenceCasePipe,\n  ],\n})\nexport class MyStackItemComponent implements OnInit, OnDestroy {\n  @Input() displayIndex: boolean = true; // for dev: show this for debugging\n  @Input() isPreviewOpen: boolean = false;\n  @Input() isVideoPlaying: boolean = false;\n  @Input() slidingItem: IonItemSliding;\n\n  @Input() clip: Clip;\n  @Input() playlistLength: number = 0; // to know when we're last\n  @Input() index: number;\n  // set index(val:number) {\n  //   // console.log(`${PAGE} set index: ${val}`);\n  //   this.itemIndex = val + 1;\n  // }\n  // get index() { return this.itemIndex - 1; }\n  @Input() currentIndex: number;\n  /** user is GLOBAL ADMIN */\n  @Input() isAdmin = false;\n  @Input() isMyStack = false;\n  @Input() isMyClip = false;\n\n  @Output() playClipIndex = new EventEmitter<number>();\n  @Output() pauseClipIndex = new EventEmitter<number>();\n  @Output() deleteClipIndex = new EventEmitter<number>();\n  @Output() moveTop = new EventEmitter<number>();\n  @Output() moveBottom = new EventEmitter<number>();\n\n  // public itemIndex: number = 0;\n  public poster: string = DEFAULT_POSTER;\n  public dateFilmed: string = '';\n  public tooLong = false;\n\n  public isCollapsedDetails: boolean = true;\n  public bDisplayIndex = false;\n  avatarFallback = DEFAULT_USER_AVATAR;\n  userAvatarUrl: string;\n  clipOwner$: Observable<string>;\n\n  private subManager = new Subscription();\n\n  constructor(\n    private toaster: ToasterService,\n    private events: EventsService,\n    private clipService: ClipsCoreService,\n    private memberService: ProjectMemberService,\n    private modalCtrl: ModalController\n  ) {}\n\n  ngOnInit() {\n    this.poster = this.getPoster();\n\n    if (this.clip) {\n      this.dateFilmed = this.clip && (this.clip.filmingDate || this.clip.created) ? getFilmingDate(this.clip) : '';\n\n      this.tooLong = Utils.convertDurationToSeconds(this.clip.duration) > MAX_VIDEO_CAPTURE_LENGTH_SECONDS; // more than 3 minutes?\n\n      this.clipOwner$ = this.memberService.getPublicUsername(this.clip.userId);\n      this.userAvatarUrl = this.memberService.getUserAvatar(this.clip.userId);\n    }\n\n    const subCloseDeets = this.events.subscribe('mystack:item:details:close', this.onCloseCollapse);\n    this.subManager.add(subCloseDeets);\n  }\n\n  ngOnDestroy() {\n    this.subManager.unsubscribe();\n  }\n\n  getPoster() {\n    return this.clipService.getPoster(this.clip);\n  }\n\n  onClickItem(event: MouseEvent) {\n    DEBUG_LOGS && console.log(`${PAGE} onClickItem`, event);\n    this.toggleCollapse();\n  }\n\n  toggleDetails(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    // this.toaster.present(`Info: ${item.title}`);\n    this.toggleCollapse();\n  }\n\n  toggleCollapse() {\n    this.isCollapsedDetails = !this.isCollapsedDetails;\n    if (!this.isCollapsedDetails) {\n      this.events.publish('mystack:item:details:close', this.index);\n    }\n  }\n  onCloseCollapse = (index) => {\n    if (this.index !== index) {\n      // DEBUG_LOGS && console.log(`close all other item deets (${this.index}) payload index:`, index);\n      this.isCollapsedDetails = true;\n    }\n  };\n\n  closeSlider() {\n    if (this.slidingItem && typeof this.slidingItem.close === 'function') {\n      this.slidingItem.close();\n    }\n  }\n\n  onClickPlay(event) {\n    Utils.tryStopPropagation(event);\n    console.log(`${PAGE} onClickPlay`, {\n      index: this.index,\n      currentIndex: this.currentIndex,\n      isPreviewOpen: this.isPreviewOpen,\n    });\n    this.playClipIndex.emit(this.index);\n  }\n\n  onClickPause(event) {\n    Utils.tryStopPropagation(event);\n    console.log(`${PAGE} onClickPause`, {\n      index: this.index,\n      currentIndex: this.currentIndex,\n      isPreviewOpen: this.isPreviewOpen,\n    });\n    this.pauseClipIndex.emit(this.index);\n  }\n\n  onSwipeDelete(event: CustomEvent) {\n    DEBUG_LOGS && console.log(`${PAGE} onSwipeDelete [${this.index}]`, { event, slidingItem: this.slidingItem });\n    if (this.isMyClip || this.isMyStack) {\n      this.delete();\n      if (typeof this.slidingItem.close === 'function') {\n        this.slidingItem.close();\n      }\n      if (this.clip && this.clip.title) {\n        this.toaster.present(`Removed '${this.clip.title}'`);\n      }\n    }\n    // this.hasSurpassedSlidingThreshold().then((pastThreshold: boolean) => {\n    //   if (pastThreshold) {\n    //     // was here\n    //   }\n    // })\n  }\n\n  deleteClip() {\n    console.log(`${PAGE} deleteClip [${this.index}]`, { slidingItem: this.slidingItem });\n    this.delete();\n    if (typeof this.slidingItem.close === 'function') {\n      this.slidingItem.close();\n    }\n    if (this.clip && this.clip.title) {\n      this.toaster.present(`Removed '${this.clip.title}'`);\n    }\n  }\n\n  onDeleteClip(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.delete();\n  }\n  onTrimClip(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.trimClip();\n  }\n  onEditClip(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.editClip();\n  }\n  onMoveTop(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.moveTop.emit(this.index);\n  }\n  onMoveBottom(event: MouseEvent) {\n    Utils.tryStopPropagation(event);\n    this.moveBottom.emit(this.index);\n  }\n\n  delete() {\n    // console.log(`${PAGE} delete`, index);\n    this.deleteClipIndex.emit(this.index);\n  }\n\n  async trimClip() {\n    // this.toaster.present(\"Trim Clip Feature Coming Soon...\");\n    const modal = await this.modalCtrl.create({\n      component: ClipperComponent,\n      componentProps: {\n        selectedSegment: ClipperSegments.Trim,\n        clip: this.clip,\n        isModal: true,\n      },\n      cssClass: 'fullheight-modal',\n    });\n    return await modal.present();\n  }\n\n  async editClip() {\n    // this.toaster.present(\"Trim Clip Feature Coming Soon...\");\n    const modal = await this.modalCtrl.create({\n      component: ClipperComponent,\n      componentProps: {\n        selectedSegment: ClipperSegments.Settings,\n        clip: this.clip,\n        isModal: true,\n      },\n      cssClass: 'fullheight-modal',\n    });\n    return await modal.present();\n  }\n\n  /**\n   * ion-sliding https://ionicframework.com/docs/api/item-sliding#methods\n   * @returns boolean if has surpassed threshold\n   * not working... caches the first value and never updates? giving up for now..\n   */\n  private async hasSurpassedSlidingThreshold(): Promise<boolean> {\n    if (this.slidingItem && typeof this.slidingItem.getOpenAmount === 'function') {\n      // getOpenAmount\n      const openAmount = await this.slidingItem.getOpenAmount();\n      const slidingRation = await this.slidingItem.getSlidingRatio();\n      console.log(`${PAGE} checkSlidingThreshold:`, { openAmount, slidingRation });\n      return false;\n    }\n    return false;\n  }\n}\n","<ion-item [class.current]=\"index === currentIndex\" lines=\"none\" \n          text-wrap=\"true\" \n          (click)=\"onClickItem()\"\n          class=\"mystack-item mystack-capture-item\">\n\n  <ion-reorder slot=\"start\">\n      <ion-thumbnail class=\"poster\">\n        <div *ngIf=\"poster\" class=\"handle clip-poster\" [ngStyle]=\"{'background-image': 'url(' + poster + ')'}\"></div>\n  \n        <div *ngIf=\"clip?.duration && clip?.duration !== '00:00'\" class=\"clip-length\">{{clip?.duration | duration}}</div> \n        <div class=\"handle poster-play ion-no-margin loading-spinner\">\n            <ion-spinner name=\"crescent\" [color]=\"progressBarColor\" size=\"large\"></ion-spinner>\n        </div>\n\n        <div class=\"poster-text\">{{ posterText }}</div>\n        \n        <!-- <div *ngIf=\"bDisplayIndex\" class=\"clip-index\">{{index}}</div> -->\n      </ion-thumbnail>\n  </ion-reorder>\n  \n  <ion-label>\n    <h2 class=\"clip-title keep-top ion-text-wrap\">{{ clip?.title | sentenceCase }}</h2>\n    <div *ngIf=\"dateFilmed\" class=\"date\">{{ dateFilmed }}</div>\n    <ion-progress-bar [value]=\"progressValue\" [buffer]=\"progressBuffer\" [type]=\"progressType\" [color]=\"progressBarColor\"></ion-progress-bar>\n    <div class=\"progress-status\">\n      {{loadingStatus}} \n    </div>\n  </ion-label>\n\n  <ion-button *ngIf=\"transcodingCheckTimedout\" slot=\"end\" fill=\"clear\" color=\"light\" (click)=\"checkTranscodeComplete($event)\" [disabled]=\"transcodingCheckClicked\" title=\"Check Again\" class=\"timeout-refresh-btn\">\n    <ion-icon  slot=\"icon-only\" name=\"refresh\"></ion-icon>\n  </ion-button>\n      \n  <ion-reorder slot=\"end\">\n    <ion-icon name=\"reorder-two-outline\" size=\"large\" class=\"handle\" color=\"light\"></ion-icon>\n  </ion-reorder>\n\n</ion-item>\n\n <!--\n    removed expandable to avoid accidental deleting of clips during upload/capture\n    if expandable swipe delete, add this: \n    ion-item-options (ionSwipe)=\"deleteClip()\" \n    ion-item-option expandable (click)=\"deleteClip()\"\n  -->\n<ion-item-options side=\"end\" (click)=\"closeSlider()\">\n  <ion-item-option (click)=\"deleteClip($event)\" color=\"secondary\">\n    <ion-icon slot=\"top\" name=\"remove-circle-outline\"></ion-icon>\n    Remove\n  </ion-item-option>\n</ion-item-options>\n","/** @format */\n\nimport { Component, OnInit, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\nimport { NgIf, NgStyle } from '@angular/common';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n  AlertController,\n  IonItemSliding,\n  IonItem,\n  IonReorder,\n  IonThumbnail,\n  IonSpinner,\n  IonLabel,\n  IonProgressBar,\n  IonButton,\n  IonIcon,\n  IonItemOptions,\n  IonItemOption,\n} from '@ionic/angular/standalone';\nimport { ClipsCoreService } from '@app/core/services/clips.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { SentryService } from '@app/core/services/sentry.service';\nimport { Clip, DEFAULT_POSTER } from '@app/shared/models/clip.model';\nimport { DurationRenderPipe } from '@app/shared/pipes/duration-render.pipe';\nimport { SentenceCasePipe } from '@app/shared/pipes/sentence-case.pipe';\nimport { Utils } from '@app/shared/utils';\nimport { StackEditPage } from '@app/stacks/stack-edit/stack-edit.page';\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[MyStackCaptureItem]';\n\n@Component({\n  selector: 'app-my-stack-capture-item',\n  templateUrl: './my-stack-capture-item.component.html',\n  styleUrls: ['./my-stack-capture-item.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    NgStyle,\n    DurationRenderPipe,\n    SentenceCasePipe,\n    IonItem,\n    IonReorder,\n    IonThumbnail,\n    IonSpinner,\n    IonLabel,\n    IonProgressBar,\n    IonButton,\n    IonIcon,\n    IonItemOptions,\n    IonItemOption,\n  ],\n})\nexport class MyStackCaptureItemComponent implements OnInit, OnChanges {\n  @Input() isPreviewOpen: boolean = false;\n  @Input() slidingItem: IonItemSliding;\n  @Input() clip: Clip;\n  @Input() currentIndex: number;\n  @Input() index: number = 0;\n\n  @Output() deleteClipIndex = new EventEmitter<number>();\n\n  poster: string = DEFAULT_POSTER;\n  dateFilmed: string = '';\n\n  progressType: 'determinate' | 'indeterminate' = 'indeterminate';\n  progressValue: number = 0;\n  progressBuffer: number = 0; // setting it to 0 makes the buffer animation be the background\n  loadingStatus: string = 'Transcoding...';\n  posterText: string = 'Processing';\n\n  transcodingCheckTimedout = false;\n  transcodingCheckClicked = false;\n  progressBarColor = 'tertiary';\n\n  constructor(\n    private stackEditPage: StackEditPage,\n    private alertCtrl: AlertController,\n    private toaster: ToasterService,\n    private clipService: ClipsCoreService,\n    private translate: TranslateService,\n    private sentryService: SentryService\n  ) {}\n\n  ngOnInit() {\n    DEBUG_LOGS && console.log(`${PAGE} OnInit`, this.clip);\n    this.poster = this.clipService.getPoster(this.clip);\n  }\n\n  /**\n   * Watch the Clip for changes\n   * specifically the hlsMeta prop\n   */\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes && changes.clip && changes.clip.currentValue) {\n      // && !changes.clip.firstChange\n      // watching the first also, to allow init with partially transcoded clip\n      // console.log(`ngOnChanges clip:`, changes.clip);\n      DEBUG_LOGS &&\n        console.log(`watching hlsMeta & sources:`, {\n          hlsMeta: changes.clip.currentValue.hlsMeta,\n          hlsSrc: changes.clip.currentValue.hlsSrc,\n          sources: changes.clip.currentValue.sources, // upon this array having a length, mystack template will change to an item rather than capture-item..\n        });\n      if (changes.clip.currentValue.hlsMeta) {\n        const hlsMeta = Utils.tryParseJSON(changes.clip.currentValue.hlsMeta) || {};\n\n        if (hlsMeta.errorMessage) {\n          try {\n            // updated  2022-08-18 to get a better error\n            const msg =\n              typeof hlsMeta.errorMessage !== 'string' ? Utils.objToString(hlsMeta.errorMessage) : hlsMeta.errorMessage;\n            this.loadingStatus = `${this.translate.instant('ERRORS.UH_OH')} ${msg.substring(0, 90)}`;\n          } catch (error) {\n            console.warn(`We had an issue getting the error message!`, error);\n            this.sentryService.captureError(error);\n            this.loadingStatus = this.translate.instant('ERRORS.UNKNOWN');\n          }\n          this.progressType = 'determinate';\n          // try a page refresh to auto-correct\n          if (window && window.location && typeof window.location.reload === 'function') {\n            window.location.reload();\n          }\n        } else if (hlsMeta.status === 'COMPLETE') {\n          this.loadingStatus = this.translate.instant('EDITOR.COMPLETE');\n          this.progressType = 'determinate';\n          try {\n            // upon transcode complete -> save stack ... is this caught in all cases?\n            console.warn(`Dev: Tanscode complete -> save stack ... is this caught in all cases?`);\n            this.stackEditPage.saveStack();\n          } catch (error) {\n            console.warn(`Caught & ignored udring save:`, error);\n          }\n        } else if (hlsMeta.percentComplete) {\n          // give a specific status which might be TRANSCODING or FINISHING (note all caps)\n          const currentStatus = hlsMeta.status ? Utils.titleCase(hlsMeta.status) : 'Transcoding';\n          this.loadingStatus = `${currentStatus}: ${hlsMeta.percentComplete}% complete`;\n        } else if (hlsMeta.hls === true) {\n          // this was the request we sent..\n        } else if (!changes.clip.firstChange) {\n          console.warn(`hlsMeta unhanded?`, hlsMeta);\n        }\n      }\n    }\n  }\n\n  onClickItem() {\n    this.closeSlider();\n  }\n\n  async deleteClip(event) {\n    Utils.tryStopPropagation(event);\n    await this.confirmDelete();\n    this.closeSlider();\n  }\n\n  delete() {\n    this.deleteClipIndex.emit(this.index);\n\n    if (this.clip && this.clip.title) {\n      this.toaster.present(`${this.translate.instant('EDITOR.REMOVED')} '${this.clip.title}'`);\n    }\n  }\n\n  closeSlider() {\n    if (this.slidingItem && typeof this.slidingItem.close === 'function') {\n      this.slidingItem.close();\n    }\n  }\n\n  async confirmDelete() {\n    const confirm = await this.alertCtrl.create({\n      header: this.translate.instant('EDITOR.CLIP_TRANSCODING'),\n      message: this.translate.instant('EDITOR.CONFIRM_REMOVE'),\n      buttons: [\n        {\n          text: this.translate.instant('COMMON.CANCEL'),\n          handler: () => {\n            // console.log('Cancel, do nothing');\n          },\n        },\n        {\n          text: this.translate.instant('EDITOR.REMOVE'),\n          handler: () => {\n            this.delete();\n          },\n        },\n      ],\n    });\n    return await confirm.present();\n  }\n\n  /**\n   * @deprectaed to be removed\n   */\n  waitForTranscodeComplete() {\n    this.clipService\n      .waitForClipTranscoded(this.clip)\n      .then((res) => {\n        DEBUG_LOGS && console.log(`${PAGE} clipTranscoded res:`, res);\n        this.loadingStatus = this.translate.instant('EDITOR.DONE');\n        this.progressType = 'indeterminate';\n        setTimeout(() => {\n          this.transcodingCheckClicked = false;\n          this.clip.source.uploading = false; // this should kick the component back to standard non-capture view?\n          this.clipService.updateClipStore(res);\n        }, 1000);\n      })\n      .catch((err) => {\n        console.info(`${PAGE} Caught:`, err.message);\n        this.loadingStatus = this.translate.instant('EDITOR.TRY_AGAIN');\n        this.progressType = 'determinate';\n        this.transcodingCheckTimedout = true;\n        this.transcodingCheckClicked = false;\n      });\n  }\n\n  /**\n   * @deprectaed to be removed\n   */\n  checkTranscodeComplete(event) {\n    Utils.tryStopPropagation(event);\n    this.transcodingCheckClicked = true;\n    this.progressType = 'indeterminate';\n    this.loadingStatus = this.translate.instant('EDITOR.WAITING');\n    this.waitForTranscodeComplete();\n  }\n}\n","<!-- @format -->\n\n<ng-template #noClips>\n  <div class=\"no-clips ion-padding skinny-limit-width\">\n    <h1 class=\"text-uppercase\">\n      <span *ngIf=\"isCollaborative\">{{ 'COMMON.COLLABORATIVE' | translate }}</span>\n      {{ 'COMMON.STACK_STORY' | translate }}\n    </h1>\n    <div *ngIf=\"isMine || (isCollaborative && (canCollaborate || openInvite) ); else noEdit\">\n      <h2>{{ 'EDITOR.NO_CLIPS' | translate }}</h2>\n      <div class=\"ion-text-center\">\n        <fs-button buttonStyle=\"primary\" size=\"large\" (click)=\"addClips.emit()\">\n          {{ 'CLIP.ADD_CLIPS' | translate }}\n          <ion-icon *ngIf=\"!isSaving\" slot=\"end\" name=\"add-outline\"></ion-icon>\n        </fs-button>\n      </div>\n    </div>\n    <ng-template #noEdit>\n      {{ 'EDITOR.NO_EDIT' | translate }}\n    </ng-template>\n  </div>\n  <!-- <div class=\"no-clips-image skinny-limit-width\">\n    <img src=\"assets/images/stack-placeholder.png\" draggable=\"false\" />\n  </div> -->\n</ng-template>\n\n<ion-reorder-group (ionItemReorder)=\"doReorder($event)\" [disabled]=\"disableReorder || (!isMine && !canCollaborate)\">\n  <ion-item-sliding \n    *ngFor=\"let clip of items; let i = index; trackBy: trackByStackItem\" \n    [disabled]=\"!isMine && userId !== clip?.userId\"\n    #slidingItem>\n    <!-- \n      finally figured out what happened to the transcoding progress indicators...\n      when we changed the code to create the item in DB before it was done transcoding,\n      the clipAPI.createClip method deleted the  ___\n      just figured out why the Editor transcoding progress hasn't been working... ugg. \n      i was triggering the capture item component based on a property that i was deleting when creating in DB... \n      and in Javascript that mutates the object, which was changing the source\n    -->\n    <app-my-stack-item\n      *ngIf=\"clip?.hlsSrc || clip?.sources?.length > 0; else uploadingItem\"\n      [attr.data-id]=\"clip?.projectId + '/' + clip?.id\"\n      [attr.data-index]=\"i\"\n      [clip]=\"clip\"\n      [index]=\"i\"\n      [playlistLength]=\"clips.length\"\n      [currentIndex]=\"currentIndex\"\n      [isPreviewOpen]=\"isPreviewOpen\"\n      [isVideoPlaying]=\"isVideoPlaying\"\n      [slidingItem]=\"slidingItem\"\n      [isAdmin]=\"isAdmin\"\n      [isMyStack]=\"isMine\"\n      [isMyClip]=\"userId === clip?.userId\"\n      (playClipIndex)=\"onPlayClipIndex($event)\"\n      (pauseClipIndex)=\"onPauseClipIndex($event)\"\n      (deleteClipIndex)=\"deleteClipByIndex($event)\"\n      (moveTop)=\"onMoveTop($event)\"\n      (moveBottom)=\"onMoveBottom($event)\"\n      class=\"draggable-item\"\n    ></app-my-stack-item>\n\n    <ng-template #uploadingItem>\n      <app-my-stack-capture-item\n        [clip]=\"clip\"\n        [index]=\"i\"\n        [attr.data-index]=\"i\"\n        [currentIndex]=\"currentIndex\"\n        [isPreviewOpen]=\"isPreviewOpen\"\n        [slidingItem]=\"slidingItem\"\n        (deleteClipIndex)=\"deleteClipByIndex($event)\"\n        class=\"draggable-item\"\n      ></app-my-stack-capture-item>\n    </ng-template>\n  </ion-item-sliding>\n</ion-reorder-group>\n\n<div *ngIf=\"clips?.length > 0; else noClips\" class=\"editor-actions\">\n  <!-- show the last updated -->\n  <div *ngIf=\"stack.dteSaved || stack.updatedBy\" class=\"editor-status ion-text-center\">\n    <i>{{ 'COMMON.LAST_UPDATED' | translate }} </i> \n    <b *ngIf=\"stack.dteSaved\">{{  stack.dteSaved | date:'medium' }} </b>\n    <i *ngIf=\"stack.updatedBy\">{{ 'COMMON.BY' | translate }} </i>\n    <b *ngIf=\"stack.updatedBy\">{{ stack.updatedBy }}</b>\n  </div>\n  <div class=\"editor-actions--buttons\">  \n    <!-- Sort by Date is not working - we are not capturing the file date correctly durion iOS Filestack upload\n    <ion-button (click)=\"sortDate()\">\n      <ion-icon slot=\"start\" name=\"funnel-outline\"></ion-icon>\n      {{ 'EDITOR.SORT_DATE' | translate }}\n    </ion-button> -->\n\n    <!-- todo: make this sort ONLY YOUR CLIPS if !isMine\n    *ngIf=\"isMine || (isCollaborative && canCollaborate)\"  -->\n    <ion-button *ngIf=\"isMine\" (click)=\"sortByTitle()\" fill=\"clear\">\n      <ion-icon slot=\"start\" name=\"funnel-outline\"></ion-icon>\n      {{ 'EDITOR.SORT_TITLE' | translate }}\n    </ion-button>\n    \n    <ion-button *ngIf=\"isMine\" (click)=\"clearStack()\" color=\"secondary\" fill=\"clear\">\n      <ion-icon slot=\"start\" name=\"remove-circle-outline\"></ion-icon>\n      {{ 'EDITOR.REMOVE_ALL_CLIPS' | translate }}\n    </ion-button>\n  </div>\n  <div class=\"editor-actions--buttons\">\n    <ion-button *ngIf=\"isMine || (!stack.dtePublished && isCollaborative && canCollaborate) else startNewStack\" [disabled]=\"isSaving\" (click)=\"addClips.emit()\" color=\"primary\" size=\"large\" fill=\"outline\">\n      <!-- {{ 'EDITOR.SAVE_COLLABORATIVE_DRAFT' | translate }} -->\n      {{ 'CLIP.ADD_CLIPS' | translate }}\n      <!-- <ion-spinner *ngIf=\"isSaving\" slot=\"end\" name=\"crescent\" style=\"margin-left:4px;\"></ion-spinner> -->\n      <ion-icon *ngIf=\"!isSaving\" slot=\"end\" name=\"add-outline\"></ion-icon>\n    </ion-button>\n    <ng-template #startNewStack>\n      <div *ngIf=\"stack.dtePublished\" class=\"watch-stack ion-padding-bottom\">\n        <span class=\"bright\">{{ 'STACK.STACK_PUBLISHED' | translate }}</span>\n        <ion-button [routerLink]=\"[watchRoute, stack.projectId, stack.stackId]\" color=\"primary\" fill=\"clear\">\n          {{ 'PLAYER.WATCH_IT' | translate }}\n          <ion-icon slot=\"start\" name=\"play\"></ion-icon>\n        </ion-button>\n          <!-- {{ stack?.shareUrl }} -->\n      </div>\n      <div *ngIf=\"openInvite\" class=\"join-crew ion-padding\">\n        <ion-button (click)=\"acceptInvite.emit()\" color=\"primary\">\n          {{ 'FILE_UPLOAD.JOIN_CREW_UPLOAD_CLIPS' | translate }}\n          <ion-icon slot=\"end\" name=\"add\"></ion-icon>\n        </ion-button>\n      </div>\n      <!-- MVP-1342 not needed here, it's in the FAB..\n      <div *ngIf=\"userId\" class=\"re-stack\">\n        <ion-button (click)=\"newStack.emit()\" color=\"primary\" fill=\"outline\">\n          {{ 'EDITOR.CREATE_NEW_STACK' | translate }}\n        </ion-button>\n      </div> -->\n      <div class=\"re-stack\">\n        <p>{{ 'STACK.RESTACK_HINT' | translate }}</p>\n        <ion-button (click)=\"reStack.emit()\" color=\"primary\" fill=\"outline\">\n          {{ 'STACK.ACTIONS.RESTACK_NEW_DRAFT' | translate }}\n          <!-- <ion-icon *ngIf=\"!isSaving\" slot=\"end\" name=\"save-outline\"></ion-icon> -->\n        </ion-button>\n      </div>\n    </ng-template>\n  </div>\n</div>\n\n <!-- With or without clips, no matter -->\n <div *ngIf=\"isMine\" class=\"margin-top ion-padding-top ion-text-center\">\n  <div *ngIf=\"isCollaborative else mineNotCollab\" class=\"share\">\n    <h3>{{ 'STACK.PUBLIC_COLLAB_DRAFT' | translate }} &mdash; {{ 'STACK.COLLAB_INVITE_HEADING' | translate }}</h3>\n\n    <!--       \n    What should happen: I make the draft collaborative and then a modal pops up asking if I \n    “ready to add clips to this collaborative draft?” \n    Or \n    “I'll come back to this collaborative draft later”\n    … this would help me avoid feeling that I should “publish” the draft, \n    which ends the collaborative aspect prematurely. -->\n\n    <div *ngIf=\"collabShareUrl\">\n      <p class=\"no-top-margin\">\n        {{ 'STACK.COLLAB_INVITE_TEXT' | translate }}\n      </p>\n      \n      <ion-button fill=\"outline\" (click)=\"showingQr = !showingQr\"\n        [title]=\"('COMMON.TOGGLE' | translate) + ' ' + ('ONBOARDING.COMMON.QR_CODE' | translate)\">\n        <span *ngIf=\"!showingQr\">{{ 'COMMON.SHOW' | translate }}</span>\n        <span *ngIf=\"showingQr\">{{ 'COMMON.HIDE' | translate }}</span>\n        &nbsp;{{ 'ONBOARDING.COMMON.QR_CODE' | translate }}\n        <ion-icon *ngIf=\"!showingQr\" name=\"chevron-down-outline\"></ion-icon>\n        <ion-icon *ngIf=\"showingQr\" name=\"chevron-up-outline\"></ion-icon>\n      </ion-button>\n      <app-qr-code *ngIf=\"showingQr\" [qrCode]=\"collabShareUrl\"></app-qr-code>\n      <!-- \n        todo: how to implement a named input and pass readonly attr to fs-input? (how to accomplish the below?)\n        your crew now has access, here's a link to share via email\n      -->\n      <!-- <fs-input #inputShareUrl label=\"Share URL\" [value]=\"[shareUrl]\"></fs-input> -->\n      <ion-item class=\"share--item\" lines=\"none\">\n        <ion-input #inputShareUrl readonly selectAllOnClick [value]=\"collabShareUrl\"\n        labelPlacement=\"stacked\" [label]=\"'EDITOR.SHARE_COLLABORATIVE_DRAFT' | translate\"></ion-input>\n        <ion-button slot=\"end\" shape=\"round\" (click)=\"copyLink()\"\n          [title]=\"'SOCIAL.COPY_TO_CLIPBOARD' | translate\">\n          <ion-icon name=\"link\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n      </ion-item>\n\n      <p>{{ 'EDITOR.COLLAB_INSTRUCT_REMOVE' | translate }}</p>\n      <ion-button fill=\"clear\" color=\"secondary\" class=\"share--action-btn\" (click)=\"removeCrew()\">\n        <ion-icon slot=\"start\" name=\"person-remove-outline\"></ion-icon>\n        {{ 'STACK.ACTIONS.REMOVE_CREW' | translate }}\n      </ion-button>\n    </div>\n  </div>\n  <ng-template #mineNotCollab>\n    <!-- not needed, handled in stack-edit  -->\n    <div *ngIf=\"stack && stack.stackId && !stack.dtePublished\" class=\"ion-padding-bottom\">\n      <h3>{{ 'STACK.DRAFT_INVITE' | translate }}</h3>\n      <div class=\"ion-text-center\">\n        <fs-button buttonStyle=\"outline\" (click)=\"inviteCrew()\">\n          <!-- {{ 'COMMON.LEARN_MORE' | translate }} -->\n          {{ 'STACK.ACTIONS.INVITE_CREW' | translate }}\n        </fs-button>\n      </div>\n    </div>\n  </ng-template>\n\n  <div class=\"editor-actions--buttons ion-padding-top ion-margin-top\">\n    <ion-button *ngIf=\"clips?.length > 0\" (click)=\"continuePublish.emit(true)\" color=\"primary\" size=\"large\">\n      {{ 'COMMON.CONTINUE_PUBLISH' | translate }}\n      <ion-icon slot=\"end\" name=\"send\"></ion-icon>\n    </ion-button>\n  </div>\n</div>\n\n<!-- <my-stack-list-item *ngFor=\"let clip of clips; index as i; trackBy: trackByStackItem\" \n[attr.data-id]=\"clip?.projectId + '/' + clip?.id\" \n[clip]=\"clip\" [index]=\"i\"\n[currentIndex]=\"currentIndex\"\n[isPreviewOpen]=\"isPreviewOpen\"\n(playClipIndex)=\"onPlayClipIndex($event)\"\n(deleteClipIndex)=\"delete($event)\"\nclass=\"draggable-item\"> -->\n","/** @format */\n\nimport { Component, OnInit, Input, ViewChild, Output, EventEmitter, ElementRef, OnDestroy } from '@angular/core';\nimport { NgIf, NgFor, DatePipe } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport {\n  IonReorderGroup,\n  AlertController,\n  ModalController,\n  ItemReorderCustomEvent,\n  IonIcon,\n  IonButton,\n  IonItem,\n  IonInput,\n} from '@ionic/angular/standalone';\nimport { IonItemSliding } from '@ionic/angular/standalone';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { ConfigService } from '@app/core/config/config.service';\nimport { EventsService } from '@app/core/services/events.service';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { SHARING_METHOD } from '@app/core/social-sharing/social-sharing.model';\nimport { SocialSharingService, socialSharingServiceProvider } from '@app/core/social-sharing/social-sharing.service';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.component';\nimport { SelectInputOnClickDirective } from '@app/shared/directives/select-input-on-click.directive';\nimport { Utils } from '@app/shared/utils';\nimport { StackService } from '@app/stacks/shared/services/stack.service';\nimport { CollabModalComponent } from '@app/stacks/shared/components/collab-modal/collab-modal.component';\nimport { TRANSLATE_ROOT } from '@app/onboarding/shared/onboarding.model';\nimport { QrCodeComponent } from '@app/tokens/shared/components/qr-code/qr-code.component';\nimport { WATCH_ROUTE } from '@app/app.routes';\nimport { MyStackItemComponent } from './my-stack-item/my-stack-item.component';\nimport { MyStackCaptureItemComponent } from './my-stack-capture-item/my-stack-capture-item.component';\n\nconst DEBUG_LOGS = false;\n/**\n * Scroll to the current item when playing\n * Does work, but disabling due to poor UX if you are editing while it's playing\n */\nconst ENABLE_SCROLL_TO_ITEM = false;\n/** the px height of each item, for scrollTop calc */\nconst ITEM_EL_HEIGHT = 78;\nconst PAGE = '[MyStack]';\n\n@Component({\n  selector: 'app-my-stack',\n  templateUrl: './my-stack.component.html',\n  styleUrls: ['./my-stack.component.scss'],\n  providers: [socialSharingServiceProvider],\n  standalone: true,\n  imports: [\n    NgIf,\n    NgFor,\n    RouterLink,\n    ButtonComponent,\n    MyStackItemComponent,\n    MyStackCaptureItemComponent,\n    QrCodeComponent,\n    SelectInputOnClickDirective,\n    DatePipe,\n    TranslatePipe,\n    IonIcon,\n    IonReorderGroup,\n    IonItemSliding,\n    IonButton,\n    IonItem,\n    IonInput,\n  ],\n})\nexport class MyStackComponent implements OnInit, OnDestroy {\n  @Input() stack: Stack;\n  @Input() userId: string = '';\n  @Input() isSaving: boolean = false;\n  @Input() isMine: boolean = false;\n  @Input() isCollaborative: boolean = false;\n  @Input() openInvite: boolean = false;\n  @Input() canCollaborate: boolean = false;\n  @Input() isPreviewOpen: boolean = false;\n  @Input() isVideoPlaying: boolean = false;\n  @Input() disableReorder: boolean = false;\n  @Input() playerId: string = 'my-stack-player';\n  @Input() scrollContainer: ElementRef;\n\n  @Input() //clips: Clip[];\n  set clips(val: Clip[]) {\n    DEBUG_LOGS && console.log(`${PAGE} clips updated:`, val);\n    if (Array.isArray(val)) {\n      this._clips = val.filter((clip) => clip && clip.id && clip.projectId);\n      this.items = this._clips;\n    }\n  }\n  get clips() {\n    return this._clips;\n  }\n\n  @Input() // currentIndex: number;\n  set currentIndex(val: number) {\n    DEBUG_LOGS && console.log(`${PAGE} currentIndex updated:`, val);\n    this._currentIndex = val;\n    this.scrollToItem(val);\n  }\n  get currentIndex() {\n    return this._currentIndex;\n  }\n\n  @Output() playClipIndex = new EventEmitter<number>();\n  @Output() pauseClipIndex = new EventEmitter<number>();\n  @Output() closePreviewPlayer = new EventEmitter<boolean>();\n  @Output() continuePublish = new EventEmitter<boolean>();\n  @Output() saveStack = new EventEmitter<void>();\n  @Output() reStack = new EventEmitter<void>();\n  @Output() newStack = new EventEmitter<void>();\n  @Output() acceptInvite = new EventEmitter<void>();\n  @Output() addClips = new EventEmitter<void>();\n\n  /** build the url onInit based on appConfig */\n  collabShareUrl = window?.location?.href ?? '';\n\n  showingQr = false;\n  watchRoute = '/' + WATCH_ROUTE;\n  translatePath = TRANSLATE_ROOT;\n\n  /**\n   * The actual items to reorder, which should be different from the clips Input\n   */\n  public items: Clip[] = [];\n\n  /** Saving the isAdmin to pass to children (HLS Transcode MVP-742) */\n  isAdmin = false;\n\n  @ViewChild(IonReorderGroup) reorderGroup: IonReorderGroup;\n\n  // not used for now, passing isMine & isCollaborative as Inputs\n  // stack$ = this.store.select(selectMyStack);\n\n  private _clips: Clip[] = [];\n  private _currentIndex: number = 0;\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private store: Store<State>,\n    private alertCtrl: AlertController,\n    private translate: TranslateService,\n    private userService: UserService,\n    private mystackService: MyStackService,\n    private toaster: ToasterService,\n    private modalCtrl: ModalController,\n    private stackService: StackService,\n    private socialSharingService: SocialSharingService,\n    private configService: ConfigService,\n    private events: EventsService\n  ) {}\n\n  ngOnInit() {\n    /**\n     * Check currentUser Cognito Groups for Admin access to platform\n     */\n    this.userService.userIsGlobalAdmin$\n      .pipe(\n        takeUntil(this.onDestroy$)\n        // filter((isAdmin) => isAdmin)\n      )\n      .subscribe((isAdmin) => {\n        // console.log(`sub userGroups isAdmin:`, { isAdmin, stack: this.clip });\n        this.isAdmin = !!isAdmin;\n      });\n\n    setTimeout(() => {\n      // wait for stack to exist..\n      this.calcCollabShareUrl();\n    }, 900);\n  }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  async calcCollabShareUrl() {\n    const appConfig = await this.configService.appConfig;\n    // will the stack alwaysd exist here?\n    DEBUG_LOGS && console.log('appConfig', { appConfig, stack: this.stack });\n    this.collabShareUrl =\n      this.stack?.stackId && this.stack?.isCollaborative && !this.stack?.dtePublished && appConfig.stackShareUrl\n        ? `${appConfig.stackShareUrl}${this.stack.projectId}/${this.stack.stackId}`\n        : window?.location?.href ?? '';\n    //return this.stack?.stackId ? `${host}/${EDIT_ROUTE}/${this.stack.stackId}` : '';\n  }\n\n  /**\n   * move index to top - one of the items just emitted\n   */\n  onMoveTop(index: number) {\n    const clips = [...this.clips];\n    // arrayMove(arr, fromIndex, toIndex): in-place arr\n    Utils.arrayMove(clips, index, 0);\n    console.log(`onMoveTop`, { clips, fromIndex: index, toIndex: 0 });\n    this.mystackService.reorderClips(clips);\n  }\n  onMoveBottom(index: number) {\n    const clips = [...this.clips];\n    // arrayMove(arr, fromIndex, toIndex): in-place arr\n    Utils.arrayMove(clips, index, clips.length - 1);\n    console.log(`onMoveBottom`, { clips, fromIndex: index, toIndex: clips.length - 1 });\n    this.mystackService.reorderClips(clips);\n  }\n\n  onPlayClipIndex(index: number) {\n    DEBUG_LOGS && console.log(`${PAGE} onPlayClipIndex [${index}]`);\n    this.playClipIndex.emit(index);\n  }\n\n  onPauseClipIndex(index: number) {\n    DEBUG_LOGS && console.log(`${PAGE} onPauseClipIndex [${index}]`);\n    this.pauseClipIndex.emit(index);\n  }\n\n  deleteClip(slidingItem: IonItemSliding, index: number, clip: Clip) {\n    DEBUG_LOGS && console.log(`${PAGE} deleteClip [${index}]`);\n    this.deleteClipByIndex(index);\n    slidingItem.close();\n    this.toaster.present(`Removed '${clip.title}' from Editor`);\n  }\n\n  deleteClipByIndex(index: number) {\n    if (typeof index === 'number' && index >= 0) {\n      DEBUG_LOGS && console.log(`${PAGE} deleteClipByIndex: ${index}`);\n      this.mystackService.removeClipByIndex(index);\n    } else {\n      console.warn(`${PAGE} deleteClipByIndex !number?`, index);\n    }\n  }\n\n  sortByTitle() {\n    try {\n      this.mystackService.sortByTitle(this.clips);\n    } catch (error) {\n      console.warn(error);\n      this.toaster.present(`Uh oh! We ran into an issue - please try again.`);\n    }\n  }\n  sortDate() {\n    try {\n      this.mystackService.sortDate(this.clips);\n    } catch (error) {\n      console.warn(error);\n      this.toaster.present(`Uh oh! We ran into an issue - please try again.`);\n    }\n  }\n\n  // trimClip(slidingItem: IonItemSliding, index: number, clip: Clip) {\n  //   console.log(`${PAGE} TODO: trimClip [${index}]`, clip);\n  //   slidingItem.close();\n  //   // this.toaster.present('Trim Clip Feature Coming Soon...');\n  // }\n\n  clearStack() {\n    this.confirmClearStack();\n  }\n\n  async confirmClearStack() {\n    const confirm = await this.alertCtrl.create({\n      header: this.translate.instant('EDITOR.CLEAR_EDITOR'),\n      message: this.translate.instant('EDITOR.CLEAR_EDITOR_MESSAGE'),\n      cssClass: 'confirm-alert',\n      buttons: [\n        {\n          text: this.translate.instant('COMMON.CANCEL'),\n          cssClass: 'alert-button-cancel',\n          handler: () => {\n            // console.log('Cancel, do nothing');\n          },\n        },\n        {\n          text: this.translate.instant('EDITOR.CLEAR_CLIPS'), //'Clear Clips',\n          cssClass: 'alert-button-warning',\n          handler: () => {\n            DEBUG_LOGS && console.log('Ok, it gone. bye bye.');\n            this.mystackService.clearAllClips();\n            this.closePreviewPlayer.emit(true);\n          },\n        },\n      ],\n    });\n    return await confirm.present();\n  }\n\n  trackByStackItem(index: number, obj: Clip): string {\n    if (!obj || !obj.id) {\n      return `${Math.floor(Math.random() * 1000)}`; // random number between 0 and 1000\n    }\n\n    if (obj.projectId) {\n      return `${obj.projectId}/${obj.id}`;\n    } else {\n      return `${Math.floor(Math.random() * 100)}/${obj.id}`;\n    }\n  }\n\n  /**\n   *  Ionic Reorder (https://ionicframework.com/docs/api/reorder)\n   */\n  doReorder(ev: ItemReorderCustomEvent) {\n    if (!ev || !ev.detail || typeof ev.detail.from !== 'number' || typeof ev.detail.to !== 'number') {\n      console.warn(`${PAGE} doReorder event not correct - missing from/to`, ev);\n      return;\n    }\n    // MVP-914 When the user interacts with the clips (dragging, etc) the preview window should close automatically\n    // and pause..\n    this.pauseClipIndex.emit(this.currentIndex); // this calls pauseClipIndev\n    // this.closePreviewPlayer.emit(true);\n\n    // The `from` and `to` properties contain the index of the item\n    // when the drag started and ended, respectively\n    DEBUG_LOGS && console.log(`Dragged from index '${ev.detail.from}' to '${ev.detail.to}'`);\n\n    // Before complete is called with the items they will remain in the\n    // order before the drag\n    // console.log('Before complete', this.items);\n\n    // Finish the reorder and position the item in the DOM based on\n    // where the gesture ended. Update the items variable to the\n    // new order of items\n    this.items = ev.detail.complete(this.items);\n\n    // After complete is called the items will be in the new order\n    // console.log('After complete', this.items);\n\n    // const changeEvt: ReorderStackClips = {\n    //   from: ev.detail.from,\n    //   to: ev.detail.to,\n    //   clips: this.items,\n    // };\n    this.mystackService.reorderClips(this.items);\n  }\n\n  toggleReorderGroup() {\n    this.reorderGroup.disabled = !this.reorderGroup.disabled;\n  }\n\n  scrollToItem(index: number) {\n    if (!ENABLE_SCROLL_TO_ITEM) return;\n    if (!this.scrollContainer) {\n      console.log(`${PAGE} scrollToItem missing scrollContainer`, this.scrollContainer);\n      return;\n    }\n    // const els = document.querySelectorAll(`[data-index='${index}']`);\n    try {\n      const scrollSpeed = 1100;\n      // subtract 1 to keep one played item above, instead of current at top\n      const scrollTop = index === 0 ? 0 : (index - 1) * ITEM_EL_HEIGHT;\n      Utils.smoothScrollTo(this.scrollContainer, scrollTop, scrollSpeed);\n    } catch (error) {\n      console.error('Scroll to item failed', error);\n    }\n  }\n\n  copyLink() {\n    this.socialSharingService\n      .shareTo(\n        {\n          id: this.stack.stackId,\n          title: this.stack.title,\n          description: this.stack.description,\n          shareUrl: this.collabShareUrl,\n          // tags: ['CreateTogether'],\n          type: ITEM_TYPE.Stacks,\n        },\n        SHARING_METHOD.CLIPBOARD\n      )\n      .then((result) => {\n        console.log(result);\n      })\n      .catch((error) => {\n        console.error(error);\n      });\n  }\n\n  async inviteCrew() {\n    const modal = await this.modalCtrl.create({\n      component: CollabModalComponent,\n      componentProps: {\n        stack: this.stack,\n      },\n    });\n    modal.present();\n    const { data } = await modal.onWillDismiss();\n    console.log(`Modal dismissed`, data);\n    // if (data) // if true, it was done... do we care?\n  }\n\n  removeCrew() {\n    this.stackService.removeCollaborative(this.stack.projectId, this.stack.stackId);\n  }\n}\n","<!-- @format -->\n\n<ion-header>\n  <ng-container *ngIf=\"stack$ | async as stack; else noStack\">\n    <app-top-navbar \n      [title]=\"stack.title === '' ? ('EDITOR.START_STACK' | translate) : stack.title\"\n      [backButtonReturnUrl]=\"returnUrl\"\n      [drawerEnabled]=\"true\"\n      [drawerOpenOnLoad]=\"drawerOpenOnLoad && !stackId\"\n      [showtitleActionButton]=\"!stackId\"\n      [drawerExpandEvent]=\"topDrawerExpand$ | async\"\n      [drawerCloseEvent]=\"topDrawerClose$ | async\"\n      (drawerExpand)=\"draftDrawerExpanded($event)\"\n      (drawerClose)=\"draftDrawerExpanded($event)\"\n    ></app-top-navbar>\n\n    <div *ngIf=\"!isPreviewOpen\" class=\"top-action-btns\">\n      <!-- 2023-17 add description -->\n      <div *ngIf=\"stack.description else defaultDesctext\" class=\"stack-description\">\n        {{ stack.description }}\n      </div>\n      <!-- \n        if isCollab && isMine\n          Add your Clips to this Story!\n          EDITOR.INSTRUCT_MINE\n\n        elseif isCollab !isMine\n          Add your clips to this story and help find the best order. \n          Only the owner can publish. \n\n        else if isMine\n          if !hasClips -> Add your Clips to this Story!\n          EDITOR.INSTRUCT_MINE\n\n        else\n          blank except for stack?.description\n      -->\n      <ng-template #defaultDesctext>\n        <div class=\"stack-description default-text\">\n          <div *ngIf=\"isCollaborative else notCollabDescText\">\n            <ng-container *ngIf=\"isMine else notMineCollabDescText\">\n              {{ 'EDITOR.INSTRUCT_MINE' | translate }}\n            </ng-container>\n            <ng-template #notMineCollabDescText>\n              <!-- Add your clips to this story and help find the best order. \n          Only the owner can publish.  -->\n              {{ 'EDITOR.ADD_TO_STORY_COLLAB' | translate }}\n            </ng-template>\n          </div>\n          \n          <ng-template #notCollabDescText>\n            <div *ngIf=\"isMine\">\n              <div *ngIf=\"hasStackClips else notCollabNoClipsText\">\n                <!-- Continue to change poster or description, finally Publish. -->\n                <!-- Add & order clips, before continuing to title and poster -->\n                {{ 'EDITOR.INSTRUCT_MINE' | translate }}\n              </div>\n              <ng-template #notCollabNoClipsText>\n                {{ 'EDITOR.ADD_TO_STORY' | translate }}\n              </ng-template>\n            </div>\n            <div *ngIf=\"!isMine\">\n              {{ 'STACK.DRAFT_NOT_COLLAB_DESC' | translate }}\n            </div>\n          </ng-template>\n        \n        </div>\n      </ng-template>\n\n      <!-- <ion-buttons slot=\"end\"> -->\n        <!-- at xs break point, only publish icon -->\n        <!-- disabled= || !stackFormDetails || !stackFormDetails.createForm || !stackFormDetails.createForm.valid -->\n  \n        <ng-container *ngIf=\"stackId else noStackBtn\">\n          <ng-container *ngIf=\"!isPreviewOpen\">\n            <!-- 2022-11-02 changed to be the same for both.. -->\n            <!-- 2023-07-27 don't allow save  -->\n            <ion-button\n              *ngIf=\"isMine || (isCollaborative && canCollaborate && !isPublished) else startNewStack\"\n              fill=\"outline\"\n              class=\"icon-padding\"\n              [disabled]=\"isSaving || !hasStackClips || (!isMine && !canCollaborate)\"\n              (click)=\"saveStack()\"\n            >\n              <ion-spinner *ngIf=\"isSaving\" slot=\"icon-only\" name=\"crescent\"></ion-spinner>\n              <ion-icon *ngIf=\"!isSaving\" slot=\"icon-only\" name=\"save-outline\"></ion-icon>\n            </ion-button>\n            <ng-template #startNewStack>\n              <ion-button *ngIf=\"stack.dtePublished\" [routerLink]=\"[watchRoute, stack.projectId, stack.stackId]\" color=\"primary\" fill=\"clear\">\n                {{ 'COMMON.WATCH' | translate }}\n                <ion-icon slot=\"start\" name=\"play\"></ion-icon>\n              </ion-button>\n\n              <!-- remove ReStack button from top MVP-1342 -->\n              <!-- <ion-button *ngIf=\"!openInvite && hasStackClips\"\n                (click)=\"addAllClipsToStack()\" \n                color=\"primary\" fill=\"outline\">\n                  {{ 'STACK.ACTIONS.RESTACK_NEW_DRAFT' | translate }}\n              </ion-button> -->\n              <ion-button *ngIf=\"!openInvite && !hasStackClips\"\n                (click)=\"newDraft()\" \n                color=\"primary\" fill=\"outline\">\n                  {{ 'EDITOR.CREATE_NEW_STACK' | translate }}\n                  <!-- <ion-icon *ngIf=\"!isSaving\" slot=\"end\" name=\"save-outline\"></ion-icon> -->\n              </ion-button>\n              <ion-button *ngIf=\"stack.isCollaborative && !isPublished && openInvite\"\n                (click)=\"captureDevice()\" \n                color=\"primary\">\n                  {{ 'FILE_UPLOAD.JOIN_CREW_UPLOAD_CLIPS' | translate }}\n                  <ion-icon slot=\"end\" name=\"add\"></ion-icon>\n              </ion-button>\n            </ng-template>\n\n            <ng-template #notMineContinueButton>\n              <ion-button *ngIf=\"isCollaborative && canCollaborate && !isPublished\"\n                (click)=\"captureDevice()\"\n              >\n                {{ 'EDITOR.FAB.ADD_CLIPS' | translate }}\n              </ion-button>\n            </ng-template>\n            \n            <!-- removed: disabled=\"... || hasStackClipTooLong\" -->\n            <!-- removed: disabled=\"... || hasStackClipsTranscoding\" (allow to save form data while transcoding) -->\n             <!-- added: MVP-1412 allow producers to publish drafts -->\n            <ion-button *ngIf=\"isMine || (isCollaborative && isProjAdmin) else notMineContinueButton\"\n              [disabled]=\"isPublishing || !hasStackClips\"\n              (click)=\"actionClick($event)\"\n            >\n              <ion-spinner *ngIf=\"isPublishing\" slot=\"start\" name=\"crescent\"></ion-spinner>\n              {{ 'COMMON.CONTINUE' | translate }}\n              <ion-icon slot=\"end\" name=\"send\"></ion-icon>\n              <!-- <span class=\"ion-hide-sm-down\">{{ 'COMMON.PUBLISH' | translate }}</span>\n              <ion-icon class=\"ion-hide-sm-down\" slot=\"end\" name=\"send\"></ion-icon>\n              <ion-icon class=\"ion-hide-sm-up\" slot=\"icon-only\" name=\"send\"></ion-icon> -->\n            </ion-button>\n\n            <!-- <ng-container *ngIf=\"stack.dtePublished\">\n            </ng-container> -->\n          </ng-container>\n        </ng-container>\n  \n        <ng-template #noStackBtn>\n          <!-- replaced with topnav[showtitleActionButton]=\"!stackId\" -->\n          <!-- <ion-button\n            fill=\"outline\"\n            color=\"primary\"\n            (click)=\"expandDraftDrawer(true)\"\n          >\n            {{ 'EDITOR.CREATE_NEW_STACK' | translate }}\n            <ion-icon slot=\"start\" name=\"arrow-up\"></ion-icon>\n          </ion-button> -->\n        </ng-template>\n      <!-- </ion-buttons> -->\n    \n    \n    </div>\n\n    <div *ngIf=\"isPreviewOpen\" class=\"close-preview-btn\">\n      <ion-button fill=\"outline\" color=\"light\" (click)=\"closePreview()\">\n        <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n      </ion-button>\n    </div>\n\n  </ng-container>\n</ion-header>\n\n<section *ngIf=\"stack$ | async as stack\">\n  <div *ngIf=\"hasStackClips\" class=\"player-wrap\" [class.player-wrap--closed]=\"!isPreviewOpen\">\n    <app-video-player\n      [playerId]=\"playerId\"\n      [playlist]=\"stack.clips\"\n      [currentIndex]=\"currentPlaylistIndex$ | async\"\n      [autoplay]=\"isPreviewOpen\"\n      [fullscreen]=\"false\"\n      [handlePlaylistDone]=\"false\"\n      (playerHeight)=\"onPlayerHeight($event)\"\n      (videoDone)=\"onPlayerEnded($event)\"\n      (videoPlaying)=\"isVideoPlaying = $event\"\n      (playlistDone)=\"onPlaylistDone($event)\"\n    ></app-video-player>\n  </div>\n  \n</section>\n\n<ion-content #content>\n  <div class=\"col-md-8 offset-md-2 col-xl-6 offset-xl-3\">\n    <ng-container *ngIf=\"stack$ | async as stack\">\n      <div *ngIf=\"stack.stackId else noStackId\">\n\n        <app-my-stack \n          [stack]=\"stack\"\n          [clips]=\"stack.clips\" \n          [currentIndex]=\"currentPlaylistIndex$ | async\"\n          [isPreviewOpen]=\"isPreviewOpen\"\n          [isVideoPlaying]=\"isVideoPlaying\"\n          [disableReorder]=\"false\"\n          [playerId]=\"playerId\"\n          [isSaving]=\"isSaving\"\n          [isMine]=\"isMine\"\n          [userId]=\"userId$ | async\"\n          [isCollaborative]=\"!!stack?.isCollaborative\"\n          [canCollaborate]=\"canCollaborate\"\n          [openInvite]=\"openInvite\"\n          (playClipIndex)=\"onPlayClipIndex($event)\"\n          (pauseClipIndex)=\"onPauseClipIndex($event)\"\n          (closePreviewPlayer)=\"isPreviewOpen = false\"\n          (continuePublish)=\"continuePublish($event)\"\n          (saveStack)=\"saveStack()\"\n          (newStack)=\"newDraft()\"\n          (reStack)=\"restack()\"\n          (acceptInvite)=\"captureDevice()\"\n          (addClips)=\"captureDevice()\"\n        ></app-my-stack>\n\n        <!-- done in my-stack...\n        <div *ngIf=\"isMine && !hasStackClips && !stack?.isCollaborative && !stack.dtePublished\" class=\"ion-padding skinny-limit-width\">\n          <h3>{{ 'STACK.DRAFT_INVITE' | translate }}</h3>\n          <div class=\"ion-text-center\">\n            <fs-button buttonStyle=\"outline\" (click)=\"inviteCrew($event)\">\n              {{ 'COMMON.LEARN_MORE' | translate }}\n            </fs-button>\n          </div>\n        </div> -->\n\n        <!-- <div class=\"tab-bottom-spacer\"></div> -->\n\n        <app-capture-clip-button\n          [projectId]=\"stack.projectId\"\n          [startUpload]=\"captureClipEvent\"\n          (uploadSuccess)=\"captureSuccess($event)\"\n        ></app-capture-clip-button>\n\n        <!-- disabled the tutorial and opening fab instead MVP-1107\n        <fs-tutorial-tour\n          *ngIf=\"isTooltipShown\"\n          [placements]=\"placements\"\n          [backdropDismissal]=\"true\"\n          (tourCancel)=\"([])\"\n          (tourComplete)=\"([])\"\n        ></fs-tutorial-tour> -->\n\n      </div>\n      <ng-template #noStackId>\n        <div class=\"content-no-stack ion-padding-horizontal ion-margin-horizontal\">\n          <h1>\n            {{ 'EDITOR.START_STACK' | translate }} \n          </h1>\n          <h3> {{ 'EDITOR.EDITOR_DEFAULT_CONTENT' | translate }} </h3>\n        </div>\n      </ng-template>\n    </ng-container>\n    \n    <ng-template #noStack>\n      <p class=\"ion-text-center\">\n        {{ 'COMMON.LOADING' | translate }}\n      </p>\n    </ng-template>\n\n    \n    <div *ngIf=\"!hasMyClips && canCollaborate\" class=\"ion-text-center ion-margin ion-padding-top\">\n      <p *ngIf=\"(isLoggedIn$ | async) === true else notAuthedDiscoverText\">\n        {{ 'EDITOR.DISCOVER_CLIPS_INTRO' | translate }}\n        <ion-icon name=\"add-circle-outline\"></ion-icon>\n      </p>\n      <ng-template #notAuthedDiscoverText>\n        <p>\n          {{ 'EDITOR.DISCOVER_CLIPS_INTRO_SIGNUP' | translate }}\n        <ion-icon name=\"add-circle-outline\"></ion-icon>\n        </p>\n      </ng-template>\n      <fs-button buttonStyle=\"outline\" (click)=\"routeDiscover()\">\n        {{ 'EDITOR.ADD_CLIPS_FROM_DISCOVER' | translate }}\n      </fs-button>\n    </div>\n\n    <div *ngIf=\"isMine || canCollaborate\" class=\"ion-text-center ion-margin\">\n      <fs-button buttonStyle=\"clear\" [routerLink]=\"projectUrl\">\n        {{ 'PROJECT.SETTINGS.BACK_TO_PROJECT' | translate }}\n      </fs-button>\n    </div>\n    <div class=\"tab-bottom-spacer\"></div>\n  </div>\n\n</ion-content>\n\n<fs-tab-fab-container>\n  <ion-fab *ngIf=\"isTabFabShown\" class=\"tab-fab\" #tabFab>\n    <ion-fab-button>\n      <ion-icon name=\"add\"></ion-icon>\n    </ion-fab-button>\n    <ion-fab-list side=\"top\">\n      <!-- \n        Allow NEW_DRAFT if there’s a Stack AND hasClips AND ( it’s mine OR i can't collaborate) \n        or, not mine & not canCollab\n      -->\n      <ion-chip *ngIf=\"(stack$ | async)?.stackId && ((hasStackClips && (isMine || !canCollaborate) && !openInvite) || (!isMine && !(isCollaborative && canCollaborate)))\" \n        outline=\"true\" (click)=\"newDraft()\">\n        <ion-label>{{ 'EDITOR.FAB.NEW_DRAFT' | translate }}</ion-label>\n      </ion-chip>\n      <!-- remove these items from fab to simplify\n      <ion-chip outline=\"true\" (click)=\"routeStudio()\">\n        <ion-label>{{ 'EDITOR.FAB.STUDIO' | translate }}</ion-label>\n      </ion-chip>\n      <ion-chip *ngIf=\"stack && stack.projectId\" outline=\"true\" (click)=\"routeProject()\">\n        <ion-label>{{ 'COMMON.PROJECT' | translate }}</ion-label>\n      </ion-chip> -->\n      <ion-chip outline=\"true\" (click)=\"routeDiscover()\">\n        <ion-label>{{ 'EDITOR.ADD_CLIPS_FROM_DISCOVER' | translate }}</ion-label>\n      </ion-chip>\n      \n      <ion-chip *ngIf=\"showYoutubeFab\" outline=\"true\" (click)=\"captureYoutube($event)\">\n        <ion-label>{{ 'EDITOR.FAB.ONLINE' | translate }}</ion-label>\n      </ion-chip>\n      <ng-container *ngIf=\"isMine\">\n        <ion-chip *ngIf=\"isCollaborative else notCollaborative\" outline=\"true\" (click)=\"removeCrew($event)\">\n          <ion-label>{{ 'STACK.ACTIONS.REMOVE_CREW' | translate }}</ion-label>\n        </ion-chip>\n        <ng-template #notCollaborative>\n          <ion-chip outline=\"true\" (click)=\"inviteCrew($event)\">\n            <ion-label>{{ 'STACK.ACTIONS.INVITE_CREW' | translate }}</ion-label>\n          </ion-chip>\n        </ng-template>\n      </ng-container>\n\n      <ion-chip *ngIf=\"isMine || (isCollaborative && canCollaborate) || openInvite\" outline=\"true\" (click)=\"captureDevice()\">\n        <ion-label>{{ 'EDITOR.FAB.ADD_CLIPS' | translate }}</ion-label>\n        <!-- <ion-label>{{ 'EDITOR.FAB.MY_DEVICE' | translate }}</ion-label> -->\n      </ion-chip>\n    </ion-fab-list>\n  </ion-fab>\n</fs-tab-fab-container>\n","/**\n * @todo we need to handle the case where a user is not yet signed in\n * - it's a requirement that they sign up - otherwise there's no userId...\n *\n * @format\n */\n\nimport { ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { ActivatedRoute, NavigationEnd, Router, RouterLink } from '@angular/router';\nimport {\n  IonFab,\n  ModalController,\n  AlertController,\n  NavController,\n  IonHeader,\n  IonButton,\n  IonSpinner,\n  IonIcon,\n  IonContent,\n  IonFabButton,\n  IonFabList,\n  IonChip,\n  IonLabel,\n} from '@ionic/angular/standalone';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { BehaviorSubject, combineLatest, interval, Subject } from 'rxjs';\nimport { map, take, takeUntil, filter, distinctUntilChanged } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport * as mystackActions from '@store/actions/mystack.actions';\nimport * as stackActions from '@store/actions/stacks.actions';\nimport { addMember } from '@store/actions/projects.actions';\nimport { selectMyStack, selectMyStackCurrentClip, selectMyStackCurrentIndex } from '@store/selectors/mystack.selectors';\nimport { selectMyProjects } from '@store/selectors/projects.selectors';\nimport { getId, selectIdEdit } from '@store/selectors/stacks.selectors';\n\nimport { MAX_VIDEO_CAPTURE_LENGTH_SECONDS } from '@app/app.config';\nimport { ROOT_EDIT_URL, STUDIO_PAGE, DISCOVER_PAGE, WATCH_ROUTE, PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { PublishStackService } from '@app/core/services/publish-stack.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { TabFabContainerComponent } from '@app/shared/components/tab-fab-container/tab-fab-container.component';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.component';\nimport { TopNavbarComponent } from '@app/shared/components/top-navbar/top-navbar.component';\nimport { getDoneTranscoding } from '@app/shared/models/clip.model';\nimport { Stack, STACK_PRIVACY } from '@app/shared/models/stack.model';\nimport { Utils } from '@app/shared/utils';\nimport { ProjectMember, checkIsAdmin, isEventActive } from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { CaptureClipButtonComponent } from '@app/clips/shared/components/capture-clip-button/capture-clip-button.component';\nimport { CaptureClipModalComponent } from '@app/clips/shared/components/capture-clip-modal/capture-clip-modal.component';\nimport { StackService } from '@app/stacks/shared/services/stack.service';\nimport { CollabModalComponent } from '@app/stacks/shared/components/collab-modal/collab-modal.component';\nimport { PublishModalComponent } from '@app/stacks/shared/components/publish-modal/publish-modal.component';\nimport { PublishSuccessModalComponent } from '@app/stacks/shared/components/publish-success-modal/publish-success-modal.component';\nimport { PROJECT_MEMBER_ROLE } from '@app/project-members/shared/project-member.model';\nimport { PlansModalComponent } from '@app/billing/shared/components/plans-modal/plans-modal.component';\nimport { VideoPlayerService } from '@app/modules/video-player/shared/services/video-player.service';\nimport { VideoPlayerComponent } from '@app/modules/video-player/video-player.component';\nimport { MyStackComponent } from '@app/modules/my-stack/my-stack.component';\nimport { environment } from 'src/environments/environment';\n\nconst DEBUG_LOGS = false;\n/**\n * @note that this was not a desireable UX without further focus\n * if feature required, needs dev to resolve timing issues with the drawer OnInit\n */\nconst ENABLE_SHOW_DRAWER_ON_LOAD = false;\n/**\n * Show the Capture from YoutTube FAB\n * @todo: handle as popover component from Capture.page\n */\nconst SHOW_YOUTUBE_FAB = false;\n/** the purple one; else openFab */\nconst ENABLE_TOOLTIP = false;\nexport const STACK_EDIT_PLAYER_ID = 'stack-edit';\n\n@Component({\n  selector: 'app-stack-edit',\n  templateUrl: './stack-edit.page.html',\n  styleUrls: ['./stack-edit.page.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    RouterLink,\n    TopNavbarComponent,\n    VideoPlayerComponent,\n    MyStackComponent,\n    CaptureClipButtonComponent,\n    ButtonComponent,\n    TabFabContainerComponent,\n    AsyncPipe,\n    TranslatePipe,\n    IonHeader,\n    IonButton,\n    IonSpinner,\n    IonIcon,\n    IonContent,\n    IonFab,\n    IonFabButton,\n    IonFabList,\n    IonChip,\n    IonLabel,\n  ],\n})\nexport class StackEditPage implements OnInit, OnDestroy {\n  @ViewChild('tabFab') tabFab: IonFab;\n  @ViewChild('tabFab') tabFabEl: ElementRef;\n  @ViewChild('tabFabDetails') tabFabDetails: ElementRef;\n  // @ViewChild(StackFormDetails) stackForm: StackFormDetails;\n\n  watchRoute = '/' + WATCH_ROUTE;\n  /** Allowed to Edit */\n  // isAllowed = false;\n  isSaving = false;\n  isPublishing = false;\n  isPreviewOpen = false;\n  isVideoPlaying = false;\n  playerId = STACK_EDIT_PLAYER_ID;\n\n  userId$ = this.userService.userId$;\n  isLoggedIn$ = this.userService.isLoggedIn$;\n  returnUrl = '';\n  /** has clips */\n  hasStackClips = false;\n  /** has clips currently transcoding */\n  hasStackClipsTranscoding = false;\n  hasMyClips = false;\n  /** unused in template */\n  isStackLoading = false;\n  hasStackClipTooLong = false;\n  // setting these onInit so it can takeUntil onDestroy... necessary?\n  // segment$: Observable<string>;// = this.route.params.pipe(map((p) => p.segment || 'details'));\n  projectId: string; // = this.route.params.pipe(map((p) => p.projectId || ''));\n  stackId: string; // = this.route.params.pipe(map((p) => p.projectId || ''));\n\n  projectUrl = '';\n\n  stack$ = this.store.select(selectMyStack).pipe(\n    filter(Boolean)\n    /**\n     * @deprecated refactor in ngrx 7\n     * share({\n          connector: () => new ReplaySubject(1),\n          resetOnError: false,\n          resetOnComplete: false,\n          resetOnRefCountZero: false\n        })\n     */\n    // publishReplay(1),\n    // refCount()\n  );\n\n  currentPlaylistIndex$ = this.store.select(selectMyStackCurrentIndex);\n  currentClip$ = this.store.select(selectMyStackCurrentClip);\n\n  isTabFabShown = false;\n  // isTooltipShown = false;\n  // placements = [\n  //   { // will be translated OnInit\n  //     title: 'ADD CLIPS',\n  //     content: 'Capture video from your device or online, from your studio, or in our community.',\n  //     // add this OnInit too, to ensure tabfab exists\n  //     // el: () => this.tabFab && (this.tabFab as any).el,\n  //   },\n  // ];\n\n  /** note that this was not a desireable UX without further focus */\n  drawerOpenOnLoad = false;\n\n  topDrawerExpand$: BehaviorSubject<{ i: number; showCreateForm?: boolean }> = new BehaviorSubject({ i: 0 });\n  topDrawerClose$: BehaviorSubject<number> = new BehaviorSubject(0);\n\n  captureClipEvent: boolean;\n  // couldn't get this to work with the async in template to cause event...?\n  // private _captureClipSubject$: Subject<boolean> = new Subject();\n  // get captureClipEvent$(): Observable<boolean> {\n  //   return this._captureClipSubject$.asObservable();\n  // }\n\n  // get stackFormValid(): boolean {\n  //   return this.stackForm && this.stackForm.stackForm && this.stackForm.stackForm.valid;\n  // }\n\n  showYoutubeFab = SHOW_YOUTUBE_FAB;\n\n  isPublished = false;\n  // collaboration\n  isCollaborative = false;\n  canCollaborate = false;\n  openInvite = false;\n  inviteProjectEventActive = false;\n  isMine = false;\n  isProjAdmin = false;\n  myProjects$ = this.store.select(selectMyProjects);\n\n  private _incExpandEvent = 0;\n  private _incCloseEvent = 0;\n  private triggerTimeout;\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private store: Store<State>,\n    private translate: TranslateService,\n    private userService: UserService,\n    private videoPlayerService: VideoPlayerService,\n    private publishStackService: PublishStackService,\n    private stackService: StackService,\n    private mystackService: MyStackService,\n    private projectService: ProjectService,\n    private toaster: ToasterService,\n    private alertCtrl: AlertController,\n    private navCtrl: NavController,\n    private modalCtrl: ModalController,\n    private route: ActivatedRoute,\n    private router: Router,\n    private changeDetectorRef: ChangeDetectorRef\n  ) {\n    // has to be in constructor as OnINit only runs once, we need on all loads - INSTEAD: watch it, filtered OnINit\n    // const navigation = this.router.getCurrentNavigation();\n    // if (navigation?.extras?.state?.autoOpenCapture === true) {\n    //   // auto open capture\n    //   setTimeout(() => {\n    //     console.warn('autoOpenCapture');\n    //     this.captureDevice();\n    //   }, 600);\n    // }\n  }\n\n  ngOnInit() {\n    // :projectId/:stackId/:segment\n    // const routeParams$ = this.route.params.pipe(takeUntil(this.onDestroy$)); // shareReplay(1) causes issues when no params are passed...\n    // // if the route segment is included in the Segments enum, return that, else default Details\n    // this.segment$ = routeParams$.pipe(map((p) => (Object as any).values(Segment).includes(p.segment) ? p.segment : Segment.Details));\n    this.route.params.pipe(takeUntil(this.onDestroy$)).subscribe(({ stackId = '', projectId = '' }) => {\n      this.stackId = stackId;\n      this.projectId = projectId;\n      if (projectId && stackId && projectId !== 'video') {\n        // if first route, allow the stack to be set...\n        this.isStackLoading = true;\n        DEBUG_LOGS && console.log(`edit route selectId`, { projectId, stackId });\n        this.store.dispatch(stackActions.selectIdEdit({ projectId, stackId }));\n      }\n    });\n    this.route.queryParamMap\n      .pipe(\n        takeUntil(this.onDestroy$)\n        // filter((queryParams) => queryParams.get('returnUrl')?.length > 0)\n      )\n      .subscribe((queryParams) => {\n        this.returnUrl = queryParams.get('returnUrl');\n      });\n\n    let timeoutAutoCapture;\n    const checkCurrentNavForAutoCapture = () => {\n      if (this.router.getCurrentNavigation()?.extras?.state?.autoOpenCapture) {\n        !environment.production && console.log('nav says to autoOpenCapture..');\n        clearTimeout(timeoutAutoCapture);\n        // auto open capture\n        timeoutAutoCapture = setTimeout(() => {\n          this.captureDevice();\n        }, 600);\n      }\n    };\n\n    this.router.events.pipe(takeUntil(this.onDestroy$)).subscribe((event) => {\n      if (event instanceof NavigationEnd && event?.url?.startsWith('/stack/edit')) {\n        // DEBUG_LOGS &&\n        console.log(`router.events`, {\n          state: this.router.getCurrentNavigation()?.extras?.state,\n          extras: this.router.getCurrentNavigation()?.extras,\n          // event\n        });\n        checkCurrentNavForAutoCapture();\n      }\n    });\n    // but also do it now, as that doesn't pipe before first load\n    checkCurrentNavForAutoCapture();\n\n    // this.returnUrl = this.router.url;\n    // translate placements\n    // this.translate.get(['EDITOR.TUTORIAL.TITLE', 'EDITOR.TUTORIAL.CONTENT']).pipe(take(1))\n    //   .subscribe((res) => {\n    //     this.placements[0].title = res['EDITOR.TUTORIAL.TITLE'];\n    //     this.placements[0].content = res['EDITOR.TUTORIAL.CONTENT'];\n    //   }\n    // );\n\n    /**\n     * Watch the stack, if there's a stackId then it's editable\n     * route to edit url if not already there\n     */\n    combineLatest([\n      this.stack$.pipe(\n        distinctUntilChanged(\n          (a, b) => a && b && a.projectId === b.projectId && a.stackId === b.stackId && a.error === b.error\n        )\n      ),\n      this.store.select(selectIdEdit),\n    ])\n      .pipe(takeUntil(this.onDestroy$))\n      .subscribe(([stack, idEdit]) => {\n        !environment.production && console.log({ stack, idEdit });\n        const { stackId = '', projectId = '', error = '' } = stack;\n        // if this is not the one currently selected, we should be in a route -> load action\n        if (this.isStackLoading && idEdit === getId(projectId, stackId)) {\n          // this is our stack\n          this.isStackLoading = false;\n        } else if (this.isStackLoading) {\n          console.log(`isStackLoading && idEdit != mystackId`, { stack, idEdit });\n          // they are not equal - we do not need to update, there's a pending load\n          return;\n        }\n\n        this.projectUrl = projectId ? `/${PROJECT_DETAIL_ROUTE}/${projectId}` : '';\n        const isEditRoute = this.router.url.startsWith(ROOT_EDIT_URL);\n        if (error) {\n          // error: \"Stack not found: filmstacker-dev/jd_duplicating\n          console.log(`Warning: ${error}`);\n          this.store.dispatch(mystackActions.reset());\n          if (isEditRoute) {\n            this.navigateNoAnimation(ROOT_EDIT_URL);\n          }\n          return;\n        }\n        const url = projectId && stackId ? `${ROOT_EDIT_URL}/${projectId}/${stackId}` : ROOT_EDIT_URL;\n        DEBUG_LOGS &&\n          console.log(`Edit Stack redirect if '${isEditRoute}' [${stack.stackId}]:`, {\n            url,\n            routerUrl: this.router.url,\n            stack,\n          });\n        if (isEditRoute && projectId && stackId) {\n          this.navigateNoAnimation(url); // doesn't work unless you're on the edit page\n          // } else if (isEditRoute && (!projectId && this.projectId) || (!stackId && this.stackId)) {\n          //   // let's not do this, seems buggy... let the error property resolve instead\n          //   // this stack was not found, remove from route\n          //   this.navigateNoAnimation(ROOT_EDIT_URL);\n        }\n      });\n    // doing this in app.component instead\n    // setTimeout(() => {\n    //   // this is required due to hydration of store from localstorage, to ensure getMyStack set reliably\n    //   this.store.dispatch(mystackActions.load());\n    // }, 700);\n\n    this.stack$\n      .pipe(\n        takeUntil(this.onDestroy$),\n        distinctUntilChanged(\n          (a, b) =>\n            a &&\n            b &&\n            a.projectId === b.projectId &&\n            a.userId === b.userId &&\n            a.dtePublished === b.dtePublished &&\n            a.isCollaborative === b.isCollaborative &&\n            a.clips?.length === b.clips?.length &&\n            a.privacy === b.privacy\n        )\n      )\n      .subscribe((stack) => {\n        // watch the stack dtePublished to disable or alert if it's published\n        this.isPublished = stack?.dtePublished?.length > 0;\n        this.isCollaborative = stack?.isCollaborative > 0;\n        /**\n         * you can collaborate if there's a project.id and stack is not published\n         * MVP-1307 you can collaborate if this isCollaborative && public\n         * 2024-08-30 fix that this should happen more often than this, and is only dependent on stack\n         */\n        this.openInvite =\n          stack && !stack.dtePublished && stack.isCollaborative && stack.privacy === STACK_PRIVACY.PUBLIC;\n\n        // load the Project immediately so it's there when we click the accept button\n        if (this.openInvite) {\n          // load the project to check if there's an active event\n          this.projectService\n            .getProject(stack.projectId)\n            .pipe(take(1))\n            .subscribe((project) => {\n              this.inviteProjectEventActive = isEventActive(project);\n            });\n        }\n\n        if (Array.isArray(stack?.clips)) {\n          // ref: mystack.component.html clip?.sources?.length > 0; else uploadingItem\n          this.hasStackClips = stack.clips.length > 0;\n          const clipDoneTranscoding = stack.clips.filter((clip) => getDoneTranscoding(clip));\n          this.hasStackClipsTranscoding = clipDoneTranscoding.length !== stack.clips.length;\n          // this.hasStackClips = !!stack.clips.length;\n          this.hasStackClipTooLong = stack.clips.some(\n            (clip) => Utils.convertDurationToSeconds(clip?.duration ?? '') > MAX_VIDEO_CAPTURE_LENGTH_SECONDS\n          );\n        }\n      });\n\n    combineLatest([\n      this.stack$.pipe(\n        distinctUntilChanged(\n          (a, b) =>\n            a &&\n            b &&\n            a.projectId === b.projectId &&\n            a.userId === b.userId &&\n            a.dtePublished === b.dtePublished &&\n            a.privacy === b.privacy &&\n            a.clips?.length === b.clips?.length\n        )\n      ),\n      this.userId$.pipe(distinctUntilChanged()),\n      this.myProjects$.pipe(distinctUntilChanged((a, b) => a && b && a.length === b.length)),\n    ])\n      .pipe(takeUntil(this.onDestroy$))\n      .subscribe(([stack, userId, myProjects]) => {\n        this.isMine = userId && stack?.userId === userId;\n\n        const proj = (myProjects || []).find((p) => stack.projectId && p?.id === stack.projectId);\n\n        this.canCollaborate = stack && !stack.dtePublished && proj?.id?.length > 0;\n        //checkIsMember(userId, proj) &&? no.\n        this.isProjAdmin = proj?.id?.length > 0 && checkIsAdmin(userId, proj);\n        this.hasMyClips = stack.clips.some((clip) => clip.userId === userId);\n        DEBUG_LOGS &&\n          console.log(`Checking Permissions`, {\n            stack,\n            userId,\n            myProjects,\n            openInvite: this.openInvite,\n            isMine: this.isMine,\n            canCollaborate: this.canCollaborate,\n            isProjAdmin: this.isProjAdmin,\n          });\n      });\n  }\n\n  ionViewWillLeave() {\n    this.isTabFabShown = false;\n    this.tabFab?.close();\n    this.videoPlayerService.pause(this.playerId);\n    // we need to force rerender due to the *ngIf on isTabFabShown which wouldn't execute sometimes due to ionic caching pages\n    this.changeDetectorRef.detectChanges();\n  }\n\n  ionViewWillEnter() {\n    this.isTabFabShown = true;\n\n    if (ENABLE_SHOW_DRAWER_ON_LOAD) {\n      //  check if the navigationExtras included some state\n      // if feature required, needs dev to resolve timing issues with the drawer OnInit\n      this.drawerOpenOnLoad = !(history && history.state && history.state.hideDrawerOnLoad);\n      console.log(`drawerOpenOnLoad`, { drawerOpenOnLoad: this.drawerOpenOnLoad, historyState: history.state });\n    }\n\n    // we give the user a 2 sec headstart until the tooltip is shown, if no clips\n    combineLatest([this.stack$.pipe(take(1)), interval(2000).pipe(take(1))])\n      .pipe(\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        map(([s, w]) => s), // to filter out the value emitted by wait$\n        take(1) // just to limit to 5 the values emitted\n      )\n      .subscribe((res: Stack) => {\n        // close the tabfab onload, it'll be re-opened if needed, below (MVP-1182)\n        this.tabFab?.close();\n\n        if (res && res.error) {\n          // stack had an error, let's not do anything here..\n          return;\n        }\n\n        if (ENABLE_TOOLTIP) {\n          // ensure tabfab exists, definitely should after this delay (avoiding issues in rendering where it was showing in middle of page)\n          // this calc is finding two, need to choose only one..\n          // this.placements = this.placements.map(p => ({ ...p, el: () => this.tabFabEl && (this.tabFabEl as any).el}));\n        }\n\n        if (!res) {\n          !environment.production && console.warn(`EditTutorial check: missing response? opening fab...`);\n          this.opentabFab();\n          return;\n        }\n        DEBUG_LOGS && console.log(`StackEdit stack:`, res);\n        // show tooltip if the timer triggered (showTutorial) or if there are no clips or clipIds (clips might be loading still)\n        if (!this.stackId) {\n          //  && !res.stackId\n          this.expandDraftDrawer(true);\n        }\n        const stackHasClipIds =\n          (Array.isArray(res.clipIds) && res.clipIds.length > 0) || (Array.isArray(res.clips) && res.clips.length > 0);\n        if (!stackHasClipIds) {\n          // res.showTutorial ||\n          this.opentabFab();\n        }\n        // we need to force rerender due to the *ngIf on isTabFabShown which wouldn't execute sometimes due to ionic caching pages\n        this.changeDetectorRef.detectChanges();\n      });\n\n    // setTimeout(() => {\n    //   this.isTooltipShown = true;\n    // }, 1000);\n  }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  async continuePublish(event = true) {\n    // save our stack in it's current state, so that nothing erases progress..\n    this.saveStack();\n    const modal = await this.modalCtrl.create({\n      component: PublishModalComponent,\n      cssClass: 'modal-publish modal-wide fullheight-modal',\n      componentProps: {\n        // todo: MVP-1204 handle admins being able to edit the info on a stack\n        isProjAdmin: this.isProjAdmin,\n      },\n    });\n    await modal.present();\n\n    const { data = {} } = await modal.onDidDismiss();\n    this.tabFab?.close();\n\n    DEBUG_LOGS && console.log(`[Publish] res:`, data);\n    const { action, stack } = data;\n    switch (action) {\n      case 'save':\n        break;\n      case 'publish':\n        this.navCtrl.navigateRoot([ROOT_EDIT_URL], { animated: false });\n        this.openPublishSuccessModal(stack);\n        break;\n      case 'play':\n        this.navCtrl.navigateForward([`/${WATCH_ROUTE}`, stack.projectId, stack.stackId]);\n        break;\n      case 'cancel':\n      default:\n      // data = PointerEvent, it was simply a dismiss/cancel\n      // console.log(`Unhandled dismiss action?`, data)\n    }\n  }\n\n  async openPublishSuccessModal(stack) {\n    // mystack has already been reset...\n\n    const modal = await this.modalCtrl.create({\n      component: PublishSuccessModalComponent,\n      componentProps: {\n        stack,\n        // how here do we watch the updates? we should send the store selector, no?\n      },\n    });\n    await modal.present();\n    const { data } = await modal.onWillDismiss();\n    if (data && data.action) {\n      switch (data.action) {\n        case 'clear':\n          // reset mystack already happened above...\n          // this.mystackService.resetMyStack();\n          break;\n        case 'play':\n          this.navCtrl.navigateForward([`/${WATCH_ROUTE}`, stack.projectId, stack.stackId]);\n          break;\n        default:\n          console.log(`Unknown action?`, data);\n      }\n    }\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  async inviteCrew(event) {\n    this.stack$.pipe(take(1)).subscribe(async (stack) => {\n      const modal = await this.modalCtrl.create({\n        component: CollabModalComponent,\n        componentProps: {\n          stack,\n        },\n      });\n      modal.present();\n      const { data } = await modal.onWillDismiss();\n      console.log(`Modal dismissed`, data);\n      // if (data) // if true, it was done... do we care?\n      this.tabFab?.close();\n    });\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  removeCrew(event) {\n    this.stack$.pipe(take(1)).subscribe((stack) => {\n      this.stackService.removeCollaborative(stack.projectId, stack.stackId);\n    });\n  }\n\n  expandDraftDrawer(showCreateForm = false) {\n    this.topDrawerExpand$.next({ i: ++this._incExpandEvent, showCreateForm });\n  }\n  closeDraftDrawer() {\n    this.topDrawerClose$.next(++this._incCloseEvent);\n  }\n\n  /**\n   * drawer opened/closed\n   */\n  draftDrawerExpanded(event) {\n    if (!event) {\n      // closed\n      if (!this.stackId) {\n        // re-open the drawer... no!\n      }\n    }\n  }\n\n  opentabFab() {\n    if (this.tabFab) {\n      this.tabFab.activated = true;\n    }\n  }\n  // closeTabFab() {\n  //   if (this.tabFab && typeof this.tabFab.close === 'function') {\n  //     this.tabFab.close();\n  //   }\n  // }\n\n  /**\n   * Avoid page animations for segment changes,\n   * you can use NavController of Ionic4 giving { animated: false } as NavigationOptions\n   */\n  navigateNoAnimation(path) {\n    if (path) {\n      this.navCtrl.navigateForward(path, { animated: false });\n    }\n  }\n\n  onPlayClipIndex(index: number) {\n    console.log(`onPlayClipIndex ${index}`);\n    if (typeof index !== 'number') {\n      console.warn(`[StackEdit] onPlayClipIndex payload index isNaN???`, index);\n      return;\n    }\n    this.isPreviewOpen = true;\n    this.videoPlayerService.play(this.playerId);\n\n    this.currentPlaylistIndex$.pipe(take(1)).subscribe((currentPlaylistIndex) => {\n      if (index !== currentPlaylistIndex) {\n        this.store.dispatch(mystackActions.currentIndex({ index }));\n      }\n    });\n  }\n\n  onPauseClipIndex(index: number) {\n    console.log(`onPauseClipIndex ${index}`);\n    if (typeof index !== 'number') {\n      console.warn(`[StackEdit] onPauseClipIndex payload index isNaN???`, index);\n      return;\n    }\n    this.videoPlayerService.pause(this.playerId);\n    this.isPreviewOpen = false;\n  }\n\n  closePreview() {\n    this.videoPlayerService.pause(this.playerId);\n    this.isPreviewOpen = false;\n  }\n\n  /**\n   * Can only happen if\n   * stackId && hasStackClips  && stackFormValid\n   * hasStackClipsTranscoding disables publish, but allows save\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  actionClick(event) {\n    // open publish modal\n    this.continuePublish();\n\n    // this.stack$.pipe(take(1)).subscribe((stack) => {\n    //   if (stack.dtePublished) {\n    //     // update published stack\n    //     this.saveStack();\n    //   } else if (!stack.poster || stack.poster === STACK_DEFAULT_POSTER) {\n    //     // open publish modal\n    //     this.continuePublish();\n    //     // poster not set, prompt\n    //     // this.stackForm.openPosterSelector(event, stack).then((poster) => {\n    //     //   if (poster && this.stackFormValid) {\n    //     //     // this.confirmPublishStack(stack);\n    //     //   }\n    //     // });\n    //   } else if (stack.stackId)  {\n    //     // open publish modal\n    //     this.continuePublish();\n    //     // publish\n    //     // this.confirmPublishStack(stack);\n    //   }\n    // })\n  }\n\n  addAllClipsToStack({ restack = false }) {\n    this.stack$.pipe(take(1)).subscribe((stack) => {\n      if (stack && Array.isArray(stack.playlist) && stack.playlist.length > 0) {\n        // this.isFabOpen = false;\n        // this.expandDraftDrawer();// already happens when playlist exists\n        if (restack) {\n          // MVP-1342 add title and description if create new (Restack)\n          this.store.dispatch(\n            stackActions.addToStackDrawer({\n              playlist: stack.playlist,\n              isCreateNew: true,\n              projectId: stack.projectId,\n              title: stack.title,\n              description: stack.description,\n              poster: stack.poster,\n            })\n          );\n        } else {\n          this.store.dispatch(stackActions.addToStackDrawer({ playlist: stack.playlist }));\n        }\n        // console.log(`addAllClipsToStack`, { stack, event });\n      } else {\n        !environment.production && console.log(`No Playlist.`, stack);\n      }\n    });\n  }\n\n  /**\n   * Consider: on mystackActions.reorderClipIds -> autosave\n   */\n  saveStack() {\n    this.isSaving = true;\n    try {\n      combineLatest([this.stack$, this.userId$, this.userService.username$])\n        .pipe(take(1))\n        .subscribe(async ([stack, userId, username]) => {\n          // MVP-1176 handle collaborative stack\n          const isMine = stack.userId === userId;\n          DEBUG_LOGS && console.log(`saveStack`, { isMine, stack, userId, username });\n          this.publishStackService.saveStackUpdates({\n            userId: isMine ? userId : stack.userId,\n            credits: isMine ? username : stack.credits,\n            projectId: stack.projectId,\n            stackId: stack.stackId,\n            clips: stack.clips,\n            poster: stack.poster,\n          });\n          setTimeout(() => {\n            // just making it show loading for a bit, since we only dispatched actions here\n            this.isSaving = false;\n            // if we are a projAdmin then we will be in PublishModal, so don't show this\n            if (!this.isMine && !this.isProjAdmin && stack.isCollaborative) {\n              this.toaster.present(this.translate.instant('EDITOR.SAVE_COLLAB_SUCCESS'));\n            }\n          }, 900);\n        });\n    } catch (error) {\n      console.error(error);\n      // this.errorMsg = this.translate.instant('ERRORS.GENERIC_OOPS');\n      // this.isLoading = false;\n      this.isSaving = false;\n    }\n  }\n\n  /**\n   * modal with capture-instructions\n   * only used if there is not a projectId...\n   */\n  async presentCaptureModal() {\n    const modal = await this.modalCtrl.create({\n      component: CaptureClipModalComponent,\n      componentProps: {\n        projectId: this.projectId,\n      },\n    });\n    await modal.present();\n    const { data } = await modal.onDidDismiss();\n    console.log(`CaptureClipModal dismiss:`, { data });\n  }\n\n  /**\n   * clipUpload button success\n   * @todo MVP-1321\n   * sort uploaded clips by title before saving\n   */\n  captureSuccess(filesUploaded = []) {\n    const clips = filesUploaded.map((file) => {\n      const id = Utils.removeFileExt(file.filename);\n      return {\n        id,\n        title: id,\n        projectId: file.uploadTags?.projectId ?? '',\n      };\n    });\n    DEBUG_LOGS && console.log(`captureSuccess sort uploaded clips by title before saving:`, { clips, filesUploaded });\n    this.mystackService.sortUserUploadSuccessByTitle(clips);\n  }\n\n  /**\n   * check if there's a projectId and it's one of mine, then do it directly, else modal..\n   */\n  captureDevice() {\n    combineLatest([this.userService.isCaptureAllowed$, this.userService.userId$, this.userService.username$])\n      .pipe(take(1))\n      .subscribe(([{ isAllowed, projects }, userId, username]) => {\n        if (!userId) {\n          this.tabFab?.close();\n          this.navCtrl.navigateForward('/login', { queryParams: { returnUrl: this.router.url } });\n          return;\n        }\n        // there's a user,\n        const exists = projects.find((p) => p?.id && p.id === this.projectId);\n        DEBUG_LOGS &&\n          console.log('captureDevice check', {\n            userId,\n            isAllowed,\n            projects,\n            projectId: this.projectId,\n            project: exists,\n          });\n\n        if (isAllowed && exists?.id) {\n          // captureDevice projectId exists, open Filestack directly\n          this.triggerCapture();\n          this.tabFab?.close();\n        } else if (!isAllowed && exists?.id) {\n          // we are crew but not subscribed\n          DEBUG_LOGS && console.log(`we are crew but not subscribed (captureDevice not allowed), open plans modal`);\n          this.tabFab?.close();\n          this.openPlansModal();\n        } else if (this.projectId && this.openInvite) {\n          // assume we're not an active crew member\n          const member: ProjectMember = {\n            isActive: true,\n            role: PROJECT_MEMBER_ROLE.CREW,\n            projectId: this.projectId,\n            userId,\n            username,\n          };\n          // DEBUG_LOGS && console.log(`captureDevice openInvite`, { member });\n          /**\n           * here we know this will be in MINE Projects once done here\n           * sent to Effect with action instead of direct call to API\n           * // do we assume this was successful in API? (via Effect)\n           * // what happens if failure? hmm..\n           */\n          this.store.dispatch(addMember({ member }));\n          //  this.analyticsService.crewInviteAccepted(projectId);\n\n          // need to verify that the project has active event, else go to plans..\n          const handleActiveEvent = (project) => {\n            if (isEventActive(project) || this.inviteProjectEventActive) {\n              this.triggerCapture();\n            } else {\n              DEBUG_LOGS && console.log(`captureDevice no active event, open plans modal`);\n              this.openPlansModal();\n            }\n          };\n          // MVP-1410 we know this is an openInvite, so we need to check if there's an active event\n          // even if exists, we need to load full project record\n          if (exists?.id) {\n            handleActiveEvent(exists);\n          } else {\n            this.projectService\n              .getProject(this.projectId)\n              .pipe(\n                filter((p) => p?.id === this.projectId),\n                take(1)\n              )\n              .subscribe((project) => {\n                handleActiveEvent(project);\n              });\n          }\n        } else if (isAllowed) {\n          // we are Pro, but no projectId found\n          // modal with capture-instructions, select projectId\n          this.presentCaptureModal();\n        } else if (!this.projectId) {\n          DEBUG_LOGS && console.log(`captureDevice no projectId, open plans modal`);\n          this.openPlansModal();\n        } else {\n          console.warn('CaptureDevice UNHANDLED?');\n          this.openPlansModal();\n        }\n      });\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  captureYoutube(e: Event) {\n    console.log(`DEV: youtube capture disabled`);\n    // this.router.navigate(['/stack/capture/youtube']);\n  }\n\n  newDraft() {\n    this.store.dispatch(stackActions.addToStackDrawer({ playlist: [], isCreateNew: true }));\n    this.expandDraftDrawer(true);\n  }\n  restack() {\n    this.addAllClipsToStack({ restack: true });\n  }\n\n  routeStudio() {\n    this.navCtrl.navigateForward(STUDIO_PAGE);\n  }\n  routeDiscover() {\n    this.navCtrl.navigateForward(DISCOVER_PAGE, { queryParams: { returnUrl: this.router.url } });\n  }\n  routeProject() {\n    this.navCtrl.navigateForward([`/${PROJECT_DETAIL_ROUTE}`, this.projectId]);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onPlayerEnded(event) {\n    this.store.dispatch(mystackActions.nextClip());\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onPlaylistDone(event) {\n    // this.isHistoryOpen = true;\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\n  onPlayerHeight(event) {}\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onOrientationChange = (orient) => {\n    // this.isHistoryOpen = false;\n  };\n\n  /**\n   * We need to reset the trigger event..\n   */\n  private triggerCapture() {\n    this.captureClipEvent = true;\n    clearTimeout(this.triggerTimeout);\n    this.triggerTimeout = setTimeout(() => {\n      this.captureClipEvent = false;\n    }, 300);\n  }\n\n  private async openPlansModal() {\n    const modal = await this.modalCtrl.create({\n      component: PlansModalComponent,\n      componentProps: {},\n      cssClass: 'fullheight-iframe-modal',\n    });\n    await modal.present();\n    const { data } = await modal.onWillDismiss();\n    if (data) {\n      console.log('PlansModal dismissed:', data);\n    }\n  }\n}\n"],"x_google_ignoreList":[]}