{"version":3,"file":"2191.afcf6e6fd452cd66.js","mappings":"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","names":["TickScheduler","_TickScheduler","ɵfac","__ngFactoryType__","ɵprov","i0","token","factory","isNgZone","zone","NgZone","inject","NoopTickScheduler","AnimationFrameTickScheduler","providedIn","_AnimationFrameTickScheduler","constructor","appRef","super","this","isScheduled","schedule","requestAnimationFrame","tick","RenderScheduler","_RenderScheduler","cdRef","tickScheduler","markForCheck","createRenderEventManager","handlers","handleRenderEvent","combineRenderEventHandlers","event","type","potentialObservable$","ReplaySubject","nextPotentialObservable","potentialObservable","next","handlePotentialObservableChanges","pipe","distinctUntilChanged","switchMapToRenderEvent","switchMap","observable$","fromPotentialObservable","isObservable","isObservableDictionary","value","isDictionary","Array","isArray","Object","keys","length","values","every","combineLatest","toDistinctObsDictionary","obsDictionary","reduce","acc","key","r","isPromiseLike","then","from","Observable","subscriber","reset","synchronous","subscription","untracked","subscribe","error","complete","renderEventComparator","tap","previous","current","LetDirective","_LetDirective","ngrxLet","renderEventManager","mainTemplateRef","viewContainerRef","errorHandler","renderScheduler","isMainViewCreated","isSuspenseViewCreated","viewContext","$implicit","undefined","suspense","renderSuspenseView","renderMainView","handleError","Subscription","ngTemplateContextGuard","dir","ctx","ngOnInit","add","ngOnDestroy","unsubscribe","isSyncEvent","clear","createEmbeddedView","suspenseTemplateRef","ɵdir","selectors","inputs","standalone","features","Nl2brPipe","_Nl2brPipe","transform","args","replace","pure","ctx_r0","errorMessage","ROOT_APP_URL","getReturnUrl","projectId","eventType","getInviteAcceptPath","MemberInviteModalComponent","_MemberInviteModalComponent","tokenId","id","_a","project","projectTitle","title","projectHero","hero","getProjectDefaultHeroUrl","projectShareUrl","PROJECT_DETAIL_ROUTE","appProjectUrl","formBuilder","modalCtrl","alertCtrl","tokensService","mailerService","projectService","translate","isLoading","isLoadingResend","roleOptions","text","PROJECT_MEMBER_ROLE","PRODUCER","CREW","userInviteForm","group","sentToEmail","Validators","compose","required","email","messageInput","minLength","role","projectRole","payload","message","patchValue","getProjectFromStoreById","filter","p","take","cancel","dismiss","saved","data","resent","deleteToken","_this","_asyncToGenerator","create","header","instant","buttons","handler","present","resend","_this2","valid","toEmail","get","updateMessage","updates","updateTokenApi","environment","production","console","log","projectList","img","shareUrl","TOKEN_QUERY_PARAM","sendInviteEmail","fromName","createdBy","fromEmail","routeId","returnUrl","res","save","_this3","err","warn","_this4","createdAt","tokenEventType","payloadEventType","tokenMessage","projectEventType","getInviteTypeFromProject","updateToken","i1","i2","i3","i4","i5","i6","decls","vars","consts","template","rf","MemberInviteModalComponent_div_14_Template","MemberInviteModalComponent_div_15_Template","MemberInviteModalComponent_p_17_Template","invalid","BaseModalComponent","FormsModule","ReactiveFormsModule","FormInputComponent","FormSelectComponent","FormTextareaComponent","NgIf","IonSpinner","ButtonComponent","TranslatePipe","FormControlCastPipe","styles","_r1","projectMember_r2","ctx_r2","viewProjectMember","MemberInviteListComponent_ion_grid_0_ion_col_5_div_1_span_10_Template","isActive","avatar","username","avatarFallback","MemberInviteListComponent_ion_grid_0_ion_col_5_div_1_Template","_r4","inviteMember","MemberInviteListComponent_ion_grid_0_ion_col_6_ion_spinner_4_Template","isLoadingInvite","MemberInviteListComponent_ion_grid_0_ion_col_5_Template","MemberInviteListComponent_ion_grid_0_ion_col_6_Template","invites","trackByInvite","showInvite","MemberInviteListComponent","_MemberInviteListComponent","tokens","_tokens","items","persistToken","map","convertTokenToPendingMember","sort","a","b","Utils","sortObjArrayAlphaBy","routerLinkInvite","inviteType","toLowerCase","toaster","addMember","EventEmitter","memberDeleted","DEFAULT_USER_AVATAR_TERTIARY","index","item","emit","projectMember","openModal","modal","component","componentProps","onWillDismiss","invite","foundIndex","findIndex","x","defaults","userId","outputs","MemberInviteListComponent_ion_grid_0_Template","IonGrid","IonRow","NgFor","IonCol","IonFabButton","IonIcon","IonAvatar","ImageFallbackDirective","IonButton","ProjectDetailPage_ng_template_7_ng_container_1_Template","ProjectDetailPage_ng_template_7_ng_template_2_Template","loading","noProjDoneLoading_r2","_c1","currentUrl","routerLinkJoin","ProjectDetailPage_ng_template_9_ng_template_2_ion_button_6_Template","ProjectDetailPage_ng_template_9_ng_template_2_div_8_Template","isLoggedIn$","showJoinButton","ProjectDetailPage_ng_template_9_ng_container_1_Template","ProjectDetailPage_ng_template_9_ng_template_2_Template","privDoneLoading_r4","$event","_r5","project_r6","ngIf","shareProject","_r7","vm_r8","openEventDetailsPopover","isProjectAdmin","projectSubLevel","subscriptionBy","currentUserId","_r9","openProjectAdmin","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_2_fs_subscription_mini_status_edit_1_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_2_ion_button_2_Template","projectSubActive","enableBilling","isProjectMember","_r10","onFileUploadFinished","onFileUploadFailed","mission","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_3_ion_button_2_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_3_p_14_Template","isDefaultProjectHero","numStackViews$","moreStacksToLoad","votes","numStacks$","members","_c4","description","listIdCollabDrafts","isModerated","_r11","onSearchStacks","_r12","openProjectAdminManageFeatured","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_13_h3_1_ion_button_1_Template","list_r14","_r13","loadMoreStacks","_c5","layoutType","Carousel","featuredStacks","items$","nextToken","label","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_13_h3_1_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_13_app_stack_list_2_Template","list$","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_15_div_1_h3_1_span_3_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_15_div_1_h3_1_span_4_Template","showRecentStacks","list_r16","_r15","expandDraftDrawer","_c7","_c6","stackList_r17","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_15_div_1_h3_1_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_15_div_1_app_stack_list_2_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_15_div_1_Template","_c3","recentStacks","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_template_16_p_0_Template","tmp_9_0","listIdStackDrafts","listPrivate_r19","_r18","tmp_11_0","stackListPrivate","_r21","clipsList_r22","loadMoreClips","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_22_div_1_ng_container_16_div_3_Template","Grid","_c9","clipsByProject","itemIds","_r20","onSearchClips","onFilterClips","clipsAccordionChange","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_22_div_1_ng_container_16_Template","captureSuccess","isClipsListShowing","_c8","captureClipEvent","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_22_div_1_Template","projectMember_r23","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_25_fs_carousel_guides_1_Template","projectMember_r24","myContentExists$","_r26","createEvent","eventSignUpTranslateKey","_r27","editSubscription","eventEditTranslateKey","_r25","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_29_div_2_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_29_div_3_Template","inviteTokens","canCreateEvent","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ion_button_1_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_2_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_3_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_p_5_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_6_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_fs_collab_drafts_11_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_12_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_13_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_15_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_template_16_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_fs_draft_stacks_18_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_ng_container_19_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_22_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_25_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_27_Template","ProjectDetailPage_ng_container_11_ng_container_1_div_1_div_29_Template","isWidgetActive","showProjectHero","isWedding","tmp_16_0","recentStacksNotShowing_r28","tmp_20_0","userAsProjectMember$","_c2","ProjectDetailPage_ng_container_11_ng_container_1_div_1_Template","privacy","privacyPrivate","privateProject_r29","ProjectDetailPage_ng_container_11_ng_container_1_Template","vm$","_r31","fabClick","_r33","ProjectDetailPage_fs_tab_fab_container_14_ion_fab_1_ng_container_4_ion_chip_1_Template","_r32","project_r34","_r35","captureClip","_r36","deleteProject","ProjectDetailPage_fs_tab_fab_container_14_ion_fab_1_ion_fab_button_2_Template","ProjectDetailPage_fs_tab_fab_container_14_ion_fab_1_ng_container_4_Template","_r30","ProjectDetailPage_fs_tab_fab_container_14_ion_fab_1_ng_container_9_Template","ProjectDetailPage_fs_tab_fab_container_14_ion_fab_1_ion_chip_10_Template","vm_r37","isCaptureAllowed","isProjectDeleteAllowed","ProjectDetailPage_fs_tab_fab_container_14_ion_fab_1_Template","project$","ProjectDetailPage","_ProjectDetailPage","router","url","ProjectEventType","Weddings","routerLinkSubscribe","SIGNUP_RETURN_URL_PRO","routerLinkCreateEvent","SIGNUP_RETURN_URL_WEDDINGS","SIGNUP_RETURN_URL_EVENTS","getInvitePath","routerLinkEditStack","drawerSelectedProjectId","drawerSelectedStackId","_numStackViews$","asObservable","_numStacks$","_myContentExists$","activatedRoute","snapshot","paramMap","stackFilterId","clipFilterId","listIdProjectStacksFeatured","listIdProjectStacksRecent","listIdPrivateStacks","listIdProjectStacksTrending","listIdProjectClips","configService","navCtrl","store","popoverCtrl","socialSharingService","userService","analyticsService","billingService","sentryService","numStacksToLoad","LAYOUT_TYPE","showingClips","showTrendingStacks","PROJECT_PRIVACY","PRIVATE","ENABLE_BILLING","projectEventTitleTranslationPath","projectSubscriptionBy","user$","select","selectUserState","getUserLoggedIn","selectCurrentProject","isProjectAdmin$","selectIsCurrentProjectAdminByUser","selectCurrentProjectMemberByUser","isProjectMember$","member","drawerHandleActions","selectedItemSuccess$","BehaviorSubject","topDrawerExpand$","i","topDrawerClose$","_incExpandEvent","_incCloseEvent","None","isCrew","clipsSearchText","clipsCurrentFilter","FilterEntityTypes","Recent","onDestroy$","Subject","token$","addIcons","lockClosed","icons","AaQ","addCircleOutline","setTimeout","initialLoad","queryParamMap","queryParams","dispatch","projectActions","projectIdChanged$","takeUntil","q","projectChanged$","config","getProjectConfig","JSON","stringify","subscriptionId","subscriptionStatus","subscriptionLevel","withLatestFrom","projMember","DEFAULT_HERO","canBeActive","eventIsActive","eventDate","eventConfig","subscriptionMinutes","getEventConfig","SubscriptionStatus","Active","projectSubscriptionId","upperFirstChar","projConfig","initRecentStacks","wasCrew","initContent","loadProjectTokens","debounceTime","watchSummaryData","appConfig","allowCapture","userId$","ngAfterViewInit","showTutorial","getCurrentNavigation","extras","state","tutorial","ionViewWillLeave","stackActions","closeTabFab","selectList","selectStackListItems","action","filters","listId","of","isApproved","itemObservables","y","Featured","push","Private","isPrivate","selectClipListItems","clipActions","Boolean","isTokenExpired","timer","found","some","v","list","recentStackList","featuredStackList","getViews","stacks","accumulator","views","totalViews","detail","showCreateForm","closeDraftDrawer","addFilmstack","navigateForward","EDIT_ROUTE","selectCanCaptureToProject","canCapture","inviteCrew","AddMemberModalComponent","cssClass","onDidDismiss","openAddMemberDialog","listTokens","catch","shareItem","ITEM_TYPE","Projects","tags","share","search","users","Mine","setFilter","Unused","STUDIO_PAGE","container","PROJECT_HERO_UPLOAD_BUCKET","PROJECT_HERO_UPLOAD_CDN","captureError","tabFab","activated","openTabFab","close","draftDrawerSelected","stackId","delayedCloseDrawer","captureDevice","draftDrawerNewItem","draftDrawerExpanded","path","doReset","delay","clearTimeout","_closeDrawerTimeout","presentCaptureModal","CaptureClipModalComponent","showProjectSelect","routeTo","isCaptureAllowed$","isAllowed","projects","exists","find","triggerCapture","popover","EventDetailComponent","dismissOnSelect","subscriptionisActive","canEdit","isPopover","_this5","_ref","isProjAdmin","openEditSubscription","_x","apply","arguments","triggerTimeout","i7","i8","i9","i10","i11","i12","viewQuery","socialSharingServiceProvider","ProjectDetailPage_ng_template_7_Template","ProjectDetailPage_ng_template_9_Template","ProjectDetailPage_ng_container_11_Template","ProjectDetailPage_fs_tab_fab_container_14_Template","tmp_2_0","noProject_r38","NgStyle","RouterLink","PosterUploadDirective","UploaderStatsComponent","ListTitleComponent","CollabDraftsComponent","FilterableToolbarComponent","StackListComponent","TopNavbarComponent","SubscriptionMiniStatusEditComponent","DraftStacksCarouselComponent","CaptureClipButtonComponent","ClipListComponent","CarouselGuidesComponent","ProjectMemberListComponent","FooterComponent","TabFabContainerComponent","IonHeader","IonContent","IonAccordionGroup","IonAccordion","IonItem","IonLabel","IonFab","IonFabList","IonChip","AsyncPipe"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./node_modules/@ngrx/component/fesm2022/ngrx-component.mjs","./src/app/shared/pipes/nl2br.pipe.ts","./src/app/tokens/member-invite-modal/member-invite-modal.component.html","./src/app/tokens/member-invite-modal/member-invite-modal.component.ts","./src/app/tokens/member-invite-list/member-invite-list.component.html","./src/app/tokens/member-invite-list/member-invite-list.component.ts","./src/app/projects/project-detail/project-detail.page.html","./src/app/projects/project-detail/project-detail.page.ts"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { NgZone, inject, Injectable, ChangeDetectorRef, untracked, Directive, Input, Pipe } from '@angular/core';\nimport { isObservable, combineLatest, from, Observable, ReplaySubject, pipe, Subscription } from 'rxjs';\nimport { distinctUntilChanged, tap, switchMap } from 'rxjs/operators';\n\nfunction isNgZone(zone) {\n return zone instanceof NgZone;\n}\n\nclass TickScheduler {\n /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: TickScheduler, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: TickScheduler, providedIn: 'root', useFactory: () => {\n const zone = inject(NgZone);\n return isNgZone(zone)\n ? new NoopTickScheduler()\n : inject(AnimationFrameTickScheduler);\n } }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: TickScheduler, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n useFactory: () => {\n const zone = inject(NgZone);\n return isNgZone(zone)\n ? new NoopTickScheduler()\n : inject(AnimationFrameTickScheduler);\n },\n }]\n }] });\nclass AnimationFrameTickScheduler extends TickScheduler {\n constructor(appRef) {\n super();\n this.appRef = appRef;\n this.isScheduled = false;\n }\n schedule() {\n if (!this.isScheduled) {\n this.isScheduled = true;\n requestAnimationFrame(() => {\n this.appRef.tick();\n this.isScheduled = false;\n });\n }\n }\n /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: AnimationFrameTickScheduler, deps: [{ token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Injectable }); }\n /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: AnimationFrameTickScheduler, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: AnimationFrameTickScheduler, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }], ctorParameters: () => [{ type: i0.ApplicationRef }] });\nclass NoopTickScheduler extends TickScheduler {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n schedule() { }\n}\n\n/**\n * Provides rendering functionality regardless of whether `zone.js` is present\n * or not. It must be provided at the component/directive level.\n *\n * @usageNotes\n *\n * ### Rerender zone-less app on route changes\n *\n * ```ts\n * @Component({\n * selector: 'app-root',\n * template: '<router-outlet>',\n * // 👇 `RenderScheduler` is provided at the component level\n * providers: [RenderScheduler],\n * changeDetection: ChangeDetectionStrategy.OnPush,\n * })\n * export class AppComponent implements OnInit {\n * constructor(\n * private readonly router: Router,\n * private readonly renderScheduler: RenderScheduler\n * ) {}\n *\n * ngOnInit(): void {\n * this.router.events\n * .pipe(filter((e) => e instanceof NavigationEnd))\n * .subscribe(() => this.renderScheduler.schedule());\n * }\n * }\n * ```\n *\n * ### Rerender component on interval\n *\n * ```ts\n * @Component({\n * selector: 'app-interval',\n * template: '{{ elapsedTime }}ms',\n * // 👇 `RenderScheduler` is provided at the component level\n * providers: [RenderScheduler],\n * changeDetection: ChangeDetectionStrategy.OnPush,\n * })\n * export class IntervalComponent implements OnInit {\n * elapsedTime = 0;\n *\n * constructor(private readonly renderScheduler: RenderScheduler) {}\n *\n * ngOnInit(): void {\n * setInterval(() => {\n * this.elapsedTime += 1000;\n * this.renderScheduler.schedule();\n * }, 1000);\n * }\n * }\n * ```\n */\nclass RenderScheduler {\n constructor(cdRef, tickScheduler) {\n this.cdRef = cdRef;\n this.tickScheduler = tickScheduler;\n }\n /**\n * Marks component and its ancestors as dirty.\n * It also schedules a new change detection cycle in zone-less mode.\n */\n schedule() {\n this.cdRef.markForCheck();\n this.tickScheduler.schedule();\n }\n /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: RenderScheduler, deps: [{ token: i0.ChangeDetectorRef }, { token: TickScheduler }], target: i0.ɵɵFactoryTarget.Injectable }); }\n /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: RenderScheduler }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: RenderScheduler, decorators: [{\n type: Injectable\n }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: TickScheduler }] });\nfunction createRenderScheduler() {\n return new RenderScheduler(inject(ChangeDetectorRef), inject(TickScheduler));\n}\n\nfunction combineRenderEventHandlers(handlers) {\n return (event) => handlers[event.type]?.(event);\n}\n\nfunction fromPotentialObservable(potentialObservable) {\n if (isObservable(potentialObservable)) {\n return potentialObservable;\n }\n if (isObservableDictionary(potentialObservable)) {\n return combineLatest(toDistinctObsDictionary(potentialObservable));\n }\n if (isPromiseLike(potentialObservable)) {\n return from(potentialObservable);\n }\n return new Observable((subscriber) => {\n subscriber.next(potentialObservable);\n });\n}\nfunction isPromiseLike(value) {\n return typeof value?.then === 'function';\n}\nfunction isObservableDictionary(value) {\n return (isDictionary(value) &&\n Object.keys(value).length > 0 &&\n Object.values(value).every(isObservable));\n}\nfunction isDictionary(value) {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\nfunction toDistinctObsDictionary(obsDictionary) {\n return Object.keys(obsDictionary).reduce((acc, key) => ({\n ...acc,\n [key]: obsDictionary[key].pipe(distinctUntilChanged()),\n }), {});\n}\n\nfunction createRenderEventManager(handlers) {\n const handleRenderEvent = combineRenderEventHandlers(handlers);\n const potentialObservable$ = new ReplaySubject(1);\n return {\n nextPotentialObservable(potentialObservable) {\n potentialObservable$.next(potentialObservable);\n },\n handlePotentialObservableChanges() {\n return potentialObservable$.pipe(distinctUntilChanged(), switchMapToRenderEvent(), distinctUntilChanged(renderEventComparator), tap(handleRenderEvent));\n },\n };\n}\nfunction switchMapToRenderEvent() {\n return pipe(switchMap((potentialObservable) => {\n const observable$ = fromPotentialObservable(potentialObservable);\n let reset = true;\n let synchronous = true;\n return new Observable((subscriber) => {\n const subscription = untracked(() => observable$.subscribe({\n next(value) {\n subscriber.next({ type: 'next', value, reset, synchronous });\n reset = false;\n },\n error(error) {\n subscriber.next({ type: 'error', error, reset, synchronous });\n reset = false;\n },\n complete() {\n subscriber.next({ type: 'complete', reset, synchronous });\n reset = false;\n },\n }));\n if (reset) {\n subscriber.next({ type: 'suspense', reset, synchronous: true });\n reset = false;\n }\n synchronous = false;\n return subscription;\n });\n }));\n}\nfunction renderEventComparator(previous, current) {\n if (previous.type !== current.type || previous.reset !== current.reset) {\n return false;\n }\n if (current.type === 'next') {\n return previous.value === current.value;\n }\n if (current.type === 'error') {\n return previous.error === current.error;\n }\n return true;\n}\n\n/**\n *\n * @description\n *\n * The `*ngrxLet` directive serves a convenient way of binding observables to a view context\n * (DOM element's scope). It also helps with several internal processing under the hood.\n *\n * @usageNotes\n *\n * ### Displaying Observable Values\n *\n * ```html\n * <ng-container *ngrxLet=\"number$ as n\">\n * <app-number [number]=\"n\"></app-number>\n * </ng-container>\n *\n * <ng-container *ngrxLet=\"number$; let n\">\n * <app-number [number]=\"n\"></app-number>\n * </ng-container>\n * ```\n *\n * ### Tracking Different Observable Events\n *\n * ```html\n * <ng-container *ngrxLet=\"number$ as n; error as e; complete as c\">\n * <app-number [number]=\"n\" *ngIf=\"!e && !c\">\n * </app-number>\n *\n * <p *ngIf=\"e\">There is an error: {{ e }}</p>\n * <p *ngIf=\"c\">Observable is completed.</p>\n * </ng-container>\n * ```\n *\n * ### Combining Multiple Observables\n *\n * ```html\n * <ng-container *ngrxLet=\"{ users: users$, query: query$ } as vm\">\n * <app-search-bar [query]=\"vm.query\"></app-search-bar>\n * <app-user-list [users]=\"vm.users\"></app-user-list>\n * </ng-container>\n * ```\n *\n * ### Using Suspense Template\n *\n * ```html\n * <ng-container *ngrxLet=\"number$ as n; suspenseTpl: loading\">\n * <app-number [number]=\"n\"></app-number>\n * </ng-container>\n *\n * <ng-template #loading>\n * <p>Loading...</p>\n * </ng-template>\n * ```\n *\n * ### Using Aliases for Non-Observable Values\n *\n * ```html\n * <ng-container *ngrxLet=\"userForm.controls.email as email\">\n * <input type=\"text\" [formControl]=\"email\" />\n *\n * <ng-container *ngIf=\"email.errors && (email.touched || email.dirty)\">\n * <p *ngIf=\"email.errors.required\">This field is required.</p>\n * <p *ngIf=\"email.errors.email\">This field must be an email.</p>\n * </ng-container>\n * </ng-container>\n * ```\n *\n * @publicApi\n */\nclass LetDirective {\n set ngrxLet(potentialObservable) {\n this.renderEventManager.nextPotentialObservable(potentialObservable);\n }\n constructor(mainTemplateRef, viewContainerRef, errorHandler, renderScheduler) {\n this.mainTemplateRef = mainTemplateRef;\n this.viewContainerRef = viewContainerRef;\n this.errorHandler = errorHandler;\n this.renderScheduler = renderScheduler;\n this.isMainViewCreated = false;\n this.isSuspenseViewCreated = false;\n this.viewContext = {\n $implicit: undefined,\n ngrxLet: undefined,\n error: undefined,\n complete: false,\n };\n this.renderEventManager = createRenderEventManager({\n suspense: () => {\n this.viewContext.$implicit = undefined;\n this.viewContext.ngrxLet = undefined;\n this.viewContext.error = undefined;\n this.viewContext.complete = false;\n this.renderSuspenseView();\n },\n next: (event) => {\n this.viewContext.$implicit = event.value;\n this.viewContext.ngrxLet = event.value;\n if (event.reset) {\n this.viewContext.error = undefined;\n this.viewContext.complete = false;\n }\n this.renderMainView(event.synchronous);\n },\n error: (event) => {\n this.viewContext.error = event.error;\n if (event.reset) {\n this.viewContext.$implicit = undefined;\n this.viewContext.ngrxLet = undefined;\n this.viewContext.complete = false;\n }\n this.renderMainView(event.synchronous);\n this.errorHandler.handleError(event.error);\n },\n complete: (event) => {\n this.viewContext.complete = true;\n if (event.reset) {\n this.viewContext.$implicit = undefined;\n this.viewContext.ngrxLet = undefined;\n this.viewContext.error = undefined;\n }\n this.renderMainView(event.synchronous);\n },\n });\n this.subscription = new Subscription();\n }\n static ngTemplateContextGuard(dir, ctx) {\n return true;\n }\n ngOnInit() {\n this.subscription.add(this.renderEventManager.handlePotentialObservableChanges().subscribe());\n }\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n renderMainView(isSyncEvent) {\n if (this.isSuspenseViewCreated) {\n this.isSuspenseViewCreated = false;\n this.viewContainerRef.clear();\n }\n if (!this.isMainViewCreated) {\n this.isMainViewCreated = true;\n this.viewContainerRef.createEmbeddedView(this.mainTemplateRef, this.viewContext);\n }\n if (!isSyncEvent) {\n this.renderScheduler.schedule();\n }\n }\n renderSuspenseView() {\n if (this.isMainViewCreated) {\n this.isMainViewCreated = false;\n this.viewContainerRef.clear();\n }\n if (this.suspenseTemplateRef && !this.isSuspenseViewCreated) {\n this.isSuspenseViewCreated = true;\n this.viewContainerRef.createEmbeddedView(this.suspenseTemplateRef);\n }\n }\n /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: LetDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i0.ErrorHandler }, { token: RenderScheduler }], target: i0.ɵɵFactoryTarget.Directive }); }\n /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"18.2.5\", type: LetDirective, isStandalone: true, selector: \"[ngrxLet]\", inputs: { ngrxLet: \"ngrxLet\", suspenseTemplateRef: [\"ngrxLetSuspenseTpl\", \"suspenseTemplateRef\"] }, providers: [RenderScheduler], ngImport: i0 }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: LetDirective, decorators: [{\n type: Directive,\n args: [{\n standalone: true,\n selector: '[ngrxLet]',\n providers: [RenderScheduler],\n }]\n }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i0.ErrorHandler }, { type: RenderScheduler }], propDecorators: { ngrxLet: [{\n type: Input\n }], suspenseTemplateRef: [{\n type: Input,\n args: ['ngrxLetSuspenseTpl']\n }] } });\n\n/**\n * @description\n *\n * The `ngrxPush` pipe serves as a drop-in replacement for the `async` pipe.\n * It contains intelligent handling of change detection to enable us\n * running in zone-full as well as zone-less mode without any changes to the code.\n *\n * @usageNotes\n *\n * ### Displaying Observable Values\n *\n * ```html\n * <p>{{ number$ | ngrxPush }}</p>\n *\n * <ng-container *ngIf=\"number$ | ngrxPush as n\">{{ n }}</ng-container>\n *\n * <app-number [number]=\"number$ | ngrxPush\"></app-number>\n * ```\n *\n * ### Combining Multiple Observables\n *\n * ```html\n * <code>\n * {{ { users: users$, query: query$ } | ngrxPush | json }}\n * </code>\n * ```\n *\n * @publicApi\n */\nclass PushPipe {\n constructor(errorHandler) {\n this.errorHandler = errorHandler;\n this.renderScheduler = createRenderScheduler();\n this.renderEventManager = createRenderEventManager({\n suspense: (event) => this.setRenderedValue(undefined, event.synchronous),\n next: (event) => this.setRenderedValue(event.value, event.synchronous),\n error: (event) => {\n if (event.reset) {\n this.setRenderedValue(undefined, event.synchronous);\n }\n this.errorHandler.handleError(event.error);\n },\n complete: (event) => {\n if (event.reset) {\n this.setRenderedValue(undefined, event.synchronous);\n }\n },\n });\n this.subscription = this.renderEventManager\n .handlePotentialObservableChanges()\n .subscribe();\n }\n transform(potentialObservable) {\n this.renderEventManager.nextPotentialObservable(potentialObservable);\n return this.renderedValue;\n }\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n setRenderedValue(value, isSyncEvent) {\n if (value !== this.renderedValue) {\n this.renderedValue = value;\n if (!isSyncEvent) {\n this.renderScheduler.schedule();\n }\n }\n }\n /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: PushPipe, deps: [{ token: i0.ErrorHandler }], target: i0.ɵɵFactoryTarget.Pipe }); }\n /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: \"14.0.0\", version: \"18.2.5\", ngImport: i0, type: PushPipe, isStandalone: true, name: \"ngrxPush\", pure: false }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"18.2.5\", ngImport: i0, type: PushPipe, decorators: [{\n type: Pipe,\n args: [{\n standalone: true,\n name: 'ngrxPush',\n pure: false,\n }]\n }], ctorParameters: () => [{ type: i0.ErrorHandler }] });\n\n/**\n * DO NOT EDIT\n *\n * This file is automatically generated at build\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { LetDirective, PushPipe, RenderScheduler };\n","/** @format */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'nl2br',\n standalone: true,\n})\nexport class Nl2brPipe implements PipeTransform {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n transform(value: string, ...args: unknown[]): string {\n return value.replace(/(?:\\r\\n|\\r|\\n)/g, '<br>');\n }\n}\n","<fs-base-modal mode=\"light\" class=\"ion-text-center\"\n [title]=\"'MEMBERS.INVITE.MANAGE.TITLE' | translate\"\n [description]=\"'MEMBERS.INVITE.MANAGE.SUBTITLE' | translate\" \n>\n <form [formGroup]=\"userInviteForm\">\n <fs-form-input\n [label]=\"'MEMBERS.INVITE.MANAGE.SENT_TO' | translate\"\n type=\"text\"\n [control]=\"userInviteForm.get('sentToEmail') | formControlCast\"\n [disabled]=\"isLoading\"\n [hint]=\"'MEMBERS.INVITE.MANAGE.SENT_TO_HINT' | translate\"\n ></fs-form-input>\n \n <fs-form-select\n [label]=\"'COMMON.PROJECT_ROLE' | translate\"\n [items]=\"roleOptions\"\n [control]=\"userInviteForm.get('role') | formControlCast\"\n ></fs-form-select>\n\n <fs-form-textarea\n [label]=\"'MEMBERS.INVITE.LABEL' | translate\"\n [control]=\"userInviteForm.get('messageInput') | formControlCast\"\n ></fs-form-textarea>\n\n <div *ngIf=\"error\">\n <div class=\"project-form__error\">\n <strong>{{ 'ERRORS.ERROR' | translate }}:</strong> {{ error }}\n </div>\n </div>\n </form>\n\n <!-- Humorously this injects the loader from the index.html page due to classes ;) -->\n <div *ngIf=\"isLoading || isLoadingResend\" class=\"loading-wrap\">\n <div class=\"loader\">\n <ion-spinner slot=\"start\" name=\"crescent\"></ion-spinner>\n </div>\n </div>\n\n <div class=\"footer\">\n <p *ngIf=\"errorMessage\">\n {{ errorMessage }}\n </p>\n <!-- Resend Invite, Edit Message & Role, Disable & Delete -->\n <div class=\"footer-btn\">\n <fs-button\n [disabled]=\"isLoading || isLoadingResend || userInviteForm.invalid || !tokenId\"\n [loading]=\"isLoadingResend\"\n (click)=\"resend()\"\n >{{ 'MEMBERS.INVITE.MANAGE.RESEND' | translate }}</fs-button\n >\n </div>\n <div class=\"footer-btn\">\n <fs-button\n [disabled]=\"isLoading || userInviteForm.invalid\"\n (click)=\"save()\"\n >{{ 'MEMBERS.INVITE.MANAGE.SAVE_EDIT' | translate }}</fs-button\n >\n </div>\n <div class=\"footer-btn\">\n <fs-button\n [disabled]=\"isLoading || userInviteForm.invalid\"\n buttonStyle=\"outline\"\n color=\"danger\"\n (click)=\"deleteToken()\"\n >{{ 'MEMBERS.INVITE.MANAGE.DELETE' | translate }}</fs-button\n >\n </div>\n </div>\n</fs-base-modal>\n","/** @format */\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { UntypedFormBuilder, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { AlertController, ModalController, IonSpinner } from '@ionic/angular/standalone';\nimport { filter, take } from 'rxjs/operators';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { MailerService } from '@app/core/services/mailer.service';\nimport { FormControlCastPipe } from '@app/shared/pipes/form-control-cast.pipe';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.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 { FormTextareaComponent } from '@app/shared/components/ui/form/form-textarea/form-textarea.component';\nimport { BaseModalComponent } from '@app/shared/components/ui/modal/base-modal.component';\nimport { getProjectDefaultHeroUrl, Project } from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { PROJECT_MEMBER_ROLE } from '@app/project-members/shared/project-member.model';\nimport {\n getInviteAcceptPath,\n getInviteTypeFromProject,\n OnboardingTypes,\n} from '@app/onboarding/shared/onboarding.model';\nimport { Token, TOKEN_QUERY_PARAM } from '@app/tokens/shared/tokens.model';\nimport { TokensService } from '@app/tokens/shared/services/tokens.service';\nimport { environment } from 'src/environments/environment';\n\nconst ROOT_APP_URL = 'https://app.filmstacker.com/';\n\nconst getReturnUrl = (projectId, eventType) =>\n `${ROOT_APP_URL}${getInviteAcceptPath(eventType as OnboardingTypes)}/${projectId}`;\nconst appProjectUrl = (projectId) => `${ROOT_APP_URL}${PROJECT_DETAIL_ROUTE}/${projectId}`;\n\n@Component({\n selector: 'app-member-invite-modal',\n templateUrl: './member-invite-modal.component.html',\n styleUrls: ['./member-invite-modal.component.scss'],\n standalone: true,\n imports: [\n BaseModalComponent,\n FormsModule,\n ReactiveFormsModule,\n FormInputComponent,\n FormSelectComponent,\n FormTextareaComponent,\n NgIf,\n IonSpinner,\n ButtonComponent,\n TranslatePipe,\n FormControlCastPipe,\n ],\n})\nexport class MemberInviteModalComponent implements OnInit {\n @Input() token: Token;\n\n error: string;\n isLoading = false;\n isLoadingResend = false;\n errorMessage = '';\n\n roleOptions: { text: string; value: string }[] = [\n {\n text: PROJECT_MEMBER_ROLE.PRODUCER,\n value: PROJECT_MEMBER_ROLE.PRODUCER,\n },\n {\n text: PROJECT_MEMBER_ROLE.CREW,\n value: PROJECT_MEMBER_ROLE.CREW,\n },\n ]; // Object.values(PROJECT_MEMBER_ROLE)\n\n userInviteForm = this.formBuilder.group({\n sentToEmail: ['', Validators.compose([Validators.required, Validators.email])],\n messageInput: ['', Validators.compose([Validators.required, Validators.minLength(3)])],\n role: [PROJECT_MEMBER_ROLE.CREW, [Validators.required]],\n });\n\n get tokenId() {\n return this.token && this.token.id;\n }\n\n private project: Project;\n private get projectId(): string {\n return this.project?.id ?? '';\n }\n private get projectTitle(): string {\n return this.project?.title ?? '';\n }\n private get projectHero(): string {\n return this.project?.hero ?? getProjectDefaultHeroUrl(this.project);\n }\n /** @note that this is the Invite Email URL, so it cannot be the shareUrl\n * rather must be the app url\n */\n private get projectShareUrl(): string {\n return this.projectId && appProjectUrl(this.projectId);\n }\n\n constructor(\n private formBuilder: UntypedFormBuilder,\n private modalCtrl: ModalController,\n private alertCtrl: AlertController,\n private tokensService: TokensService,\n private mailerService: MailerService,\n private projectService: ProjectService,\n private translate: TranslateService\n ) {}\n\n ngOnInit(): void {\n if (this.token) {\n const {\n // action,\n // createdBy,\n // fromEmail,\n // id,\n projectId,\n sentToEmail,\n projectRole = PROJECT_MEMBER_ROLE.CREW,\n // eventType,\n payload: {\n message = '',\n // returnUrl\n } = {},\n } = this.token;\n this.userInviteForm.patchValue({\n sentToEmail,\n messageInput: message,\n role: projectRole,\n });\n\n if (projectId) {\n // get the projectPreview deets, already exists\n this.projectService\n .getProjectFromStoreById(projectId)\n .pipe(\n filter((p) => p && p.id && p.id.length > 0),\n take(1)\n )\n .subscribe((project) => {\n this.project = project;\n });\n }\n }\n }\n cancel() {\n return this.modalCtrl.dismiss(null, 'cancel');\n }\n\n saved(data = {}) {\n return this.modalCtrl.dismiss(data, 'saved');\n }\n\n resent(data = {}) {\n return this.modalCtrl.dismiss(data, 'resent');\n }\n\n async deleteToken() {\n if (this.tokenId) {\n const alert = await this.alertCtrl.create({\n header: this.translate.instant('MEMBERS.INVITE.MANAGE.DELETE_CONFIRM'),\n message: this.translate.instant('MEMBERS.INVITE.MANAGE.ACTION_CONFIRM'),\n buttons: [\n {\n text: this.translate.instant('COMMON.CANCEL'),\n role: 'cancel',\n handler: () => {\n // this.handlerMessage = 'Alert canceled';\n },\n },\n {\n text: this.translate.instant('COMMON.DELETE'),\n role: 'destructive',\n handler: () => {\n // delete token then close the modal\n this.tokensService.deleteToken(this.tokenId);\n return this.modalCtrl.dismiss({ id: this.tokenId }, 'deleted');\n },\n },\n ],\n });\n\n await alert.present();\n\n // const { role } = await alert.onDidDismiss();\n // this.roleMessage = `Dismissed with role: ${role}`;\n }\n }\n\n async resend() {\n this.isLoadingResend = true;\n try {\n if (this.userInviteForm.valid) {\n const toEmail = this.userInviteForm.get('sentToEmail').value;\n const message = this.userInviteForm.get('messageInput').value;\n const role = this.userInviteForm.get('role').value;\n\n const { message: updateMessage, updates, error } = await this.updateTokenApi({ toEmail, message, role });\n\n !environment.production && console.log(`resend update res:`, { updateMessage, updates });\n\n if (error) {\n this.errorMessage = error;\n return;\n }\n\n const token: Token = {\n ...this.token,\n ...updates,\n };\n\n // const returnUrl = token.payload && token.payload.returnUrl ? token.payload.returnUrl : getReturnUrl(token.projectId, token.eventType);\n\n const projectList = [\n {\n id: this.projectId,\n title: this.projectTitle,\n img: this.projectHero,\n shareUrl: `${this.projectShareUrl}?${TOKEN_QUERY_PARAM}=${token.id}`,\n },\n ];\n\n this.mailerService\n .sendInviteEmail({\n token,\n fromName: token.createdBy,\n fromEmail: token.fromEmail,\n toEmail, //: sentToEmail,\n message,\n routeId: token.eventType,\n returnUrl: getReturnUrl(token.projectId, token.eventType),\n projectList,\n })\n .pipe(take(1))\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n .subscribe((res) => {\n // show success somehow then close\n this.isLoadingResend = false;\n return this.resent(token);\n });\n }\n } catch (error) {\n console.error(error);\n // toast ?\n this.errorMessage = `Oops! There was an issue resending the invite. Please try again.`;\n this.isLoadingResend = false;\n }\n }\n\n async save() {\n try {\n this.isLoading = true;\n\n if (this.userInviteForm.valid) {\n const toEmail = this.userInviteForm.get('sentToEmail').value;\n const message = this.userInviteForm.get('messageInput').value;\n const role = this.userInviteForm.get('role').value;\n\n const { message: updateMessage, updates, error } = await this.updateTokenApi({ toEmail, message, role });\n\n !environment.production && console.log(`save update res:`, { updateMessage, updates });\n\n if (error) {\n this.errorMessage = error;\n } else {\n this.saved({\n ...this.token,\n ...updates,\n });\n }\n }\n } catch (err) {\n console.warn(err);\n } finally {\n this.isLoading = false;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async updateTokenApi({ toEmail, message, role }): Promise<{ message: string; updates: any; error?: any }> {\n const {\n // action,\n // createdBy,\n // fromEmail,\n sentToEmail,\n id,\n projectId,\n projectRole,\n createdAt,\n eventType: tokenEventType,\n payload: { eventType: payloadEventType, message: tokenMessage = '', returnUrl } = {},\n } = this.token;\n\n // migrating eventTypes\n const eventType = tokenEventType || payloadEventType;\n\n const updates: Partial<Token> = {\n id,\n createdAt, // keep this for an easier api migration..\n };\n // check role matches, else update... or just update?\n if (projectRole !== role) {\n updates.projectRole = role;\n }\n if (sentToEmail !== toEmail) {\n updates.sentToEmail = toEmail;\n }\n\n if (tokenMessage !== message) {\n updates.payload = {};\n updates.payload.message = message;\n }\n if (!returnUrl) {\n updates.payload = updates.payload || {};\n updates.payload.returnUrl = getReturnUrl(projectId, eventType);\n }\n\n // get project eventType\n const projectEventType = getInviteTypeFromProject(this.project);\n if (projectEventType && projectEventType !== eventType) {\n updates.eventType = projectEventType;\n }\n\n // if (this.token.payload.acceptUrl) {\n // token.payload.acceptUrl = this.token.payload.acceptUrl;\n // }\n\n // then\n try {\n // todo update await\n const { message: updateMessage } = await this.tokensService.updateToken(updates);\n\n return {\n message: updateMessage,\n updates,\n };\n } catch (error) {\n console.error(error);\n\n // this.errorMessage = updateMessage || `Oops! There was an issue resending the invite. Please try again.`;\n return {\n message: 'Oops! There was an issue resending the invite. Please try again.',\n error: 'Oops! There was an issue resending the invite. Please try again.',\n updates: {},\n };\n }\n }\n}\n","<ion-grid *ngIf=\"projectId\" class=\"project-member-list\">\n\n <!-- <ion-row *ngIf=\"showTitle\" >\n <ion-col class=\"ion-text-left\">\n <fs-list-title class=\"list-title\" icon=\"people-outline\">\n {{ 'COMMON.FILM_CREW' | translate }} <span class=\"crew-count\">{{projectMembers.length}}</span>\n </fs-list-title>\n </ion-col>\n </ion-row> -->\n \n <ion-row class=\"crew-list ion-justify-content-start\">\n <div class=\"vertical-text\">\n {{ 'COMMON.PENDING_INVITES' | translate }}\n </div>\n <ion-col *ngFor=\"let projectMember of invites; trackBy: trackByInvite\" size=\"2\" class=\"member-col\">\n <div *ngIf=\"projectMember\" (click)=\"viewProjectMember(projectMember)\" class=\"crew-member\" [class.not-active]=\"!projectMember || !projectMember.isActive\" [title]=\"'COMMON.EDIT' | translate\">\n <ion-fab-button class=\"floating-edit-icon\" size=\"small\">\n <ion-icon name=\"create-outline\"></ion-icon>\n </ion-fab-button>\n <ion-avatar class=\"avatar\">\n <img [src]=\"projectMember.avatar\" [alt]=\"projectMember.username\" [fallback]=\"avatarFallback\" />\n </ion-avatar>\n <div class=\"name\">\n <span>{{projectMember.username}}</span>\n </div>\n <div class=\"role\">\n <span *ngIf=\"!projectMember || !projectMember.isActive\" class=\"ion-text-uppercase\">{{ 'COMMON.INACTIVE' | translate }} </span>\n <span>{{projectMember.role}}</span>\n </div>\n </div>\n </ion-col>\n \n <!-- Add icon for new Invite -->\n <ion-col *ngIf=\"showInvite\" size=\"2\" class=\"member-col\">\n <div class=\"crew-member\" [title]=\"'MEMBERS.INVITE.ACTION' | translate\">\n <ion-button class=\"avatar\" fill=\"outline\" [disabled]=\"isLoadingInvite\" (click)=\"inviteMember()\">\n <ion-spinner *ngIf=\"isLoadingInvite\" class=\"invite-spinner\"></ion-spinner>\n <ion-icon name=\"add\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <!-- <ion-avatar class=\"avatar\">\n <img [src]=\"avatarFallback\" />\n </ion-avatar> -->\n <!-- <div class=\"name\">\n <span>{{'MEMBERS.INVITE.ACTION' | translate}}</span>\n </div> -->\n <div class=\"role bold\">\n <span>{{'MEMBERS.INVITE.ACTION' | translate}}</span>\n </div>\n </div>\n </ion-col>\n\n </ion-row>\n\n</ion-grid>\n","/** @format */\n\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { NgIf, NgFor } from '@angular/common';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport {\n ModalController,\n IonGrid,\n IonRow,\n IonCol,\n IonFabButton,\n IonIcon,\n IonAvatar,\n IonButton,\n IonSpinner,\n} from '@ionic/angular/standalone';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { DEFAULT_USER_AVATAR_TERTIARY } from '@app/shared/models/user.model';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport { Utils } from '@app/shared/utils';\nimport { ProjectMember } from '@app/projects/shared/project.model';\nimport { PROJECT_MEMBER_ROLE } from '@app/project-members/shared/project-member.model';\nimport { Token } from '@app/tokens/shared/tokens.model';\nimport { MemberInviteModalComponent } from '../member-invite-modal/member-invite-modal.component';\n\nconst DEBUG_LOGS = false;\n\nclass PendingInvite extends ProjectMember {\n tokenId?: string;\n token?: Token;\n}\n\n@Component({\n selector: 'app-member-invite-list',\n templateUrl: './member-invite-list.component.html',\n styleUrls: ['./member-invite-list.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n IonGrid,\n IonRow,\n NgFor,\n IonCol,\n IonFabButton,\n IonIcon,\n IonAvatar,\n ImageFallbackDirective,\n IonButton,\n IonSpinner,\n TranslatePipe,\n ],\n})\nexport class MemberInviteListComponent {\n /** show the invite button at end of list */\n @Input() showInvite = true;\n @Input() inviteType = ''; // {{ 'ONBOARDING' + (inviteType ? '.' + inviteType : '') + '.INVITE_ACTION' | translate }}\n @Input() projectId: string;\n @Input()\n set tokens(value: Token[]) {\n this._tokens = value;\n const items = (value ?? [])\n .filter((token) => token && !token.persistToken) // don't show the persistTokens in list\n .map((token) => this.convertTokenToPendingMember(token))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .sort((a, b) => Utils.sortObjArrayAlphaBy(a, b, 'username'));\n // note: these include !isActive..\n DEBUG_LOGS && console.log(`MemberInviteList invite tokens:`, { tokens: value, items });\n this.invites = items;\n }\n get tokens(): Token[] {\n return this._tokens ?? [];\n }\n\n @Output() addMember = new EventEmitter();\n @Output() memberDeleted = new EventEmitter<string>();\n\n avatarFallback = DEFAULT_USER_AVATAR_TERTIARY;\n invites: PendingInvite[] = [];\n\n get routerLinkInvite() {\n return '/events' + (this.inviteType ? '/' + this.inviteType.toLowerCase() : '') + '/invite/' + this.projectId || '';\n }\n\n isLoadingInvite = false;\n\n private _tokens = [];\n\n constructor(\n private toaster: ToasterService,\n private modalCtrl: ModalController,\n private translate: TranslateService\n ) {}\n\n /*\n Note: ngOnInit code moved to parent and handled in \"@Input set tokens\"\n if (this.projectId) this.tokensService.listTokens -> this.invites\n */\n\n trackByInvite(index, item) {\n return item?.tokenId ?? index;\n }\n\n inviteMember() {\n // instead of route, allow the parent to handle\n this.addMember.emit();\n }\n\n viewProjectMember(projectMember: PendingInvite) {\n /* .token = \n action: \"Invite To Project\"\n createdAt: \"2022-07-01T17:40:25.956Z\"\n createdBy: \"cody_sheehy\"\n fromEmail: \"cody@filmstacker.com\"\n id: \"34ea360e-0cb7-4048-be91-eb23a115ace7\"\n eventType: \"EVENTS\"\n payload:\n message: \"We're hoping you'll help capture video clips to tell our story. It's easy, fun and free for you. We'd like to have you on the team.\"\n returnUrl: \"/stack/discover/project/cody_sheehy_the-4th-of-july_20220701\"\n projectId: \"cody_sheehy_the-4th-of-july_20220701\"\n projectRole: \"CREW\"\n sentToEmail: \"craig@filmstacker.com\"\n */\n // console.log(projectMember);\n this.openModal(projectMember.token);\n }\n\n private async openModal(token: Token) {\n try {\n this.isLoadingInvite = true;\n const modal = await this.modalCtrl.create({\n component: MemberInviteModalComponent,\n componentProps: {\n token,\n },\n });\n modal.present();\n\n const { data, role } = await modal.onWillDismiss();\n // console.log({ data, role })\n const id = data?.id;\n if (role === 'deleted' && id) {\n this.invites = this.invites.filter((invite) => invite && invite.tokenId !== id);\n // Invite Deleted - notify parent\n this.memberDeleted.emit(id);\n this.toaster.present(this.translate.instant('MEMBERS.INVITE.DELETED'));\n } else if (role === 'saved' && id) {\n // invite updated\n const foundIndex = this.invites.findIndex((x) => x.tokenId === id);\n if (foundIndex > -1) {\n this.invites[foundIndex] = {\n // ...this.invites[foundIndex],\n ...this.convertTokenToPendingMember(data, this.invites[foundIndex]),\n };\n DEBUG_LOGS && console.log(`Invite updated:`, { id: id, foundIndex, data, invite: this.invites[foundIndex] });\n }\n this.toaster.present(this.translate.instant('MEMBERS.INVITE.SAVED'));\n } else if (role === 'resent' && id) {\n // invite resent\n const foundIndex = this.invites.findIndex((x) => x.tokenId === id);\n if (foundIndex > -1) {\n this.invites[foundIndex] = {\n // ...this.invites[foundIndex],\n ...this.convertTokenToPendingMember(data, this.invites[foundIndex]),\n };\n DEBUG_LOGS && console.log(`Invite updated:`, { id, foundIndex, data, invite: this.invites[foundIndex] });\n }\n this.toaster.present(this.translate.instant('MEMBERS.INVITE.RESENT'));\n }\n } catch (error) {\n console.warn(error);\n } finally {\n this.isLoadingInvite = false;\n }\n }\n\n private convertTokenToPendingMember(token: Token, defaults: Partial<PendingInvite> = {}): PendingInvite {\n const {\n // action,\n // createdBy,\n // fromEmail,\n id,\n projectId,\n sentToEmail,\n projectRole = PROJECT_MEMBER_ROLE.CREW,\n // eventType,\n payload: {\n // message,\n // returnUrl\n } = {},\n } = token;\n\n if (projectId && projectId !== this.projectId) {\n return;\n }\n\n return {\n userId: sentToEmail || defaults.userId,\n username: sentToEmail || defaults.username,\n role: projectRole || defaults.role,\n isActive: true || defaults.isActive,\n projectId: projectId || defaults.projectId,\n tokenId: id || defaults.tokenId,\n token: token || defaults.token,\n // avatar: || defaults.//,\n };\n }\n}\n","<ion-header>\n <app-top-navbar \n theme=\"light\"\n class=\"light\"\n [title]=\"(project$ | async)?.title\"\n [drawerEnabled]=\"true\"\n [drawerHandleActions]=\"drawerHandleActions\"\n [drawerExpandEvent]=\"topDrawerExpand$ | async\"\n [drawerCloseEvent]=\"topDrawerClose$ | async\"\n [drawerSelectedItemSuccess]=\"selectedItemSuccess$ | async\"\n (drawerSelected)=\"draftDrawerSelected($event)\"\n (drawerNewItem)=\"draftDrawerNewItem($event)\"\n (drawerExpand)=\"draftDrawerExpanded($event)\"\n >\n <!-- SLOT: anything added here will go below the ion-navbar -->\n </app-top-navbar>\n</ion-header>\n\n<ion-content class=\"project light\">\n <ng-template #noProject>\n <div class=\"page container ion-text-center ion-padding ion-margin-top\">\n <ng-container *ngIf=\"loading; else noProjDoneLoading\">\n <p><ion-spinner name=\"crescent\"></ion-spinner> {{ 'PROJECT.LOADER' | translate }}</p>\n </ng-container>\n <ng-template #noProjDoneLoading>\n <p> {{ 'PROJECT.NOT_FOUND' | translate }} </p>\n <ion-button fill=\"outline\" routerLink=\"/stack/discover/projects\">{{ \n 'PROJECT.VIEW_ALL' | translate \n }}</ion-button>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-template #privateProject>\n <div class=\"page container ion-text-center ion-padding ion-margin-top\">\n <ng-container *ngIf=\"loading; else privDoneLoading\">\n <p><ion-spinner name=\"crescent\"></ion-spinner> {{ 'PROJECT.LOADER' | translate }}</p>\n </ng-container>\n <ng-template #privDoneLoading>\n \n <h1>{{ 'PROJECT.IS_PRIVATE_HEADING' | translate }}</h1>\n <h2 class=\"ion-margin-bottom\">{{ 'PROJECT.IS_PRIVATE_SUBHEADING' | translate }}</h2>\n \n <ion-button *ngIf=\"(isLoggedIn$ | async) !== true\" fill=\"outline\" routerLink=\"/login\" [queryParams]=\"{returnUrl: currentUrl}\">{{ \n 'PROJECT.IS_PRIVATE_LOGIN' | translate \n }}</ion-button>\n\n <div *ngIf=\"showJoinButton\" class=\"ion-padding-top\">\n <ion-button size=\"large\" [routerLink]=\"routerLinkJoin\" queryParamsHandling=\"preserve\">\n {{ 'COMMON.JOIN_AS_CREW' | translate }}\n </ion-button>\n </div>\n </ng-template>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"project$ | async as project; else noProject\">\n <ng-container *ngrxLet=\"vm$ as vm\">\n <div *ngIf=\"project?.privacy !== privacyPrivate || vm.isProjectMember; else privateProject\">\n <!-- SHARE BUTTON we could restrict it to privacy: project?.privacy !== privacyPrivate -->\n <ion-button *ngIf=\"project?.shareUrl && !isWidgetActive\" fill=\"clear\" color=\"light\"\n class=\"project__edit project__share\" (click)=\"shareProject(project, $event)\">\n <ion-icon slot=\"icon-only\" ios=\"share-outline\" md=\"share-social-outline\"></ion-icon>\n </ion-button>\n\n <div *ngIf=\"!isWidgetActive\" class=\"top-right-hero-btns\">\n <fs-subscription-mini-status-edit\n *ngIf=\"projectSubActive && enableBilling && vm.isProjectMember === true\"\n class=\"subscription-status subscription-color subscription-btn\"\n color=\"light\"\n [level]=\"projectSubLevel\"\n [isDisabled]=\"!vm.isProjectAdmin || project?.subscriptionBy !== currentUserId\"\n [showEditButton]=\"false\"\n (clicked)=\"openEventDetailsPopover($event, project, vm.isProjectAdmin)\"\n ></fs-subscription-mini-status-edit>\n\n <!-- EDIT BUTTON for admins -->\n <ion-button *ngIf=\"vm.isProjectAdmin === true\" fill=\"clear\" color=\"light\" class=\"project__edit\"\n (click)=\"openProjectAdmin()\">\n <ion-icon slot=\"icon-only\" name=\"settings-outline\"></ion-icon>\n </ion-button>\n </div>\n\n <ng-container *ngIf=\"showProjectHero\">\n <div class=\"project__hero\" [style.background-image]=\"'url(' + projectHero + ')'\">\n <ion-button posterUpload *ngIf=\"isDefaultProjectHero && vm.isProjectAdmin\" fill=\"outline\" color=\"primary\"\n size=\"large\" class=\"round\" title=\"{{ 'PROJECT.FORM.PROPS.POSTER.PLACEHOLDER' | translate }}\"\n [projectId]=\"project.id\" [userId]=\"currentUserId\" (fileUploadFinished)=\"onFileUploadFinished($event)\"\n (fileUploadFailed)=\"onFileUploadFailed($event)\">\n <ion-icon slot=\"icon-only\" name=\"images-outline\"></ion-icon>\n </ion-button>\n <div class=\"project__hero__content\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <h1>{{ project.title }}</h1>\n <fs-uploader-stats \n [views]=\"numStackViews$ | async\" \n viewsTitle=\"{{ 'COMMON.NUMBER_STACK_VIEWS' | translate }}\"\n [moreViews]=\"moreStacksToLoad\" \n [likes]=\"project.votes || -1\" \n [stacks]=\"numStacks$ | async\"\n stacksTitle=\"{{ 'COMMON.NUMBER_STACKS' | translate }}\" \n [moreStacks]=\"moreStacksToLoad\"\n [members]=\"(project.members || []).length\"\n ></fs-uploader-stats>\n <p *ngIf=\"project.mission\">{{ project.mission }}</p>\n <!-- <p *ngIf=\"project.description\" [innerHTML]=\"project.description | nl2br\"></p> -->\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"project__tint\"></div>\n </ng-container>\n\n <div class=\"container\">\n <p *ngIf=\"project.description\" [innerHTML]=\"project.description | nl2br\"></p>\n\n <div *ngIf=\"vm.isProjectAdmin && isWedding\" class=\"top-content-tips-btn-wrap\">\n <ion-button \n fill=\"clear\" \n color=\"primary\" \n href=\"https://filmstacker.com/support/filmstacker-tips/successful-wedding-event\" \n target=\"_filmstacker\" \n title=\"{{ 'ONBOARDING.WEDDINGS.TIPS_LINK_TITLE' | translate }}\">\n <ion-icon slot=\"start\" name=\"information-circle-outline\"></ion-icon>\n {{ 'ONBOARDING.WEDDINGS.TIPS' | translate }}\n <ion-icon slot=\"end\" name=\"open-outline\" size=\"small\"></ion-icon>\n </ion-button> \n </div>\n\n <!-- replaced with openEventDetailsPopover \n <div #projectEventsEl *ngIf=\"projectSubActive && enableBilling && !isWidgetActive && vm.isProjectMember === true\">\n <fs-event-detail\n [currentUserId]=\"currentUserId\"\n [subscriptionId]=\"projectSubscriptionId\"\n [subscriptionLevel]=\"projectSubLevel\"\n [subscriptionBy]=\"project?.subscriptionBy\"\n [subscriptionisActive]=\"projectSubActive\"\n [eventDate]=\"project?.eventDate\"\n [canEdit]=\"vm.isProjectAdmin\"\n ></fs-event-detail>\n </div> -->\n\n <fs-list-title icon=\"layers-outline\">{{ 'COMMON.FILMSTACKS' | translate }}</fs-list-title>\n <div class=\"layout-wrap\">\n <fs-collab-drafts *ngIf=\"vm.isProjectMember\" \n [listId]=\"listIdCollabDrafts\"\n [heading]=\"'PROJECT.COLLAB_DRAFT_STACKS.HEADING' | translate\" \n [projectId]=\"projectId\"\n [isModerated]=\"project.isModerated\" \n [canModerate]=\"vm.isProjectAdmin\"\n [isProjectMember]=\"vm.isProjectMember\" \n [showListIfEmpty]=\"false\"\n ></fs-collab-drafts>\n\n <div class=\"search-toolbar\" *ngIf=\"vm.isProjectMember\">\n <app-filterable-toolbar [searchPlaceholder]=\"'Find Stacks'\" (onSearch)=\"onSearchStacks($event)\">\n </app-filterable-toolbar>\n </div>\n\n <div *ngIf=\"(featuredStacks.items$ | async)?.length > 0\" class=\"list-wrap list-featured-stacks\">\n <h3 *ngIf=\"vm.isProjectMember\">\n <ion-button *ngIf=\"vm.isProjectAdmin\" style=\"float: right;\" fill=\"clear\" color=\"medium\" (click)=\"openProjectAdminManageFeatured()\">\n {{ 'COMMON.EDIT' | translate }}\n </ion-button> \n {{ 'PROJECT.FEATURED_STACKS.HEADING' | translate }}\n </h3>\n \n <app-stack-list *ngIf=\"featuredStacks.list$ | async as list\" \n [layout]=\"{\n type: layoutType.Carousel\n }\" \n [items]=\"featuredStacks.items$ | async\" \n [canLoadMore]=\"!!list.nextToken\" \n [isLoading]=\"list.loading\"\n [heading]=\"featuredStacks.label\" \n [isModerated]=\"project.isModerated\"\n [canModerate]=\"vm.isProjectAdmin\"\n [isProjectMember]=\"vm.isProjectMember\" \n (loadMore)=\"loadMoreStacks(list)\"\n ></app-stack-list>\n </div>\n\n <ng-container *ngIf=\"showRecentStacks || vm.isProjectMember else recentStacksNotShowing\">\n <div *ngFor=\"let stackList of [recentStacks]\" class=\"list-wrap\">\n <h3 *ngIf=\"vm.isProjectMember\">\n {{ 'PROJECT.RECENT_STACKS.HEADING' | translate }}\n <span *ngIf=\"vm.isProjectAdmin && showRecentStacks\" class=\"list-subtitle\">\n {{ 'PROJECT.RECENT_STACKS.ADMIN_HIDE' | translate }}\n </span>\n <span *ngIf=\"vm.isProjectAdmin && !showRecentStacks\" class=\"list-subtitle\">\n {{ 'PROJECT.RECENT_STACKS.ADMIN_SHOW' | translate }}\n </span>\n </h3>\n \n <app-stack-list *ngIf=\"stackList.list$ | async as list\" \n [layout]=\"{\n type: layoutType.Carousel,\n options: {\n hasAddNewItemButton: vm.isProjectMember\n }\n }\" \n [items]=\"stackList.items$ | async\" \n [canLoadMore]=\"!!list.nextToken\" \n [isLoading]=\"list.loading\"\n [heading]=\"stackList.label\" \n [isModerated]=\"project.isModerated\" \n [canModerate]=\"vm.isProjectAdmin\"\n [isProjectMember]=\"vm.isProjectMember\" \n (loadMore)=\"loadMoreStacks(list)\" \n (newStackClick)=\"expandDraftDrawer()\"\n ></app-stack-list>\n </div>\n </ng-container>\n\n <ng-template #recentStacksNotShowing>\n <p *ngIf=\"(featuredStacks.items$ | async)?.length < 1\">\n {{ 'PROJECT.NO_PUBLIC_STACKS' | translate }}\n </p>\n </ng-template>\n\n <fs-draft-stacks *ngIf=\"vm.isProjectMember\" \n [listId]=\"listIdStackDrafts\" \n [showListIfEmpty]=\"false\"\n [showAvatar]=\"true\" \n [projectId]=\"projectId\" \n [isModerated]=\"project.isModerated\"\n [canModerate]=\"vm.isProjectAdmin\"\n ></fs-draft-stacks>\n\n <ng-container *ngIf=\"(stackListPrivate?.items$ | async)?.length > 0 && stackListPrivate?.list$ | async as listPrivate\">\n <h3>{{ 'PROJECT.PRIVATE_STACKS.HEADING' | translate }}</h3>\n <div class=\"list-wrap\">\n <app-stack-list \n [class.no-items]=\"(stackListPrivate?.items$ | async)?.length < 1\" \n [layout]=\"{\n type: layoutType.Carousel\n }\" \n [items]=\"stackListPrivate?.items$ | async\" \n [canLoadMore]=\"!!listPrivate.nextToken\"\n [isLoading]=\"listPrivate.loading\" \n [heading]=\"stackListPrivate.label\" \n (loadMore)=\"loadMoreStacks(listPrivate)\"\n ></app-stack-list>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n <!-- PROJECT CLIPS & maybe Guides -->\n <div *ngIf=\"!isWidgetActive && userAsProjectMember$ | async as projectMember\">\n <div class=\"container\" *ngIf=\"projectMember?.isActive\">\n\n <!-- moved fs-carousel-guides to crew section MVP-1223 -->\n\n <!-- \n clicking in items causes search input to be selected\n https://github.com/ionic-team/ionic-framework/issues/21982#issuecomment-734999212\n -->\n <div [class.isShowing]=\"isClipsListShowing\" class=\"accordion-search-toolbar\">\n <!-- hid this 2022-07-05 to delay dealing with \n https://github.com/ionic-team/ionic-framework/issues/21982 -->\n <app-filterable-toolbar \n [options]=\"['Recent', 'Not Used', 'Mine']\" \n [selectedOption]=\"'Recent'\"\n [searchPlaceholder]=\"'Find Clips'\" \n (onSearch)=\"onSearchClips($event)\"\n (onOption)=\"onFilterClips($event)\"\n ></app-filterable-toolbar>\n </div>\n <ion-accordion-group (ionChange)=\"clipsAccordionChange($event)\">\n <ion-accordion>\n <div slot=\"header\">\n <ion-item slot=\"header\" class=\"accordion-main-header no-padding-start\" lines=\"none\">\n <ion-label color=\"primary\">\n <fs-list-title icon=\"film\" [list]=\"clipsByProject.list$ | async\">{{ \n 'PROJECT.CLIPS_HEADER' | translate\n }}</fs-list-title>\n </ion-label>\n <ion-button fill=\"clear\" slot=\"end\">\n {{ 'COMMON.SHOW_HIDE' | translate }}\n </ion-button>\n </ion-item>\n </div>\n\n <div slot=\"content\">\n <!-- hid this 2022-07-05 to delay dealing with \n https://github.com/ionic-team/ionic-framework/issues/21982 -->\n <!-- <div hidden class=\"search-toolbar\">\n <app-filterable-toolbar \n [options]=\"['Recent', 'Not Used', 'Mine']\" \n [selectedOption]=\"'Recent'\"\n [searchPlaceholder]=\"'Find Clips'\" \n (onSearch)=\"onSearchClips($event)\" \n (onOption)=\"onFilterClips($event)\"\n ></app-filterable-toolbar>\n </div> -->\n\n <ng-container *ngIf=\"clipsByProject.list$ | async as clipsList\">\n <app-clip-list \n [layout]=\"{\n type: layoutType.Grid,\n options: {\n showAvatar: true\n }\n }\" \n [items]=\"clipsByProject.items$ | async\" \n [canEdit]=\"vm.isProjectAdmin\"\n [isLoading]=\"clipsList.loading\" \n [isModerated]=\"false && project.isModerated\"\n [canModerate]=\"vm.isProjectAdmin\" \n ></app-clip-list>\n <!-- re-enable [isModerated]=\"project.isModerated\" -->\n\n <div *ngIf=\"clipsList?.itemIds?.length >0 && clipsList?.nextToken\"\n class=\"clips-loadmore ion-text-center\">\n <ion-button [disabled]=\"clipsList.loading\" (click)=\"loadMoreClips(clipsList)\">\n {{ 'COMMON.MORE' | translate }}\n </ion-button>\n </div>\n </ng-container>\n </div>\n </ion-accordion>\n </ion-accordion-group>\n\n <app-capture-clip-button [projectId]=\"projectId\" [startUpload]=\"captureClipEvent\"\n (uploadSuccess)=\"captureSuccess($event)\"></app-capture-clip-button>\n </div><!-- end projectMember.isActive -->\n </div>\n\n <!-- FILM CREW, we already have *ngIf=\"project$ | async as project\" in parent -->\n <div class=\"container project-member-section\" [ngStyle]=\"isWidgetActive && {'margin-bottom': 0}\">\n\n <div *ngIf=\"!isWidgetActive && userAsProjectMember$ | async as projectMember\">\n <!-- only show guides if you are an activer member and none of your content exists -->\n <fs-carousel-guides *ngIf=\"projectMember?.isActive && (myContentExists$ | async) === false\"></fs-carousel-guides>\n </div>\n\n <div class=\"container ion-text-center ion-padding-top\" *ngIf=\"showJoinButton\">\n <ion-button size=\"large\" [routerLink]=\"routerLinkJoin\" queryParamsHandling=\"preserve\">\n {{ 'COMMON.JOIN_AS_CREW' | translate }}\n </ion-button>\n </div>\n\n <!-- [showApply]=\"((userAsProjectMember$ | async) === undefined) && (isLoggedIn$ | async) && !isWidgetActive\" -->\n <fs-project-member-list \n [showTitle]=\"true\" \n [projectId]=\"projectId\" \n [projects]=\"[project]\" \n [canEdit]=\"vm.isProjectAdmin\"\n ></fs-project-member-list>\n\n <div *ngIf=\"vm.isProjectAdmin === true && !isWidgetActive\" class=\"ion-text-center\">\n <app-member-invite-list \n [projectId]=\"project.id\" \n [inviteType]=\"inviteType\"\n [tokens]=\"inviteTokens\"\n (addMember)=\"addMember(project)\"\n (memberDeleted)=\"memberDeleted($event)\"\n ></app-member-invite-list>\n\n <!-- removed this buttonand just using the crew list add icon\n <ion-button outline=\"true\" (click)=\"inviteCrew(project)\">\n <ion-label>{{ 'ONBOARDING' + (inviteType ? '.' + inviteType : '') + '.INVITE_ACTION' | translate }}</ion-label>\n </ion-button> -->\n <!-- We already know vm.isProjectAdmin === true && !isWidgetActive -->\n <div *ngIf=\"canCreateEvent\" class=\"plan-options ion-padding-top\">\n <ion-button fill=\"outline\" (click)=\"createEvent()\">\n <!-- <ion-spinner *ngIf=\"isLoadingEvents\"></ion-spinner> -->\n {{ eventSignUpTranslateKey | translate }}\n </ion-button>\n </div>\n <!-- the Edit Event button should only show if it is yours to Edit -->\n <div *ngIf=\"enableBilling && projectSubActive && project?.subscriptionBy === currentUserId\" class=\"plan-options ion-padding-top\">\n <ion-button fill=\"outline\" (click)=\"editSubscription()\">\n <!-- <ion-spinner *ngIf=\"isLoadingEvents\"></ion-spinner> -->\n {{ eventEditTranslateKey | translate }}\n </ion-button>\n </div>\n <div class=\"ion-padding-top\">\n <ion-button fill=\"clear\" color=\"medium\" (click)=\"openProjectAdmin()\">\n {{ 'PROJECT.EDIT' | translate }}\n <ion-icon slot=\"start\" name=\"settings-outline\"></ion-icon>\n </ion-button> \n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <app-footer theme=\"light\"></app-footer>\n</ion-content>\n\n<fs-tab-fab-container *ngrxLet=\"vm$ as vm\">\n <!-- hide the fab totally if there's no actions to take (not a member) -->\n <ion-fab #tabFabProject \n *ngIf=\"(vm.isProjectMember || isCaptureAllowed) && !isWidgetActive && project$ | async as project\" \n class=\"tab-fab\" >\n <!-- hide the fab totally if there's no actions to take (not a member) -->\n <ion-fab-button *ngIf=\"(vm.isProjectMember || isCaptureAllowed) && !isWidgetActive\"\n (click)=\"fabClick()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n <ion-fab-list side=\"top\">\n <ng-container *ngIf=\"vm.isProjectAdmin && !isWidgetActive\">\n <ion-chip *ngIf=\"canCreateEvent\" outline=\"true\" (click)=\"createEvent()\">\n <ion-label>{{ 'ONBOARDING.COMMON.FAB_CREATE_EVENT' | translate }}</ion-label>\n </ion-chip>\n <ion-chip outline=\"true\" (click)=\"addMember(project)\">\n <!-- <ion-label>{{ 'PROJECT.FAB_CREW' | translate }}</ion-label> -->\n <ion-label>{{ 'ONBOARDING' + (inviteType ? '.' + inviteType : '') + '.FAB_CREW_ADD' | translate }}</ion-label>\n </ion-chip>\n </ng-container>\n <ion-chip outline=\"true\" (click)=\"expandDraftDrawer()\">\n <ion-label>{{ 'PROJECT.FAB_STACK' | translate }}</ion-label>\n </ion-chip>\n <ng-container *ngIf=\"(vm.isProjectMember || isCaptureAllowed) && !isWidgetActive\">\n <ion-chip outline=\"true\" (click)=\"captureClip()\">\n <ion-label>{{ 'PROJECT.FAB_CLIP' | translate }}</ion-label>\n </ion-chip>\n </ng-container>\n <ion-chip *ngIf=\"isProjectDeleteAllowed && vm.isProjectAdmin\" class=\"warning\" (click)=\"deleteProject()\">\n <ion-label>{{ 'COMMON.DELETE' | translate }}</ion-label>\n </ion-chip>\n </ion-fab-list>\n </ion-fab>\n</fs-tab-fab-container>\n","/** @format */\n\n/*\nhttps://filmstacker.atlassian.net/browse/MVP-1003\n\nProject Toggle: Live / Moderated \n Live: The public and crew can see and use the contributed content as it comes in. \n Moderated: Stacks are locked until they have been reviewed and featured by the project owner or producers\n\nIf “Moderated†is selected, the ideal solution is that \n\n- Project Owner and Producers see can see blurry? stack hero images with \n label “stack needs review,†\"Needs Moderated\" (lock)\n\n if they open the stack, it opens in Watch and there is an APPROVE / DELETE action area. \n If approved, it will be become a normal stack in the Recent Stacks carousel.\n\n- Project Crew see can see blurry stack hero images with label “stack under review,†\n they can’t open it or access the menu.\n\n- Public users (not a project owner, producer or crew) do NOT see the Recent Stacks carousel.\n\nIf “Live†is selected, the solution is that\n\n- The Recent Stacks carousel is visible to the public and the project owners, producers, and crew. \n New stacks are not locked or blurred out, but are live to be watched, shared \n and stacks clips can be used in other stacks unless the stacks is set to “locked.â€\n\n\n-----\n\n# Models\n\nstack.isApproved\nclip.isApproved\nstack.isLocked\nclip.isLocked\n\nwhen stack.featured goes from false to true, all clips should be isApproved = true\n(even for projects that are not moderated? yeah, why not?\n\nclips bulkUpdate all stacks they are in when they are UNAPPROVED\n\nhandle project setting to moderated, automatically appove featured? nah\n\n*/\n\nimport { AfterViewInit, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { NgIf, NgFor, NgStyle, AsyncPipe } from '@angular/common';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport {\n IonFab,\n NavController,\n ModalController,\n PopoverController,\n IonHeader,\n IonContent,\n IonSpinner,\n IonButton,\n IonIcon,\n IonAccordionGroup,\n IonAccordion,\n IonItem,\n IonLabel,\n IonFabButton,\n IonFabList,\n IonChip,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { addCircleOutline, lockClosed } from 'ionicons/icons';\nimport { Observable, Subject, BehaviorSubject, combineLatest, of, timer } from 'rxjs';\nimport { takeUntil, distinctUntilChanged, filter, tap, take, withLatestFrom, debounceTime, map } from 'rxjs/operators';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { LetDirective } from '@ngrx/component';\nimport { Store } from '@ngrx/store';\nimport * as clipActions from '@store/actions/clips.actions';\nimport * as projectActions from '@store/actions/projects.actions';\nimport * as stackActions from '@store/actions/stacks.actions';\nimport { State } from '@store/reducers';\nimport { List, selectList, selectClipListItems, selectStackListItems } from '@store/selectors/lists.selectors';\nimport {\n selectCurrentProject,\n selectCurrentProjectMemberByUser,\n selectIsCurrentProjectAdminByUser,\n} from '@store/selectors/projects.selectors';\nimport { selectUserState, getUserLoggedIn } from '@store/selectors/user.selectors';\nimport { FilterEntity, FilterEntityTypes } from '@store/selectors/viewstate.selectors';\nimport { setFilter } from '@store/actions/viewstate.actions';\nimport { selectCanCaptureToProject } from '@app/billing/store/billing.selectors';\n// import { selectAddToStackPlaylist } from '@store/selectors/stacks.selectors';\nimport { ENABLE_BILLING } from '@app/app.config';\nimport { ConfigService } from '@app/core/config/config.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { SentryService } from '@app/core/services/sentry.service';\nimport { AnalyticsService } from '@app/core/services/analytics/analytics.service';\nimport { PickerFileError } from '@app/core/filestack/filestack.service';\nimport { PosterUploadDirective } from '@app/core/filestack/directives/poster-upload.directive';\nimport { ShareableItem } from '@app/core/social-sharing/social-sharing.model';\nimport { SocialSharingService, socialSharingServiceProvider } from '@app/core/social-sharing/social-sharing.service';\nimport { ITEM_TYPE, LAYOUT_TYPE } from '@app/shared/models/layout.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { ClipList, StackList } from '@app/shared/models/list.model';\nimport { TopNavbarComponent } from '@app/shared/components/top-navbar/top-navbar.component';\nimport { UploaderStatsComponent } from '@app/shared/components/ui/upload-stats/uploader-stats.component';\nimport { FilterableToolbarComponent } from '@app/shared/components/filterable-toolbar/filterable-toolbar.component';\nimport { ListTitleComponent } from '@app/shared/components/ui/list-title/list-title.component';\nimport { FooterComponent } from '@app/shared/components/footer/footer.component';\nimport { TabFabContainerComponent } from '@app/shared/components/tab-fab-container/tab-fab-container.component';\nimport { Nl2brPipe } from '@app/shared/pipes/nl2br.pipe';\nimport { Utils } from '@app/shared/utils';\nimport {\n Project,\n DEFAULT_PROJECT_POSTER,\n PROJECT_HERO_UPLOAD_BUCKET,\n PROJECT_HERO_UPLOAD_CDN,\n getProjectConfig,\n ProjectConfig,\n ProjectEventType,\n canCreateEvent,\n PROJECT_PRIVACY,\n getEventConfig,\n getProjectDefaultHeroUrl,\n} from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { AddMemberModalComponent } from '@app/project-members/add-member-modal/add-member-modal.component';\nimport { ProjectMemberListComponent } from '@app/project-members/project-member-list/project-member-list.component';\nimport { isTokenExpired, Token } from '@app/tokens/shared/tokens.model';\nimport { TokensService } from '@app/tokens/shared/services/tokens.service';\nimport { MemberInviteListComponent } from '@app/tokens/member-invite-list/member-invite-list.component';\nimport {\n getInviteAcceptPath,\n getInvitePath,\n getInviteTypeFromProject,\n SIGNUP_RETURN_URL_EVENTS,\n SIGNUP_RETURN_URL_PRO,\n SIGNUP_RETURN_URL_WEDDINGS,\n} from '@app/onboarding/shared/onboarding.model';\nimport { CaptureClipModalComponent } from '@app/clips/shared/components/capture-clip-modal/capture-clip-modal.component';\nimport { CaptureClipButtonComponent } from '@app/clips/shared/components/capture-clip-button/capture-clip-button.component';\nimport { ClipListComponent } from '@app/clips/shared/components/clip-list/clip-list.component';\nimport { SubscriptionStatus } from '@app/billing/shared/billing.model';\nimport { BillingService } from '@app/billing/shared/services/billing.service';\nimport { EventDetailComponent } from '@app/billing/shared/components/event-detail/event-detail.component';\nimport { SubscriptionMiniStatusEditComponent } from '@app/billing/shared/components/subscription-mini-status-edit/subscription-mini-status-edit.component';\nimport { CollabDraftsComponent } from '@app/stacks/carousels/collab-drafts/collab-drafts.component';\nimport { StackListComponent } from '@app/stacks/shared/components/stack-list/stack-list.component';\nimport { DraftStacksCarouselComponent } from '@app/stacks/carousels/draft-stacks/draft-stacks.component';\nimport { CarouselGuidesComponent } from '@app/stacks/carousels/carousel-guides/carousel-guides.component';\nimport { EDIT_ROUTE, STUDIO_PAGE } from '@app/app.routes';\nimport { environment } from 'src/environments/environment';\n\nconst DEBUG_LOGS = false;\n/** BE VERY VERY CAREFUL NOT TO DELETE AN ACTIVE PROJECT! note that you'll need to refresh the page to remove it form store */\nconst DEV_ALLOW_DELETE = false;\n\n// const LIST_ID_PROJECT_CLIPS = 'project_clips';\n// const LIST_ID_PROJECT_STACKS_FEATURED = 'project_stacks_featured';\n// const LIST_ID_PROJECT_STACKS_RECENT = 'project_stacks_recent';\n\nconst PAGE = '[ProjectDetail]';\n\n@Component({\n selector: 'app-project-detail',\n templateUrl: './project-detail.page.html',\n styleUrls: ['./project-detail.page.scss'],\n providers: [socialSharingServiceProvider],\n standalone: true,\n imports: [\n NgIf,\n NgFor,\n NgStyle,\n LetDirective,\n RouterLink,\n PosterUploadDirective,\n UploaderStatsComponent,\n ListTitleComponent,\n CollabDraftsComponent,\n FilterableToolbarComponent,\n StackListComponent,\n TopNavbarComponent,\n SubscriptionMiniStatusEditComponent,\n DraftStacksCarouselComponent,\n CaptureClipButtonComponent,\n ClipListComponent,\n CarouselGuidesComponent,\n ProjectMemberListComponent,\n MemberInviteListComponent,\n FooterComponent,\n TabFabContainerComponent,\n IonHeader,\n IonContent,\n IonSpinner,\n IonButton,\n IonIcon,\n IonAccordionGroup,\n IonAccordion,\n IonItem,\n IonLabel,\n IonFab,\n IonFabButton,\n IonFabList,\n IonChip,\n AsyncPipe,\n TranslatePipe,\n Nl2brPipe,\n ],\n})\nexport class ProjectDetailPage implements OnInit, OnDestroy, AfterViewInit {\n vm$: Observable<{ isProjectAdmin: boolean; isProjectMember: boolean }>;\n numStacksToLoad = 10;\n isCaptureAllowed = false;\n layoutType = LAYOUT_TYPE;\n loading = true;\n showingClips = true;\n showRecentStacks = false;\n showTrendingStacks = false;\n\n projectHero = ''; // set OnInit\n privacyPrivate = PROJECT_PRIVACY.PRIVATE;\n isWidgetActive = false;\n showProjectHero = true;\n isDefaultProjectHero = true;\n inviteType = '';\n canCreateEvent = false;\n inviteTokens: Token[] = [];\n enableBilling = ENABLE_BILLING;\n projectSubLevel = '';\n projectSubActive = false;\n projectSubscriptionId: string;\n projectEventTitleTranslationPath = '';\n projectSubscriptionBy = '';\n /** Edit/Create Event buttons disabled if true - except that we'd need to watch the portal close event, which we are not.. */\n // isLoadingEvents = false;\n\n user$ = this.store.select(selectUserState);\n isLoggedIn$ = this.store.select(getUserLoggedIn);\n\n project$ = this.store.select(selectCurrentProject);\n isProjectAdmin$ = this.store.select(selectIsCurrentProjectAdminByUser);\n /** not filtered by isActive, use isProjectMember for truthy */\n userAsProjectMember$ = this.store.select(selectCurrentProjectMemberByUser);\n isProjectMember$: Observable<boolean> = this.userAsProjectMember$.pipe(map((member) => !!member?.isActive));\n\n // since we're doing a by selector anyways, why not create one for each projectId?\n // can we keep the lists in state and allow a nav without re-load?\n clipsByProject: ClipList = {\n // list$: of(), //this.store.select(selectList(this.listIdProjectClips)),\n // items$: of(), // this.store.select(selectClipListItems(this.listIdProjectClips)),\n };\n recentStacks: StackList = {\n label: 'Recent', // will be translated onInit\n // list$: of(), // this.store.select(selectList(this.listIdProjectStacksRecent)),\n // items$: of(), //this.store.select(selectStackListItems(this.listIdProjectStacksRecent)),\n };\n featuredStacks: StackList = {\n label: 'Featured', // will be translated onInit\n // list$: of(), //this.store.select(selectList(this.listIdProjectStacksFeatured)),\n // items$: of(), //this.store.select(selectStackListItems(this.listIdProjectStacksFeatured)),\n };\n stackListPrivate: StackList = {\n label: 'Private', // will be translated onInit\n };\n\n get listIdStackDrafts() {\n return `project-${this.projectId || 'page'}-drafts`;\n }\n\n get listIdCollabDrafts() {\n return `project-${this.projectId || 'page'}-collab-drafts`;\n }\n\n currentUserId = '';\n moreStacksToLoad = false;\n public isProjectDeleteAllowed = false;\n isClipsListShowing = false;\n\n showJoinButton = false;\n captureClipEvent: boolean;\n\n // @ViewChild(IonContent) content: IonContent;\n // @ViewChild('projectEventsEl', { static: false }) projectEventsEl: ElementRef;\n\n @ViewChild('tabFabProject') tabFab: IonFab;\n drawerHandleActions = true;\n selectedItemSuccess$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n topDrawerExpand$: BehaviorSubject<{ i: number; showCreateForm?: boolean }> = new BehaviorSubject({ i: 0 });\n topDrawerClose$: BehaviorSubject<number> = new BehaviorSubject(0);\n private _incExpandEvent = 0;\n private _incCloseEvent = 0;\n\n get currentUrl() {\n return this.router.url;\n }\n\n private eventType = ProjectEventType.None;\n\n get isWedding(): boolean {\n return this.eventType === ProjectEventType.Weddings;\n }\n\n get routerLinkSubscribe() {\n return SIGNUP_RETURN_URL_PRO;\n // switch (this.eventType) {\n // case ProjectEventType.Teams:\n // case ProjectEventType.Event:\n // case ProjectEventType.Festivals:\n // return SIGNUP_RETURN_URL_EVENTS;\n // case ProjectEventType.Weddings:\n // return SIGNUP_RETURN_URL_WEDDINGS;\n // case ProjectEventType.Pro:\n // case ProjectEventType.Projects:\n // default:\n // return SIGNUP_RETURN_URL_PRO;\n // }\n }\n get routerLinkCreateEvent() {\n switch (this.eventType) {\n case ProjectEventType.Weddings:\n return SIGNUP_RETURN_URL_WEDDINGS + '/' + this.projectId;\n case ProjectEventType.Pro:\n case ProjectEventType.Projects:\n case ProjectEventType.Teams:\n case ProjectEventType.Event:\n case ProjectEventType.Festivals:\n default:\n return SIGNUP_RETURN_URL_EVENTS + '/' + this.projectId;\n }\n }\n\n get eventSignUpTranslateKey() {\n switch (this.eventType) {\n case ProjectEventType.Weddings:\n return 'ONBOARDING.WEDDINGS.SIGNUP_UPGRADE';\n // return 'AUTH.PLANS.SIGN_UP_WEDDING';\n default:\n return 'ONBOARDING.EVENTS.SIGNUP_UPGRADE';\n // return 'AUTH.PLANS.SIGN_UP_EVENT';\n }\n }\n get eventEditTranslateKey() {\n switch (this.eventType) {\n case ProjectEventType.Weddings:\n return 'AUTH.PLANS.EDIT_WEDDING';\n default:\n return 'AUTH.PLANS.EDIT_EVENT';\n }\n }\n\n get routerLinkInvite() {\n return '/' + getInvitePath(this.inviteType) + '/' + this.projectId;\n // return '/events' + (this.inviteType ? '/' + this.inviteType.toLowerCase() : '') + '/invite/' + this.projectId || '';\n }\n get routerLinkJoin() {\n return '/' + getInviteAcceptPath(this.inviteType) + '/' + this.projectId;\n // return '/events' + (this.inviteType ? '/' + this.inviteType.toLowerCase() : '') + '/accept/' + this.projectId || '';\n }\n\n get routerLinkEditStack() {\n return (\n '/stack/edit/' +\n (this.drawerSelectedProjectId && this.drawerSelectedStackId\n ? `${this.drawerSelectedProjectId}/${this.drawerSelectedStackId}`\n : '')\n );\n }\n private drawerSelectedProjectId: string;\n private drawerSelectedStackId: string;\n\n private _numStackViews$: BehaviorSubject<number> = new BehaviorSubject(0);\n get numStackViews$(): Observable<number> {\n return this._numStackViews$.asObservable();\n }\n\n private _numStacks$: BehaviorSubject<number> = new BehaviorSubject(0);\n get numStacks$(): Observable<number> {\n return this._numStacks$.asObservable();\n }\n\n /**\n * there are items that are mine\n * @todo should trigger the tutorial as well as if guides are showing...\n */\n private _myContentExists$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n get myContentExists$(): Observable<boolean> {\n return this._myContentExists$.asObservable();\n }\n\n private isCrew = false;\n private clipsSearchText = '';\n private clipsCurrentFilter: FilterEntityTypes = FilterEntityTypes.Recent;\n\n private onDestroy$ = new Subject<void>();\n\n public get projectId() {\n return this.activatedRoute.snapshot.paramMap.get('id');\n }\n private get stackFilterId() {\n return `project-${this.projectId || 'page'}-stacks`;\n }\n private get clipFilterId() {\n return `project-${this.projectId || 'page'}-clips`;\n }\n\n /**\n * make these dynamic to project id\n * @todo can we keep the lists in state and allow a nav without re-load?\n */\n private get listIdProjectStacksFeatured() {\n // const LIST_ID_PROJECT_STACKS_FEATURED = 'project_stacks_featured';\n return `stacks_feat_proj_${this.projectId || 'page'}`;\n }\n private get listIdProjectStacksRecent() {\n // const LIST_ID_PROJECT_STACKS_RECENT = 'project_stacks_recent';\n return `stacks_recent_proj_${this.projectId || 'page'}`;\n }\n /**\n * @todo subscribe to this list in studio if already exists, filtered by projectId\n */\n private get listIdPrivateStacks() {\n return `stacks_private_proj_${this.projectId || 'page'}`;\n }\n private get listIdProjectStacksTrending() {\n return `stacks_trend_proj_${this.projectId || 'page'}`;\n }\n private get listIdProjectClips() {\n // const LIST_ID_PROJECT_STACKS_RECENT = 'project_stacks_recent';\n return `clips_proj_${this.projectId || 'page'}`;\n }\n\n private token$: Observable<Token> = this.tokensService.token$;\n private triggerTimeout;\n private _closeDrawerTimeout;\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private configService: ConfigService,\n private navCtrl: NavController,\n private translate: TranslateService,\n private store: Store<State>,\n private modalCtrl: ModalController,\n private popoverCtrl: PopoverController,\n private socialSharingService: SocialSharingService,\n private tokensService: TokensService,\n private projectService: ProjectService,\n private userService: UserService,\n private analyticsService: AnalyticsService,\n private billingService: BillingService,\n private router: Router,\n private sentryService: SentryService\n ) {\n addIcons({\n lockClosed, addCircleOutline,\n });\n }\n\n ngOnInit() {\n /**\n * in dev allow deleting project\n * BE VERY VERY CAREFUL NOT TO DELETE AN ACTIVE PROJECT!\n */\n this.isProjectDeleteAllowed = !environment.production && DEV_ALLOW_DELETE;\n\n this.vm$ = combineLatest([this.isProjectAdmin$, this.isProjectMember$]).pipe(\n map(([isProjectAdmin, isProjectMember]) => ({\n // <-- `map` emits a user-friendly object\n isProjectAdmin,\n isProjectMember,\n }))\n );\n\n this.translate\n .get(['COMMON.RECENT', 'COMMON.FEATURED'])\n .pipe(take(1))\n .subscribe((res) => {\n this.recentStacks.label = res['COMMON.RECENT'];\n this.featuredStacks.label = res['COMMON.FEATURED'];\n });\n\n // only be loading for a short time\n setTimeout(() => {\n this.loading = false;\n // upped this as with really slow internet we should wait a bit longer.. 2400\n }, 5400);\n\n let initialLoad = true;\n this.activatedRoute.queryParamMap.subscribe((queryParams) => {\n // placeholder filters in case we react to query param changes\n this.clipsSearchText = queryParams.get('q');\n\n if (initialLoad) {\n initialLoad = false;\n // load PROJECT by id - delay to allow the user to be logged in via cookie\n setTimeout(() => {\n // this.store.dispatch(projectActions.loadById({ id: this.projectId }));\n this.store.dispatch(projectActions.selectById({ id: this.projectId }));\n }, 900);\n } else {\n // already ready already\n this.store.dispatch(projectActions.selectById({ id: this.projectId }));\n }\n });\n\n /**\n * only triggers when the ID changes on the project$\n */\n const projectIdChanged$ = this.project$.pipe(\n takeUntil(this.onDestroy$),\n filter((p) => p && typeof p.id === 'string' && p.id.length > 0),\n distinctUntilChanged((p: Project, q: Project) => p.id === q.id)\n );\n\n // TODO: how to reset the prior project's hero before it slides in UI (changes after slides-in)\n // projectIdChanged$.pipe(\n // takeUntil(this.onDestroy$)\n // ).subscribe((project) => {\n // console.warn('ID CHANGED - reset the hero', project);\n // // temp reset the projectHero?\n // this.projectHero = '';//getProjectDefaultHeroUrl(project);\n // });\n\n /**\n * this triggers on multiple state changes for ui\n */\n const projectChanged$ = this.project$.pipe(\n takeUntil(this.onDestroy$),\n filter((p) => p && typeof p.id === 'string' && p.id.length > 0),\n map((p) => ({\n ...p,\n config: getProjectConfig(p),\n })),\n distinctUntilChanged(\n (p: Project, q: Project) =>\n p.id === q.id &&\n p.hero === q.hero &&\n p.members &&\n q.members &&\n // include changes for active or role\n JSON.stringify(p.members) === JSON.stringify(q.members) &&\n p.config &&\n q.config &&\n // here we are checking which settings our UI cares about\n (p.config as ProjectConfig).showRecentStacks === (q.config as ProjectConfig).showRecentStacks &&\n (p.config as ProjectConfig).showTrendingStacks === (q.config as ProjectConfig).showTrendingStacks &&\n // checking subscriptions\n p.subscriptionId === q.subscriptionId &&\n p.subscriptionStatus === q.subscriptionStatus &&\n p.subscriptionLevel === q.subscriptionLevel\n ),\n tap((project) => DEBUG_LOGS && console.log(`projectChanged$`, project))\n );\n\n /**\n * update hero, template, (setActiveProject already done in projectActions.selectById)\n */\n projectChanged$\n .pipe(withLatestFrom(this.userAsProjectMember$), takeUntil(this.onDestroy$))\n .subscribe(([project, projMember]) => {\n const isCrew = projMember?.isActive;\n const DEFAULT_HERO = getProjectDefaultHeroUrl(project);\n console.log('getProjectDefaultHeroUrl=', DEFAULT_HERO);\n this.projectHero = project?.hero ?? DEFAULT_HERO;\n this.isDefaultProjectHero = this.projectHero === DEFAULT_HERO;\n this.inviteType = getInviteTypeFromProject(project);\n\n const {\n eventType,\n canBeActive,\n eventIsActive,\n eventDate,\n eventConfig,\n subscriptionBy,\n subscriptionId,\n subscriptionLevel,\n subscriptionMinutes,\n subscriptionStatus,\n } = getEventConfig(project);\n console.log('getEventConfig=', {\n eventType,\n canBeActive,\n eventIsActive,\n eventDate,\n eventConfig,\n subscriptionBy,\n subscriptionLevel,\n subscriptionMinutes,\n subscriptionStatus,\n });\n this.eventType = eventType;\n this.projectSubActive = subscriptionStatus === SubscriptionStatus.Active;\n this.projectSubscriptionId = subscriptionId;\n this.canCreateEvent = this.projectSubActive ? false : canCreateEvent(project);\n this.projectSubLevel = this.projectSubActive ? Utils.upperFirstChar(subscriptionLevel) : '';\n\n const projConfig: ProjectConfig = getProjectConfig(project) || {};\n DEBUG_LOGS &&\n console.log(`projectChanged checking config`, { showRecentStacks: this.showRecentStacks, projConfig });\n // update the list for the recent or trending if it has changed\n // also, show them if you are crew\n if (isCrew || (projConfig.showRecentStacks && !this.showRecentStacks)) {\n this.showRecentStacks = projConfig.showRecentStacks;\n this.initRecentStacks();\n } else {\n this.showRecentStacks = projConfig.showRecentStacks;\n }\n this.showTrendingStacks = projConfig && projConfig.showTrendingStacks;\n });\n\n /**\n * Load the initial list content, on first time\n * now we know if this is a moderated project, so we load the lists here\n * @note this is not being triggered for non-crew users..\n */\n projectChanged$\n .pipe(withLatestFrom(this.isProjectAdmin$, this.userAsProjectMember$), takeUntil(this.onDestroy$))\n .subscribe(([project, isProjectAdmin, projMember]) => {\n const wasCrew = !!this.isCrew;\n this.isCrew = isProjectAdmin || (projMember && projMember.isActive);\n if (this.isCrew !== wasCrew) {\n DEBUG_LOGS &&\n console.log('isProjectCrew changed... initContent', { isCrew: this.isCrew, isProjectAdmin, projMember });\n this.initContent(project);\n }\n if (isProjectAdmin) {\n this.loadProjectTokens();\n }\n });\n /**\n * 2022-07-05 if members changes, notify ui (not just projectIdChanged$)\n * 2022-07-19 maybe not?\n */\n // projectChanged$.pipe(\n // // we already know something changed, but let's only respond to member changes here - why?\n // // distinctUntilChanged((p: Project, q: Project) => p.members && q.members &&\n // // // include changes for active or role\n // // JSON.stringify(p.members) === JSON.stringify(q.members)\n // // ),\n // withLatestFrom(this.isProjectAdmin$, this.userAsProjectMember$)\n // ).subscribe(([project, isProjectAdmin, projMember]) => {\n\n // });\n\n /**\n * if not crew, need to initContent\n * @todo this would make more sense as a race condition than a debounce\n */\n projectIdChanged$.pipe(debounceTime(800)).subscribe((project) => {\n DEBUG_LOGS && console.log('debounced public check for content', { isCrew: this.isCrew, project });\n if (!this.isCrew) {\n this.initContent(project);\n }\n });\n // the first time only, setup watchers\n projectIdChanged$.pipe(debounceTime(900), take(1)).subscribe((project) => {\n DEBUG_LOGS && console.log('debounced setup watchers for project:', project);\n this.watchSummaryData();\n });\n\n // get widget and app config\n this.configService.appConfig.then((config) => {\n this.isCaptureAllowed = config.allowCapture;\n this.isWidgetActive = config.isWidgetActive;\n if (config.isWidgetActive) {\n this.showProjectHero = config.showProjectHero;\n }\n });\n\n // get the currentUserId for Clip Filter = MINE\n this.userService.userId$.pipe(takeUntil(this.onDestroy$)).subscribe((userId) => {\n this.currentUserId = userId;\n });\n }\n\n ngAfterViewInit() {\n // state.tutorial - definition of something to alert the user to\n const showTutorial = this.router.getCurrentNavigation().extras.state?.tutorial;\n if (showTutorial) {\n console.warn('navstate.showTutorial: ' + showTutorial);\n }\n }\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n ionViewWillLeave() {\n // reset any lingering topnav-drawer playlist actions\n this.store.dispatch(stackActions.resetAddToStackPlaylist());\n this.closeTabFab();\n }\n\n initRecentStacks(isCrew = false) {\n // if the Project.config.showRecentStacks for public, or if you are crew\n if (this.showRecentStacks || this.isCrew || isCrew) {\n this.recentStacks = {\n label: this.recentStacks.label,\n /** MVP-970 ngrx deprecated selectorWithProps */\n list$: this.store.select(selectList(this.listIdProjectStacksRecent)),\n items$: this.store.select(selectStackListItems(this.listIdProjectStacksRecent)),\n };\n console.log({\n action: 'initRecentStacks',\n filters: {\n listId: this.listIdProjectStacksRecent,\n filters: {\n id: this.listIdProjectStacksRecent,\n q: this.clipsSearchText,\n projectId: this.projectId,\n type: FilterEntityTypes.Recent,\n },\n },\n });\n // load RECENT STACKS by project id\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: this.listIdProjectStacksRecent,\n filters: {\n id: this.listIdProjectStacksRecent,\n q: this.clipsSearchText,\n projectId: this.projectId,\n type: FilterEntityTypes.Recent,\n },\n })\n );\n } else {\n // create the List object to allow the watchListChanges to run\n this.recentStacks = {\n label: this.recentStacks.label,\n list$: of({ itemIds: [], id: 'not-showing-recent', nextToken: '', loading: false }),\n items$: of([]),\n };\n }\n }\n\n /**\n * load all of our lists\n * we have to wait for the project so we can know if isModerated..\n */\n initContent(project: Project) {\n const filters: FilterEntity = {\n id: this.stackFilterId,\n q: this.clipsSearchText, // do we want this search queryparam? probably..\n projectId: this.projectId,\n };\n\n /**\n * include filter for isApproved is isModerated && !isProjectAdmin..\n */\n if (project.isModerated && !this.isCrew) {\n filters.isApproved = true;\n }\n // update the lists to be the current projectId\n this.featuredStacks = {\n label: this.featuredStacks.label,\n /** MVP-970 ngrx deprecated selectorWithProps */\n list$: this.store.select(selectList(this.listIdProjectStacksFeatured)),\n items$: this.store.select(selectStackListItems(this.listIdProjectStacksFeatured)),\n };\n const itemObservables = [\n this.featuredStacks.items$.pipe(\n filter(Array.isArray),\n distinctUntilChanged((x, y) => x.length === y.length)\n ),\n ];\n // load FEATURED STACKS by project id\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: this.listIdProjectStacksFeatured,\n filters: {\n ...filters,\n id: this.listIdProjectStacksFeatured,\n type: FilterEntityTypes.Featured,\n },\n })\n );\n\n // if the Project.config.showRecentStacks for public, or if you are crew\n if (this.showRecentStacks || this.isCrew) {\n this.recentStacks = {\n label: this.recentStacks.label,\n /** MVP-970 ngrx deprecated selectorWithProps */\n list$: this.store.select(selectList(this.listIdProjectStacksRecent)),\n items$: this.store.select(selectStackListItems(this.listIdProjectStacksRecent)),\n };\n itemObservables.push(\n this.recentStacks.items$.pipe(\n filter(Array.isArray),\n distinctUntilChanged((x, y) => x.length === y.length)\n )\n );\n // load RECENT STACKS by project id\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: this.listIdProjectStacksRecent,\n filters: {\n ...filters,\n id: this.listIdProjectStacksRecent,\n type: FilterEntityTypes.Recent,\n },\n })\n );\n } else {\n // create the List object to allow the watchListChanges to run\n this.recentStacks = {\n label: this.recentStacks.label,\n list$: of({ itemIds: [], id: 'not-showing-recent', nextToken: '', loading: false }),\n items$: of([]),\n };\n !environment.production && console.warn(`Recent Stacks list not created..`);\n }\n\n // if (this.showTrendingStacks) {}\n\n if (this.currentUserId) {\n // build my private stacks list\n this.translate\n .get('PROJECT.PRIVATE_STACKS.LABEL')\n .pipe(take(1))\n .subscribe((res: string) => {\n this.stackListPrivate.label = res;\n });\n this.stackListPrivate = {\n id: this.listIdPrivateStacks,\n label: this.stackListPrivate.label,\n list$: this.store.select(selectList(this.listIdPrivateStacks)),\n items$: this.store\n .select(selectStackListItems(this.listIdPrivateStacks))\n .pipe(\n map((items) =>\n Array.isArray(items) ? items.filter((item) => item && item.projectId === filters.projectId) : items\n )\n ),\n };\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: this.listIdPrivateStacks,\n filters: {\n // : FilterEntity\n type: FilterEntityTypes.Private,\n id: this.listIdPrivateStacks,\n q: null,\n projectId: this.projectId, // done with items?\n userId: this.currentUserId,\n isPrivate: true, // only the private stacks\n },\n })\n );\n }\n\n if (this.isCrew) {\n this.clipsByProject = {\n /** MVP-970 ngrx deprecated selectorWithProps */\n list$: this.store.select(selectList(this.listIdProjectClips)),\n items$: this.store.select(selectClipListItems(this.listIdProjectClips)),\n };\n // MVP-1044 do not include clips in myContentExists logic for guides carousel\n // itemObservables.push(this.clipsByProject.items$.pipe(\n // filter(Array.isArray),\n // distinctUntilChanged((x, y) => x.length === y.length)\n // ))\n\n // load CLIPS by project id\n this.store.dispatch(\n clipActions.loadFilteredClips({\n listId: this.listIdProjectClips,\n filters: {\n ...filters,\n type: FilterEntityTypes.Recent,\n id: this.clipFilterId,\n },\n })\n );\n } else {\n // create the List object to allow the watchListChanges to run\n this.clipsByProject = {\n list$: of({ itemIds: [], id: 'not-crew', nextToken: '', loading: false }),\n items$: of([]),\n };\n // not crew, check if token for join\n this.token$.pipe(takeUntil(this.onDestroy$), filter(Boolean)).subscribe((token: Token) => {\n const {\n projectId,\n projectRole,\n // eventType = '',\n // payload: { returnUrl = '', message = '' },\n } = token;\n\n this.showJoinButton = projectRole && projectId === this.projectId && !isTokenExpired(token);\n !environment.production &&\n console.log(`[Token] payload roleMatching:`, { showJoinButton: this.showJoinButton, token });\n });\n }\n\n // now figure out if we should show the guides-carousel\n // timer(1200).pipe(\n\n // );\n\n combineLatest([timer(1100), ...itemObservables])\n .pipe(take(1)) // only need one, delayed since it's below the fold & we want as much data as has been loaded\n // .pipe(takeUntil(this.onDestroy$))\n .subscribe((values) => {\n try {\n DEBUG_LOGS &&\n console.log(`dev: here check items are my userId for guides carousel (${this.currentUserId}):`, values);\n let found = false;\n for (const items of values) {\n found = Array.isArray(items) ? items.some((v) => v && v.userId === this.currentUserId) : false;\n if (found) {\n this._myContentExists$.next(true);\n return true;\n }\n }\n if (!found) {\n this._myContentExists$.next(false);\n !environment.production &&\n console.log(\n `DEV: here we can show the New Crew Tutorial, if isCrew (none of my stacks exist in current lists..)`\n );\n }\n } catch (error) {\n console.warn(`Caught error itemObservables userId check:`, error);\n }\n });\n } //end initContent\n\n /**\n * Update the summary data for the Project Hero\n * @note changed logic above so this will fire for everyone, crew or public..\n */\n watchSummaryData() {\n combineLatest([\n this.recentStacks.items$.pipe(\n filter(Array.isArray),\n distinctUntilChanged((x, y) => x.length === y.length)\n ),\n this.featuredStacks.items$.pipe(\n filter(Array.isArray),\n distinctUntilChanged((x, y) => x.length === y.length)\n ),\n this.recentStacks.list$.pipe(\n filter((list) => list && Array.isArray(list.itemIds)),\n distinctUntilChanged((x, y) => x.itemIds.length === y.itemIds.length && x.nextToken === y.nextToken)\n ),\n this.featuredStacks.list$.pipe(\n filter((list) => list && Array.isArray(list.itemIds)),\n distinctUntilChanged((x, y) => x.itemIds.length === y.itemIds.length && x.nextToken === y.nextToken)\n ),\n ])\n .pipe(takeUntil(this.onDestroy$))\n .subscribe(([recentStacks, featuredStacks, recentStackList, featuredStackList]) => {\n const getViews = (stacks) =>\n stacks.reduce((accumulator, current) => accumulator + ((current && current.views) || 0), 0);\n\n // viewsTitle=\"Number of Stack Views\"\n const totalViews = getViews(recentStacks) + getViews(featuredStacks);\n this._numStackViews$.next(totalViews);\n\n // stacksTitle=\"Number of Stacks\"\n this._numStacks$.next(recentStacks.length + featuredStacks.length);\n\n this.moreStacksToLoad = recentStackList.nextToken || featuredStackList.nextToken ? true : false;\n // console.warn(`*** does this happen if no recent? -> now, YES`, { totalViews });\n });\n }\n\n loadMoreClips(list: List) {\n this.store.dispatch(\n clipActions.loadMoreFilteredClips({\n listId: list.id,\n filters: list.filters,\n nextToken: list.nextToken,\n })\n );\n }\n\n loadMoreStacks(list: List) {\n this.store.dispatch(\n stackActions.loadMoreFilteredStacks({\n listId: list.id,\n filters: list.filters,\n nextToken: list.nextToken,\n })\n );\n }\n\n /** if event.detail.value then it was opened */\n clipsAccordionChange(event) {\n this.isClipsListShowing = event && event.detail && event.detail.value;\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 addFilmstack() {\n this.navCtrl.navigateForward(`/${EDIT_ROUTE}`);\n }\n\n captureClip() {\n this.store\n .select(selectCanCaptureToProject(this.projectId))\n .pipe(take(1))\n .subscribe((canCapture) => {\n if (canCapture) {\n // open topnavDrawer to select the Draft, then handle onSelected\n this.drawerHandleActions = false;\n this.expandDraftDrawer();\n } else {\n // nav to the subscribe page\n this.navCtrl.navigateForward(this.routerLinkSubscribe, { state: { returnUrl: this.router.url } });\n this.closeTabFab();\n }\n });\n }\n\n createEvent() {\n this.navCtrl.navigateForward(this.routerLinkCreateEvent, { state: { returnUrl: this.router.url } });\n }\n\n /**\n * @deprecated not showing this button and instead using the add-member-invite button\n */\n inviteCrew() {\n this.navCtrl.navigateForward(this.routerLinkInvite);\n }\n\n async addMember(project: Project) {\n const modal = await this.modalCtrl.create({\n component: AddMemberModalComponent,\n componentProps: {\n project,\n },\n cssClass: 'crew-member-modal fullheight-modal',\n });\n\n await modal.present();\n\n const { data, role } = await modal.onDidDismiss();\n if (data || role) {\n // reload the tokens to see what changed\n this.loadProjectTokens();\n if (data?.openAddMemberDialog) {\n this.addMember(project);\n }\n }\n }\n\n memberDeleted(tokenId) {\n this.inviteTokens = this.inviteTokens.filter((invite) => invite && invite.id !== tokenId);\n }\n\n loadProjectTokens() {\n if (this.projectId) {\n this.tokensService\n .listTokens({ projectId: this.projectId })\n .then((tokens) => {\n this.inviteTokens = tokens;\n })\n .catch((error) => {\n console.warn(error);\n this.inviteTokens = [];\n });\n }\n }\n\n openProjectAdmin() {\n this.navCtrl.navigateForward(`/project/${this.projectId}/edit`);\n }\n openProjectAdminManageFeatured() {\n this.navCtrl.navigateForward(`/project/${this.projectId}/edit?featured=manage`);\n }\n\n async shareProject(project: Project, event: MouseEvent) {\n try {\n const shareItem: ShareableItem = {\n id: project.id,\n title: project.title,\n description: project.description,\n shareUrl: project.shareUrl,\n type: ITEM_TYPE.Projects,\n tags: project.tags,\n };\n\n await this.socialSharingService.share(shareItem, event);\n } catch (error) {\n console.warn(error);\n }\n }\n\n /**\n * filterable-toolbar search event\n */\n onSearchClips(value) {\n DEBUG_LOGS && console.log(`${PAGE} onSearchClips: ${value}`);\n this.analyticsService.search(`[project_clips]:${value}`);\n this.clipsSearchText = value || '';\n const filters: FilterEntity = {\n id: this.clipFilterId,\n q: this.clipsSearchText,\n projectId: this.projectId,\n type: this.clipsCurrentFilter,\n users: this.clipsCurrentFilter === FilterEntityTypes.Mine ? this.currentUserId : null,\n };\n // set filter so the list gets reset\n this.store.dispatch(setFilter({ filter: filters }));\n\n // dispatch recent stacks\n this.store.dispatch(\n clipActions.loadFilteredClips({\n listId: this.listIdProjectClips,\n filters,\n })\n );\n }\n\n /**\n * filterable-toolbar option changed event\n */\n onFilterClips(value) {\n switch (value) {\n case 'Mine': {\n DEBUG_LOGS && console.log(`${PAGE} onFilterClips... ${value}`);\n this.clipsCurrentFilter = FilterEntityTypes.Mine;\n break;\n }\n case 'Not Used': {\n DEBUG_LOGS && console.log(`${PAGE} onFilterClips... ${value}`);\n this.clipsCurrentFilter = FilterEntityTypes.Unused;\n break;\n }\n case 'Recent':\n default: {\n DEBUG_LOGS && console.log(`${PAGE} onFilterClips Reset to recent: ${value}`);\n this.clipsCurrentFilter = FilterEntityTypes.Recent;\n }\n }\n const filters = {\n id: this.clipFilterId,\n q: this.clipsSearchText,\n projectId: this.projectId,\n type: this.clipsCurrentFilter,\n users: this.clipsCurrentFilter === FilterEntityTypes.Mine ? this.currentUserId : null,\n };\n // set filter so the list gets reset\n this.store.dispatch(setFilter({ filter: filters }));\n this.store.dispatch(\n clipActions.loadFilteredClips({\n listId: this.listIdProjectClips,\n filters,\n })\n );\n }\n\n /**\n * filterable-toolbar search event\n */\n onSearchStacks(value) {\n DEBUG_LOGS && console.log(`${PAGE} onSearchStacks: ${value}`);\n this.analyticsService.search(`[project_stacks]:${value}`);\n const filters: FilterEntity = {\n id: this.stackFilterId,\n q: value,\n projectId: this.projectId,\n };\n\n // set filter so the list(s) gets reset\n this.store.dispatch(setFilter({ filter: filters }));\n\n // load FEATURED STACKS by project id\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: this.listIdProjectStacksFeatured,\n filters: {\n ...filters,\n type: FilterEntityTypes.Featured,\n },\n })\n );\n // load RECENT STACKS by project id\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: this.listIdProjectStacksRecent,\n filters: {\n ...filters,\n type: FilterEntityTypes.Recent,\n },\n })\n );\n }\n\n deleteProject() {\n this.projectService\n .deleteProject(this.projectId)\n .then(() => {\n this.navCtrl.navigateForward(`/${STUDIO_PAGE}`);\n })\n .catch((error) => {\n console.log(error);\n });\n }\n\n /**\n * Poster hero upload\n */\n onFileUploadFinished(res: { container?: string; key?: string; url?: string }) {\n console.log('### fileUploadFinished', res);\n if (res.container === PROJECT_HERO_UPLOAD_BUCKET) {\n // we will use the Filmstacker CDN, ideally\n const url = `${PROJECT_HERO_UPLOAD_CDN}${res.key}`;\n this.store.dispatch(projectActions.setHero({ id: this.projectId, url }));\n } else {\n // fallback with warning, using filestack url (searchable in our DB, difficult to find in Filestack Portal)\n console.warn(`container !== '${PROJECT_HERO_UPLOAD_BUCKET}'?`, res);\n this.store.dispatch(projectActions.setHero({ id: this.projectId, url: res.url }));\n }\n }\n\n /**\n * Poster hero upload\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onFileUploadFailed(res: PickerFileError) {\n console.log('### fileUploadFailed', res);\n this.sentryService.captureError(`Filestack onFileUploadFailed`);\n }\n\n /**\n * FAB Click appears to come just before the element changes its value\n * fab is open if it is not currently activated\n */\n fabClick() {\n const isFabOpen = !this.tabFab.activated; // !this.isFabOpen;\n if (!isFabOpen) {\n this.drawerHandleActions = true;\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 this.drawerHandleActions = true;\n }\n\n /**\n * Handle drawer actions\n * drawerHandleActions\n */\n draftDrawerSelected(event: Partial<Stack> = {}) {\n if (!this.drawerHandleActions) {\n const { projectId, stackId } = event;\n // console.log(`Project draft selected`, event);\n this.selectedItemSuccess$.next(true);\n if (projectId && stackId) {\n this.drawerSelectedProjectId = projectId;\n this.drawerSelectedStackId = stackId;\n this.store.dispatch(stackActions.selectIdEdit({ projectId, stackId }));\n }\n this.delayedCloseDrawer();\n this.captureDevice();\n }\n }\n draftDrawerNewItem(event: Partial<Stack> = {}) {\n if (!this.drawerHandleActions) {\n const { projectId, stackId } = event;\n // console.log(`Studio draft new item`);\n this.selectedItemSuccess$.next(true);\n if (projectId && stackId) {\n this.drawerSelectedProjectId = projectId;\n this.drawerSelectedStackId = stackId;\n this.store.dispatch(stackActions.selectIdEdit({ projectId, stackId }));\n }\n this.delayedCloseDrawer();\n this.captureDevice();\n }\n }\n draftDrawerExpanded(event) {\n // console.log(`Studio draft drawer expanded (${event})`);\n if (!event) {\n // closed, close fab\n this.closeTabFab();\n }\n }\n\n delayedCloseDrawer(path = '', doReset = false, delay = 600) {\n clearTimeout(this._closeDrawerTimeout);\n this._closeDrawerTimeout = setTimeout(() => {\n this.closeDraftDrawer();\n this.selectedItemSuccess$.next(false);\n this.closeTabFab();\n if (doReset) {\n this.store.dispatch(stackActions.resetAddToStackPlaylist());\n }\n if (path) {\n this.navCtrl.navigateForward(path);\n }\n }, delay);\n }\n\n /**\n * modal with capture-instructions\n */\n async presentCaptureModal() {\n const modal = await this.modalCtrl.create({\n component: CaptureClipModalComponent,\n componentProps: {\n // in this case we are on a Project Page - we want the clips here, regardless of where the stack is saved to\n projectId: this.projectId, // projectId || this.projectId,\n showProjectSelect: false,\n },\n });\n\n await modal.present();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { data } = await modal.onDidDismiss();\n // console.log(`CaptureClipModal dismiss:`, { data });\n this.closeTabFab();\n }\n\n /**\n * clipUpload button success\n */\n captureSuccess(event) {\n console.log(`captureSuccess event=files:`, { event, routeTo: this.routerLinkEditStack });\n this.navCtrl.navigateForward(this.routerLinkEditStack);\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 this.userService.isCaptureAllowed$.pipe(take(1)).subscribe(({ isAllowed, projects }) => {\n if (isAllowed && this.projectId) {\n const exists = projects.find((p) => p && p.id === this.projectId);\n if (exists) {\n // captureDevice projectId exists, open Filestack directly\n this.triggerCapture();\n this.tabFab.close();\n } else {\n this.presentCaptureModal();\n console.log('captureDevice check', { isAllowed, exists, projectId: this.projectId });\n }\n } else {\n // modal with capture-instructions, select projectId\n this.presentCaptureModal();\n console.log('captureDevice check', { isAllowed, projectId: this.projectId });\n }\n });\n }\n\n async openEventDetailsPopover(event: Event, project, isProjectAdmin) {\n const popover = await this.popoverCtrl.create({\n component: EventDetailComponent,\n event,\n dismissOnSelect: true, // close when Edit button is clicked\n componentProps: {\n currentUserId: this.currentUserId,\n subscriptionId: this.projectSubscriptionId,\n subscriptionLevel: this.projectSubLevel,\n subscriptionBy: project?.subscriptionBy,\n subscriptionisActive: this.projectSubActive,\n eventDate: project?.eventDate,\n canEdit: isProjectAdmin,\n isPopover: true,\n },\n });\n\n await popover.present();\n\n const { role } = await popover.onDidDismiss();\n console.log(`Popover dismissed with role: ${role}`);\n }\n\n /**\n * replaced with openEventDetailsPopover, this was too intrusive.. but it did work\n */\n // async scrollToEvents() {\n // let yOffset = this.projectEventsEl.nativeElement.getBoundingClientRect().top;\n // if (!yOffset || yOffset < 500) {\n // yOffset = 500;\n // } else {\n // yOffset -= 80; // remove topnav\n // }\n // await this.content.scrollToPoint(0, yOffset, 1000)\n // }\n\n /**\n * Do the check and call service\n */\n editSubscription() {\n // this.isLoadingEvents = true;\n combineLatest([this.project$, this.isProjectAdmin$])\n .pipe(take(1))\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n .subscribe(async ([project, isProjAdmin]) => {\n if (isProjAdmin && this.projectSubActive && this.projectSubscriptionId) {\n // console.log('editSubscription isAdmin > open sub:', isProjAdmin);\n this.billingService.openEditSubscription(this.projectSubscriptionId);\n\n // old code:\n // const modal = await this.modalCtrl.create({\n // component: ManageEventModalComponent,\n // // cssClass: 'modal-wide fullheight-modal',\n // componentProps: {\n // isProjAdmin,\n // project\n // },\n // });\n // await modal.present();\n\n // modal.onWillDismiss().then(() => {\n // this.isLoadingEvents = false;\n // });\n\n // const { data = {} } = await modal.onDidDismiss();\n // if (this.tabFab) {\n // this.tabFab.close();\n // }\n // DEBUG_LOGS && console.log(`[ManageEventModalComponent] res:`, data);\n // // }\n }\n // } else {\n // this.navCtrl.navigateForward(SIGNUP_RETURN_URL_PRO);\n // }\n });\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"],"x_google_ignoreList":[0]}