{"version":3,"file":"4114.afb1da02d06b29b1.js","mappings":"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","names":["i0","CheckoutButtonComponent","_CheckoutButtonComponent","constructor","store","sentryService","billingService","modalCtrl","platform","ngZone","cd","this","planId","ChargebeePlanId","Free","priceId","referralCode","routeId","disabled","projectId","projectTitle","eventDate","completed","EventEmitter","errored","processing","onDestroy$","Subject","ngOnDestroy","next","complete","isNativeCheckout","is","window","open","indexOf","error","console","warn","continue","log","setTimeout","onCompleted$","stopConditions$","merge","select","selectCustomer","pipe","takeUntil","subscribe","customer","id","length","cb","msg","res","run","detectChanges","emit","successPageId","payload","user_id","plan_id","price_id","referral_code","project_id","project_name","event_date","successRedirectPath","getSuccessPath","onCancel","onError","onSuccess","alert","openCheckout","dispatch","createCustomer","openCheckoutModal","_asyncToGenerator","i1","i2","i3","i4","selectors","inputs","outputs","standalone","features","decls","vars","consts","template","rf","ctx","_r1","CheckoutButtonComponent_ion_spinner_1_Template","CheckoutButtonComponent_ng_template_2_Template","notProcessing_r2","NgIf","IonFabButton","IonSpinner","IonIcon","ctx_r0","selectedPriceName","costUnit","selectedCost","selectedPriceUnit","_r2","routeBack","_r3","backSlide","_r4","nextSlide","disableNext_r5","$event","_r6","signupErrored","signupCompleted","enableBilling","hasTiers","numMembers","isProOnProPage","selectedPriceId","eventType","selectedProjectId$","selectedProject","title","selectedEventDate","SignupStepperComponent_ng_template_2_ng_template_1_Template","SignupStepperComponent_ng_template_2_ion_button_3_Template","SignupStepperComponent_ng_template_2_ion_button_4_Template","SignupStepperComponent_ng_template_2_ion_button_5_Template","SignupStepperComponent_ng_template_2_div_6_Template","showPrevRoute_r7","showPrev_r8","spacerDiv_r11","showNext_r9","showCheckoutBtn_r10","_r13","onRangeChange","SignupStepperComponent_div_6_swiper_slide_3_ng_container_15_Template","translatePath","selectedRangeTier","pinFormatter","cost","stepperActions_r14","_c3","price_r16","name","price","periodUnit","_r15","updatePricing","SignupStepperComponent_div_6_swiper_slide_4_ion_list_1_ion_item_5_Template","planTitle","planPrices","SignupStepperComponent_div_6_swiper_slide_4_ion_list_1_Template","SignupStepperComponent_div_6_swiper_slide_4_ng_container_3_Template","isProPlan","isActivePro","alreadyActiveProTpl_r17","_c4","_r19","projectChanged","defaultProjectId","SignupStepperComponent_div_6_swiper_slide_5_ng_container_1_Template","SignupStepperComponent_div_6_swiper_slide_5_ng_container_4_Template","_r18","createProject","SignupStepperComponent_div_6_swiper_slide_5_p_13_Template","SignupStepperComponent_div_6_swiper_slide_5_ng_container_15_Template","selectedPriceTpl_r20","myProjectsAdminLength$","selectedProjectHasActiveEvent","_c5","SignupStepperComponent_div_6_swiper_slide_6_ng_container_1_Template","SignupStepperComponent_div_6_swiper_slide_6_ng_container_7_Template","_c6","_r21","codeBlur","SignupStepperComponent_div_6_ng_container_7_ng_container_20_Template","referralCodeFormControl","_c7","_r12","initSlider","SignupStepperComponent_div_6_swiper_slide_3_Template","SignupStepperComponent_div_6_swiper_slide_4_Template","SignupStepperComponent_div_6_swiper_slide_5_Template","SignupStepperComponent_div_6_swiper_slide_6_Template","SignupStepperComponent_div_6_ng_container_7_Template","allowSlideNext","allowSlidePrev","swiperModules","isWeddingRoute","otherEventSignupRoute","_c8","meta_r23","actionUrl","_r22","editSubscription","SignupStepperComponent_ng_template_20_ion_button_10_Template","metaPlanOptions","_r24","eventDateChanged","minimumEventDate","SignupStepperComponent","_SignupStepperComponent","_a","plan","tiers","OnboardingTypes","Weddings","find","swiper","_b","swiperRef","nativeElement","_selectedEventDate","split","value","Date","toISOString","userService","tokensService","router","None","TRANSLATE_ROOT","projectCreated","setDefaultProjectId","eventDateSelected","signupComplete","signupError","ENABLE_BILLING","plansLoaded$","selectPlansLoaded","selectMyProjectsAdmin","map","projects","DEFAULT_PRICE_RANGE_TIER","BehaviorSubject","FormControl","IonicSlides","_isFirstProjectChange","ngOnInit","addDaysForEventDate","numDays","date","setDate","getDate","tokenId$","filter","Boolean","take","tokenId","setValue","ngOnChanges","changes","currentValue","previousValue","getNumMembersFromRange","getPriceFromTiers","event","detail","allowTouchMove","on","slideChange","isBeginning","project","isEventActive","slideNext","slidePrev","selectedProjectId","navigateByUrl","STUDIO_SETTINGS_ROUTE","PROJECT_DETAIL_ROUTE","_this","subscriptionId","openEditSubscription","_this2","userId$","_ref","userId","projectCreateModal","create","component","ProjectFormComponent","componentProps","getProjectEventTypeFromOnboardingType","present","data","onWillDismiss","projectCreatedSuccess","_x","apply","arguments","environSetActiveProject","i5","i6","viewQuery","SignupStepperComponent_ng_template_0_Template","SignupStepperComponent_ng_template_2_Template","SignupStepperComponent_ng_template_4_Template","SignupStepperComponent_div_6_Template","SignupStepperComponent_div_8_Template","SignupStepperComponent_ng_template_20_Template","SignupStepperComponent_ng_template_23_Template","loadingTpl_r25","_c1","_c2","NgFor","NgTemplateOutlet","RouterLink","AsyncPipe","UpperCasePipe","FormControlCastPipe","TranslatePipe","FormInputComponent","FormSelectMyProjects","ButtonComponent","IonModal","IonDatetime","IonItem","IonLabel","IonNote","IonButton","IonRange","IonList","IonRadioGroup","IonListHeader","IonRadio","IonGrid","IonRow","IonCol","IonDatetimeButton","styles","OnboardingSignupComponent_ng_container_7_h1_1_ng_container_1_Template","OnboardingSignupComponent_ng_container_7_h1_1_ng_template_2_Template","defaultBillingTitle_r2","description","_c0","onProjectCreated","handleSuccessAlert","onboardingType","isAlertOpenSignupSuccess","alertButtonsSignupSuccess","OnboardingSignupComponent_ng_container_7_h1_1_Template","OnboardingSignupComponent_ng_container_7_p_2_Template","OnboardingSignupComponent_ng_container_7_ng_template_3_Template","OnboardingSignupComponent_ng_container_7_ng_template_5_Template","OnboardingSignupComponent_ng_container_7_ng_container_7_Template","defaultPlanDescription_r4","billingDisabled_r5","routeToSignup","OnboardingSignupComponent","_OnboardingSignupComponent","route","snapshot","paramMap","get","currentSignupRoute","onboardingService","toaster","loadingCtrl","translate","location","isLoggedIn$","text","role","didInit","queryParams","params","returnUrl","getCurrentNavigation","extras","state","_c","combineLatest","routeOnboardingMeta$","selectPlans","getUserSubscriptionState","backgroundUrl","backgroundPosition","plans","subscriptionLevel","subscriptionStatus","SubscriptionStatus","Active","SubscriptionLevel","Pro","getMetaForRoute","Teams","getPlanFromOnboardingType","prices","sort","a","b","t","replaceState","ProjectEventType","instant","eventConfig","eventIsActive","Wedding","Event","doDbUpdate","setProjectSubscriptionEvent","routeOnSuccess","tutorial","navigate","loading","message","username$","username","createCollabStacksForWedding","then","newStacks","dismiss","i7","i8","OnboardingSignupComponent_ng_container_7_Template","OnboardingSignupComponent_ng_template_9_Template","notLoggedIn_r7","IonHeader","TopNavbarComponent","IonContent","IonAlert","LoginFormComponent","OnboardingService","_OnboardingService","publishService","routeOnboardingType$","events","NavigationEnd","_","firstChild","mergeMap","ROUTE_DATA_PROP","shareReplay","getTranslatePath","input","credits","privacy","STACK_PRIVACY","PUBLIC","playlist","isCollaborative","poster","receptionStack","createStackDraft","factory","ɵfac","providedIn"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/billing/shared/components/checkout-button/checkout-button.component.html","./src/app/billing/shared/components/checkout-button/checkout-button.component.ts","./src/app/onboarding/onboarding-signup/signup-stepper/signup-stepper.component.html","./src/app/onboarding/onboarding-signup/signup-stepper/signup-stepper.component.ts","./src/app/onboarding/onboarding-signup/onboarding-signup.component.html","./src/app/onboarding/onboarding-signup/onboarding-signup.component.ts","./src/app/onboarding/shared/services/onboarding.service.ts"],"sourcesContent":["<ion-fab-button [disabled]=\"disabled || processing\" (click)=\"continue()\">\n <ion-spinner *ngIf=\"processing else notProcessing\"></ion-spinner>\n <ng-template #notProcessing>\n <ion-icon name=\"arrow-forward\"></ion-icon>\n </ng-template>\n</ion-fab-button>\n\n<!-- \n the \"Drop-in Script\" solution does not allow us to use our own Auth, so this is just a reference of how not to do it...\n [attr.data-cb-type]=\"'checkout'\" does not work due to api config (using our auth)\n use portal instead\n-->\n<!-- <a #linkButton \n href=\"javascript:void(0)\" \n [attr.data-cb-type]=\"'portal'\" \n [attr.data-cb-plan-id]=\"planId\"\n style=\"display:none;\"\n>\n <ng-content></ng-content>\n</a> -->\n\n<!-- <a href = \"javascript:void(0)\" data-cb-type = \"checkout\" data-cb-plan-id = \"wedding-500\" > subscribe </a> -->\n","/**\n * This is the \"Drop-in Script\" option, which is only for apps that\n * - You do not have a user authentication system at your end and you rely on Chargebee for providing it.\n * https://www.chargebee.com/checkout-portal-docs/checkout.html#via-drop-in-script\n * @format\n */\n\nimport { ChangeDetectorRef, Component, EventEmitter, Input, NgZone, OnDestroy, Output } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { merge, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ModalController, Platform, IonFabButton, IonSpinner, IonIcon } from '@ionic/angular/standalone';\nimport { Store } from '@ngrx/store';\nimport { State } from '@app/billing/store/billing.reducer';\nimport { createCustomer } from '@app/billing/store/billing.actions';\nimport { selectCustomer } from '@app/billing/store/billing.selectors';\nimport { ChargebeeCustomer, ChargebeePlanId } from '@app/billing/shared/billing.model';\nimport { BillingService } from '@app/billing/shared/services/billing.service';\nimport { OpenCheckoutParams } from '@app/billing/shared/services/chargebee.service';\n// import { CheckoutModalComponent } from '../checkout-modal/checkout-modal.component';\nimport { getSuccessPath } from '@app/onboarding/shared/onboarding.model';\nimport { SentryService } from '@app/core/services/sentry.service';\n\nconst DEBUG_LOGS = false;\n\n@Component({\n selector: 'fs-checkout-button',\n templateUrl: './checkout-button.component.html',\n styleUrls: ['./checkout-button.component.scss'],\n standalone: true,\n imports: [NgIf, IonFabButton, IonSpinner, IonIcon],\n})\nexport class CheckoutButtonComponent implements OnDestroy {\n @Input() planId: ChargebeePlanId = ChargebeePlanId.Free;\n @Input() priceId = '';\n @Input() referralCode = '';\n @Input() routeId = '';\n @Input() disabled = false;\n @Input() projectId = '';\n @Input() projectTitle = '';\n @Input() eventDate = '';\n\n @Output() completed = new EventEmitter<{ successPageId: string; customer: ChargebeeCustomer }>();\n @Output() errored = new EventEmitter<string>();\n\n processing = false;\n\n private onDestroy$ = new Subject<void>();\n\n constructor(\n private store: Store<State>,\n private sentryService: SentryService,\n private billingService: BillingService,\n private modalCtrl: ModalController,\n private platform: Platform,\n private ngZone: NgZone,\n private cd: ChangeDetectorRef\n ) {}\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n /**\n * Decide if we need to show the modal or allow default Chargebee interface which allows more interaction\n */\n isNativeCheckout(): boolean {\n try {\n // we know the chargebee popup will not work in ios\n if (this.platform.is('ios') || this.platform.is('android')) {\n return true;\n }\n // todo: test if this works on Android\n // if (this.platform.is('android')) { return true?}\n\n /**\n * We can check if popups are blocked with teh toString method, which return [native code] as a body of that function.\n * We'll use use ''+ to convert function toString.\n * When you convert some native function toString, function content is presented as [native code].\n * https://stackoverflow.com/a/31299484\n */\n const popupsBlocked = ('' + window.open).indexOf('[native code]') === -1;\n if (popupsBlocked) {\n return false;\n }\n\n return false;\n } catch (error) {\n console.warn(error);\n return true;\n }\n }\n\n /**\n * Chargebee Hosted Pages Modal does not work on iOS - TBD if it does not work on Android\n * We can open in Modal, but...\n * @todo how to determine if popups are blocked in a non-iOS browser?\n * https://support.chargebee.com/support/solutions/articles/256122-hosted-checkout-not-loading-on-safari-mobile-browser\n */\n continue() {\n console.log('continue', {\n planId: this.planId,\n priceId: this.priceId,\n referralCode: this.referralCode,\n projectId: this.projectId,\n projectTitle: this.projectTitle,\n eventDate: this.eventDate,\n });\n this.processing = true;\n // allow to reset if after awhile\n setTimeout(() => {\n this.processing = false;\n }, 4000);\n\n try {\n const onCompleted$ = new Subject();\n const stopConditions$ = merge(this.onDestroy$, onCompleted$);\n // .pipe(map((con) => {console.warn('processing Stop Condition'); return con;}));\n this.store\n .select(selectCustomer)\n .pipe(takeUntil(stopConditions$))\n .subscribe((customer) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (!(customer as any)?.id?.length) {\n DEBUG_LOGS && console.log(`createCustomer...`);\n this.store.dispatch(createCustomer());\n } else {\n // this should happen on the response of the above createCustomer since we're in the selectCustomer pipe\n\n const cb = (msg: string, res: string) => {\n // res = hostedPageID\n console.log(msg, res);\n // we are coming from an event outside of the zone\n this.ngZone.run(() => {\n this.processing = false;\n this.cd.detectChanges();\n onCompleted$.next(true);\n onCompleted$.complete();\n if (msg === 'onSuccess') {\n this.completed.emit({ successPageId: res, customer: customer as ChargebeeCustomer });\n } else if (msg === 'onError') {\n console.log('Caught Error:', res);\n this.errored.emit(res);\n }\n });\n };\n const payload: OpenCheckoutParams = {\n user_id: (customer as ChargebeeCustomer).id,\n plan_id: this.planId,\n price_id: this.priceId,\n referral_code: this.referralCode,\n ...(this.projectId ? { project_id: this.projectId } : {}),\n ...(this.projectTitle ? { project_name: this.projectTitle } : {}),\n ...(this.eventDate ? { event_date: this.eventDate } : {}),\n successRedirectPath: getSuccessPath(this.routeId),\n onCancel: (res: string) => cb('onCancel', res),\n onError: (res: string) => cb('onError', res),\n onSuccess: (res: string) => cb('onSuccess', res),\n };\n DEBUG_LOGS && console.log(`customer:`, { payload, customer });\n\n if (this.isNativeCheckout()) {\n console.warn('isNativeCheckout');\n alert('isNativeCheckout');\n // this appears to need callbacks... and does work in mobile - but is against the policy?\n // this.openCheckoutModal(payload);\n\n // does not work in mobile..\n // this.openCheckout(payload);\n } else {\n // this has callbacks included\n this.openCheckout(payload);\n }\n }\n });\n } catch (error) {\n console.log(`openCheckout caught`, error);\n }\n }\n\n /** this is an option that is not working - use IAP for Native */\n async openCheckoutModal() {\n // const {\n // user_id: userId,\n // plan_id: planId,\n // price_id: priceId,\n // referral_code: referralCode,\n // project_id: projectId,\n // project_name: projectTitle,\n // event_date: eventDate,\n // successRedirectPath,\n // } = payload;\n // const modal = await this.modalCtrl.create({\n // component: CheckoutModalComponent,\n // componentProps: {\n // userId,\n // planId,\n // priceId,\n // referralCode,\n // projectId,\n // projectTitle,\n // eventDate,\n // successRedirectPath,\n // },\n // cssClass: 'fullheight-iframe-modal',\n // });\n // await modal.present();\n // const { data } = await modal.onWillDismiss();\n // if (data) {\n // console.log('CheckoutModal dismissed:', data);\n // try {\n // this.sentryService.captureMessage(`CheckoutModal dismissed with data: ${data.toString()}`);\n // } catch (error) {\n // console.warn('CheckoutModal sentryService.captureMessage caught:', error);\n // }\n // // here we need to check the hostedPage result and redirect? it doesn't seem so...\n // // this.billingService.updateBillingInfoWithHostedPage(hostedPageId);\n // // onSuccess(hostedPageId);\n // }\n }\n\n openCheckout(payload: OpenCheckoutParams) {\n this.billingService.openCheckout(payload);\n }\n}\n\n/*\n // the Chargebee \"Drop-in Script\" solution does not allow us to use our own Auth\n // also, we need to allow User Click to initiate the portal in order for mobile to function...\n @Input() triggerClick: Subject<number>;\n @Input()\n set triggerClick(i) {\n this.clickLink();\n }\n @ViewChild('linkButton') linkButton: ElementRef;\n public get linkElement() {\n return this.linkButton && this.linkButton.nativeElement ? this.linkButton.nativeElement : {};\n }\n ngOnInit() {\n this.triggerClick.pipe(takeUntil(this.onDestroy$)).subscribe((i) => {\n DEBUG_LOGS && console.log(`checkout click triggered`, i);\n this.clickLink();\n });\n ngAfterViewInit() {\n this.billingService.rebindElements();\n clickLink()\n this.linkElement.click();\n*/\n","<ng-template #selectedPriceTpl >\n <ion-item lines=\"none ion-padding-bottom\">\n <ion-label class=\"ion-text-capitalize\" style=\"white-space: wrap;\">\n {{ selectedPriceName }}\n </ion-label>\n <ion-note slot=\"end\" color=\"light\">{{ costUnit }}{{ selectedCost }}<span>/{{ selectedPriceUnit }}</span></ion-note>\n </ion-item>\n</ng-template>\n\n<ng-template #stepperActions \n let-showPrevRoute=\"showPrevRoute\" \n let-showPrev=\"showPrev\" \n let-showNext=\"showNext\" \n let-disableNext=\"disableNext\" \n let-showCheckoutBtn=\"showCheckoutBtn\">\n <div class=\"stepper-actions\">\n <ng-template #spacerDiv>\n <div></div>\n </ng-template>\n <ion-button *ngIf=\"showPrevRoute && !showPrev\" fill=\"clear\" class=\"action-left\" (click)=\"routeBack()\">\n {{ 'COMMON.BACK' | translate }}\n <ion-icon slot=\"start\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"showPrev else spacerDiv\" fill=\"clear\" class=\"action-left\" (click)=\"backSlide()\">\n {{ 'COMMON.BACK' | translate }}\n <ion-icon slot=\"start\" name=\"arrow-back\"></ion-icon>\n </ion-button>\n <ion-button *ngIf=\"showNext else spacerDiv\" \n fill=\"solid\" size=\"large\" class=\"action-right\" \n [disabled]=\"disableNext\"\n (click)=\"nextSlide()\">\n {{ 'COMMON.NEXT' | translate }}\n <ion-icon slot=\"end\" name=\"arrow-forward\"></ion-icon>\n </ion-button>\n <div *ngIf=\"showCheckoutBtn\" class=\"checkout-action\">\n <fs-checkout-button \n [disabled]=\"!enableBilling || (hasTiers && numMembers < 1) || isProOnProPage\"\n [planId]=\"planId\" \n [priceId]=\"selectedPriceId\" \n [referralCode]=\"referralCode\" \n [routeId]=\"eventType\"\n [projectId]=\"selectedProjectId$ | async\"\n [projectTitle]=\"selectedProject?.title\"\n [eventDate]=\"selectedEventDate\"\n (errored)=\"signupErrored($event)\"\n (completed)=\"signupCompleted($event)\"></fs-checkout-button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loadingTpl>\n <div class=\"loading-wrap\">\n <ion-spinner></ion-spinner> {{ 'COMMON.LOADING' | translate}}...\n </div>\n</ng-template>\n\n<div *ngIf=\"(plansLoaded$ | async) === true; else loadingTpl\" class=\"stepper-wrap\">\n <!-- autoHeight causing slider to not show.. [autoHeight]=\"true\" [updateAutoHeight]=\"600\" -->\n <swiper-container #swiper [allowTouchMove]=\"false\" [allowSlideNext]=\"allowSlideNext\" [allowSlidePrev]=\"allowSlidePrev\" [modules]=\"swiperModules\" (init)=\"initSlider($event)\">\n <!-- \n TODO: Handle Tiers, if desired - not fully implemented..\n -->\n <swiper-slide *ngIf=\"!isProPlan && hasTiers\">\n <p>\n {{ translatePath + 'SIGNUP_BODY_TIERED' | translate }}\n </p>\n <ion-item lines=\"none\" class=\"tiered-item\">\n <ion-label position=\"stacked\" class=\"ion-text-wrap\">{{ translatePath + 'SIGNUP_NUM_MEMBERS_PLACEHOLDER' | translate }}: <span class=\"bold\">{{ numMembers }}</span></ion-label>\n <!-- <ion-label position=\"stacked\" class=\"ion-text-capitalize\">{{ 'COMMON.MINUTES' | translate }}</ion-label> -->\n <ion-range \n [ticks]=\"true\" \n [snaps]=\"true\" \n [min]=\"1\" \n [max]=\"5\" \n [pin]=\"true\" \n [value]=\"selectedRangeTier\"\n debounce=\"100\" \n [pinFormatter]=\"pinFormatter\" \n (ionChange)=\"onRangeChange($event)\"\n ></ion-range>\n \n <ion-note slot=\"end\" color=\"light\">{{ costUnit }}{{ cost }}</ion-note>\n </ion-item>\n <p [innerHTML]=\"translatePath + 'SIGNUP_BODY_PRICING' | translate\" class=\"ion-padding-top\"></p>\n <ng-container \n *ngTemplateOutlet=\"stepperActions;context:{ showPrevRoute: true, showNext: true }\">\n </ng-container>\n </swiper-slide>\n\n <swiper-slide *ngIf=\"planPrices?.length > 1\">\n <ion-list *ngIf=\"!isProPlan || !isActivePro else alreadyActiveProTpl\" lines=\"none\" class=\"ion-padding-bottom ion-margin-bottom\">\n <ion-radio-group \n [value]=\"selectedPriceId\"\n (ionChange)=\"updatePricing($event)\"\n class=\"pricing__checkbox\"\n >\n <ion-list-header>\n <ion-label class=\"pricing__checkbox__title\">\n {{ planTitle }}\n </ion-label>\n </ion-list-header>\n \n <ion-item *ngFor=\"let price of planPrices; index as i;\">\n <ion-radio label-placement=\"end\" [value]=\"price.id\" class=\"ion-text-wrap\">\n <div class=\"pricing__checkbox__text\">\n {{ price?.name }}\n <ion-note color=\"light\">{{ costUnit }}{{ price?.price }}<span>/{{ price?.periodUnit }}</span></ion-note>\n </div>\n </ion-radio>\n <!-- aria-label=\"{{ price?.name ?? 'Plan' }}\" -->\n <!-- <ion-note slot=\"end\" color=\"light\">{{ costUnit }}{{ price?.price }}<span>/{{ price?.periodUnit }}</span></ion-note> -->\n </ion-item>\n </ion-radio-group>\n </ion-list>\n\n <div class=\"action-spacer\"></div>\n\n <ng-container \n *ngTemplateOutlet=\"stepperActions;context:{ showPrevRoute: true, showPrev: hasTiers, showNext: !(isProPlan && isActivePro) }\">\n </ng-container>\n </swiper-slide>\n\n <swiper-slide *ngIf=\"!isProPlan\">\n <ng-container *ngTemplateOutlet=\"selectedPriceTpl\"></ng-container>\n <ion-grid class=\"ion-padding-top\">\n <ion-row class=\"ion-align-items-center\">\n <ng-container *ngIf=\"(myProjectsAdminLength$ | async) > 0\">\n <ion-col size=\"12\" size-sm=\"6\" style=\"margin-top:-22px\">\n {{ 'ONBOARDING.COMMON.SELECT_EXISTING_PROJECT' | translate }}\n <app-form-select-myprojects\n [defaultProjectId]=\"defaultProjectId\"\n [onlyAdmin]=\"true\"\n [showLabel]=\"false\"\n (selected)=\"projectChanged($event)\"\n ></app-form-select-myprojects>\n </ion-col>\n <ion-col size=\"12\" size-sm=\"2\" class=\"italic ion-padding-horizontal ion-text-center\">\n {{ 'COMMON.OR' | translate | uppercase }}\n </ion-col>\n </ng-container>\n <ion-col size=\"12\" size-sm=\"4\">\n <ion-button [fill]=\"(myProjectsAdminLength$ | async) > 0 ? 'outline' : 'solid'\" (click)=\"createProject()\">\n {{ 'ONBOARDING.COMMON.CREATE_PROJECT' | translate }}\n </ion-button>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <p *ngIf=\"selectedProjectHasActiveEvent\" class=\"orange bold ion-text-center\">\n \"{{ selectedProject?.title }}\" {{ 'ONBOARDING.COMMON.PROJECT_HAS_EVENT' | translate }}\n </p>\n </ion-col>\n </ion-row>\n </ion-grid>\n <div class=\"action-spacer double-height\"></div>\n <ng-container \n *ngTemplateOutlet=\"stepperActions;context:{ disableNext: selectedProjectHasActiveEvent || !selectedProject?.id, showPrevRoute: true, showPrev: planPrices?.length > 1 || hasTiers, showNext: true }\">\n </ng-container>\n </swiper-slide>\n\n <!-- only weddings need an event date atm -->\n <swiper-slide *ngIf=\"isWeddingRoute\">\n <ng-container *ngTemplateOutlet=\"selectedPriceTpl\"></ng-container>\n\n <h3>{{ 'ONBOARDING.COMMON.EVENT_DATE' | translate }}</h3>\n <ion-datetime-button datetime=\"selEventDate\"></ion-datetime-button>\n <!-- see modal outside of container -->\n\n <div class=\"action-spacer double-height\"></div>\n <ng-container \n *ngTemplateOutlet=\"stepperActions;context:{ showPrevRoute: true, showPrev: true, showNext: true }\">\n </ng-container>\n </swiper-slide>\n \n <ng-container *ngIf=\"!isProOnProPage\">\n <swiper-slide class=\"token-slide\">\n <ion-item lines=\"none ion-padding-bottom\">\n <ion-label class=\"ion-text-capitalize\" style=\"white-space: wrap;\">\n {{ selectedPriceName }}\n </ion-label>\n <ion-note slot=\"end\" color=\"light\">{{ costUnit }}{{ selectedCost }}<span>/{{ selectedPriceUnit }}</span></ion-note>\n </ion-item>\n\n <h3>{{ 'AUTH.SIGNUP.SHOW_TOKEN_BUTTON' | translate }}</h3>\n <!-- no expandable button, always show..\n <fs-button\n class=\"show-token-button\"\n buttonStyle=\"clear\"\n color=\"primary\"\n [disabled]=\"showingCodeInput\"\n (click)=\"showingCodeInput = true\"\n >\n {{ 'AUTH.SIGNUP.SHOW_TOKEN_BUTTON' | translate }}\n </fs-button> -->\n \n <div class=\"token-input-field\">\n <fs-form-input\n [label]=\"'AUTH.INVITE_REFERRAL_CODE' | translate\"\n type=\"text\"\n [control]=\"referralCodeFormControl | formControlCast\"\n (blur)=\"codeBlur($event)\"\n ></fs-form-input>\n </div>\n\n <p>{{ 'AUTH.SIGNUP.TOKEN_DESCRIPTION' | translate }}</p>\n \n <div class=\"action-spacer\"></div>\n <ng-container \n *ngTemplateOutlet=\"stepperActions;context:{ showPrev: true, showNext: false, showCheckoutBtn: true }\">\n </ng-container>\n </swiper-slide>\n </ng-container>\n \n </swiper-container>\n \n</div>\n\n<div *ngIf=\"!isProPlan\" class=\"teams-section\">\n <h3 [innerHTML]=\"translatePath + 'SIGNUP_OTHER_EVENT' | translate\"></h3>\n <ion-button fill=\"clear\" class=\"text-btn\" [routerLink]=\"otherEventSignupRoute\">{{ translatePath + 'SIGNUP_OTHER_EVENT_ACTION' | translate }}</ion-button>\n</div>\n\n<div class=\"teams-section event-contact\">\n <h3 [innerHTML]=\"translatePath + 'SIGNUP_CONTACT_Q' | translate\"></h3>\n <p>\n <ion-button fill=\"clear\" class=\"text-btn\" [routerLink]=\"['/contact']\" [queryParams]=\"{topic: 'Filmstack My ' + (isWeddingRoute ? 'Wedding' : 'Event')}\">{{ 'COMMON.CONTACT_US' | translate }}</ion-button>\n <span [innerHTML]=\"translatePath + 'SIGNUP_CONTACT' | translate\"></span>\n </p>\n</div>\n\n<p class=\"italic disclaimer\" [innerHTML]=\"'ONBOARDING.COMMON.DISCLAIMER' | translate\"></p>\n\n<!-- <ng-template #proPlanTpl>\n <swiper-slide>\n <ion-list *ngIf=\"!isActivePro else alreadyActiveProTpl\" lines=\"none\" class=\"ion-padding-bottom ion-margin-bottom\">\n <ion-radio-group \n [value]=\"selectedPriceId\"\n (ionChange)=\"updatePricing($event)\"\n class=\"pricing__checkbox\"\n >\n <ion-list-header>\n <ion-label class=\"pricing__checkbox__title\">\n {{ planTitle }}\n </ion-label>\n </ion-list-header>\n \n <ion-item *ngFor=\"let price of planPrices; index as i;\">\n <ion-radio label-placement=\"end\" [value]=\"price.id\" class=\"ion-text-wrap\">\n <div class=\"pricing__checkbox__text\">\n {{ price?.name }}\n <ion-note color=\"light\">{{ costUnit }}{{ price?.price }}<span>/{{ price?.periodUnit }}</span></ion-note>\n </div>\n </ion-radio>\n </ion-item>\n \n </ion-radio-group>\n </ion-list>\n <ng-container \n *ngTemplateOutlet=\"stepperActions;context:{ showPrev: true, showNext: true }\">\n </ng-container>\n </swiper-slide>\n</ng-template> -->\n\n<ng-template #alreadyActiveProTpl>\n <p class=\"ion-padding-vertical bold orange ion-text-center\">\n {{ 'BILLING.ALREADY_PRO' | translate }}\n <fs-button size=\"default\" (click)=\"editSubscription()\">{{ 'AUTH.PLANS.EDIT_SUBSCRIPTION' | translate }}</fs-button>\n </p>\n\n <h3>{{ 'BILLING.ADD_EVENT_INSTEAD' | translate }}</h3>\n\n <div class=\"action-buttons ion-margin-bottom\">\n <ion-button \n *ngFor=\"let meta of metaPlanOptions\"\n fill=\"outline\" \n [routerLink]=\"[meta.actionUrl, 'signup']\"\n >{{ \n meta.translatePath + 'CREATE_EVENT' | translate \n }}</ion-button>\n </div>\n</ng-template>\n\n<ion-modal [keepContentsMounted]=\"true\">\n <ng-template>\n <ion-datetime id=\"selEventDate\" \n presentation=\"date\" \n [min]=\"minimumEventDate\" \n [value]=\"selectedEventDate\" \n [showDefaultButtons]=\"true\"\n [doneText]=\"'COMMON.OK' | translate\" [cancelText]=\"'COMMON.CANCEL' | translate\"\n (ionChange)=\"eventDateChanged($event)\">\n <span slot=\"title\">{{ 'ONBOARDING.COMMON.SELECT_EVENT_DATE' | translate }}</span>\n </ion-datetime>\n </ng-template>\n</ion-modal>\n\n <!-- <div class=\"actions skinny-limit-width\">\n <fs-checkout-button \n [disabled]=\"!enableBilling || (hasTiers && numMembers < 1) || isProOnProPage\"\n [planId]=\"planId\" \n [priceId]=\"selectedPriceId\" \n [referralCode]=\"referralCode\" \n [routeId]=\"onboardingType\"\n [projectId]=\"selectedProjectId$ | async\"\n [projectTitle]=\"selectedProject?.title\"\n [eventDate]=\"selectedEventDate\"\n (errored)=\"signupErrored($event)\"\n (completed)=\"signupComplete($event)\"></fs-checkout-button>\n </div> -->\n","/** @format */\n\nimport {\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { NgIf, NgTemplateOutlet, NgFor, AsyncPipe, UpperCasePipe } from '@angular/common';\nimport { FormControl } from '@angular/forms';\nimport { Router, RouterLink } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { take, filter, map } from 'rxjs/operators';\nimport {\n IonicSlides,\n ModalController,\n RadioGroupCustomEvent,\n IonItem,\n IonLabel,\n IonNote,\n IonButton,\n IonSpinner,\n IonRange,\n IonList,\n IonRadioGroup,\n IonListHeader,\n IonRadio,\n IonGrid,\n IonRow,\n IonCol,\n IonDatetimeButton,\n IonModal,\n IonDatetime,\n IonIcon,\n} from '@ionic/angular/standalone';\nimport { Store } from '@ngrx/store';\nimport { activeProject as environSetActiveProject } from '@store/actions/environ.actions';\nimport { selectPlansLoaded } from '@app/billing/store/billing.selectors';\nimport { selectMyProjectsAdmin } from '@store/selectors/projects.selectors';\nimport { ENABLE_BILLING } from '@app/app.config';\nimport { PROJECT_DETAIL_ROUTE, STUDIO_SETTINGS_ROUTE } from '@app/app.routes';\nimport { UserService } from '@app/core/services/user.service';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.component';\nimport { FormSelectMyProjects } from '@app/shared/components/form-select-myprojects/form-select-myprojects.component';\nimport { FormInputComponent } from '@app/shared/components/ui/form/form-input/form-input.component';\nimport { FormControlCastPipe } from '@app/shared/pipes/form-control-cast.pipe';\nimport {\n ChargebeeCustomer,\n ChargebeePlanId,\n DEFAULT_PRICE_RANGE_TIER,\n Plan,\n PlanPrice,\n PlanPriceTier,\n getPriceFromTiers,\n} from '@app/billing/shared/billing.model';\nimport { BillingService } from '@app/billing/shared/services/billing.service';\nimport { CheckoutButtonComponent } from '@app/billing/shared/components/checkout-button/checkout-button.component';\nimport {\n OnboardingMeta,\n OnboardingTypes,\n TRANSLATE_ROOT,\n getProjectEventTypeFromOnboardingType,\n} from '@app/onboarding/shared/onboarding.model';\nimport { Project, isEventActive } from '@app/projects/shared/project.model';\nimport { ProjectFormComponent } from '@app/projects/project-form/project-form.component';\nimport { TokensService } from '@app/tokens/shared/services/tokens.service';\n\nconst NUM_DAYS_FROM_TODAY_INIT_EVENT_DATE = 1;\nconst DEBUG_LOGS = false;\n\n@Component({\n selector: 'fs-signup-stepper',\n templateUrl: './signup-stepper.component.html',\n styleUrls: ['./signup-stepper.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n NgFor,\n NgTemplateOutlet,\n RouterLink,\n AsyncPipe,\n UpperCasePipe,\n FormControlCastPipe,\n TranslatePipe,\n CheckoutButtonComponent,\n FormInputComponent,\n FormSelectMyProjects,\n ButtonComponent,\n IonModal,\n IonDatetime,\n IonItem,\n IonLabel,\n IonNote,\n IonButton,\n IonSpinner,\n IonRange,\n IonList,\n IonRadioGroup,\n IonListHeader,\n IonRadio,\n IonGrid,\n IonRow,\n IonCol,\n IonDatetimeButton,\n IonIcon,\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class SignupStepperComponent implements OnInit, OnChanges {\n @Input() projectId: string;\n @Input() eventType: OnboardingTypes | string = OnboardingTypes.None;\n // do we get & set to do all the needed logic when plan changes?\n @Input() plan: Plan;\n @Input() planPrices: PlanPrice[] = [];\n @Input() tiers: PlanPriceTier[] = [];\n @Input() translatePath = TRANSLATE_ROOT;\n @Input() metaPlanOptions: OnboardingMeta[] = [];\n @Input() isProPlan = false;\n @Input() isActivePro = false;\n @Input() subscriptionId: string;\n @Input() defaultProjectId = '';\n\n @Output() projectCreated = new EventEmitter<Partial<Project>>();\n @Output() setDefaultProjectId = new EventEmitter<string>();\n @Output() eventDateSelected = new EventEmitter<string>();\n @Output() signupComplete = new EventEmitter<{\n selectedProjectId: string;\n selectedEventDate: string;\n event: {\n successPageId: string;\n customer: ChargebeeCustomer;\n };\n }>();\n @Output() signupError = new EventEmitter<string>();\n\n enableBilling = ENABLE_BILLING;\n\n plansLoaded$ = this.store.select(selectPlansLoaded);\n myProjectsAdminLength$ = this.store.select(selectMyProjectsAdmin).pipe(map((projects) => projects?.length ?? 0));\n\n get planId(): ChargebeePlanId {\n return this.plan?.id;\n }\n get hasTiers(): boolean {\n return this.tiers.length > 0;\n }\n\n get isWeddingRoute(): boolean {\n return this.eventType === OnboardingTypes.Weddings;\n }\n get otherEventSignupRoute(): string {\n return `/events/${this.isWeddingRoute ? '' : 'weddings/'}signup${this.projectId ? '/' + this.projectId : ''}`;\n }\n\n get isProOnProPage(): boolean {\n return this.isProPlan && this.isActivePro;\n }\n\n cost = 0;\n numMembers = 0;\n minimumEventDate = new Date().toISOString();\n\n selectedPriceId = '';\n selectedRangeTier = DEFAULT_PRICE_RANGE_TIER;\n\n get planTitle(): string {\n return this.plan?.title ?? 'Plan';\n }\n\n get costUnit(): string {\n return this.plan && this.plan.costUnit ? this.plan.costUnit : '$';\n }\n\n get selectedCost(): number {\n return this.planPrices.find((price) => price?.id === this.selectedPriceId)?.price ?? 0;\n }\n get selectedPriceName(): string {\n return this.planPrices.find((price) => price?.id === this.selectedPriceId)?.name ?? 'Unknown';\n }\n get selectedPriceUnit(): string {\n return this.planPrices.find((price) => price?.id === this.selectedPriceId)?.periodUnit ?? '';\n }\n\n selectedProjectId$: BehaviorSubject<string> = new BehaviorSubject<string>('');\n selectedProject: Project;\n selectedProjectHasActiveEvent = false;\n\n // showingCodeInput = false;\n referralCodeFormControl = new FormControl('');\n referralCode = '';\n\n // https://ionicframework.com/docs/angular/slides\n @ViewChild('swiper', { static: false }) swiperRef: ElementRef | undefined;\n swiperModules = [IonicSlides];\n allowSlidePrev = false;\n allowSlideNext = false;\n get swiper() {\n return this.swiperRef?.nativeElement?.swiper;\n }\n\n /** our selectedEventDate is just the date part of the ISO string */\n get selectedEventDate(): string {\n return this._selectedEventDate.split('T')[0];\n }\n private set selectedEventDate(value) {\n this._selectedEventDate = value || new Date().toISOString();\n }\n // we'll update this onInit to addDays...\n private _selectedEventDate = new Date().toISOString();\n // private onDestroy$ = new Subject<void>();\n\n constructor(\n private store: Store,\n private userService: UserService,\n private tokensService: TokensService,\n private billingService: BillingService,\n private modalCtrl: ModalController,\n private router: Router\n ) {}\n\n ngOnInit() {\n const addDaysForEventDate = (numDays = 0) => {\n const date = new Date();\n date.setDate(date.getDate() + numDays);\n return date;\n };\n this._selectedEventDate = addDaysForEventDate(NUM_DAYS_FROM_TODAY_INIT_EVENT_DATE).toISOString();\n\n this.tokensService.tokenId$.pipe(filter(Boolean), take(1)).subscribe((tokenId: string) => {\n this.referralCodeFormControl.setValue(tokenId);\n // this.showingCodeInput = true;\n });\n }\n\n /**\n * we can watch all the changes - just plan?\n * You can also use .previousValue and .firstChange for comparing old and new values\n */\n ngOnChanges(changes: SimpleChanges) {\n // isProPlan: changes.isProPlan.currentValue {previousValue: false, currentValue: true, firstChange: false}\n // plan: changes.plan.currentValue\n // planPrices\n // metaPlanOptions\n if (changes.plan && changes.plan.currentValue !== changes.plan.previousValue) {\n DEBUG_LOGS && console.log('[signup-stepper] plan changed:', changes);\n if (this.hasTiers) {\n this.numMembers = this.getNumMembersFromRange(DEFAULT_PRICE_RANGE_TIER);\n this.cost = getPriceFromTiers(this.numMembers, this.tiers);\n } else {\n // pro plan select monthly plan initially\n if (this.planPrices.length === 1) {\n this.selectedPriceId = this.planPrices[0].id;\n } else {\n this.selectedPriceId = this.planPrices.find((price) => price?.periodUnit === 'month')?.id ?? '';\n }\n DEBUG_LOGS && console.log({ selectedPriceId: this.selectedPriceId });\n if (this.isProPlan) {\n // input will not be shown, update\n this.numMembers = 1;\n this.cost = this.planPrices.find((price) => price?.id === this.selectedPriceId)?.price ?? 0;\n }\n }\n } else {\n DEBUG_LOGS && console.log('[signup-stepper] ignoring changes:', changes);\n }\n }\n\n initSlider(event) {\n const { detail = [] } = event;\n if (detail.length > 0) {\n const swiper = detail[0];\n // DEBUG_LOGS && console.log(swiper)\n if (swiper) {\n swiper.allowTouchMove = false;\n swiper.on('slideChange', () => {\n // slideChangeTransitionEnd\n this.slideChange();\n });\n // swiper.updateSize();\n }\n }\n }\n\n slideChange() {\n // re-disable the slide in UI\n this.swiper.allowSlideNext = false;\n this.swiper.allowSlidePrev = false;\n // this.content.scrollToTop();\n if (this.swiper.isBeginning) {\n this.allowSlidePrev = false;\n }\n }\n\n /** we don't want to emit the first time to avoid overwriting the state with dropdown's init value */\n // eslint-disable-next-line @typescript-eslint/member-ordering\n private _isFirstProjectChange = true;\n projectChanged(project) {\n DEBUG_LOGS && console.log('onboardingSignup projectChanged:', project);\n this.selectedProjectId$.next(project?.id ?? '');\n this.selectedProject = project;\n // if there's already an active Event for this project, let's notify\n this.selectedProjectHasActiveEvent = isEventActive(project);\n\n if (this._isFirstProjectChange) {\n this._isFirstProjectChange = false;\n } else {\n this.setDefaultProjectId.emit(project?.id ?? '');\n }\n }\n\n codeBlur(value: string) {\n this.referralCode = value;\n }\n\n /**\n * in this range ui, we are getting value 1-5 representing quarters, so the tiers must align with that\n * 1 = 1\n * 2 = 25\n * 3 = 50\n * 4 = 75\n * 5 = 100\n */\n getNumMembersFromRange(value) {\n switch (value) {\n case 1:\n return 1;\n case 2:\n case 3:\n case 4:\n return (value - 1) * 25;\n case 5:\n return (value - 1) * 25;\n default:\n return 0;\n }\n }\n\n /**\n * hasTiers ion-range\n */\n pinFormatter(value: number) {\n return `${value > 1 ? (value - 1) * 25 : 1}`;\n }\n\n /**\n * in this range ui, we are getting value 1-5 representing quarters, so the tiers must align with that\n * 1 = 1\n * 2 = 25\n * 3 = 50\n * 4 = 75\n * 5 = 100\n */\n onRangeChange(event: Event) {\n const { detail: { value = 0 } = {} } = event as CustomEvent;\n this.numMembers = this.getNumMembersFromRange(value);\n this.cost = this.numMembers > 0 ? getPriceFromTiers(this.numMembers, this.tiers) : 0;\n }\n\n updatePricing(event: Event) {\n const { detail: { value } = {} } = event as RadioGroupCustomEvent;\n this.selectedPriceId = value;\n }\n\n eventDateChanged(event: Event) {\n const { detail: { value } = {} } = event as CustomEvent;\n DEBUG_LOGS && console.log('eventDateChanged', { value, selectedEventDate: value });\n this.eventDateSelected.emit(value);\n }\n\n /**\n * go to the next slide\n * note: removed the idea of validate here and added to template\n */\n nextSlide() {\n if (!this.swiper) {\n return console.warn('no swiper?', this.swiperRef);\n }\n this.swiper.allowSlideNext = true;\n this.swiper.slideNext();\n // // removed and added to template - need to check the selectedProject, not eventSubscriptions (only mine)\n // if (validate) {\n // DEBUG_LOGS && console.log('nextSlide + validate..');\n // // the selectedProject should not already have the same subscription\n // combineLatest([\n // this.selectedProjectId$,\n // this.store.select(selectEventSubscriptions),\n // ])\n // .pipe(take(1))\n // .subscribe(([selectedProjectId, eventSubscriptions]) => {\n // DEBUG_LOGS && console.log({ selectedProjectId, eventSubscriptions, selectedProject: this.selectedProject });\n // // this.selectedProject\n // if (eventSubscriptions?.length > 0) {\n // const found = eventSubscriptions.find((sub) => {\n // sub.cf_project_id === selectedProjectId\n // });\n // if (found) {\n // DEBUG_LOGS && console.warn('found:', found);\n // return;\n // }\n // }\n\n // this.swiper.allowSlideNext = true;\n // this.swiper.slideNext();\n // });\n // }\n }\n\n backSlide() {\n if (!this.swiper) {\n return console.warn('no swiper?');\n }\n this.allowSlidePrev = true;\n this.swiper.allowSlidePrev = true;\n this.swiper.slidePrev();\n }\n\n signupErrored(event) {\n console.warn('signupErrored', event);\n // do in parent: this.toaster.present(this.translate.instant('ERRORS.GENERIC_OOPS'));\n this.signupError.emit(event);\n }\n\n signupCompleted(event: { successPageId: string; customer: ChargebeeCustomer }) {\n DEBUG_LOGS && console.log(`signupComplete:`, { event });\n this.selectedProjectId$.pipe(take(1)).subscribe((selectedProjectId) => {\n this.signupComplete.emit({\n selectedProjectId,\n selectedEventDate: this.selectedEventDate,\n event,\n });\n });\n }\n\n routeBack() {\n if (this.isProPlan || !this.projectId) {\n this.router.navigateByUrl(`/${STUDIO_SETTINGS_ROUTE}`);\n } else {\n this.router.navigateByUrl(`/${PROJECT_DETAIL_ROUTE}/${this.projectId}`);\n }\n }\n\n /**\n * Edit Subscription\n */\n async editSubscription() {\n if (this.subscriptionId) {\n this.billingService.openEditSubscription(this.subscriptionId);\n } else {\n console.warn('No Subscription ID?');\n }\n }\n\n async createProject() {\n this.userService.userId$.pipe(take(1)).subscribe(async (userId) => {\n const projectCreateModal = await this.modalCtrl.create({\n component: ProjectFormComponent,\n componentProps: {\n userId,\n eventType: getProjectEventTypeFromOnboardingType(this.eventType),\n },\n });\n projectCreateModal.present();\n const { data } = await projectCreateModal.onWillDismiss();\n if (data?.project?.id?.length > 0) {\n // update the project selected\n this.projectCreatedSuccess(data.project);\n }\n });\n }\n\n private projectCreatedSuccess(project: Partial<Project>) {\n const projectId = project?.id;\n if (projectId) {\n // this will get called again after the setActiveProject selector returns... so we don't really need it..\n // this.projectChanged(project);\n // but we do need to set this so the form-select updates to this as preferred\n this.setDefaultProjectId.emit(projectId);\n DEBUG_LOGS && console.log(`Project Created -> environSetActiveProject: '${projectId}'`);\n this.store.dispatch(environSetActiveProject({ projectId }));\n this.projectCreated.emit(project);\n }\n }\n}\n","<ion-header>\n <app-top-navbar title=\"\" [backButtonReturnUrl]=\"returnUrl\">\n <!-- SLOT: anything added here will go below the ion-navbar -->\n </app-top-navbar>\n</ion-header>\n\n<ion-content class=\"light\">\n <div class=\"container ion-padding diet-limit-width\">\n <h2>\n {{ translatePath + 'SIGNUP_TITLE' | translate }}\n </h2>\n\n <ng-container *ngIf=\"isLoggedIn$ | async as isLoggedIn; else notLoggedIn\">\n <h1 *ngIf=\"enableBilling\">\n <ng-container *ngIf=\"hasTiers else defaultBillingTitle\">\n {{ translatePath + 'SIGNUP_SUBTITLE_TIERED' | translate }}\n </ng-container>\n <ng-template #defaultBillingTitle>\n {{ translatePath + 'SIGNUP_SUBTITLE' | translate }}\n </ng-template>\n </h1>\n \n <p *ngIf=\"plan?.description else defaultPlanDescription\">\n {{ plan.description }}\n </p>\n <ng-template #defaultPlanDescription>\n <p>\n {{ translatePath + 'SIGNUP_BODY_1' | translate }}\n </p>\n </ng-template>\n\n <ng-template #billingDisabled>\n <p class=\"ion-padding-vertical bold orange\">\n {{ 'BILLING.FEATURE_DISABLED' | translate }}\n <ion-button \n fill=\"clear\" \n class=\"text-btn\" \n [routerLink]=\"['/contact']\"\n [queryParams]=\"{ topic: 'EMAILS.CONTACT_TOPIC_WEDDINGS' | translate }\">{{ \n 'COMMON.CONTACT_US' | translate \n }}</ion-button>\n </p>\n </ng-template>\n\n <ng-container *ngIf=\"enableBilling else billingDisabled\">\n \n <fs-signup-stepper\n [eventType]=\"onboardingType\"\n [projectId]=\"projectId\"\n [translatePath]=\"translatePath\"\n [plan]=\"plan\"\n [planPrices]=\"planPrices\"\n [subscriptionId]=\"subscriptionId\"\n [isProPlan]=\"isProPlan\"\n [isActivePro]=\"isActivePro\"\n [metaPlanOptions]=\"metaPlanOptions\"\n [defaultProjectId]=\"selectedProjectId\"\n (setDefaultProjectId)=\"setDefaultProjectId($event)\"\n (projectCreated)=\"onProjectCreated($event)\"\n (signupComplete)=\"signupComplete($event)\"\n (signupError)=\"signupError($event)\"\n ></fs-signup-stepper>\n\n <ion-alert\n [isOpen]=\"isAlertOpenSignupSuccess\"\n [header]=\"translatePath + 'SIGNUP_SUCCESS' | translate\"\n [subHeader]=\"translatePath + 'SIGNUP_SUCCESS_ALERT_SUBHEAD' | translate\"\n [message]=\"translatePath + 'SIGNUP_SUCCESS_ALERT_MESSAGE' | translate\"\n [buttons]=\"alertButtonsSignupSuccess\"\n (didDismiss)=\"handleSuccessAlert($event)\"\n ></ion-alert>\n\n </ng-container>\n\n <!-- moved to signup-stepper:\n <p class=\"italic disclaimer\" [innerHTML]=\"'ONBOARDING.COMMON.DISCLAIMER' | translate\"></p>\n <div class=\"actions skinny-limit-width\">\n <fs-checkout-button \n [disabled]=\"!enableBilling || (hasTiers && numMembers < 1) || isProOnProPage\"\n [planId]=\"planId\" \n [priceId]=\"selectedPriceId\" \n [referralCode]=\"referralCode\" \n [routeId]=\"onboardingType\"\n [projectId]=\"selectedProjectId$ | async\"\n [projectTitle]=\"selectedProject?.title\"\n [eventDate]=\"selectedEventDate\"\n (errored)=\"signupErrored($event)\"\n (completed)=\"signupComplete($event)\"></fs-checkout-button>\n </div> -->\n </ng-container>\n \n <ng-template #notLoggedIn>\n <!-- LOGGED OUT -->\n <div>\n <fs-button\n class=\"signup-button\"\n size=\"large\"\n buttonStyle=\"clear\"\n routerLink=\"/signup\" [queryParams]=\"{returnUrl: actionUrl}\"\n >{{ 'AUTH.NO_ACCOUNT_SIGNUP' | translate }}</fs-button\n >\n </div>\n <div class=\"container\">\n <h3>{{ 'AUTH.EXISTING_ACCOUNT' | translate }}</h3>\n <fs-login-form \n [routeOnSuccess]=\"actionUrl\" \n [cancelText]=\"'AUTH.NO_ACCOUNT_SIGNUP' | translate\"\n (cancelClick)=\"routeToSignup()\"></fs-login-form>\n </div>\n </ng-template>\n </div>\n\n</ion-content>\n","/** @format */\n\nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Location, NgIf, AsyncPipe } from '@angular/common';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { LoadingController, IonHeader, IonContent, IonButton, IonAlert } from '@ionic/angular/standalone';\nimport { combineLatest, Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { ENABLE_BILLING } from '@app/app.config';\nimport { PROJECT_DETAIL_ROUTE, STUDIO_SETTINGS_ROUTE } from '@app/app.routes';\nimport { UserService } from '@app/core/services/user.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { TopNavbarComponent } from '@app/shared/components/top-navbar/top-navbar.component';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.component';\nimport { LoginFormComponent } from '@app/shared/components/login/login-form.component';\nimport { Store } from '@ngrx/store';\nimport { setSubscriptionEvent as setProjectSubscriptionEvent } from '@store/actions/projects.actions';\nimport { getUserSubscriptionState } from '@store/selectors/user.selectors';\nimport { State } from '@app/billing/store/billing.reducer';\nimport { selectPlans } from '@app/billing/store/billing.selectors';\nimport {\n Plan,\n ChargebeePlanId,\n PlanPrice,\n PlanPriceTier,\n SubscriptionStatus,\n SubscriptionLevel,\n} from '@app/billing/shared/billing.model';\nimport { Project, ProjectEventType } from '@app/projects/shared/project.model';\nimport { getPlanFromOnboardingType, OnboardingMeta, OnboardingTypes, TRANSLATE_ROOT } from '../shared/onboarding.model';\nimport { OnboardingService } from '../shared/services/onboarding.service';\nimport { SignupStepperComponent } from './signup-stepper/signup-stepper.component';\n\nconst DEBUG_LOGS = false;\n\n@Component({\n selector: 'app-onboarding-signup',\n templateUrl: './onboarding-signup.component.html',\n styleUrls: ['./onboarding-signup.component.scss'],\n standalone: true,\n imports: [\n IonHeader,\n TopNavbarComponent,\n IonContent,\n NgIf,\n IonButton,\n RouterLink,\n SignupStepperComponent,\n IonAlert,\n ButtonComponent,\n LoginFormComponent,\n AsyncPipe,\n TranslatePipe,\n ],\n})\nexport class OnboardingSignupComponent implements OnInit, OnDestroy {\n // @ViewChild('checkoutButton') checkoutButton: CheckoutButtonComponent;\n // triggerCheckout: Subject<number> = new Subject<number>();\n // iTriggers = 0;\n\n get projectId() {\n return this.selectedProjectId || this.route.snapshot.paramMap.get('projectId');\n }\n\n enableBilling = ENABLE_BILLING;\n translatePath = TRANSLATE_ROOT;\n actionUrl = '/signup';\n returnUrl: string;\n onboardingType: OnboardingTypes;\n // backgroundUrl = DEFAULT_BACKGROUND_URL;\n // backgroundPosition = DEFAULT_BACKGROUND_POSITION;\n isLoggedIn$ = this.userService.isLoggedIn$;\n subscriptionId: string;\n\n planId: ChargebeePlanId;\n isActivePro = false;\n isProPlan = false;\n plan: Plan;\n planPrices: PlanPrice[] = [];\n metaPlanOptions: OnboardingMeta[] = [];\n\n // get + switch based on onboardingType?\n public alertButtonsSignupSuccess = [\n {\n text: 'Skip', // will be translated onInit\n role: 'cancel',\n },\n {\n text: 'OK',\n role: 'confirm',\n },\n ];\n isAlertOpenSignupSuccess = false;\n\n get isWeddingRoute(): boolean {\n return this.onboardingType === OnboardingTypes.Weddings;\n }\n get currentSignupRoute(): string {\n return `/events/${this.isWeddingRoute ? 'weddings/' : ''}signup${this.projectId ? '/' + this.projectId : ''}`;\n }\n get otherEventSignupRoute(): string {\n return `/events/${this.isWeddingRoute ? '' : 'weddings/'}signup${this.projectId ? '/' + this.projectId : ''}`;\n }\n /** handle the project selection from signup-stepper */\n selectedProjectId: string;\n\n get hasTiers(): boolean {\n return this.tiers.length > 0;\n }\n private tiers: PlanPriceTier[] = [];\n private onDestroy$ = new Subject<void>();\n /**\n * OnDestroy is not being called reliably due to route not fully changing (nested) & component being re-used...\n * so we are duplicating onInit without onDestroy - using this to avoid\n */\n private didInit = false;\n\n constructor(\n private store: Store<State>,\n private onboardingService: OnboardingService,\n private userService: UserService,\n private toaster: ToasterService,\n private loadingCtrl: LoadingController,\n private translate: TranslateService,\n private location: Location,\n private route: ActivatedRoute,\n private router: Router\n ) {}\n\n ngOnInit(): void {\n // billingService.loadPlans happens in app.component.initializeApp\n if (this.didInit) {\n return;\n }\n\n this.route.queryParams.pipe(takeUntil(this.onDestroy$)).subscribe((params) => {\n if (params?.returnUrl) {\n this.returnUrl = params.returnUrl;\n } else if (this.router.getCurrentNavigation()?.extras?.state) {\n this.returnUrl = this.router.getCurrentNavigation().extras.state?.returnUrl ?? '';\n }\n });\n this.selectedProjectId = this.route.snapshot.paramMap.get('projectId');\n\n combineLatest([\n this.onboardingService.routeOnboardingMeta$,\n this.store.select(selectPlans),\n this.store.select(getUserSubscriptionState),\n ])\n .pipe(takeUntil(this.onDestroy$))\n .subscribe(\n ([\n /* eslint-disable @typescript-eslint/no-unused-vars */\n { routeId, translatePath = '', actionUrl = '', backgroundUrl = '', backgroundPosition = '' },\n { plans, addons },\n { userId, subscriptionId, subscriptionLevel, subscriptionStatus, subscriptionMinutes },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ]) => {\n if (!routeId) return; // not the current route or metadata not available\n this.onboardingType = routeId;\n this.translatePath = translatePath;\n this.actionUrl = actionUrl + 'signup'; // this component, used in login-form onsuccess\n\n try {\n this.metaPlanOptions = [];\n if (subscriptionStatus === SubscriptionStatus.Active) {\n // we have an active sub - check if it is an upgrade or downgrade\n // console.log('here determine upgrade?', {\n // subscriptionId,\n // subscriptionLevel,\n // subscriptionStatus,\n // routeId: this.routeId\n // });\n this.isActivePro = subscriptionLevel === SubscriptionLevel.Pro;\n this.subscriptionId = subscriptionId;\n // subscriptionLevel !=== getTopSubscriptionInfo()\n\n if (this.isActivePro && this.onboardingType === OnboardingTypes.Pro) {\n this.metaPlanOptions = [\n this.onboardingService.getMetaForRoute(OnboardingTypes.Teams),\n this.onboardingService.getMetaForRoute(OnboardingTypes.Weddings),\n ];\n DEBUG_LOGS && console.log({ action: 'metaPlanOptions', metaPlanOptions: this.metaPlanOptions });\n }\n }\n // plans\n if (plans?.length > 0) {\n const { planId, plan, isProPlan, tiers } = getPlanFromOnboardingType(routeId, plans);\n if (plan && plan.id) {\n this.planId = plan.id;\n this.plan = plan;\n this.tiers = tiers;\n this.planPrices =\n plan.prices?.sort((a, b) => (a && b && a.price && b.price && a.price > b.price ? 1 : -1)) ?? [];\n this.isProPlan = isProPlan;\n DEBUG_LOGS &&\n console.log(`[ONBOARDING.SIGNUP] routeId: '${routeId}'`, {\n isProPlan,\n planId,\n plan,\n translatePath: this.translatePath,\n });\n } else if (routeId !== OnboardingTypes.None) {\n console.warn('no plan?', { routeId, planId, plan, isProPlan, tiers, plans });\n }\n }\n } catch (error) {\n console.warn(error);\n }\n }\n );\n\n this.translate\n .get(['COMMON.SKIP', 'COMMON.OK'])\n .pipe(take(1))\n .subscribe((t) => {\n this.alertButtonsSignupSuccess[0].text = t['COMMON.SKIP'];\n this.alertButtonsSignupSuccess[1].text = t['COMMON.OK'];\n });\n\n this.didInit = true;\n }\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n this.didInit = false; // should already happen, but let'ds make sure ;)\n }\n\n /**\n * sent from form-select-dropdown within signup-stepper\n * update the selected Project and URL to handle reload (but don't actually navigate)\n */\n setDefaultProjectId(projectId) {\n if (projectId && projectId !== this.projectId) {\n DEBUG_LOGS && console.log(`setDefaultProjectId '${projectId}' !== current this.projectId='${this.projectId}'`);\n if (!this.projectId) {\n this.location.replaceState(`${this.currentSignupRoute}/${projectId}`);\n } else {\n this.location.replaceState(`/events/${this.isWeddingRoute ? 'weddings/' : ''}signup/${projectId}`);\n }\n this.selectedProjectId = projectId;\n }\n }\n\n /** navigate if eventType has changed */\n onProjectCreated(project: Partial<Project>) {\n if (\n (project.eventType === ProjectEventType.Weddings && !this.isWeddingRoute) ||\n (project.eventType !== ProjectEventType.Weddings && this.isWeddingRoute)\n ) {\n DEBUG_LOGS &&\n console.log('Routing to other event type..', {\n project: project.eventType,\n onboardingType: this.onboardingType,\n });\n this.router.navigateByUrl(this.otherEventSignupRoute);\n }\n }\n\n signupError(event) {\n console.warn('signupErrored', event);\n this.toaster.present(this.translate.instant('ERRORS.GENERIC_OOPS'));\n }\n\n /**\n * event = {\n * selectedEventDate: \"2023-09-15\",\n * successPageId: \"JfZRUupQKtmkcuJDqcd9QQV6qCyjkZI9b4\",\n * selectedProjectId: \"\",\n * event: {\n * customer: ChargebeeCustomer\n * }\n * }\n */\n signupComplete(event) {\n const {\n selectedProjectId,\n selectedEventDate,\n event: {\n successPageId = 'success-' + new Date().toISOString(),\n // customer\n } = {},\n } = event;\n this.selectedProjectId = selectedProjectId;\n\n if (!this.isProPlan && selectedProjectId) {\n // update the Project to include the eventType we just set\n const payload = {\n id: selectedProjectId,\n eventConfig: {}, // { expiresDate, renewsDate }\n eventDate: selectedEventDate,\n eventIsActive: true,\n eventType: this.onboardingType,\n subscriptionId: 'successPageId=' + successPageId,\n subscriptionLevel:\n this.onboardingType === OnboardingTypes.Weddings ? SubscriptionLevel.Wedding : SubscriptionLevel.Event,\n subscriptionStatus: SubscriptionStatus.Active,\n // subscriptionMinutes\n doDbUpdate: true, // persist this in DB as Effect\n };\n\n console.log(`setProjectSubscriptionEvent:`, { payload, event });\n\n this.store.dispatch(setProjectSubscriptionEvent(payload));\n\n // MVP-1367 if this is a wedding, allow the user the ability to create collab drafts\n if (this.onboardingType === OnboardingTypes.Weddings) {\n this.isAlertOpenSignupSuccess = true;\n } else {\n // not wedding, is event...\n this.toaster.present(this.translate.instant('ONBOARDING.EVENTS.SIGNUP_SUCCESS'));\n this.routeOnSuccess(selectedProjectId);\n }\n } else {\n // this.isProPlan || !selectedProjectId\n this.toaster.present(this.translate.instant('ONBOARDING.SIGNUP_SUCCESS'));\n this.routeOnSuccess(null);\n }\n }\n\n routeOnSuccess(projectId: string) {\n if (projectId) {\n this.router.navigateByUrl(`/${PROJECT_DETAIL_ROUTE}/${projectId}`, { state: { tutorial: 'SIGNUP_SUCCESS' } });\n } else {\n this.router.navigateByUrl(`/${STUDIO_SETTINGS_ROUTE}`, { state: { tutorial: 'SIGNUP_SUCCESS' } });\n }\n }\n\n routeToSignup() {\n this.router.navigate(['/signup'], { queryParams: { returnUrl: this.actionUrl } });\n }\n\n async handleSuccessAlert(event) {\n this.isAlertOpenSignupSuccess = false;\n if (event?.detail?.role === 'confirm') {\n const loading = await this.loadingCtrl.create({\n message: this.translate.instant('ONBOARDING.COMMON.CREATING_WEDDING_STACKS'),\n });\n try {\n combineLatest([this.userService.userId$, this.userService.username$])\n .pipe(take(1))\n .subscribe(([userId, username]) => {\n this.onboardingService\n .createCollabStacksForWedding({ userId, username, projectId: this.selectedProjectId })\n .then((newStacks) => {\n DEBUG_LOGS && console.log('Created Stacks:', newStacks);\n loading.dismiss();\n this.routeOnSuccess(this.selectedProjectId);\n });\n });\n } catch (error) {\n console.error(error);\n loading.dismiss();\n this.routeOnSuccess(this.selectedProjectId);\n this.toaster.present(this.translate.instant('ERRORS.STACK_CREATE'));\n }\n } else {\n this.routeOnSuccess(this.selectedProjectId);\n }\n }\n}\n","/** @format */\n\nimport { Injectable } from '@angular/core';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { filter, map, mergeMap, shareReplay } from 'rxjs/operators';\nimport { TranslateService } from '@ngx-translate/core';\nimport { OnboardingTypes, OnboardingMeta, getTranslatePath, ROUTE_DATA_PROP } from '../onboarding.model';\nimport { STACK_PRIVACY, Stack, StackDraftPublishInput } from '@app/shared/models/stack.model';\nimport { PublishStackService } from '@app/core/services/publish-stack.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OnboardingService {\n /**\n * use with takeUntil(this.onDestroy$),\n * @todo consider where this should live\n */\n routeOnboardingType$: Observable<OnboardingTypes> = this.router.events.pipe(\n filter((event) => event instanceof NavigationEnd),\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n map((_) => this.route),\n map((route) => {\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n }),\n mergeMap((route) => route.data),\n map((data) => data[ROUTE_DATA_PROP]),\n shareReplay(1)\n );\n\n /**\n * use with takeUntil(this.onDestroy$),\n */\n routeOnboardingMeta$: Observable<OnboardingMeta> = this.routeOnboardingType$.pipe(\n map((routeId: OnboardingTypes) => this.getMetaForRoute(routeId)),\n shareReplay(1)\n );\n\n constructor(\n private publishService: PublishStackService,\n private translate: TranslateService,\n private router: Router,\n private route: ActivatedRoute\n ) {}\n\n getMetaForRoute(routeId: string): OnboardingMeta {\n const translatePath = getTranslatePath(routeId);\n switch (routeId) {\n case OnboardingTypes.Weddings:\n return {\n routeId,\n translatePath,\n actionUrl: `/events/weddings/`,\n backgroundUrl: '/assets/images/events/weddings-bride@2.jpg',\n backgroundPosition: 'bottom right',\n };\n case OnboardingTypes.Teams:\n return {\n routeId,\n translatePath,\n actionUrl: `/events/`,\n backgroundUrl: '/assets/images/events/crowd-filming@2.jpg',\n backgroundPosition: 'center',\n };\n case OnboardingTypes.Pro:\n case OnboardingTypes.Projects:\n case OnboardingTypes.None:\n default:\n return {\n routeId: (routeId as OnboardingTypes) || OnboardingTypes.None,\n translatePath,\n actionUrl: `/pro/`,\n backgroundUrl: '/assets/images/events/crowd-filming@2.jpg',\n backgroundPosition: 'center',\n // this.sideBlocks = this.buildSideBlocks('');\n };\n }\n }\n\n /**\n * On successful signup, create 2 collab drafts for Guests [MVP-1367]\n * The owner should be the person who just signed up\n * 1: Reception\n * poster: https://app.filmstacker.com/assets/images/events/weddings-jump@1.jpg\n * 2: Ceremony (created second so it shows up first?)\n * poster: https://app.filmstacker.com/assets/images/events/weddings-hands@1.jpg\n */\n async createCollabStacksForWedding({ userId, username, projectId }): Promise<Array<Stack>> {\n console.warn('create the collab stacks!', { userId, username, projectId });\n try {\n const input: StackDraftPublishInput = {\n userId,\n credits: username,\n projectId,\n privacy: STACK_PRIVACY.PUBLIC,\n playlist: [],\n isCollaborative: 1,\n title: this.translate.instant('ONBOARDING.COMMON.STACK_TITLE_RECEPTION'),\n poster: 'https://app.filmstacker.com/assets/images/events/weddings-jump@1.jpg',\n };\n const receptionStack = await this.publishService.createStackDraft(input);\n // ok, now the Ceremony\n input.title = this.translate.instant('ONBOARDING.COMMON.STACK_TITLE_CEREMONY');\n input.poster = 'https://app.filmstacker.com/assets/images/events/weddings-hands@1.jpg';\n const ceremonyStack = await this.publishService.createStackDraft(input);\n return [receptionStack, ceremonyStack];\n } catch (error) {\n console.error(error);\n throw error;\n }\n }\n}\n"],"x_google_ignoreList":[]}