{"version":3,"file":"common.df455e68f4c17ee9.js","mappings":"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","names":["i0","ctx_r0","eventTitleTranslationPath","subscriptionBy","_r2","editSubscription","subscriptionIsMine","_r3","EventDetailComponent","_EventDetailComponent","this","currentUserId","subscriptionLevel","SubscriptionLevel","Wedding","constructor","billingService","subscriptionisActive","canEdit","isPopover","subscriptionId","openEditSubscription","i1","selectors","inputs","eventDate","standalone","features","decls","vars","consts","template","rf","ctx","EventDetailComponent_div_1_Template","EventDetailComponent_span_10_Template","EventDetailComponent_dt_13_Template","EventDetailComponent_dd_14_Template","EventDetailComponent_ion_col_26_Template","EventDetailComponent_ion_row_27_Template","NgIf","TranslatePipe","IonButton","IonIcon","IonGrid","IonRow","IonCol","styles","PosterUploadDirective","_PosterUploadDirective","BaseFileUpload","filestackService","translate","platform","sentryService","super","projectId","customPickerOptions","maxSize","MAX_IMG_UPLOAD_SIZE_MB","accept","storeTo","path","filestackConfig","poster","container","region","imageDim","transformations","crop","force","aspectRatio","rotate","onClick","event","openFilePicker","i2","i3","i4","hostBindings","$event","HOME_TAGS","ALL_TAGS","item_r1","title","subtitle","description","SplitLayoutComponent_div_7_h1_1_Template","SplitLayoutComponent_div_7_h2_2_Template","SplitLayoutComponent_div_7_p_3_Template","SplitLayoutComponent","_SplitLayoutComponent","background","backgroundUrl","backgroundPosition","sideBlocks","showSignupBtn","ENABLE_SIGNUP","showLoginBtn","returnUrl","ngContentSelectors","_c0","SplitLayoutComponent_div_7_Template","TopNavbarComponent","NgFor","AvatarUploadDirective","_AvatarUploadDirective","userId","avatar","fromSources","makeFileUploadName","file","apiTriggerSuffix","Utils","mimeToExtension","mimetype","avatarUrlStyle","onFileUploadFinished","onFileUploadFailed","EditableAvatarComponent","_EditableAvatarComponent","avatarUrl","store","DEFAULT_USER_AVATAR","canEditAvatar","isLoading","res","USER_AVATAR_UPLOAD_CDN","USER_AVATAR_UPLOAD_PATH","USER_AVATAR_UPLOAD_CDN_FILETYPE","tempAvatar","Date","now","clearTimeout","_timeout","setTimeout","dispatch","userActions","console","log","captureError","error","EditableAvatarComponent_div_0_Template","EditableAvatarComponent_div_1_Template","EditableAvatarComponent_ion_button_2_Template","IonSpinner"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/billing/shared/components/event-detail/event-detail.component.html","./src/app/billing/shared/components/event-detail/event-detail.component.ts","./src/app/core/filestack/directives/poster-upload.directive.ts","./src/app/modules/tagger-input/tags.ts","./src/app/shared/components/layouts/split-layout/split-layout.component.html","./src/app/shared/components/layouts/split-layout/split-layout.component.ts","./src/app/core/filestack/directives/avatar-upload.directive.ts","./src/app/studio/shared/components/editable-avatar/editable-avatar.component.html","./src/app/studio/shared/components/editable-avatar/editable-avatar.component.ts"],"sourcesContent":["<div class=\"event-detail ion-text-capitalize\">\n <div *ngIf=\"isPopover\" class=\"popover-close\">\n <ion-button size=\"small\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n </ion-button>\n </div>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"10\">\n <ion-grid>\n <ion-row>\n <ion-col size=\"12\" [attr.size-md]=\"isPopover ? 12 : 4\">\n <h3>\n {{ subscriptionLevel }} <span *ngIf=\"eventTitleTranslationPath\">{{ eventTitleTranslationPath | translate }}</span>\n <!-- {{ 'AUTH.PLANS.SUBSCRIPTION_LEVEL' | translate }} -->\n </h3>\n </ion-col>\n <ion-col size=\"12\" [attr.size-md]=\"isPopover ? 12 : 8\">\n <dl>\n <dt *ngIf=\"subscriptionBy\">{{ 'COMMON.OWNER' | translate }}:</dt>\n <dd *ngIf=\"subscriptionBy\">{{ subscriptionBy }}</dd>\n <dt>{{ 'AUTH.STATUS' | translate }}:</dt>\n <dd>{{ (subscriptionisActive ? 'COMMON.ACTIVE' : 'COMMON.INACTIVE') | translate }}</dd>\n <!-- TODO:\n COMMON.EXPIRES \n COMMON.RENEWS -->\n <!-- <div *ngIf=\"project?.expires\">\n {{ 'COMMON.EXPIRES_OR_RENEWS' | translate }}: \n {{ 'GET DATE' }}\n </div> -->\n <dt>{{ 'COMMON.EVENT_DATE' | translate }}:</dt>\n <dd>{{ eventDate }}</dd>\n </dl>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-col>\n <ion-col *ngIf=\"!isPopover\" size=\"2\" class=\"col-right\"> \n <ion-button \n [disabled]=\"!subscriptionIsMine\"\n fill=\"outline\"\n (click)=\"editSubscription()\">\n {{ 'COMMON.EDIT' | translate }}\n <ion-icon slot=\"end\" name=\"create-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"isPopover\" class=\"popover-actions\">\n <ion-col>\n <ion-button \n [disabled]=\"!subscriptionIsMine\"\n fill=\"outline\"\n (click)=\"editSubscription()\">\n {{ 'COMMON.EDIT' | translate }}\n <ion-icon slot=\"end\" name=\"create-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n</div>","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonButton, IonIcon, IonGrid, IonRow, IonCol } from '@ionic/angular/standalone';\nimport { SubscriptionLevel } from '@app/billing/shared/billing.model';\nimport { BillingService } from '@app/billing/shared/services/billing.service';\n\n@Component({\n selector: 'fs-event-detail',\n templateUrl: './event-detail.component.html',\n styleUrls: ['./event-detail.component.scss'],\n standalone: true,\n imports: [NgIf, TranslatePipe, IonButton, IonIcon, IonGrid, IonRow, IonCol],\n})\nexport class EventDetailComponent {\n @Input() currentUserId: string;\n @Input() subscriptionId;\n @Input() subscriptionLevel;\n @Input() subscriptionBy;\n @Input() subscriptionisActive = false;\n @Input() eventDate;\n @Input() canEdit = false;\n @Input() isPopover = false;\n\n get subscriptionIsMine() {\n return this.subscriptionBy && this.currentUserId === this.subscriptionBy;\n }\n\n get eventTitleTranslationPath() {\n return this.subscriptionLevel === SubscriptionLevel.Wedding ? 'PROJECT.EVENT' : '';\n }\n\n constructor(\n // private translate: TranslateService,\n // private store: Store<State>,\n private billingService: BillingService\n ) {}\n\n /**\n * Do the check and call service\n */\n editSubscription() {\n // this.isLoadingEvents = true;\n if (this.canEdit && this.subscriptionId) {\n this.billingService.openEditSubscription(this.subscriptionId);\n }\n }\n}\n","/** @format */\n\nimport { Directive, HostListener, Input } from '@angular/core';\nimport { Platform } from '@ionic/angular/standalone';\nimport { TranslateService } from '@ngx-translate/core';\nimport { filestackConfig } from 'src/environments/environment';\nimport { MAX_IMG_UPLOAD_SIZE_MB } from '@app/app.config';\nimport { SentryService } from '@app/core/services/sentry.service';\nimport { FilestackService } from '@app/core/filestack/filestack.service';\nimport { BaseFileUpload } from './base-file-upload';\n\n@Directive({\n selector: '[posterUpload]',\n standalone: true,\n})\nexport class PosterUploadDirective extends BaseFileUpload {\n @Input() projectId: string = '';\n @Input() userId: string;\n\n protected customPickerOptions = {\n maxSize: MAX_IMG_UPLOAD_SIZE_MB * 1024 * 1024,\n accept: 'image/*',\n storeTo: {\n path: filestackConfig.storeTo.poster.path, // + this.projectId + '/', // note that projectId is not ready yet\n container: filestackConfig.storeTo.poster.container,\n region: filestackConfig.storeTo.poster.region,\n },\n /**\n * Only for JPEG, PNG, and BMP files. Local and cropped images will be resized (upscaled or downscaled)\n * to the specified dimensions before uploading. The original height to width ratio is maintained.\n * To resize all images based on the width, set [width, null],\n * https://filestack.github.io/filestack-js/interfaces/pickeroptions.html#imagedim\n */\n imageDim: [1200, null],\n transformations: {\n crop: {\n force: true,\n aspectRatio: 1.78,\n },\n force: true,\n rotate: true,\n },\n };\n\n constructor(\n filestackService: FilestackService, \n translate: TranslateService, \n platform: Platform, \n sentryService: SentryService\n ) {\n super(filestackService, translate, platform, sentryService);\n }\n\n @HostListener('click', ['$event'])\n onClick(event: Event) {\n // we need to get the projectId Input which is not available at construct...\n if (this.projectId) {\n const path = this.customPickerOptions.storeTo.path;\n this.customPickerOptions.storeTo.path = path + this.projectId + '/';\n }\n this.openFilePicker(event);\n }\n}\n","/** Tags for Home Page Filters */\nexport const HOME_TAGS: string[] = [\n 'arts',\n 'conservation',\n 'cooking',\n 'education',\n 'filmmaking',\n 'fire',\n 'oceans',\n 'sailing',\n 'science',\n 'technology',\n 'travel',\n 'water',\n 'weddings',\n 'wildlife',\n];\n\n/** Tags for autocomplete inputs */\nexport const ALL_TAGS: string[] = [\n ...HOME_TAGS,\n // common\n 'accessibility',\n 'adventure',\n 'amazing',\n 'astronomy',\n 'beach',\n 'challenge',\n 'civilization',\n 'decisions',\n 'ecosystems',\n 'environment',\n 'equality',\n 'evolution',\n 'explanation',\n 'fun',\n 'future',\n 'internet',\n 'kids',\n 'learning',\n 'life',\n 'macro',\n 'micro',\n 'media',\n 'meditation',\n 'memories',\n 'mindfulness',\n 'pets',\n 'programming',\n 'revolution',\n 'society',\n 'solutions',\n 'space',\n 'yoga',\n // make people better\n 'genetics',\n 'CRISPR',\n 'Samira Kiani',\n 'George Church',\n 'Antonio Regalado',\n 'biosecurity',\n 'lab'\n];\n","<div class=\"split-layout\">\n <div class=\"navbar\">\n <app-top-navbar \n class=\"light\"\n theme=\"light\"\n [backButtonReturnUrl]=\"returnUrl\"\n [showSignupBtn]=\"showSignupBtn\"\n [showLoginBtn]=\"showLoginBtn\"\n [showSearch]=\"false\"></app-top-navbar>\n </div>\n\n <div class=\"row\">\n <div\n class=\"col-md-6 d-none d-md-block screen-item left\"\n [style.background-image]=\"background\"\n [style.background-position]=\"backgroundPosition\"\n >\n <div class=\"left__overlay\"></div>\n <div class=\"left__content\">\n <div *ngFor=\"let item of sideBlocks\" class=\"col-md-9 col-lg-6 blocks\">\n <h1 *ngIf=\"item.title\">{{ item.title }}</h1>\n <h2 *ngIf=\"item.subtitle\">{{ item.subtitle }}</h2>\n <p *ngIf=\"item.description\">{{ item.description }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-md-6 screen-item right light\">\n <div class=\"right__content row\">\n <div class=\"col-sm-9 col-md-12 col-lg-9 col-xl-8\" style=\"flex-basis: auto\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</div>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgFor, NgIf } from '@angular/common';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ENABLE_SIGNUP } from '@app/app.config';\nimport { TopNavbarComponent } from '@app/shared/components/top-navbar/top-navbar.component';\n/*\nTODO: implement service that gives us a stackID(s) and render as <featured-block>\nSideBlock[] = [{\n title: 'Saving Turtles in our Seas',\n description: 'The award-winning true story of a fisherman who breaks with tradition by going vegan and transitioning to plant-based diet.',\n route: '/stack/watch/stackId',\n}];\n*/\n\nexport interface SideBlock {\n title: string;\n subtitle?: string;\n description: string;\n}\n\n@Component({\n selector: 'app-split-layout',\n templateUrl: './split-layout.component.html',\n styleUrls: ['./split-layout.component.scss'],\n standalone: true,\n imports: [TopNavbarComponent, NgFor, NgIf],\n})\nexport class SplitLayoutComponent {\n @Input() backgroundUrl = 'https://projects.filmstacker.com/rhumbline-media/sea-turtle-900px.jpg';\n @Input() backgroundPosition = 'center';\n @Input() sideBlocks: SideBlock[] = [];\n @Input() showSignupBtn = ENABLE_SIGNUP;\n @Input() showLoginBtn = true;\n @Input() returnUrl = '';\n\n get background() {\n return `url(${this.backgroundUrl})`;\n }\n\n constructor(private translate: TranslateService) {}\n\n // /** @todo this is currently in SignupPage, move here?\n\n // * take the translateDepth and add if they exist\n // * @param root root prop(s)\n // * @param path inner path (free, pro, event...\n // * @param max the most you want, if they exist\n // * @returns SideBlock[]\n // *\n // *\n // */\n // buildSideBlocks(root = 'AUTH', path = 'SIGNUP', max = 3): SideBlock[] {\n // const rootPath = `${root}${ path ? '.' + path : '' }`;\n // const ret: SideBlock[] = [];\n\n // for (let index = 0; index < max; index++) {\n // // root index items do not have _#\n // const level = (index > 0) ? `_${ index +1}` : ``;\n // // path = free, pro, event\n // const title = this.translate.instant(`${rootPath}.SIDE_TITLE${level}`),\n // subtitle = this.translate.instant(`${rootPath}.SIDE_SUBTITLE${level}`),\n // description = this.translate.instant(`${rootPath}.SIDE_DESCRIPTION${level}`);\n // const block = {\n // ...(title && { title }),\n // ...(subtitle && { subtitle }),\n // ...(description && { description })\n // }\n // console.log(`buildSideBlocks:`, block)\n\n // if (block) {\n // ret.push(block)\n // }\n // }\n // return ret;\n // }\n}\n","/** @format */\n\nimport { Directive, HostListener, Input } from '@angular/core';\nimport { Platform } from '@ionic/angular/standalone';\nimport { TranslateService } from '@ngx-translate/core';\nimport { filestackConfig } from 'src/environments/environment';\nimport { MAX_IMG_UPLOAD_SIZE_MB } from '@app/app.config';\nimport { SentryService } from '@app/core/services/sentry.service';\nimport { Utils } from '@app/shared/utils';\nimport { FilestackService, PickerFileMetadata } from '@app/core/filestack/filestack.service';\nimport { BaseFileUpload } from './base-file-upload';\n\n@Directive({\n selector: '[avatarUpload]',\n standalone: true,\n})\nexport class AvatarUploadDirective extends BaseFileUpload {\n @Input() userId: string = 'anon';\n\n protected customPickerOptions = {\n maxSize: MAX_IMG_UPLOAD_SIZE_MB * 1024 * 1024,\n accept: 'image/*',\n storeTo: {\n path: filestackConfig.storeTo.avatar.path,\n container: filestackConfig.storeTo.avatar.container,\n region: filestackConfig.storeTo.avatar.region,\n // workflow appears to work, except that you have to rename the file to store it, but no dynamic options?\n // workflows: ['b6a16479-80b9-4de1-94d7-5c9408adb7a5']\n },\n transformations: {\n crop: {\n force: true,\n aspectRatio: 1,\n },\n force: true,\n rotate: true,\n },\n fromSources: ['webcam', 'local_file_system', 'googledrive', 'onedrive', 'facebook', 'box', 'url'],\n };\n\n constructor(\n filestackService: FilestackService,\n translate: TranslateService,\n platform: Platform,\n sentryService: SentryService\n ) {\n super(filestackService, translate, platform, sentryService);\n }\n\n @HostListener('click', ['$event'])\n onClick(event: Event) {\n this.openFilePicker(event);\n }\n\n makeFileUploadName(file: PickerFileMetadata, userId = this.userId) {\n // the apiTriggerSuffix is the key that the backend will use to trigger resize\n return `${userId}${filestackConfig.storeTo.avatar.apiTriggerSuffix}.${Utils.mimeToExtension(file.mimetype)}`;\n }\n}\n","<div *ngIf=\"isLoading\" class=\"avatar-loading\">\n <ion-spinner color=\"secondary\"></ion-spinner>\n</div>\n<div *ngIf=\"avatarUrl\" class=\"avatar\" [style.background-image]=\"avatarUrlStyle\"></div>\n\n<ion-button avatarUpload *ngIf=\"canEditAvatar\" fill=\"solid\" color=\"primary\" class=\"profile-avatar__upload round\"\n [userId]=\"userId\"\n (fileUploadFinished)=\"onFileUploadFinished($event)\"\n (fileUploadFailed)=\"onFileUploadFailed($event)\"\n>\n <ion-icon slot=\"icon-only\" name=\"images-outline\"></ion-icon>\n</ion-button>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { IonSpinner, IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport * as userActions from '@store/actions/user.actions';\nimport { SentryService } from '@app/core/services/sentry.service';\nimport { PickerFileError, PickerFileMetadata } from '@app/core/filestack/filestack.service';\nimport { AvatarUploadDirective } from '@app/core/filestack/directives/avatar-upload.directive';\nimport {\n DEFAULT_USER_AVATAR,\n USER_AVATAR_UPLOAD_CDN,\n USER_AVATAR_UPLOAD_CDN_FILETYPE,\n USER_AVATAR_UPLOAD_PATH,\n} from '@app/shared/models/user.model';\n\n/** How long does it take to upload, resize and clear CDN cache? */\nconst AVATAR_TIMEOUT = 3600;\n\n@Component({\n selector: 'app-editable-avatar',\n templateUrl: './editable-avatar.component.html',\n styleUrls: ['./editable-avatar.component.scss'],\n standalone: true,\n imports: [NgIf, IonSpinner, IonButton, AvatarUploadDirective, IonIcon],\n})\nexport class EditableAvatarComponent {\n @Input() userId: string;\n @Input() avatarUrl = DEFAULT_USER_AVATAR;\n @Input() canEditAvatar: boolean = false;\n\n get avatarUrlStyle() {\n return `url('${this.avatarUrl}')`;\n }\n\n isLoading = false;\n private _timeout;\n\n constructor(private store: Store<State>, private sentryService: SentryService) {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onFileUploadFinished(res: PickerFileMetadata) {\n /**\n * @note res.url = filestack cdn link, but we really don't want that..\n * rather, we know it'll be in our CDN, but we should wait a moment to request again\n */\n const avatar = `${USER_AVATAR_UPLOAD_CDN}${USER_AVATAR_UPLOAD_PATH}${this.userId}.${USER_AVATAR_UPLOAD_CDN_FILETYPE}`;\n // we need the UI to change while the backend processes & invalidates cache (api will use the avatar, we will temp use this)\n const tempAvatar = `${avatar}?v=${Date.now()}`;\n\n this.isLoading = true;\n clearTimeout(this._timeout);\n this._timeout = setTimeout(() => {\n this.store.dispatch(\n userActions.setAvatar({\n avatar,\n tempAvatar,\n // avatar: res.url\n })\n );\n this.isLoading = false;\n }, AVATAR_TIMEOUT);\n }\n\n onFileUploadFailed(res: PickerFileError) {\n console.log('### fileUploadFailed', res);\n this.sentryService.captureError(res.error);\n }\n}\n"],"x_google_ignoreList":[]}