{"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 ↵ or ,)`;\n this.initialPlaceholder = `Add ${val}s (then ↵ 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 <!-- <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 }} — {{ '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 {{ '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":[]}