{"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]}