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