{"version":3,"file":"7650.022124b6fdd5f8ae.js","mappings":"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","names":["i0","ctx_r1","heading","_r3","share","shareToOptions","FACEBOOK","TWITTER","LINKEDIN","CLIPBOARD","project","shareUrl","ModalInviteSuccessComponent","_ModalInviteSuccessComponent","constructor","socialSharingService","modalController","this","title","SHARING_METHOD","openAddMemberDialog","_this","_asyncToGenerator","dismiss","navToProject","shareTo","id","description","type","ITEM_TYPE","Projects","catch","error","console","i1","i2","selectors","viewQuery","rf","ctx","BaseModalComponent","socialSharingServiceProvider","decls","vars","consts","template","ModalInviteSuccessComponent_h1_4_Template","_r1","ModalInviteSuccessComponent_section_11_Template","btnText","NgIf","SelectInputOnClickDirective","TranslatePipe","IonButton","IonIcon","IonItem","IonInput","styles","message","email_r3","InviteFormComponent_ng_container_1_div_18_span_4_Template","emails","sendInvites","$event","emailsChange","InviteFormComponent_ng_container_1_div_14_Template","InviteFormComponent_ng_container_1_div_18_Template","projectMemberInviteForm","get","hideProjectSelect","projectOptions","valid","length","loadingAttempt","translatePath","actionUrl","InviteFormComponent","_InviteFormComponent","routeId","value","messagePath","_routeId","OnboardingTypes","Teams","Weddings","translate","pipe","take","subscribe","res","warn","patchValue","formBuilder","store","mailerApi","configService","tokensService","toaster","userService","projectId","TRANSLATE_ROOT","inviteSuccess","EventEmitter","isLoggedIn$","group","Validators","required","_appUrl","onDestroy$","Subject","_projects","ngOnInit","select","selectMyProjects","takeUntil","projects","Array","isArray","activeProjectId","routeTemplates","push","Pro","checkAndUpdateProjectId","projs","buildProjectOptions","some","p","filter","includes","toLowerCase","ngOnDestroy","next","complete","split","element","Utils","REGEX_EMAIL","test","combineLatest","username$","email$","_ref","name","userEmail","proj","find","projectsTextArr","present","img","hero","projectRole","PROJECT_MEMBER_ROLE","CREW","returnUrl","getInviteAcceptPath","appProjectUrl","PROJECT_DETAIL_ROUTE","eventType","getInviteTypeFromProject","payload","getReturnUrl","acceptUrl","tokenQueryParam","TOKEN_QUERY_PARAM","messageNoNewlines","convertNewlinesToBr","getEmailTranslatePath","el","footer","instant","promises","email","token","Token","sentToEmail","fromEmail","action","TokenActions","ProjectInvite","createToken","then","tokenId","urlWithToken","url","projectsHtml","projectsText","buildProjectsListMessage","map","item","params","toEmail","subject","topic","MailTopic","InviteToCrew","messageText","stripHtml","leaveBrTags","buttonLabel","DEBUG_LOGS","sendEmail","result","Promise","all","allResults","resetOnSuccess","allError","_x","apply","arguments","sort","a","b","sortObjArrayAlphaBy","text","msg","reset","emit","i3","i4","i5","i6","i7","i8","inputs","outputs","standalone","features","InviteFormComponent_ng_container_1_Template","InviteFormComponent_ng_template_3_Template","notLoggedIn_r4","FormsModule","ReactiveFormsModule","FormTextareaComponent","FormSelectComponent","ButtonComponent","NgFor","LoginFormComponent","AsyncPipe","FormControlCastPipe","QrManageComponent_ng_template_1_h1_0_Template","QrManageComponent_ng_template_1_ng_template_1_Template","persistentTokenActive","notPublicHeading_r1","qrCode","_r4","renewExpiration","confirmDeleteAndNew","_c0","persistentToken","expires","_r5","addDays","QrManageComponent_ng_template_4_ng_container_0_ng_container_2_ng_container_1_Template","QrManageComponent_ng_template_4_ng_container_0_ng_container_2_ng_template_2_Template","persistentTokenExpired","notExpired_r6","_r7","disablePublicInvite","QrManageComponent_ng_template_4_ng_container_0_ng_container_1_Template","QrManageComponent_ng_template_4_ng_container_0_ng_container_2_Template","QrManageComponent_ng_template_4_ng_container_0_div_3_Template","persistentTokenId","_r8","generateQr","QrManageComponent_ng_template_4_ng_template_1_div_3_ion_spinner_2_Template","generatingQr","QrManageComponent_ng_template_4_ng_template_1_div_3_Template","hasPersistentToken","QrManageComponent_ng_template_4_ng_container_0_Template","QrManageComponent_ng_template_4_ng_template_1_Template","notPublic_r9","QrManageComponent","_QrManageComponent","_project","isStudio","listTokens","tokens","environment","production","log","t","persistToken","createTokenQrCode","loadingTokens","_b","_a","isActive","isTokenExpired","alertController","setTimeout","enableTokenUpdateExpired","Date","now","disableToken","toISOString","success","data","ToasterPosition","Bottom","updatePersistentToken","_this2","create","header","subHeader","buttons","role","handler","deleteAndGenerateNew","_this3","userId$","userId","createPersistentToken","getEventTypeFromOnboarding","err","event","updates","days","from","_this4","enableToken","getExpires","_this5","deleteToken","QrManageComponent_h1_0_Template","QrManageComponent_ng_template_1_Template","QrManageComponent_div_3_Template","QrManageComponent_ng_template_4_Template","doneLoadingTokensHeading_r10","doneLoadingTokens_r11","TranslateDirective","DatePipe","QrCodeComponent","IonSpinner","openSuccessDialog","inactiveUsers_r5","ngIf","viewInactiveUsers","AddMemberComponent_div_27_div_1_span_2_Template","AddMemberComponent_div_27_div_1_span_3_Template","viewingInactiveUsers","AddMemberComponent_div_27_div_1_Template","user_r7","roleInCurrentProject","_r6","$implicit","onClickUser","AddMemberComponent_div_32_div_3_div_5_Template","viewProjectMember","isUserSelected","avatar","avatarFallback","AddMemberComponent_div_32_div_1_Template","AddMemberComponent_div_32_div_3_Template","searchResults_r8","selectedUserIds","_r9","onProjectRoleChanged","projects$","PAGE","AddMemberComponent","_AddMemberComponent","of","getTranslatePath","projectMemberService","projectService","sentryService","navCtrl","addSuccess","showBillingText","loadingAddCrew","DEFAULT_USER_AVATAR_TERTIARY","submitEmailAttempt","inactiveUsers","searchChanged$","getMyProjects","projectsInactiveUsers$","reduce","acc","members","member","m","tap","searchResults$","selectMemberQueryResults","distinctUntilChanged","users","u","User","selected","getUserAvatar","memberProjects","projOwned","OWNER","search","switchMap","queryMembers","EMPTY","resetQueryMembers","searchChanged","user","splice","findIndex","username","addToQueryMemberResults","stopPropagation","component","ProjectMemberModalComponent","componentProps","viewOnly","cssClass","addProjectRole","submitAddUser","forEach","isCurrentlyInactive","dispatch","updateMemberAction","addMemberAction","membersAdded","makeCommaSeparatedString","captureError","modal","onDidDismiss","navigateForward","openCommunityRules","CommunityRulesPage","isModal","AddMemberComponent_p_7_Template","AddMemberComponent_app_invite_form_18_Template","AddMemberComponent_ng_template_19_Template","AddMemberComponent_div_27_Template","AddMemberComponent_div_32_Template","AddMemberComponent_app_project_member_projects_51_Template","AddMemberComponent_div_54_Template","AddMemberComponent_span_58_Template","AddMemberComponent_ion_spinner_61_Template","AddMemberComponent_section_62_Template","projectLoading_r10","ImageFallbackDirective","SearchbarComponent","ProjectMemberProjectsComponent","IonAvatar","item_r1","hint","errorMessage","_FormSelectComponent","BaseFormComponent","super","interface","disabled","interfaceOptions","side","items","placeholder","isReadyForValidation","updateProp","detail","FormSelectComponent_ion_select_option_2_Template","FormSelectComponent_span_3_Template","label","control","FormItemComponent","IonSelect","IonSelectOption","_SelectInputOnClickDirective","selectAll","nativeEl","nativeElement","querySelector","setSelectionRange","hostBindings"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/shared/components/modal-invite-success/modal-invite-success.component.html","./src/app/shared/components/modal-invite-success/modal-invite-success.component.ts","./src/app/project-members/shared/components/invite-form/invite-form.component.html","./src/app/project-members/shared/components/invite-form/invite-form.component.ts","./src/app/tokens/shared/components/qr-manage/qr-manage.component.html","./src/app/tokens/shared/components/qr-manage/qr-manage.component.ts","./src/app/project-members/add-member/add-member.component.html","./src/app/project-members/add-member/add-member.component.ts","./src/app/shared/components/ui/form/form-select/form-select.component.html","./src/app/shared/components/ui/form/form-select/form-select.component.ts","./src/app/shared/directives/select-input-on-click.directive.ts"],"sourcesContent":["<fs-base-modal [title]=\"title\" mode=\"light\" #modal>\n <section>\n <div class=\"container heading ion-text-center\">\n <h1 *ngIf=\"heading\">{{ heading }}</h1>\n <div class=\"buttons\">\n <ion-button (click)=\"openAddMemberDialog()\">{{ btnText }}</ion-button>\n <ion-button fill=\"outline\" (click)=\"navToProject()\">{{ 'PROJECT.RETURN' | translate }}</ion-button>\n </div>\n </div>\n </section>\n\n <section *ngIf=\"project?.id\">\n <div class=\"text-center\">\n <h3>{{ 'PROJECT.SHARE_THIS' | translate }}</h3>\n <div class=\"share-buttons row ion-padding ion-justify-content-center\">\n <ion-button fill=\"outline\" color=\"dark\" (click)=\"share(shareToOptions.FACEBOOK)\" title=\"Share on Facebook\">\n <ion-icon slot=\"icon-only\" name=\"logo-facebook\"></ion-icon>\n </ion-button>\n <ion-button fill=\"outline\" color=\"dark\" (click)=\"share(shareToOptions.TWITTER)\" title=\"Share on Twitter\">\n <ion-icon slot=\"icon-only\" name=\"logo-twitter\"></ion-icon>\n </ion-button>\n <ion-button fill=\"outline\" color=\"dark\" (click)=\"share(shareToOptions.LINKEDIN)\" title=\"Share on LinkedIn\">\n <ion-icon slot=\"icon-only\" name=\"logo-linkedin\"></ion-icon>\n </ion-button>\n </div>\n <div class=\"row\">\n <ion-item class=\"share-item\" lines=\"none\">\n <ion-input #inputShareUrl readonly selectAllOnClick [value]=\"project?.shareUrl\"></ion-input>\n <ion-button shape=\"round\" (click)=\"share(shareToOptions.CLIPBOARD)\" title=\"Copy to Clipboard\">\n <ion-icon name=\"link\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-item>\n </div>\n </div>\n </section>\n</fs-base-modal>\n","/** @format */\n\nimport { Component, ViewChild, Input } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonButton, IonIcon, IonInput, IonItem, ModalController } from '@ionic/angular/standalone';\nimport { SocialSharingService, socialSharingServiceProvider } from '@app/core/social-sharing/social-sharing.service';\nimport { SHARING_METHOD, ShareableItem } from '@app/core/social-sharing/social-sharing.model';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { SelectInputOnClickDirective } from '@app/shared/directives/select-input-on-click.directive';\nimport { BaseModalComponent } from '@app/shared/components/ui/modal/base-modal.component';\nimport { Project } from '@app/projects/shared/project.model';\n\n// const STEPS = {\n// selection: { id: 'selection', back: null, next: 'subSelection' },\n// additionalText: { id: 'additionalText', back: 'subSelection', next: 'sent' },\n// sent: { id: 'sent', back: null, next: null },\n// };\n// type Steps = keyof typeof STEPS;\n\n@Component({\n selector: 'app-modal-invite-success',\n templateUrl: './modal-invite-success.component.html',\n styleUrls: ['./modal-invite-success.component.scss'],\n providers: [socialSharingServiceProvider],\n standalone: true,\n imports: [\n NgIf,\n BaseModalComponent,\n SelectInputOnClickDirective,\n TranslatePipe,\n IonButton,\n IonIcon,\n IonItem,\n IonInput,\n ],\n})\nexport class ModalInviteSuccessComponent {\n @Input() heading: string;\n @Input() btnText: string;\n @Input() project: Project;\n\n title = '';\n shareToOptions = SHARING_METHOD;\n\n @ViewChild('modal', { static: false, read: BaseModalComponent })\n modal: BaseModalComponent;\n\n constructor(private socialSharingService: SocialSharingService, private modalController: ModalController) {}\n\n async openAddMemberDialog() {\n this.modalController.dismiss({\n openAddMemberDialog: true,\n });\n }\n\n navToProject() {\n // this.project.id\n this.modalController.dismiss({\n navToProject: true,\n });\n }\n\n share(shareTo: SHARING_METHOD) {\n const shareItem: ShareableItem = {\n id: this.project.id,\n title: this.project.title,\n description: this.project.description,\n shareUrl: this.project.shareUrl,\n type: ITEM_TYPE.Projects,\n // tags: ,\n };\n\n this.socialSharingService.shareTo(shareItem, shareTo).catch((error) => {\n console.error(error);\n });\n }\n}\n","<div class=\"invite-form\">\n \n <ng-container *ngIf=\"isLoggedIn$ | async as isLoggedIn; else notLoggedIn\">\n <form\n [formGroup]=\"projectMemberInviteForm\"\n (ngSubmit)=\"sendInvites()\"\n >\n\n <fs-form-textarea\n [label]=\"'MEMBERS.INVITE.LABEL' | translate\"\n [control]=\"projectMemberInviteForm.get('message') | formControlCast\"\n ></fs-form-textarea>\n\n <fs-form-textarea\n [label]=\"'COMMON.EMAILS' | translate\"\n [placeholder]=\"'ONBOARDING.COMMON.INVITE.MEMBERS_PLACEHOLDER' | translate\"\n [control]=\"projectMemberInviteForm.get('emails') | formControlCast\"\n [debounce]=\"1000\"\n (onInput)=\"emailsChange($event)\"\n ></fs-form-textarea>\n\n <!-- <ion-item lines=\"none\">\n <ion-label position=\"floating\" class=\"ion-text-uppercase\">{{ 'MEMBERS.INVITE.LABEL' | translate }}</ion-label>\n <ion-textarea rows=\"5\" auto-grow=\"true\" [(ngModel)]=\"message\"></ion-textarea>\n </ion-item>\n\n <ion-item lines=\"none\">\n <ion-label position=\"stacked\" class=\"ion-text-uppercase\">{{ 'COMMON.EMAILS' | translate }}</ion-label>\n <ion-textarea debounce=\"500\" rows=\"6\"\n [placeholder]=\"'ONBOARDING.COMMON.INVITE.MEMBERS_PLACEHOLDER' | translate\"\n (ionChange)=\"membersChange($event.detail.value)\"\n ></ion-textarea>\n </ion-item> -->\n\n <fs-form-select [hidden]=\"hideProjectSelect\"\n label=\"{{ 'COMMON.PROJECT' | translate }}\"\n placeholder=\"{{ 'PROJECT.SELECT_PROJECT' | translate }}\"\n [items]=\"projectOptions\"\n [control]=\"projectMemberInviteForm.get('projectId') | formControlCast\"\n ></fs-form-select>\n\n <div class=\"actions ion-text-center ion-padding-top ion-padding-bottom\">\n <div *ngIf=\"message\" class=\"message ion-padding-bottom ion-color-success\">\n {{ message }}\n </div>\n <fs-button\n [disabled]=\"!projectMemberInviteForm.valid || emails.length < 1 || loadingAttempt\"\n type=\"submit\"\n size=\"large\"\n [loading]=\"loadingAttempt\"\n >{{ translatePath + 'INVITE_ACTION' | translate }}</fs-button\n >\n </div>\n </form>\n\n <div *ngIf=\"emails?.length > 0\" class=\"results\">\n <h3>{{ 'COMMON.EMAILS_FOUND' | translate }}:</h3>\n <span *ngFor=\"let email of emails\" style=\"display:inline-block;margin-right: 10px;\">{{ email }}</span>\n </div>\n\n <!-- <div *ngIf=\"projectId\" class=\"ion-text-center\">\n <ion-button [routerLink]=\"['/stack/discover/project/', projectId]\" fill=\"outline\">\n {{ 'PROJECT.RETURN_TO_PROJECT' | translate }}\n </ion-button>\n </div> -->\n </ng-container>\n\n <ng-template #notLoggedIn>\n <!-- LOGGED OUT -->\n <div class=\"container skinny-limit-width\">\n <fs-login-form [routeOnSuccess]=\"actionUrl\"></fs-login-form>\n </div>\n </ng-template>\n</div>","/** @format */\n\nimport { Component, Input, OnDestroy, OnInit, Output, EventEmitter } from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { UntypedFormBuilder, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { combineLatest, Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { MailerApiService, MailTopic, SendMail } from '@app/core/api/mailer.api.service';\nimport { ConfigService } from '@app/core/config/config.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { FormTextareaComponent } from '@app/shared/components/ui/form/form-textarea/form-textarea.component';\nimport { FormSelectComponent } from '@app/shared/components/ui/form/form-select/form-select.component';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.component';\nimport { LoginFormComponent } from '@app/shared/components/login/login-form.component';\nimport { FormControlCastPipe } from '@app/shared/pipes/form-control-cast.pipe';\nimport { Utils } from '@app/shared/utils';\nimport { Project } from '@app/projects/shared/project.model';\nimport {\n getInviteAcceptPath,\n getInviteTypeFromProject,\n OnboardingTypes,\n TRANSLATE_ROOT,\n} from '@app/onboarding/shared/onboarding.model';\nimport { getReturnUrl, Token, TokenActions, TokenPayload, TOKEN_QUERY_PARAM } from '@app/tokens/shared/tokens.model';\nimport { TokensService } from '@app/tokens/shared/services/tokens.service';\nimport { PROJECT_MEMBER_ROLE } from '@app/project-members/shared/project-member.model';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { selectMyProjects } from '@store/selectors/projects.selectors';\n\nconst DEBUG_LOGS = false;\nconst ROOT_APP_URL = 'https://app.filmstacker.com/';\n\n@Component({\n selector: 'app-invite-form',\n templateUrl: './invite-form.component.html',\n styleUrls: ['./invite-form.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n FormsModule,\n ReactiveFormsModule,\n FormTextareaComponent,\n FormSelectComponent,\n ButtonComponent,\n NgFor,\n LoginFormComponent,\n AsyncPipe,\n TranslatePipe,\n FormControlCastPipe,\n ],\n})\nexport class InviteFormComponent implements OnInit, OnDestroy {\n @Input() projectId = '';\n @Input() translatePath = TRANSLATE_ROOT;\n @Input() actionUrl = '/invite';\n @Input()\n set routeId(value) {\n this._routeId = value || OnboardingTypes.Teams;\n let messagePath;\n switch (value) {\n case OnboardingTypes.Weddings: {\n messagePath = 'EMAILS.ONBOARDING.WEDDINGS.INVITE_MESSAGE';\n break;\n }\n default: {\n messagePath = 'EMAILS.ONBOARDING.EVENTS.INVITE_MESSAGE';\n }\n }\n DEBUG_LOGS && console.log(`[InviteForm]`, { routeId: value, messagePath });\n this.translate\n .get(messagePath)\n .pipe(take(1))\n .subscribe((res: string) => {\n if (!res) {\n return console.warn(`[INVITE] missing translation?`);\n }\n this.projectMemberInviteForm.patchValue({\n message: res,\n });\n });\n }\n get routeId() {\n return this._routeId;\n }\n\n @Output() inviteSuccess = new EventEmitter();\n\n isLoggedIn$ = this.userService.isLoggedIn$;\n\n projectMemberInviteForm = this.formBuilder.group({\n projectId: ['', Validators.required],\n message: ['', Validators.required],\n emails: ['', Validators.required],\n });\n\n /** the emails we will contact */\n emails: string[] = [];\n loadingAttempt = false;\n message = '';\n\n hideProjectSelect = true;\n projectOptions = [];\n // myProjects$ = this.store.select(getMyProjects);\n\n private _appUrl = ROOT_APP_URL;\n private onDestroy$ = new Subject<void>();\n private _projects: Project[] = [];\n private _routeId: string;\n\n constructor(\n private formBuilder: UntypedFormBuilder,\n private store: Store<State>,\n private translate: TranslateService,\n private mailerApi: MailerApiService,\n private configService: ConfigService,\n private tokensService: TokensService,\n\n private toaster: ToasterService,\n private userService: UserService\n ) {}\n\n ngOnInit(): void {\n /**\n * 1. get the activeProject and select that one if it's mine & is {eventType} template\n * 2. Filter myProjects by eventType template\n * 3. auto-select if only one project exists\n * @see stack-form-details for similar implementation\n */\n // combineLatest([\n // this.myProjects$,\n // from(this.projectId),//this.environService.activeProjectId$,\n // this.onboardingService.routeOnboardingType$\n // ])\n this.store\n .select(selectMyProjects)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe((projects) => {\n this._projects = Array.isArray(projects) ? projects : [];\n const activeProjectId = this.projectId;\n\n const routeTemplates = [];\n switch (this.routeId) {\n case OnboardingTypes.Weddings: {\n routeTemplates.push(...['wedding', 'weddings']);\n break;\n }\n case OnboardingTypes.Teams:\n routeTemplates.push(...['team', 'teams']);\n break;\n case OnboardingTypes.Pro:\n routeTemplates.push(...['pro']);\n break;\n default: {\n // nada\n }\n }\n\n DEBUG_LOGS &&\n console.log(`[InviteForm] getMyProjects`, {\n projects,\n routeTemplates,\n routeId: this.routeId,\n activeProjectId,\n });\n\n const checkAndUpdateProjectId = (projs: Project[] = []): boolean => {\n // don't return on already set form, as this will be called multiple times while building the myProjects from crew & owned api calls\n // if (this.projectMemberInviteForm.get('projectId').value) {\n // // we already have a value, we're done\n // return true;\n // }\n if (projs.length > 0) {\n this.buildProjectOptions(projs);\n if (projs.length === 1) {\n DEBUG_LOGS && console.log(`[InviteForm] only one project -> use that!`);\n this.projectMemberInviteForm.patchValue({\n projectId: projs[0].id,\n });\n } else if (activeProjectId && projs.some((p) => p && p.id === activeProjectId)) {\n // if there's an activeProject, and it's included\n DEBUG_LOGS && console.log(`[InviteForm] includes activeProject -> use that!`, activeProjectId);\n this.projectMemberInviteForm.patchValue({\n projectId: activeProjectId,\n });\n }\n this.hideProjectSelect = projs.length === 1;\n return true; // options ready for select\n }\n return false;\n };\n\n // check if we have myprojects that match the projectId found in route\n const routed = this.projectId ? this._projects.filter((p) => p && p.id === this.projectId) : [];\n if (!checkAndUpdateProjectId(routed)) {\n // check if we have myprojects that match the template based on routeId\n const filtered = this._projects.filter(\n (p) => p && p.template && routeTemplates.includes(p.template.toLowerCase())\n );\n if (!checkAndUpdateProjectId(filtered)) {\n // myProjects do not have matching routeTemplates\n DEBUG_LOGS &&\n console.log(`[InviteForm] combineLatest myProjects do not have matching routeTemplates...yet`, {\n projects,\n activeProjectId,\n routeTemplates,\n filtered,\n });\n checkAndUpdateProjectId(this._projects);\n }\n }\n });\n\n // this is not the correct logic, as a widget could not accept tokens, only the root app\n // this.configService.appConfig.then(({ shareUrl }) => {\n // this._appUrl = shareUrl;\n // });\n }\n\n // ngAfterViewChecked(): void {\n // /**\n // * this was migrated from the onboarding-invite - TBD if still needed...\n // * was added to avoid expression change after it was checked ng-valid-true for the projectId causing input-select to change & hide\n // * https://stackoverflow.com/questions/53901392/expression-has-changed-after-it-was-checked-previous-value-ng-valid-true-c\n // */\n // this.changeDetectorRef.detectChanges();\n // }\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n /**\n * TextArea emails change\n * split the string on each occurrence of a space or comma (split(/[, ]+/)), or newline (.split(/\\r?\\n/))\n * The plus + matches the preceding item (comma or space) one or more times, which means both a comma and a space would count as 1 match.\n * filter exists and passes basic valid email test\n */\n emailsChange(value) {\n try {\n if (!value || typeof value.split !== 'function') return;\n this.emails = value.split(/[, \\r?\\n/]+/).filter((element) => element && Utils.REGEX_EMAIL.test(element));\n } catch (error) {\n console.warn(error);\n }\n }\n\n /**\n * @todo why the url pro? just always make it teams!\n *\n * Send the invitations\n * @see add-member.component refactor similar function implementation?\n */\n async sendInvites() {\n this.message = '';\n if (!Array.isArray(this.emails) || this.emails.length < 1) {\n return;\n }\n this.loadingAttempt = true;\n\n try {\n combineLatest([this.userService.username$, this.userService.email$])\n .pipe(take(1))\n .subscribe(async ([name, userEmail]) => {\n const emails = this.emails;\n const message = this.projectMemberInviteForm.get('message').value;\n const projectId = this.projectMemberInviteForm.get('projectId').value;\n\n const proj = this._projects.find((p) => p && p.id === projectId);\n const projectsTextArr = [];\n if (proj && proj.id && proj.title) {\n projectsTextArr.push({\n id: projectId,\n title: proj.title,\n img: proj.hero,\n shareUrl: proj.shareUrl,\n // mission: proj.mission,\n });\n } else {\n console.warn(`[INVITE] sendInvite missing project Data?`, {\n proj,\n projects: this._projects,\n projectId,\n });\n this.toaster.present(`We had an issue getting the Project Details? Please try again..`);\n return;\n }\n\n // set everyone as crew, initially\n const projectRole = PROJECT_MEMBER_ROLE.CREW;\n /** the url to have displayed in the email */\n const returnUrl = `${this._appUrl}${getInviteAcceptPath(this.routeId as OnboardingTypes)}/${projectId}`;\n const appProjectUrl = `${this._appUrl}${PROJECT_DETAIL_ROUTE}/${projectId}`;\n /**\n * @todo when migrating, here handle different eventType\n */\n // const eventType = getEventTypeFromOnboarding(this.routeId);\n const eventType = getInviteTypeFromProject(proj);\n const payload: TokenPayload = {\n /** the url to redirect upon signup/in */\n returnUrl: getReturnUrl(projectId),\n acceptUrl: returnUrl,\n message,\n // eventType,// moved to parent\n };\n\n // create a querystring adder to shareUrl\n const tokenQueryParam = TOKEN_QUERY_PARAM;\n // const tokenQuery = `?${tokenQueryParam}=`; // ${tokenId}`;\n\n const messageNoNewlines = Utils.convertNewlinesToBr(message);\n\n const getEmailTranslatePath = (el) => {\n switch (this.routeId) {\n case OnboardingTypes.Weddings: {\n return 'EMAILS.ONBOARDING.WEDDINGS.' + el;\n }\n default: {\n return 'EMAILS.ONBOARDING.EVENTS.' + el;\n }\n }\n };\n\n const footer = this.translate.instant(getEmailTranslatePath('INVITE_INSTRUCTION'));\n\n // loop all the emails..\n const promises = [];\n\n for (const email of this.emails) {\n /**\n *\n */\n const token: Token = new Token({\n // email,\n sentToEmail: email,\n fromEmail: userEmail, // user that sent the token\n projectId,\n projectRole,\n action: TokenActions.ProjectInvite,\n payload,\n eventType,\n });\n\n promises.push(\n this.tokensService.createToken(token).then((res) => {\n const { id: tokenId, message: createTokenMessage } = res;\n\n /**\n * @todo refactor to mailerService.sendInviteEmail\n * see member-invite-modal.component\n */\n\n // a token exists now\n // create message with token queryparam\n const urlWithToken = (url) =>\n url && tokenId && tokenQueryParam ? `${url}?${tokenQueryParam}=${tokenId}` : url;\n const { projectsHtml, projectsText } = this.mailerApi.buildProjectsListMessage(\n projectsTextArr.map((item) => ({ ...item, shareUrl: urlWithToken(appProjectUrl) }))\n );\n\n const params: SendMail = {\n tokenId,\n tokenQueryParam,\n toEmail: email,\n fromEmail: `${name} (${userEmail})`,\n // name, // this is the toName... confusing!\n subject: this.translate.instant(getEmailTranslatePath('INVITE_SUBJECT')),\n topic: MailTopic.InviteToCrew,\n // toEmail: 'jd@filmstacker.com',//must be confirmed in AWS SES\n message: messageNoNewlines + '<br><br>' + projectsHtml,\n messageText: Utils.stripHtml(messageNoNewlines, { leaveBrTags: true }) + '<br><br>' + projectsText,\n footer,\n heading: this.translate.instant(getEmailTranslatePath('INVITE_HEADING')),\n buttonLabel: this.translate.instant(getEmailTranslatePath('INVITE_CTA')),\n returnUrl,\n };\n\n DEBUG_LOGS &&\n console.log(`[INVITE] sendInvite sendingEmail:`, {\n toEmail: email,\n userEmail,\n projectsText,\n message,\n footer,\n returnUrl,\n params,\n createTokenMessage,\n });\n\n return this.mailerApi\n .sendEmail(params)\n .pipe(take(1))\n .subscribe((result) => result);\n })\n );\n } //end emails loop\n\n DEBUG_LOGS && console.log(`sendInvites:`, { emails, message, userEmail, projectId });\n\n return await Promise.all(promises)\n .then((allResults) => {\n DEBUG_LOGS && console.log(`[INVITE] sendEmail success res:`, allResults);\n this.resetOnSuccess(\n this.translate.instant(this.translatePath + 'INVITE_SUCCESS', { value: allResults.length })\n );\n })\n .catch((allError) => {\n console.warn(`[INVITE] sendEmail ERROR:`, allError);\n this.message = this.translate.instant('ERRORS.GENERIC_OOPS');\n });\n });\n } catch (error) {\n console.warn(`[Invite] sendInvites FAILED:`, error);\n this.toaster.present(this.translate.instant('MEMBERS.INVITE.ERROR'));\n } finally {\n this.loadingAttempt = false;\n }\n }\n\n /**\n * @dev - is this better? yes... optimize the delay in showing the popup on select click\n * @todo implement appConfig allowPublishTo\n * @see publish-stack.page.getProjects for implementation reference\n */\n private buildProjectOptions(projects: Project[]): { text: string; value: string }[] {\n // let allProjects = [];\n // /**\n // */\n // if (this.configProjects.length > 0) {\n // // combine myProjects with configProjects\n // allProjects = Utils.addOrReplaceMultipleObjectsToNewArray(projects || [], this.configProjects, 'id').sort(\n // Utils.sortObjArrayAlphaBy\n // );\n // } else {\n // allProjects = projects;\n // }\n this.projectOptions = projects\n .sort((a, b) => Utils.sortObjArrayAlphaBy(a, b, 'title'))\n .map((item) => ({\n text: item.title,\n value: item.id,\n }));\n\n return this.projectOptions;\n }\n\n private resetOnSuccess(msg) {\n this.message = msg;\n\n this.projectMemberInviteForm.reset({\n // projectId: this.projectId\n message: this.projectMemberInviteForm.get('message').value,\n projectId: this.projectMemberInviteForm.get('projectId').value,\n emails: ' ',\n });\n // this.inviteForm.updateValueAndValidity();\n // this.inviteForm.controls.emails.setErrors(null);\n this.inviteSuccess.emit(true);\n }\n}\n","<h1 *ngIf=\"loadingTokens && !hasPersistentToken else doneLoadingTokensHeading\">\n {{ 'COMMON.LOADING' | translate }}\n</h1>\n<ng-template #doneLoadingTokensHeading>\n <h1 *ngIf=\"persistentTokenActive else notPublicHeading\">\n {{ 'ONBOARDING.COMMON.INVITE.OPEN_PUBLIC' | translate }}\n </h1>\n <ng-template #notPublicHeading>\n <h1>\n {{ 'ONBOARDING.COMMON.INVITE.CLOSED_PUBLIC' | translate }}\n </h1>\n </ng-template>\n</ng-template>\n\n\n<div *ngIf=\"loadingTokens && !hasPersistentToken else doneLoadingTokens\" class=\"ion-text-center\">\n <p class=\"ion-text-center\">\n {{ 'COMMON.LOADING' | translate }}\n </p>\n</div>\n\n<ng-template #doneLoadingTokens>\n\n <ng-container *ngIf=\"hasPersistentToken && (!persistentTokenExpired || persistentToken?.expires); else notPublic\">\n <!-- \n In development: \n \"Print this QR as a 6x9 graphic\" \n \"Email this QR image to your email\"\n -->\n <ng-container *ngIf=\"!persistentTokenExpired\">\n <p class=\"no-top-margin\">\n {{ translatePath + 'INVITE_QR_TEXT' | translate }}\n </p>\n\n <app-qr-code [qrCode]=\"qrCode\"></app-qr-code>\n\n <ion-item class=\"share-item\" lines=\"none\">\n <ion-input #inputShareUrl readonly selectAllOnClick [value]=\"qrCode\"></ion-input>\n <ion-button size=\"default\" (click)=\"share(shareToOptions.CLIPBOARD, $event)\" [title]=\"'SOCIAL.COPY_TO_CLIPBOARD' | translate\">\n <ion-icon name=\"link\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-item>\n\n <!-- trying button instead of toggle, below...\n <ion-item *ngIf=\"persistentTokenId\" lines=\"none\" class=\"ion-padding-top\">\n <ion-label class=\"ion-text-wrap\">\n <ng-container *ngIf=\"persistentTokenActive else toggleNoPersistentText\">\n {{ 'ONBOARDING.COMMON.INVITE.TOGGLE_CLOSE_PUBLIC' | translate }}\n </ng-container>\n <ng-template #toggleNoPersistentText>\n {{ 'ONBOARDING.COMMON.INVITE.TOGGLE_OPEN_PUBLIC' | translate }}\n </ng-template>\n </ion-label>\n <ion-toggle #togglePublicInvite slot=\"start\" [checked]=\"true\" [enableOnOffLabels]=\"true\"\n (ionChange)=\"toggleDisabledChanged($event)\"></ion-toggle>\n </ion-item> -->\n </ng-container>\n\n <ng-container *ngIf=\"persistentToken?.expires\">\n <ng-container *ngIf=\"persistentTokenExpired else notExpired\">\n <p class=\"no-top-margin\">\n {{ translatePath + 'INVITE_NO_QR_TEXT' | translate }}\n </p>\n <p class=\"bold\" translate [translateParams]=\"{ date: persistentToken.expires | date:'medium' }\">\n {{ 'ONBOARDING.COMMON.INVITE.EXPIRED_ON' }}\n </p>\n <ion-button class=\"ion-padding-end\" (click)=\"renewExpiration()\">\n {{ 'ONBOARDING.COMMON.INVITE.EXPIRED_RENEW' | translate }}\n </ion-button>\n <ion-button fill=\"outline\" color=\"secondary\" (click)=\"confirmDeleteAndNew()\">\n {{ 'ONBOARDING.COMMON.INVITE.DELETE_NEW' | translate }}\n </ion-button>\n </ng-container>\n\n <ng-template #notExpired>\n <ion-item lines=\"none\">\n <ion-label translate [translateParams]=\"{ date: persistentToken.expires | date:'medium' }\"\n class=\"ion-text-wrap ion-padding-vertical\" style=\"text-transform: none;\">\n {{ 'ONBOARDING.COMMON.INVITE.EXPIRES' }}\n </ion-label>\n <ion-button fill=\"outline\" slot=\"end\" (click)=\"addDays()\">\n {{ 'ONBOARDING.COMMON.INVITE.ADD_DAYS' | translate }}\n </ion-button>\n </ion-item>\n </ng-template>\n\n </ng-container>\n\n <div *ngIf=\"persistentTokenId && !persistentTokenExpired\" class=\"ion-text-center ion-padding-top\">\n <ion-button fill=\"outline\" color=\"secondary\" (click)=\"disablePublicInvite()\">\n {{ 'ONBOARDING.COMMON.INVITE.DISABLE_QR' | translate }}\n </ion-button>\n </div>\n\n </ng-container>\n\n <ng-template #notPublic>\n <p class=\"no-top-margin\">\n {{ translatePath + 'INVITE_NO_QR_TEXT' | translate }}\n </p>\n <div *ngIf=\"!hasPersistentToken || persistentTokenExpired\" class=\"ion-text-center\">\n <ion-button [disabled]=\"!projectId || generatingQr\" size=\"large\" (click)=\"generateQr()\">\n <ion-spinner *ngIf=\"generatingQr\"></ion-spinner>\n {{ 'ONBOARDING.COMMON.INVITE.PUBLIC' | translate }}\n </ion-button>\n </div>\n </ng-template>\n\n</ng-template>","/** @format */\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { NgIf, DatePipe } from '@angular/common';\nimport { TranslateService, TranslatePipe, TranslateDirective } from '@ngx-translate/core';\nimport { AlertController, IonItem, IonInput, IonButton, IonIcon, IonSpinner } from '@ionic/angular/standalone';\nimport { combineLatest } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { UserService } from '@app/core/services/user.service';\nimport { ToasterPosition, ToasterService } from '@app/core/services/toaster.service';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { SelectInputOnClickDirective } from '@app/shared/directives/select-input-on-click.directive';\nimport { ShareableItem, SHARING_METHOD } from '@app/core/social-sharing/social-sharing.model';\nimport { SocialSharingService, socialSharingServiceProvider } from '@app/core/social-sharing/social-sharing.service';\nimport { Project } from '@app/projects/shared/project.model';\nimport { createTokenQrCode, getInviteTypeFromProject, TRANSLATE_ROOT } from '@app/onboarding/shared/onboarding.model';\nimport { getEventTypeFromOnboarding, getExpires, isTokenExpired, Token } from '@app/tokens/shared/tokens.model';\nimport { TokensService } from '@app/tokens/shared/services/tokens.service';\nimport { QrCodeComponent } from '../qr-code/qr-code.component';\nimport { environment } from 'src/environments/environment';\n\n@Component({\n selector: 'fs-qr-manage',\n templateUrl: './qr-manage.component.html',\n styleUrls: ['./qr-manage.component.scss'],\n providers: [socialSharingServiceProvider],\n standalone: true,\n imports: [\n NgIf,\n TranslatePipe,\n TranslateDirective,\n SelectInputOnClickDirective,\n DatePipe,\n QrCodeComponent,\n IonItem,\n IonInput,\n IonButton,\n IonIcon,\n IonSpinner,\n ],\n})\nexport class QrManageComponent implements OnInit {\n @Input() isStudio: boolean = false;\n @Input() translatePath = TRANSLATE_ROOT;\n @Input()\n set project(value) {\n this._project = value;\n if (!this.isStudio) {\n if (this.project && this.project.id) {\n this.tokensService\n .listTokens({ projectId: this.project.id })\n .then((tokens) => {\n /**\n * @todo need to create a persistent token if not exists...\n * need to throttle?\n *\n * set qrCode to the persistentToken\n *\n * @todo handle multiple persistent tokens with filter and loop\n * @note we want all, not just active - handle logic in template\n */\n !environment.production && console.log(`Tokens [${tokens.length}]:`, tokens);\n // const activeTokens = tokens.filter((t) => t && t.id && (t.isActive || !t.hasOwnProperty('isActive')));\n // !environment.production && console.log(`Tokens active [${activeTokens.length}]:`, activeTokens);\n if (Array.isArray(tokens) && tokens.length > 0) {\n this.persistentToken = tokens.find((t) => t && t.persistToken);\n // build the qr code if there's a persistentToken\n this.qrCode = this.hasPersistentToken ? createTokenQrCode(this.project, this.persistentTokenId) : '';\n this.loadingTokens = false;\n } else {\n this.persistentToken = null;\n }\n })\n .catch((error) => {\n console.warn(error);\n });\n }\n }\n }\n get project(): Project {\n return this._project;\n }\n get projectId(): string {\n return this.project && this.project.id;\n }\n get routeId() {\n return getInviteTypeFromProject(this.project);\n }\n\n // @ViewChild('togglePublicInvite', { static: false }) togglePublicInvite: IonToggle;\n\n loadingTokens = true; // trigger the spinner\n qrCode = '';\n generatingQr = false;\n persistentToken: Token;\n get hasPersistentToken(): boolean {\n return this.persistentToken?.id?.length > 0;\n }\n get persistentTokenId(): string {\n return this.persistentToken?.id;\n }\n get persistentTokenActive(): boolean {\n return this.persistentToken?.isActive;\n }\n get persistentTokenExpired() {\n return isTokenExpired(this.persistentToken);\n }\n\n shareToOptions = SHARING_METHOD;\n\n private _project: Project;\n\n constructor(\n private toaster: ToasterService,\n private alertController: AlertController,\n private tokensService: TokensService,\n private socialSharingService: SocialSharingService,\n private userService: UserService,\n private translate: TranslateService\n ) {}\n\n ngOnInit() {\n setTimeout(() => {\n this.loadingTokens = false;\n }, 5600);\n }\n\n addDays() {\n this.enableTokenUpdateExpired(30, this.persistentToken?.expires ?? Date.now());\n }\n\n renewExpiration() {\n this.enableTokenUpdateExpired();\n }\n\n // trying button...\n // toggleDisabledChanged(event: Event) {\n // const customEvent = event as ToggleCustomEvent;\n // const checked = !!customEvent.detail.checked;\n // }\n\n /**\n * When disabling, set the expires to now so we track when it happened, and then it will expire\n * If you don't want an expiring QR, delete & create new...\n */\n async disablePublicInvite() {\n try {\n const res = await this.tokensService.disableToken({\n tokenId: this.persistentTokenId,\n expires: new Date().toISOString(),\n });\n if (res?.success && res?.data) {\n this.toaster.present(this.translate.instant('ONBOARDING.COMMON.INVITE.UPDATED'), ToasterPosition.Bottom);\n this.updatePersistentToken(res.data);\n } else {\n console.warn('Response but not success?', res);\n this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n }\n } catch (error) {\n console.warn('disablePublicInvite Caught error', error);\n this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n }\n }\n\n async confirmDeleteAndNew() {\n const alert = await this.alertController.create({\n header: this.translate.instant('ONBOARDING.COMMON.INVITE.CONFIRM_DELETE.HEADER'),\n subHeader: this.translate.instant('ONBOARDING.COMMON.INVITE.CONFIRM_DELETE.SUBHEAD'),\n message: this.translate.instant('ONBOARDING.COMMON.INVITE.CONFIRM_DELETE.MESSAGE'),\n buttons: [\n {\n text: this.translate.instant('COMMON.CANCEL'),\n role: 'cancel',\n handler: () => {\n //\n },\n },\n {\n text: this.translate.instant('ONBOARDING.COMMON.INVITE.CONFIRM_DELETE.ACTION'),\n role: 'destructive',\n handler: () => {\n this.deleteAndGenerateNew();\n },\n },\n ],\n });\n\n await alert.present();\n }\n\n async generateQr() {\n if (!this.projectId) {\n return console.warn('No projectId?');\n }\n if (this.persistentTokenId) {\n this.enableTokenUpdateExpired();\n } else {\n // console.log(`Creating the persistentToken...`);\n this.generatingQr = true;\n combineLatest([this.userService.userId$, this.userService.email$])\n .pipe(take(1))\n .subscribe(([userId, userEmail]) => {\n this.tokensService\n .createPersistentToken({\n userId,\n userEmail,\n projectId: this.projectId,\n eventType: getEventTypeFromOnboarding(this.routeId),\n })\n .then((res) => {\n this.generatingQr = false;\n this.updatePersistentToken(res);\n this.qrCode = this.hasPersistentToken ? createTokenQrCode(this.project, this.persistentTokenId) : '';\n })\n .catch((err) => {\n console.error(err);\n this.generatingQr = false;\n });\n });\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n share(shareTo: SHARING_METHOD, event?: MouseEvent) {\n if (!this.project?.id) {\n return;\n }\n const shareItem: ShareableItem = {\n id: this.project.id,\n title: this.project.title,\n // description: this.project.description,\n shareUrl: this.qrCode,\n type: ITEM_TYPE.Projects,\n // tags: ,\n };\n\n this.socialSharingService.shareTo(shareItem, shareTo).catch((error) => {\n console.error(error);\n });\n }\n\n private updatePersistentToken(updates) {\n this.persistentToken = {\n ...(this.persistentToken || {}),\n ...(updates || {}),\n };\n }\n\n private async enableTokenUpdateExpired(days = 30, from = null) {\n try {\n const res = await this.tokensService.enableToken({\n tokenId: this.persistentTokenId,\n expires: getExpires(days, from),\n });\n if (res?.success && res?.data) {\n this.toaster.present(this.translate.instant('ONBOARDING.COMMON.INVITE.UPDATED'), ToasterPosition.Bottom);\n this.updatePersistentToken(res.data);\n } else {\n console.warn('Response but not success?', res);\n this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n }\n } catch (error) {\n console.warn('AddDays Caught error', error);\n this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n }\n }\n\n private async deleteAndGenerateNew() {\n try {\n await this.tokensService.deleteToken(this.persistentTokenId);\n this.persistentToken = null;\n this.generateQr();\n } catch (error) {\n console.warn('deleteAndGenerateNew Caught:', error);\n this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n }\n }\n}\n","<div class=\"add-member\">\n <h2>\n {{ translatePath + 'INVITE_TITLE' | translate }}\n </h2>\n <p>\n {{ translatePath + 'INVITE_BODY_1' | translate }}\n </p>\n <p *ngIf=\"showBillingText\">\n {{ translatePath + 'INVITE_BODY_2' | translate }}\n </p>\n\n <p class=\"instructions\">\n {{ 'ONBOARDING.COMMON.INVITE.INTRO_RULES' | translate }} \n <a (click)=\"openCommunityRules()\">{{ 'COMMON.COMMUNITY_RULES' | translate }}</a>. \n {{ 'ONBOARDING.COMMON.INVITE.RULES' | translate }}\n </p>\n\n <div class=\"add-member__content-wrap\">\n\n <section class=\"emails-wrap\">\n <!-- <h1>\n {{ translatePath + 'INVITE_SUBTITLE' | translate }}\n </h1> -->\n <!-- <p class=\"no-top-margin\">\n {{ 'ONBOARDING.COMMON.INTRO.EXPLAINED' | translate }}\n </p> -->\n <!-- [project]=\"project\" -->\n <app-invite-form *ngIf=\"project else projectLoading\"\n [projectId]=\"project?.id\"\n [routeId]=\"routeId\"\n [translatePath]=\"translatePath\"\n (inviteSuccess)=\"openSuccessDialog()\"\n ></app-invite-form>\n\n <ng-template #projectLoading>\n <p class=\"ion-text-center\">\n {{ 'COMMON.LOADING_PROJECT' | translate }}\n </p>\n </ng-template>\n </section>\n\n <section class=\"existing-wrap\">\n <h1>\n {{ 'ONBOARDING.COMMON.INVITE.EXISTING' | translate }}\n </h1>\n <div class=\"ion-padding-bottom\">\n <!-- <p class=\"no-top-margin\">\n {{ 'ONBOARDING.COMMON.INVITE.EXISTING_BODY' | translate }}\n </p> -->\n <!-- <h2 class=\"title\">Invite Film Crew</h2> -->\n <section class=\"\">\n <div *ngIf=\"projectsInactiveUsers$ | async as inactiveUsers\">\n <div *ngIf=\"inactiveUsers?.length > 0\" class=\"ion-text-center\">\n <ion-button fill=\"clear\" (click)=\"viewInactiveUsers(inactiveUsers)\">\n <span *ngIf=\"!viewingInactiveUsers\">{{ 'COMMON.SEE' | translate }}</span>\n <span *ngIf=\"viewingInactiveUsers\">{{ 'COMMON.HIDE' | translate }}</span>\n {{ 'MEMBERS.INACTIVE_PROJECT_MEMBERS' | translate }} ({{ inactiveUsers.length }})\n </ion-button>\n </div>\n </div>\n \n <div class=\"search-users \">\n <app-searchbar\n color=\"light\"\n [placeholderText]=\"'ONBOARDING.COMMON.INVITE.SEARCH_USERS' | translate\"\n [debounceTime]=\"1000\"\n (searchEnter)=\"searchChanged($event)\"\n (searchChange)=\"searchChanged($event)\"\n ></app-searchbar>\n </div>\n \n <div *ngIf=\"(searchResults$ | async) as searchResults\">\n <div *ngIf=\"searchResults.length > 0\" class=\"instructions next-step ion-text-center\">\n {{ 'ONBOARDING.COMMON.INVITE.SELECT_USERS' | translate }}\n </div>\n \n <div class=\"user-search-results \" [class.user-is-selected]=\"selectedUserIds?.length > 0\">\n <div *ngFor=\"let user of searchResults\" class=\"user-item clickable\"\n [class.selected]=\"isUserSelected(user?.userId)\"\n [title]=\"isUserSelected(user?.userId) ? 'Deselect User' : 'Select User'\"\n [class.disabled]=\"user?.roleInCurrentProject\" (click)=\"onClickUser(user)\">\n <ion-avatar>\n <img [src]=\"user?.avatar\" [fallback]=\"avatarFallback\" />\n </ion-avatar>\n <div class=\"name ion-text-center\">\n {{ user?.name || user?.userId }}\n </div>\n <div *ngIf=\"user?.roleInCurrentProject\" class=\"current-role ion-text-center\">\n {{ user?.roleInCurrentProject }}\n </div>\n \n <div class=\"user-item__info-btn\">\n <ion-button color=\"medium\" fill=\"clear\" (click)=\"viewProjectMember($event, user)\"\n [title]=\"'USER.SEE_DETAILS' | translate\">\n <ion-icon slot=\"icon-only\" name=\"information-circle-outline\"></ion-icon>\n </ion-button>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n <div class=\"project-list ion-padding-horizontal ion-margin-top\">\n <h3 class=\"ion-padding-top\">\n <b>\n {{ 'ONBOARDING.COMMON.INVITE.CHOOSE_PROJECT_ROLE' | translate }}\n </b>\n </h3>\n <p>\n <b>{{ 'COMMON.CREW' | translate }}</b>:\n {{ 'MEMBERS.EXPLAIN_CREW' | translate }}\n <br>\n <b>{{ 'COMMON.PRODUCERS' | translate }}</b>:\n {{ 'MEMBERS.EXPLAIN_PRODUCERS' | translate }}\n </p>\n\n <!--CREW MEMBER PROJECTS-->\n <!-- [projects]=\"isStudio ? (myProjects$ | async) : [ project ]\" -->\n <app-project-member-projects *ngIf=\"isStudio || project\" \n [projects]=\"projects$ | async\"\n [addMember]=\"true\"\n (closeModal)=\"dismiss.emit()\"\n (roleChanged)=\"onProjectRoleChanged($event)\"\n ></app-project-member-projects>\n \n </div>\n \n <section class=\"skinny-limit-width\">\n <div class=\"ion-text-center submit-btn-wrap ion-padding-top\">\n \n <div *ngIf=\"message\" class=\"message ion-padding-bottom\">\n {{ message }}\n </div>\n \n <ion-button color=\"primary\" fill=\"solid\" size=\"large\"\n [disabled]=\"selectedUserIds?.length < 1 || !addProjectRole || loadingAddCrew\" (click)=\"submitAddUser()\">\n {{ 'ONBOARDING.COMMON.ADD_USER' | translate }}<span *ngIf=\"selectedUserIds?.length > 1\">s </span> \n {{ 'ONBOARDING.COMMON.TO_PROJECT' | translate }}\n <ion-spinner *ngIf=\"loadingAddCrew\" name=\"crescent\"></ion-spinner>\n </ion-button>\n \n <!-- <ion-button color=\"primary\" fill=\"clear\" size=\"medium\" (click)=\"dismiss()\">\n {{ 'COMMON.DONE' | translate }}\n </ion-button> -->\n </div>\n </section>\n </div>\n </section>\n\n <section *ngIf=\"!isStudio\" class=\"qr-wrap ion-padding-vertical\">\n\n <fs-qr-manage\n [project]=\"project\"\n [translatePath]=\"translatePath\"\n [isStudio]=\"isStudio\"\n ></fs-qr-manage>\n\n </section>\n </div>\n</div>\n","/**\n * @todo translations in submit method..\n * @format\n */\n// import _uniqBy from 'lodash/uniqBy';\nimport { Component, OnInit, OnDestroy, Input, EventEmitter, Output } from '@angular/core';\nimport { UntypedFormBuilder } from '@angular/forms';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { ModalController, NavController, IonButton, IonAvatar, IonIcon, IonSpinner } from '@ionic/angular/standalone';\nimport { Subject, Observable, EMPTY, of } from 'rxjs';\nimport { takeUntil, switchMap, distinctUntilChanged, tap, filter, map } from 'rxjs/operators';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { SentryService } from '@app/core/services/sentry.service';\nimport { User, DEFAULT_USER_AVATAR_TERTIARY } from '@app/shared/models/user.model';\nimport { ModalInviteSuccessComponent } from '@app/shared/components/modal-invite-success/modal-invite-success.component';\nimport { SearchbarComponent } from '@app/shared/components/top-navbar/searchbar/searchbar.component';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport { Utils } from '@app/shared/utils';\nimport { Project, ProjectMember } 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 { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\nimport { ProjectMemberModalComponent } from '@app/project-members/project-member-modal/project-member-modal.component';\nimport { InviteFormComponent } from '@app/project-members/shared/components/invite-form/invite-form.component';\nimport { ProjectMemberProjectsComponent } from '@app/project-members/project-member-projects/project-member-projects.component';\nimport { getInviteTypeFromProject, getTranslatePath } from '@app/onboarding/shared/onboarding.model';\nimport { QrManageComponent } from '@app/tokens/shared/components/qr-manage/qr-manage.component';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { selectMemberQueryResults } from '@store/selectors/members.selectors';\nimport { addMember as addMemberAction, updateMember as updateMemberAction } from '@store/actions/projects.actions';\nimport { CommunityRulesPage } from '@app/pages/community-rules/community-rules.page';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[AddMember]';\n\n/**\n * TODO:\n * roleInCurrentProject - verify on Studio, and project role\n * submitAddUser - undo temp Promise.resolve\n */\n@Component({\n selector: 'app-add-member',\n templateUrl: './add-member.component.html',\n styleUrls: ['./add-member.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n NgFor,\n AsyncPipe,\n TranslatePipe,\n ImageFallbackDirective,\n QrManageComponent,\n InviteFormComponent,\n SearchbarComponent,\n ProjectMemberProjectsComponent,\n IonButton,\n IonAvatar,\n IonIcon,\n IonSpinner,\n ],\n})\nexport class AddMemberComponent implements OnInit, OnDestroy {\n @Input() isStudio: boolean = false;\n @Input()\n set project(value) {\n this._project = value;\n if (!this.isStudio) {\n this.projects$ = of([this.project]);\n }\n }\n get project(): Project {\n return this._project;\n }\n get projectId(): string {\n return this.project && this.project.id;\n }\n\n @Output() addSuccess = new EventEmitter();\n @Output() dismiss = new EventEmitter();\n\n /** small block of text saying crew must purchase upload minutes */\n showBillingText = false;\n\n searchResults$: Observable<(User & { roleInCurrentProject?: PROJECT_MEMBER_ROLE })[]>;\n addProjectRole: PROJECT_MEMBER_ROLE;\n\n loadingAddCrew = false; // trigger the spinner\n avatarFallback = DEFAULT_USER_AVATAR_TERTIARY;\n\n selectedUserIds: { userId: string; username: string }[] = [];\n\n submitEmailAttempt = false;\n message = ''; // show the results\n\n projects$: Observable<Project[]>;\n projectsInactiveUsers$: Observable<ProjectMember[]>;\n viewingInactiveUsers = false;\n\n get routeId() {\n return getInviteTypeFromProject(this.project);\n }\n get translatePath() {\n return getTranslatePath(this.routeId);\n }\n\n private _project: Project;\n private inactiveUsers: ProjectMember[] = [];\n private searchChanged$: Subject<string> = new Subject();\n private onDestroy$ = new Subject<void>();\n\n constructor(\n private modalController: ModalController,\n private formBuilder: UntypedFormBuilder,\n private toaster: ToasterService,\n private projectMemberService: ProjectMemberService,\n private projectService: ProjectService,\n private sentryService: SentryService,\n private store: Store<State>,\n private navCtrl: NavController,\n private translate: TranslateService\n ) {}\n\n ngOnInit() {\n // isStudio ? (myProjects$ | async) : [ project ]\n this.projects$ = this.isStudio ? this.projectService.getMyProjects() : of([this.project]);\n this.projectsInactiveUsers$ = this.projects$.pipe(\n map((projects) =>\n projects.reduce((acc, project) => {\n if (project && Array.isArray(project.members)) {\n acc.push(\n ...project.members.filter((member) => !member.isActive).map((m) => ({ ...m, projectId: project.id }))\n );\n }\n return acc;\n }, [])\n ),\n tap((res) => {\n DEBUG_LOGS && console.log(`${PAGE} projectsInactiveUsers$:`, res);\n this.inactiveUsers = res;\n })\n );\n\n this.searchResults$ = this.store.select(selectMemberQueryResults).pipe(\n distinctUntilChanged(),\n map((users) =>\n users.map((u) => {\n if (!u) u = new User(u);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (u as any).selected = false;\n u.avatar = this.projectMemberService.getUserAvatar(u.userId);\n // DEBUG_LOGS && console.log(`searchResultsMap`, {\n // userId: u.userId,\n // projectId: this.project && this.project.id,\n // memberProjects: u.memberProjects,\n // });\n const projectId = this.projectId;\n let roleInCurrentProject = null;\n if (projectId && Array.isArray(u.memberProjects)) {\n const proj = u.memberProjects.filter((p) => p.isActive).find((p) => p.projectId === projectId);\n roleInCurrentProject = proj && proj.role ? proj.role : null;\n }\n // now, check for projects owned\n if (!roleInCurrentProject && projectId && Array.isArray(u.projects)) {\n const projOwned = u.projects.find((p) => p.id === projectId);\n roleInCurrentProject = projOwned && projOwned.id ? PROJECT_MEMBER_ROLE.OWNER : null;\n }\n return {\n ...u,\n roleInCurrentProject,\n };\n })\n )\n );\n\n this.searchChanged$\n .pipe(\n takeUntil(this.onDestroy$),\n distinctUntilChanged(),\n filter((search) => typeof search === 'string' && search.length > 1),\n switchMap((search) => {\n this.projectMemberService.queryMembers(search);\n return EMPTY;\n })\n )\n .subscribe(() => {\n // console.log('Not empty, just subscribed..')\n });\n }\n\n ngOnDestroy() {\n this.projectMemberService.resetQueryMembers();\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n searchChanged(event) {\n if (event) {\n DEBUG_LOGS && console.log(`${PAGE} searchChanged:`, event);\n this.searchChanged$.next(event);\n } else {\n DEBUG_LOGS && console.log(`${PAGE} searchChanged reset:`, event);\n this.selectedUserIds = [];\n this.searchChanged$.next('');\n this.projectMemberService.resetQueryMembers();\n }\n this.message = '';\n }\n\n onClickUser(user) {\n if (!user || !user.userId) {\n console.warn(`${PAGE} onClickUser missing user?`, user);\n }\n if (this.isUserSelected(user.userId)) {\n // deselect\n this.selectedUserIds.splice(\n this.selectedUserIds.findIndex((id) => id.userId === user.userId),\n 1\n );\n } else {\n // select\n this.selectedUserIds.push({ userId: user.userId, username: user.username || user.userId });\n DEBUG_LOGS && console.log(`${PAGE} onClickUser select user:`, user);\n }\n }\n\n isUserSelected(userId): boolean {\n return this.selectedUserIds.findIndex((id) => id.userId === userId) > -1;\n }\n\n viewInactiveUsers(inactiveUsers) {\n DEBUG_LOGS && console.log(`${PAGE} viewInactiveUsers`, { inactiveUsers });\n this.selectedUserIds = [];\n this.searchChanged$.next('');\n this.projectMemberService.resetQueryMembers();\n if (!this.viewingInactiveUsers) {\n this.projectMemberService.addToQueryMemberResults(\n inactiveUsers.map((u) => ({\n userId: u.userId,\n username: u.username,\n avatar: u.avatar,\n memberProjects: [u],\n }))\n );\n }\n this.viewingInactiveUsers = !this.viewingInactiveUsers;\n }\n\n async viewProjectMember(event, user) {\n event.stopPropagation();\n DEBUG_LOGS && console.log(`${PAGE} viewProjectMember`, { user });\n // const appConfig = await this.configService.appConfig;\n // if (appConfig.isWidgetActive) return;\n const modal = await this.modalController.create({\n component: ProjectMemberModalComponent,\n componentProps: {\n userId: user.userId,\n viewOnly: true,\n // projects: this.projects || [],\n },\n cssClass: 'modal-lg',\n });\n\n return await modal.present();\n }\n\n /**\n * project-member-projects emitted this change\n * check if it's an update to existing or new\n * (both check if toAdd already has this user,\n * and if this user is !isActive which would cause an API update rather than create)\n */\n onProjectRoleChanged({ role, project }) {\n if (!role || !project || !project.id) {\n console.warn(`${PAGE} onProjectRoleChanged missing project or role?`, { role, project });\n return;\n }\n this.addProjectRole = role;\n // this.toAdd = _uniqBy([{ role, projectId: project.id }, ...this.toAdd], 'projectId');\n DEBUG_LOGS && console.log(`${PAGE} project role changed`, { role, projectId: project.id });\n }\n\n /**\n * Combine toAdd with selectedUserIds\n * determine isUpdate (!isActive) or create\n *\n * @todo refactor this nonsense\n */\n submitAddUser() {\n this.loadingAddCrew = true;\n this.message = '';\n try {\n DEBUG_LOGS &&\n console.log(`${PAGE} submitAddUser...`, {\n addProjectRole: this.addProjectRole,\n selectedUserIds: this.selectedUserIds,\n });\n\n if (!this.addProjectRole || this.addProjectRole.length < 1 || this.selectedUserIds.length < 1) {\n this.loadingAddCrew = true;\n this.message = `We're missing required info to perform operation. Please reload and try again.`;\n }\n\n /**\n * loop the toAdd and look at each for each selectedUserIds\n * create ProjectMembers as updates\n */\n const updates: ProjectMember[] = [];\n // const inactiveUsers = await lastValueFrom(this.projectsInactiveUsers$); //rxjs7\n const projectId = this.projectId;\n this.selectedUserIds.forEach(({ userId, username }) => {\n if (this.addProjectRole && projectId) {\n const isCurrentlyInactive = this.inactiveUsers.find(\n (u) => userId && u?.userId === userId && u.projectId === projectId\n );\n\n const member: ProjectMember = {\n isActive: true,\n role: this.addProjectRole,\n userId,\n username,\n projectId,\n };\n if (isCurrentlyInactive) {\n // update user instead of creating\n this.store.dispatch(updateMemberAction({ member }));\n } else {\n this.store.dispatch(addMemberAction({ member }));\n }\n updates.push(member);\n } else {\n console.warn(`${PAGE} submitAddUser '${userId}' missing required props: role or projectId`, {\n addProjectRole: this.addProjectRole,\n projectId,\n });\n }\n }); // end forEach selectedUserIds\n\n if (updates.length > 0) {\n const membersAdded = Utils.makeCommaSeparatedString(updates.map((u) => u.username));\n const membersPlural = updates.length > 1 ? 's' : '';\n this.message += `Success. Added ${membersAdded} as member${membersPlural} to the project!`;\n this.addProjectRole = PROJECT_MEMBER_ROLE.CREW;\n this.selectedUserIds = [];\n this.addSuccess.emit({});\n } else {\n this.message += `No updates were performed.`;\n }\n\n this.loadingAddCrew = false;\n } catch (error) {\n console.warn(`${PAGE} submitAddUser caught:`, error);\n this.sentryService.captureError(error);\n this.message = `Oops! We caught an error. Please try again.`; // ${error && error.message ? error.message : ''}`;\n this.toaster.present(`Oops! something didn't go as planned... Please try again.`);\n this.loadingAddCrew = false;\n }\n }\n\n /**\n * https://xd.adobe.com/view/61615fe1-b7c1-47a9-493b-3c7268fe8988-1750/screen/3073281d-aabd-4185-8cf2-8812fdea0563\n */\n async openSuccessDialog() {\n this.dismiss.emit();\n this.addSuccess.emit({});\n const modal = await this.modalController.create({\n component: ModalInviteSuccessComponent,\n componentProps: {\n heading: this.translate.instant('MEMBERS.INVITE.HEADING'),\n btnText: this.translate.instant('MEMBERS.INVITE.CTA'),\n project: this.project,\n },\n });\n\n await modal.present();\n const { data } = await modal.onDidDismiss();\n if (data && data.navToProject) {\n this.navCtrl.navigateForward(`/${PROJECT_DETAIL_ROUTE}/${this.project.id}`);\n } else if (data && data.openAddMemberDialog) {\n // 2025-01-27 we had to remove this because it was causing a loop (standalone components)\n // re-open this component modal again\n // this.openAddMemberDialog();\n this.dismiss.emit({ openAddMemberDialog: true });\n }\n }\n\n /**\n * This is essentially opening up yourself, is it weird?\n * 2025-01-27 we had to remove this because it was causing a loop (standalone components)\n */\n // async openAddMemberDialog() {\n // const modal = await this.modalController.create({\n // component: AddMemberModalComponent,\n // componentProps: {\n // project: this.project,\n // isStudio: this.isStudio,\n // },\n // cssClass: 'crew-member-modal fullheight-modal',\n // });\n // return await modal.present();\n // }\n\n async openCommunityRules() {\n // /community-rules\";dismiss.emit()\n const modal = await this.modalController.create({\n component: CommunityRulesPage,\n componentProps: {\n isModal: true,\n // returnUrl\n },\n });\n return await modal.present();\n }\n}\n","<fs-form-item [label]=\"label\" [errorMessage]=\"errorMessage\" class=\"fs-form-select\">\n <ion-select\n mode=\"md\"\n [interfaceOptions]=\"interfaceOptions\"\n [placeholder]=\"placeholder\"\n [label]=\"label\"\n [value]=\"control.value\"\n [disabled]=\"disabled\"\n [interface]=\"interface\"\n (ionBlur)=\"isReadyForValidation = true\"\n (ionChange)=\"isReadyForValidation = true; updateProp($any($event).detail.value)\"\n >\n <!-- \n weirdly this is not working. haven't investigated why:\n [style.border-color]=\"errorMessage ? 'var(--ion-color-danger)' : 'none'\"\n -->\n <ion-select-option *ngFor=\"let item of items\" [value]=\"item.value\">{{\n item.text\n }}</ion-select-option>\n </ion-select>\n <span class=\"fs-form-select__hint\" *ngIf=\"hint || errorMessage\" [innerHTML]=\"hint + ' ' + (errorMessage ? errorMessage : '')\"></span>\n</fs-form-item>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgFor, NgIf } from '@angular/common';\nimport { IonSelect, IonSelectOption } from '@ionic/angular/standalone';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BaseFormComponent } from '../base-form.component';\nimport { FormItemComponent } from '../form-item/form-item.component';\n\n@Component({\n selector: 'fs-form-select',\n templateUrl: './form-select.component.html',\n styleUrls: ['./form-select.component.scss'],\n standalone: true,\n imports: [FormItemComponent, NgFor, NgIf, IonSelect, IonSelectOption],\n})\nexport class FormSelectComponent extends BaseFormComponent {\n @Input() items: { text: string; value: string | number | boolean }[];\n @Input() interface = 'popover';\n @Input() placeholder: string;\n @Input() hint: string = '';\n @Input() disabled: boolean = false;\n @Input() interfaceOptions = {\n side: 'top',\n cssClass: 'form-select',\n };\n\n constructor(translate: TranslateService) {\n super(translate);\n }\n}\n","/** @format */\n\nimport { Directive, ElementRef, HostListener } from '@angular/core';\n\n/**\n * Based on https://forum.ionicframework.com/t/ion-input-select-all-text-on-focus/79406/2\n */\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: 'ion-searchbar[selectAllOnClick], ion-input[selectAllOnClick]',\n standalone: true,\n})\nexport class SelectInputOnClickDirective {\n constructor(private el: ElementRef) {}\n\n @HostListener('click')\n selectAll() {\n try {\n // access to the native input element\n const nativeEl: HTMLInputElement = this.el.nativeElement.querySelector('input');\n\n if (nativeEl) {\n if (nativeEl.setSelectionRange) {\n // select the text from start to end\n return nativeEl.setSelectionRange(0, nativeEl.value.length);\n }\n nativeEl.select();\n }\n } catch (error) {\n console.log(`Caught error in SelectInputOnClickDirective.selectAll`, error);\n }\n }\n}\n"],"x_google_ignoreList":[]}