{"version":3,"file":"6154.2c89d232b6ecd832.js","mappings":"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","names":["ProjectMemberModalComponent","_ProjectMemberModalComponent","constructor","modalController","this","viewOnly","isStudio","showRecentStacks","dismiss","dismissed","i0","i1","selectors","inputs","userId","projects","standalone","features","decls","vars","consts","template","rf","ctx","BaseModalComponent","ProjectMemberComponent","IonButton","TranslatePipe","projectFormGroup_r4","controls","currentUserMemberRole","value","project","privacy","$event","_r6","i_r7","index","ctx_r1","onActiveChanged","defaultRoleFormValue","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_div_16_ion_select_1_Template","_r5","onRoleChanged","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_div_16_ion_select_option_3_Template","addMember","isActive","role","_r3","$implicit","preventDefault","navProject","id","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_span_13_Template","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_span_14_Template","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_span_15_Template","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_div_16_Template","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_div_17_Template","hero","projectPosterFallback","title","members","length","isPendingUser","canEditProjectMembers","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_Template","_r1","saveChanges","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_Template","projectsForm","projectsControls","ProjectMemberProjectsComponent_ng_template_1_div_1_Template","ProjectMemberProjectsComponent_ng_template_1_ng_template_2_Template","doneLoading","noResults_r8","PAGE","ProjectMemberProjectsComponent","_ProjectMemberProjectsComponent","member","_member$","next","member$","asObservable","formBuilder","navCtrl","userService","projectService","toaster","projectMemberService","showMyRole","closeModal","EventEmitter","roleChanged","isSaving","memberProjects","DEFAULT_PROJECT_POSTER","BehaviorSubject","onDestroy$","Subject","ngOnInit","myProjects$","getMyProjects","watchMemberUpdates","userId$","pipe","filter","Boolean","take","delay","subscribe","currentUserId","sort","sortProjectTitleAlpha","buildForm","ngOnDestroy","complete","m","loaded","Array","isArray","map","_uniqBy","memberProjectIds","p","projectId","tap","pending","studioProjects$","iif","condition","trueResult","falseResult","defer","of","aFoundProjects","combineLatest","takeUntil","myProjects","switchMap","getProjectsFromStoreByIds","foundProjects","timeout","first","distinctUntilChanged","curr","prev","catchError","err","TimeoutError","console","warn","EMPTY","isViewableByUserId","projectMemberForms","UntypedFormArray","getUserMemberRole","projMembers","userMember","find","item","canEditMembers","isProjectAdmin","projectFormGroup","group","disabled","push","emit","crewMember","username","PROJECT_MEMBER_ROLE","CREW","OWNER","_get","event","prop","detail","val","proj","projectMember","updateProjectMember","presentSavedToast","log","error","present","message","_this","_asyncToGenerator","invalid","pristine","_each","_this2","navigateForward","PROJECT_DETAIL_ROUTE","i2","i3","i4","i5","i6","outputs","ProjectMemberProjectsComponent_ng_container_0_Template","ProjectMemberProjectsComponent_ng_template_1_Template","loadingProjects_r9","NgIf","FormsModule","ReactiveFormsModule","IonList","NgFor","IonItem","IonThumbnail","ImageFallbackDirective","IonLabel","IonIcon","IonSelect","IonSelectOption","IonText","IonSpinner","styles","_r2","ctx_r2","showingBio","user_r4","bio","location","joined","ProjectMemberComponent_div_4_div_1_ion_button_4_Template","ProjectMemberComponent_div_4_div_1_div_5_Template","ProjectMemberComponent_div_4_div_1_div_23_Template","ProjectMemberComponent_div_4_div_1_div_24_Template","avatarUrl","avatarFallback","name","tmp_12_0","recentStacks","items$","stacks","numClipsWatched","list_r6","ngIf","loadMoreStacks","_c2","layoutType","Carousel","_c1","stackList_r7","nextToken","loading","ProjectMemberComponent_div_4_div_2_div_8_app_stack_list_1_Template","list$","ProjectMemberComponent_div_4_div_2_div_8_Template","_c0","ProjectMemberComponent_div_4_div_1_Template","ProjectMemberComponent_div_4_div_2_Template","noUserTpl_r8","tmp_6_0","_ProjectMemberComponent","_userId","selectUserId","listIdMemberStacks","store","translate","enableMessaging","ENABLE_FEATURE_USER_MESSAGING","enableFollow","ENABLE_FEATURE_USER_FOLLOW","selectedUser$","selected$","DEFAULT_USER_AVATAR_TERTIARY","LAYOUT_TYPE","label","_ref","user","createdAt","updatedAt","get","res","Utils","daysAgo","Date","getUserAvatarUrl","select","selectList","selectStackListItems","dispatch","loadFilteredStacks","listId","filters","type","FilterEntityTypes","Recent","_x","apply","arguments","list","loadMoreFilteredStacks","followCrewMember","messageCrewMember","_this3","saveProjectChanges","viewQuery","ProjectMemberComponent_ng_template_0_Template","ProjectMemberComponent_ng_template_2_Template","ProjectMemberComponent_div_4_Template","loadingTpl_r9","ListTitleComponent","StackListComponent","AsyncPipe","module","exports","arrayEach","array","iteratee","identity","require","castFunction","baseEach","forEach","collection","baseIteratee","baseUniq","uniqBy"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/project-members/project-member-modal/project-member-modal.component.ts","./src/app/project-members/project-member-modal/project-member-modal.component.html","./src/app/project-members/project-member-projects/project-member-projects.component.html","./src/app/project-members/project-member-projects/project-member-projects.component.ts","./node_modules/rxjs/dist/esm/internal/observable/iif.js","./src/app/project-members/project-member/project-member.component.html","./src/app/project-members/project-member/project-member.component.ts","./node_modules/lodash/_arrayEach.js","./node_modules/lodash/_castFunction.js","./node_modules/lodash/each.js","./node_modules/lodash/forEach.js","./node_modules/lodash/uniqBy.js"],"sourcesContent":["/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { ModalController, IonButton } from '@ionic/angular/standalone';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { BaseModalComponent } from '@app/shared/components/ui/modal/base-modal.component';\nimport { Project } from '@app/projects/shared/project.model';\nimport { ProjectMemberComponent } from '../project-member/project-member.component';\n\n@Component({\n  selector: 'fs-project-member-modal',\n  templateUrl: './project-member-modal.component.html',\n  styleUrls: ['./project-member-modal.component.scss'],\n  standalone: true,\n  imports: [BaseModalComponent, ProjectMemberComponent, IonButton, TranslatePipe],\n})\nexport class ProjectMemberModalComponent {\n  @Input() userId: string;\n  @Input() projects: Project[];\n  @Input() viewOnly = true;\n  @Input() isStudio = false;\n  @Input() showRecentStacks = true;\n\n  constructor(private modalController: ModalController) {}\n\n  dismiss() {\n    this.modalController.dismiss({\n      dismissed: true,\n    });\n  }\n}\n","<fs-base-modal mode=\"light\">\n  <div class=\"col\">\n    <fs-project-member\n      [userId]=\"userId\"\n      [projects]=\"projects\"\n      [viewOnly]=\"viewOnly\"\n      [isStudio]=\"isStudio\"\n      [showRecentStacks]=\"showRecentStacks\"\n      (dismiss)=\"dismiss()\"\n    ></fs-project-member>\n\n    <div class=\"col ion-text-center ion-padding ion-margin-top\">\n      <ion-button color=\"primary\" fill=\"clear\" size=\"medium\" (click)=\"dismiss()\">\n        {{ 'COMMON.DONE' | translate }}\n      </ion-button>\n    </div>\n  </div>\n\n</fs-base-modal>\n","<ng-container\n  *ngIf=\"(addMember || memberProjects?.length > 0) && projectsForm; else loadingProjects\"\n>\n  <form [formGroup]=\"projectsForm\" (ngSubmit)=\"saveChanges()\">\n    <ion-list class=\"list\" lines=\"none\">\n      <ng-container\n        *ngFor=\"let projectFormGroup of projectsControls; let i = index\"\n      >\n        <ng-container [formGroup]=\"projectFormGroup\">\n          <ion-item\n            *ngIf=\"\n              projectFormGroup.value.canEditProjectMembers ||\n              projectFormGroup.controls.isActive.value\n            \"\n          >\n            <ion-thumbnail slot=\"start\">\n              <img src=\"{{ projectFormGroup.value.project.hero }}\" [fallback]=\"projectPosterFallback\" />\n            </ion-thumbnail>\n\n            <div class=\"list__content\">\n              <ion-label>\n                <div style=\"display: flex\">\n                  <a href=\"\" (click)=\"$event.preventDefault(); navProject(projectFormGroup.value.project.id)\" title=\"View Project\">{{\n                    projectFormGroup.value.project.title\n                  }}</a>\n                </div>\n                <div>\n                  <small>\n                    <span class=\"margin-right\">\n                      <ion-icon name=\"person\"></ion-icon>\n                      {{ projectFormGroup.value.project.members?.length }}\n                    </span>\n                    <span\n                      *ngIf=\"projectFormGroup.controls.currentUserMemberRole.value\"\n                      class=\"margin-right\"\n                    >\n                      {{ 'COMMON.ME' | translate }}: {{ projectFormGroup.controls.currentUserMemberRole.value }}\n                    </span>\n                    <span *ngIf=\"projectFormGroup.value.project.privacy !== 'PUBLIC'\" class=\"margin-right\">\n                      {{ projectFormGroup.value.project.privacy }}\n                    </span>\n                    <span *ngIf=\"isPendingUser\">\n                      [ {{ 'COMMON.PENDING_USER' | translate }} ]\n                    </span>\n                  </small>\n                </div>\n              </ion-label>\n\n              <div\n                class=\"list__content__actions\"\n                *ngIf=\"projectFormGroup.value.canEditProjectMembers\"\n              >\n                <ion-select *ngIf=\"!addMember && (projectFormGroup.value.isActive || projectFormGroup.value.role !== defaultRoleFormValue)\" \n                  name=\"isActive\"\n                  formControlName=\"isActive\"\n                  interface=\"popover\"\n                  aria-label=\"Is Active?\"\n                  (ionChange)=\"onActiveChanged($event, i)\"\n                >\n                  <ion-select-option [value]=\"true\">{{ 'COMMON.ACTIVE' | translate }}</ion-select-option>\n                  <ion-select-option [value]=\"false\"\n                    >{{ 'COMMON.INACTIVE' | translate }}</ion-select-option\n                  >\n                </ion-select>\n\n                <ion-select\n                  name=\"role\"\n                  formControlName=\"role\"\n                  interface=\"popover\"\n                  aria-label=\"Role\"\n                  (ionChange)=\"onRoleChanged($event, i)\"\n                >\n                  <!-- error in ion-select type? aria-label=\"{{ 'COMMON.ROLE' | translate }}\" -->\n                  <ion-select-option \n                    *ngIf=\"defaultRoleFormValue !== 'PRODUCER' && defaultRoleFormValue !== 'CREW'\" \n                    [value]=\"defaultRoleFormValue\">{{ defaultRoleFormValue }}...</ion-select-option>\n                  <ion-select-option value=\"PRODUCER\">{{ 'COMMON.PRODUCER' | translate }}</ion-select-option>\n                  <ion-select-option value=\"CREW\">{{ 'COMMON.CREW' | translate }}</ion-select-option>\n                </ion-select>\n              </div>\n              <div\n                class=\"list__content__actions\"\n                style=\"flex-basis: 0\"\n                *ngIf=\"!projectFormGroup.value.canEditProjectMembers\"\n              >\n                <ion-text slot=\"end\" class=\"\">\n                  {{ projectFormGroup.controls.role.value }}\n                </ion-text>\n              </div>\n            </div>\n          </ion-item>\n        </ng-container>\n      </ng-container>\n    </ion-list>\n  </form>\n</ng-container>\n\n<ng-template #loadingProjects>\n  <div class=\"ion-padding ion-text-center ion-margin\">\n    <div *ngIf=\"!doneLoading; else noResults\" class=\"loading\">\n      <ion-spinner name=\"crescent\"></ion-spinner>\n    </div>\n    <ng-template #noResults>\n      <div>{{ 'COMMON.NO_PROJECTS' | translate }}</div>\n    </ng-template>\n  </div>\n</ng-template>\n","/** @format */\n\nimport _get from 'lodash/get';\nimport _each from 'lodash/each';\nimport _uniqBy from 'lodash/uniqBy';\nimport { Component, OnInit, Input, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport {\n  UntypedFormArray,\n  UntypedFormBuilder,\n  UntypedFormGroup,\n  FormsModule,\n  ReactiveFormsModule,\n} from '@angular/forms';\nimport { NgIf, NgFor } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport {\n  NavController,\n  IonList,\n  IonItem,\n  IonThumbnail,\n  IonLabel,\n  IonIcon,\n  IonSelect,\n  IonSelectOption,\n  IonText,\n  IonSpinner,\n} from '@ionic/angular/standalone';\nimport { BehaviorSubject, combineLatest, EMPTY, iif, Observable, of, Subject, TimeoutError } from 'rxjs';\nimport {\n  takeUntil,\n  filter,\n  take,\n  catchError,\n  map,\n  tap,\n  switchMap,\n  delay,\n  distinctUntilChanged,\n  timeout,\n} from 'rxjs/operators';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { UserService } from '@app/core/services/user.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { User } from '@app/shared/models/user.model';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport {\n  DEFAULT_PROJECT_POSTER,\n  DEFAULT_PROJECT_POSTER_WEDDINGS,\n  isViewableByUserId,\n  Project,\n  sortProjectTitleAlpha,\n} from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { ProjectMember, PROJECT_MEMBER_ROLE } from '@app/project-members/shared/project-member.model';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\n\nconst DEBUG_LOGS = false;\n/* timeout and continue if you have not finished loading projects, in ms */\nconst TIMEOUT_PROJECTS = 3000;\n\nconst PAGE = '[ProjectMemberProjects]';\n\n@Component({\n  selector: 'app-project-member-projects',\n  templateUrl: './project-member-projects.component.html',\n  styleUrls: ['./project-member-projects.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    FormsModule,\n    ReactiveFormsModule,\n    IonList,\n    NgFor,\n    IonItem,\n    IonThumbnail,\n    ImageFallbackDirective,\n    IonLabel,\n    IonIcon,\n    IonSelect,\n    IonSelectOption,\n    IonText,\n    IonSpinner,\n    TranslatePipe,\n  ],\n})\nexport class ProjectMemberProjectsComponent implements OnInit, OnDestroy {\n  @Input() showMyRole = true;\n  @Input() isStudio = false; // if my studio, add myProjects\n  @Input() addMember = false; // if adding Member\n  @Input() projects: Project[]; // if adding crew\n  @Input() viewOnly = false;\n  @Input()\n  set member(value: User) {\n    if (value && value.userId) {\n      this._member$.next(value);\n    }\n  }\n  // get member(): User {\n  //   return this._member;\n  // }\n\n  @Output() closeModal = new EventEmitter<void>();\n  @Output() roleChanged = new EventEmitter<{ role: string; project: Project }>();\n\n  /**\n   * if on studio\n   */\n  myProjects$: Observable<Project[]>;\n\n  defaultRoleFormValue = 'Select';\n\n  projectsForm: UntypedFormGroup;\n  projectsControls: UntypedFormGroup[];\n\n  doneLoading = false;\n  isSaving = false;\n  /** @see User.model.pending */\n  isPendingUser = false;\n\n  memberProjects: ProjectMember[] = [];\n  /** @todo: how to change based on getProjectDefaultHeroUrl, pass as fn? */\n  projectPosterFallback = DEFAULT_PROJECT_POSTER;\n\n  /**\n   * Improving logic for getStudioCrew with observables 2021-08-08\n   */\n  get member$(): Observable<User> {\n    return this._member$.asObservable();\n  }\n  private _member$: BehaviorSubject<User> = new BehaviorSubject({ userId: null });\n\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private formBuilder: UntypedFormBuilder,\n    private navCtrl: NavController,\n    private userService: UserService,\n    private projectService: ProjectService,\n    private toaster: ToasterService,\n    private projectMemberService: ProjectMemberService\n  ) {}\n\n  ngOnInit() {\n    if (this.isStudio) {\n      this.defaultRoleFormValue = 'Add as';\n      this.myProjects$ = this.projectService.getMyProjects();\n    }\n\n    this.watchMemberUpdates();\n\n    if (this.addMember) {\n      // default to crew for the add-member modal\n      this.defaultRoleFormValue = 'CREW';\n      this.userService.userId$.pipe(filter(Boolean), take(1), delay(300)).subscribe((currentUserId: string) => {\n        DEBUG_LOGS && console.log(`${PAGE} addMember ${currentUserId} projects:`, this.projects);\n        this.projects = (this.projects || []).sort(sortProjectTitleAlpha);\n        this.buildForm({ projects: this.projects, currentUserId });\n      });\n    }\n  }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  watchMemberUpdates() {\n    DEBUG_LOGS && console.log(`${PAGE} watchMemberUpdates... `, this._member$.getValue());\n    // watch member subject for updates, if the keys that affect the form were updated, re-create the form\n    const member$ = this.member$.pipe(\n      filter((m) => m && m.loaded && Array.isArray(m.memberProjects)),\n      // distinctUntilChanged((curr, prev) => curr.length === prev.length),\n      // remove duplicates\n      map((member) => ({ ...member, memberProjects: _uniqBy(member.memberProjects, 'projectId') })),\n      map((member) => ({\n        member,\n        memberProjectIds: member.memberProjects.filter((p) => p && p.projectId).map((p) => p.projectId),\n      })),\n      tap(({ member, memberProjectIds }) => {\n        // this.member = member; // setting this here causes a \"Maximum call stack size exceeded error\"...\n        this.memberProjects = member.memberProjects;\n        if (memberProjectIds.length < 1) {\n          this.doneLoading = true;\n        }\n        this.isPendingUser = member?.pending ?? false;\n        DEBUG_LOGS && console.log(`${PAGE} watchMemberUpdates tap member$ `, { memberProjectIds });\n      }),\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      filter(({ member, memberProjectIds }) => memberProjectIds.length > 0)\n    );\n\n    const studioProjects$ = iif(() => this.isStudio, this.myProjects$, of([]));\n\n    let aFoundProjects = [];\n    combineLatest([member$, this.userService.userId$, studioProjects$])\n      .pipe(\n        takeUntil(this.onDestroy$),\n        map(([{ member, memberProjectIds }, currentUserId, myProjects]) => ({\n          member,\n          memberProjectIds,\n          currentUserId,\n          myProjects,\n        })),\n        switchMap(({ member, memberProjectIds, currentUserId, myProjects }) =>\n          this.projectService.getProjectsFromStoreByIds(memberProjectIds).pipe(\n            map((projects: Project[]) => {\n              const foundProjects = (projects || []).filter((p) => p && p.id && p.id.length > 0);\n              // save them for the end?\n              if (foundProjects.length !== aFoundProjects.length) {\n                aFoundProjects = foundProjects;\n              }\n              return {\n                projects,\n                foundProjects,\n                member,\n                memberProjectIds,\n                currentUserId,\n                myProjects,\n              };\n            }),\n            timeout({\n              first: TIMEOUT_PROJECTS,\n              // with: (args) => throwError(() => args)\n            }),\n            distinctUntilChanged(({ foundProjects: curr }, { foundProjects: prev }) => curr.length === prev.length),\n            // filter that they are all there ...what if some are private?...\n            filter(({ projects, foundProjects }) => projects.length === foundProjects.length),\n            catchError((err) => {\n              if (err instanceof TimeoutError) {\n                DEBUG_LOGS && console.log(\"timed out, let's use the ones we've found\", { aFoundProjects, err });\n                return of({\n                  projects: aFoundProjects,\n                  member,\n                  myProjects,\n                  currentUserId,\n                });\n              }\n              console.warn('sth else happened', err);\n              return EMPTY;\n            }),\n            // eslint-disable-next-line @typescript-eslint/no-shadow\n            map(({ projects, member, currentUserId, myProjects }) => {\n              DEBUG_LOGS &&\n                console.log(\n                  `watchMemberUpdates combineLatest projectService.getProjectsFromStoreByIds post-filter:`,\n                  projects\n                );\n              return {\n                member,\n                projects: projects.filter((p) => isViewableByUserId(currentUserId, p)).sort(sortProjectTitleAlpha),\n                myProjects,\n                currentUserId,\n              };\n            })\n          )\n        )\n        // ,tap((data) => DEBUG_LOGS && console.log(`watchMemberUpdates tap combineLatest post SwitchMap:`, data))\n      )\n      .subscribe(({ member, projects, currentUserId, myProjects }) => {\n        DEBUG_LOGS && console.log('handleMemberUpdates res:', { member, projects, currentUserId, myProjects });\n        this.projects = _uniqBy([...myProjects, ...projects], 'id');\n        this.buildForm({ member, projects: this.projects, currentUserId });\n      });\n  }\n\n  // /**\n  //  * @deprecated using observable\n  //  */\n  // memberUpdated() {\n  //   DEBUG_LOGS && console.log(`${PAGE} member updated`, this.member);\n  //   // member input was updated, if the keys that affect the form were updated, re-create the form\n  //   if (Array.isArray(this.member.memberProjects)) {\n  //     const memberProjectIds = this.member.memberProjects.filter(p => p && p.projectId).map(p => p.projectId);\n  //     if (memberProjectIds.length < 1) {\n  //       this.doneLoading = true;\n  //       return;\n  //     }\n\n  //     this.projectService.getProjectsFromStoreByIds(memberProjectIds).pipe(\n  //       filter(Array.isArray),\n  //       // filter that they are all there\n  //       filter((projects: Project[]) => projects.length === projects.filter((p) => p && p.id && p.id.length > 0).length),\n  //       take(1),\n  //     ).subscribe((projects: Project[]) => {\n  //       DEBUG_LOGS && console.warn(`${PAGE} projectsFromStore:`, { projects, memberProjectIds });\n  //       this.projects = projects.sort(sortProjectTitleAlpha);\n  //       this.buildForm();\n  //     });\n  //   }\n  // }\n\n  buildForm({\n    projects = [],\n    member = {},\n    currentUserId = '',\n  }: {\n    projects: Project[];\n    member?: Partial<User>;\n    currentUserId: string;\n  }) {\n    if (!Array.isArray(projects)) {\n      console.warn(`${PAGE} buildForm - projects !Array:`, projects);\n      return;\n    }\n\n    const projectMemberForms = new UntypedFormArray([]);\n\n    const getUserMemberRole = (userId, projMembers = []) => {\n      const userMember = projMembers.find((item) => item.userId === userId);\n      return userMember && userMember.role ? userMember.role : '';\n    };\n\n    for (const project of projects) {\n      if (!project) {\n        // one of the projects is not yet loaded, we need to skip this one for now, or wait longer\n        DEBUG_LOGS && console.warn(`${PAGE} buildForm - missing project? (projects:`, projects);\n        continue;\n      }\n\n      const projMembers = Array.isArray(project.members) ? project.members : [];\n\n      if (this.addMember) {\n        const canEditMembers = this.projectService.isProjectAdmin(project, currentUserId);\n\n        const currentUserMemberRole =\n          this.showMyRole && currentUserId ? getUserMemberRole(currentUserId, projMembers) : '';\n\n        DEBUG_LOGS &&\n          console.log(`${PAGE} buildForm addMember...`, {\n            projectId: project.id,\n            // role: [{value: 'none', disabled: !canEditMembers}],\n            canEditProjectMembers: canEditMembers,\n            currentUserMemberRole,\n            project,\n          });\n\n        if (canEditMembers) {\n          // add-member modal - the projectId is known and i am admin\n          this.defaultRoleFormValue = 'CREW';\n          const projectFormGroup = this.formBuilder.group({\n            projectId: [project.id],\n            // userId: [crewMember.userId],\n            // username: [crewMember.username || crewMember.userId],\n            isActive: [{ value: true, disabled: true }],\n            role: [{ value: this.defaultRoleFormValue, disabled: !canEditMembers }],\n            canEditProjectMembers: [canEditMembers],\n            currentUserMemberRole: [currentUserMemberRole],\n            project,\n          });\n\n          projectMemberForms.push(projectFormGroup);\n\n          // notify parent that we selected CREW, update form values\n          this.roleChanged.emit({ role: this.defaultRoleFormValue, project });\n        }\n      } else {\n        // !this.addMember\n        if (!member || !Array.isArray(member.memberProjects)) {\n          console.warn(`${PAGE} No member.memberProjects`, { member, project });\n          continue;\n        }\n        const crewMember = member.memberProjects.find((p) => p && p.projectId && p.projectId === project.id) || {\n          // create a temp member as inactive\n          userId: member.userId,\n          username: member.username,\n          isActive: false,\n          role: PROJECT_MEMBER_ROLE.CREW,\n        };\n\n        const canEditProjectMembers =\n          this.viewOnly || crewMember.role === PROJECT_MEMBER_ROLE.OWNER\n            ? false\n            : this.projectService.isProjectAdmin(project, currentUserId);\n\n        const currentUserMemberRole =\n          this.showMyRole && currentUserId ? getUserMemberRole(currentUserId, projMembers) : '';\n\n        // DEBUG_LOGS && console.log(`${PAGE} buildForm:`, { crewMember, canEditProjectMembers, projMembers, project });\n\n        const projectFormGroup = this.formBuilder.group({\n          projectId: [project.id],\n          userId: [crewMember.userId],\n          username: [crewMember.username || crewMember.userId],\n          isActive: [{ value: crewMember.isActive ? true : false, disabled: !canEditProjectMembers }],\n          role: [\n            { value: crewMember.role ? crewMember.role : this.defaultRoleFormValue, disabled: !canEditProjectMembers },\n          ],\n          canEditProjectMembers: [canEditProjectMembers],\n          currentUserMemberRole: [currentUserMemberRole],\n          project,\n        });\n\n        projectMemberForms.push(projectFormGroup);\n      }\n    }\n\n    this.projectsForm = this.formBuilder.group({\n      projects: projectMemberForms,\n    });\n\n    this.projectsControls = _get(this.projectsForm.controls.projects, 'controls');\n  }\n\n  onActiveChanged(event, index) {\n    const prop = 'isActive';\n    try {\n      if (event && event.detail && (event.detail.value || typeof event.detail.value === 'boolean')) {\n        const val = event.detail.value;\n        const proj = this.projects[index];\n        const projectMember = this.memberProjects.find((p) => p && p.projectId && p.projectId === proj.id);\n        if (projectMember[prop] !== val) {\n          DEBUG_LOGS && console.log(`${PAGE} activeChanged`, { val, projectMember });\n          projectMember[prop] = val;\n          this.projectMemberService.updateProjectMember(projectMember);\n          this.presentSavedToast();\n          // .pipe(\n          //   take(1),\n          //   catchError((e) => {\n          //     console.warn(`${PAGE} updateProjectMember caught`, e);\n          //     this.toaster.present(`Oops! Something went wrong. Please try again.`);\n          //     return EMPTY;\n          //   })\n          // )\n          // .subscribe((res) => {\n          //   DEBUG_LOGS && console.log(`${PAGE} update res:`, res);\n          //   this.presentSavedToast();\n          // });\n        } else {\n          DEBUG_LOGS &&\n            console.log(`${PAGE} activeChanged but didn't actually change?`, {\n              projectMemberIsActive: projectMember[prop],\n              formVal: val,\n            });\n        }\n      } else {\n        console.log(`${PAGE} activeChanged but no value?`, index, event);\n      }\n    } catch (error) {\n      console.error(`${PAGE} caught`, error);\n      this.toaster.present(\n        `Oops! Something happened. Please try again. ${error && error.message ? 'Message: ' + error.message : ''}`\n      );\n    }\n  }\n\n  onRoleChanged(event, index) {\n    const prop = 'role';\n    try {\n      if (event && event.detail && (event.detail.value || typeof event.detail.value === 'boolean')) {\n        const val: string = event.detail.value;\n        const proj = this.projects[index];\n        DEBUG_LOGS && console.log(`${PAGE} onRoleChanged`, { val, index, projectId: proj && proj.id });\n\n        if (!val || val === this.defaultRoleFormValue) {\n          DEBUG_LOGS && console.log(`${PAGE} onRoleChanged default role selected..`);\n          return;\n        }\n\n        if (this.addMember) {\n          // adding member, emit the change\n          this.roleChanged.emit({ role: val, project: proj });\n        } else {\n          // update immediately\n          const projectMember = this.memberProjects.find((p) => p && p.projectId && p.projectId === proj.id);\n          if (projectMember[prop] !== val) {\n            // DEBUG_LOGS &&\n            DEBUG_LOGS && console.log(`${PAGE} activeChanged`, { val, projectMember });\n            projectMember[prop] = val as PROJECT_MEMBER_ROLE;\n            this.projectMemberService.updateProjectMember(projectMember);\n            this.presentSavedToast();\n            // .pipe(\n            //   take(1),\n            //   catchError((e) => {\n            //     console.warn(`${PAGE} updateProjectMember caught`, e);\n            //     this.toaster.present(`Oops! Something went wrong. Please try again.`);\n            //     return EMPTY;\n            //   })\n            // )\n            // .subscribe((res) => {\n            //   DEBUG_LOGS && console.log(`${PAGE} update res:`, res);\n            //   this.presentSavedToast();\n            // });\n          } else {\n            DEBUG_LOGS &&\n              console.log(`${PAGE} activeChanged but didn't actually change?`, {\n                projectMemberRole: projectMember[prop],\n                formVal: val,\n              });\n          }\n        }\n      } else {\n        console.log(`${PAGE} activeChanged but no value?`, index, event);\n      }\n    } catch (error) {\n      console.error(`${PAGE} caught`, error);\n      this.toaster.present(\n        `Oops! Something happened. Please try again. ${error && error.message ? 'Message: ' + error.message : ''}`\n      );\n    }\n  }\n\n  async saveChanges() {\n    DEBUG_LOGS && console.log(`${PAGE}  saveChanges...`);\n    if (this.projectsForm.invalid || this.projectsForm.pristine) {\n      DEBUG_LOGS && console.log('invalid');\n      return;\n    }\n    if (this.projectsForm.pristine) {\n      return await this.toaster.present(`No changes to save...`);\n    }\n    // here set loading for button\n    this.isSaving = true;\n    try {\n      _each(this.projectsControls, (group) => {\n        if (!group.pristine) {\n          const item = group.value;\n          if (!item) {\n            console.warn(`${PAGE} saveChanges no value?!`, group);\n            return;\n          }\n          const request = {\n            projectId: item.projectId,\n            userId: item.userId,\n            username: item.username,\n            role: item.role,\n            isActive: item.isActive,\n          };\n\n          if (DEBUG_LOGS) {\n            console.group('---updateProjectCrewMember REQUEST:---');\n            console.log(request);\n            console.groupEnd();\n          }\n\n          /**\n           * @todo VERIFY this works! - it appears to on 3.2.5\n           */\n          this.projectMemberService.updateProjectMember(request);\n          // this.projectCrewApiService.updateProjectCrewMember(request);\n        }\n      });\n      this.presentSavedToast();\n    } catch (error) {\n      console.error(error);\n      this.toaster.present(`Oops! Something happened. Please try again.`);\n    } finally {\n      this.isSaving = false;\n    }\n  }\n\n  async presentSavedToast() {\n    return await this.toaster.present(`Success. Changes saved.`);\n  }\n\n  navProject(id) {\n    // console.log(`navProject ${id}`);\n    this.navCtrl.navigateForward(`/${PROJECT_DETAIL_ROUTE}/${id}`);\n    this.closeModal.emit();\n  }\n}\n","import { defer } from './defer';\nexport function iif(condition, trueResult, falseResult) {\n    return defer(() => (condition() ? trueResult : falseResult));\n}\n","<!-- can be wrapped in project-member-modal -->\n\n<ng-template #loadingTpl>\n  <div class=\"col ion-padding\">\n    <div class=\"member ion-padding\">\n      <ion-spinner></ion-spinner>\n    </div>\n  </div>  \n</ng-template>\n<ng-template #noUserTpl>\n  <div class=\"col ion-padding-horizontal\">\n    <div class=\"member ion-padding-vertical\">\n      {{ 'USER.NOT_FOUND' | translate }}\n    </div>\n  </div>  \n</ng-template>\n<div *ngIf=\"selectedUser$ | async as user; else loadingTpl\" class=\"col ion-padding-horizontal\">\n  <div *ngIf=\"user?.userId?.length > 0 else noUserTpl\" class=\"member\">\n    <!-- avatar -->\n    <div\n      class=\"member__avatar\"\n      [style.background-image]=\"'url(' + avatarUrl + '), url(' + avatarFallback + ')'\"\n      draggable=\"false\"\n    ></div>\n    <h2 class=\"member__name\">\n      {{ user.name || user.userId }}\n\n      <ion-button *ngIf=\"user.bio\"\n        [title]=\"showingBio ? 'Hide Bio' : 'Show Bio'\"\n        fill=\"clear\"\n        size=\"small\"\n        class=\"member__name__caret-btn\"\n        (click)=\"showingBio = !showingBio\"\n      >\n        <ion-icon\n          slot=\"icon-only\"\n          class=\"member__name__caret no-pointer-events\"\n          name=\"caret-down\"\n          [class.member__name__caret--expanded]=\"showingBio\"\n        ></ion-icon>\n      </ion-button>\n      \n    </h2>\n\n    <div class=\"member__bio\" *ngIf=\"user.bio && showingBio\">\n      <div>{{ user.bio }}</div>\n    </div>\n\n    <div class=\"member__stats\">\n      <ul>\n        <li title=\"{{ 'COMMON.PROJECTS' | translate }}\">\n          <ion-icon name=\"folder\" class=\"no-pointer-events\"></ion-icon>\n          {{ user.memberProjects?.length || 0 }}\n        </li>\n        <li title=\"{{ 'COMMON.STACKS' | translate }}\">\n          <ion-icon name=\"layers-outline\" class=\"no-pointer-events\"></ion-icon>\n          {{ \n            ((recentStacks.items$ | async)?.length > 0) \n              ? (recentStacks.items$ | async).length \n              : user.stacks?.length || 0 \n          }}\n        </li>\n        <li title=\"{{ 'STUDIO.CLIPS_WATCHED' | translate }}\">\n          <ion-icon name=\"play-outline\" class=\"no-pointer-events\"></ion-icon>\n          {{ user.numClipsWatched || 0 }}\n        </li>\n      </ul>\n    </div>\n    <div class=\"member__description\">\n      <div *ngIf=\"user.location\" class=\"member__description__content\">\n        <strong>{{ 'STUDIO.SETTINGS.LABEL_LOCATION' | translate }}</strong>\n        <span>{{ user.location }}</span>\n      </div>\n      <div *ngIf=\"joined\" class=\"member__description__content\">\n        <strong>{{ 'USER.JOINED' | translate }}</strong>\n        <span>{{ joined }}</span>\n      </div>\n    </div>\n  </div>\n\n  <div *ngIf=\"showRecentStacks && (recentStacks.items$ | async)?.length > 0\" class=\"member__stacks\">\n    <fs-list-title icon=\"logo-buffer\" style=\"display:block;margin-right:80px;\">\n      <span class=\"ion-hide-sm-up\">{{ 'MEMBERS.RECENT_STACKS' | translate }}</span>\n      <span class=\"ion-hide-sm-down\">{{ 'MEMBERS.RECENT_STACK_STORIES' | translate }}</span>\n    </fs-list-title>\n    \n    <div *ngFor=\"let stackList of [recentStacks]\" class=\"list-wrap\">\n      <app-stack-list *ngIf=\"(stackList.list$ | async) as list\" \n        [layout]=\"{\n          type: layoutType.Carousel,\n          options: {\n            hasAddNewItemButton: false,\n            showAvatar: false\n          }\n        }\" \n        [items]=\"stackList.items$ | async\" \n        [canLoadMore]=\"!!list.nextToken\" \n        [isLoading]=\"list.loading\"\n        (loadMore)=\"loadMoreStacks(list)\" \n        (itemClick)=\"dismiss.emit()\"\n      ></app-stack-list>\n      <!-- [heading]=\"stackList.label\"  -->\n    </div>\n    \n  </div>\n\n  <div class=\"ion-text-left ion-margin-bottom\">\n    <fs-list-title class=\"no-top-margin ion-padding-bottom\" icon=\"folder-outline\">{{ 'COMMON.PROJECTS' | translate }}</fs-list-title>\n    <app-project-member-projects\n      [member]=\"user\"\n      [isStudio]=\"isStudio\"\n      [viewOnly]=\"viewOnly\"\n      (closeModal)=\"dismiss.emit()\"\n    ></app-project-member-projects>\n  </div>\n  \n</div>\n","/** @format */\n\nimport { Component, OnInit, Input, ViewChild, OnDestroy, EventEmitter, Output } from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { ModalController, IonSpinner, IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { Observable, Subject } from 'rxjs';\nimport { distinctUntilChanged, take, takeUntil } from 'rxjs/operators';\nimport { ENABLE_FEATURE_USER_MESSAGING, ENABLE_FEATURE_USER_FOLLOW } from '@app/app.config';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { StackList, List } from '@app/shared/models/list.model';\nimport { DEFAULT_USER_AVATAR_TERTIARY } from '@app/shared/models/user.model';\nimport { LAYOUT_TYPE } from '@app/shared/models/layout.model';\nimport { ListTitleComponent } from '@app/shared/components/ui/list-title/list-title.component';\n// import { BaseModalComponent } from '@app/shared/components/ui/modal/base-modal.component';\nimport { Utils } from '@app/shared/utils';\nimport { StackListComponent } from '@app/stacks/shared/components/stack-list/stack-list.component';\nimport { Project } from '@app/projects/shared/project.model';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\nimport { ProjectMemberProjectsComponent } from '@app/project-members/project-member-projects/project-member-projects.component';\n\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { loadFilteredStacks, loadMoreFilteredStacks } from '@store/actions/stacks.actions';\nimport { selectList, selectStackListItems } from '@store/selectors/lists.selectors';\nimport { FilterEntityTypes } from '@store/selectors/viewstate.selectors';\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[ProjectMember]';\n/**\n * ProjectMemberDetail\n */\n@Component({\n  selector: 'fs-project-member',\n  templateUrl: './project-member.component.html',\n  styleUrls: ['./project-member.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    NgFor,\n    ListTitleComponent,\n    StackListComponent,\n    ProjectMemberProjectsComponent,\n    IonButton,\n    IonIcon,\n    IonSpinner,\n    AsyncPipe,\n    TranslatePipe,\n  ],\n})\nexport class ProjectMemberComponent implements OnInit, OnDestroy {\n  @Input()\n  set userId(value) {\n    if (this._userId !== value && value?.length > 0) {\n      // select this ID from the store -> kicks off effect to load UserData\n      this.projectMemberService.selectUserId(value);\n    }\n    this._userId = value;\n  }\n  get userId(): string {\n    return this._userId;\n  }\n  @Input() projects: Project[];\n  @Input() viewOnly = true;\n  @Input() isStudio = false;\n  @Input() showRecentStacks = true;\n\n  @Output() dismiss = new EventEmitter<void>();\n\n  @ViewChild(ProjectMemberProjectsComponent) projectMemberProjectsComponent: ProjectMemberProjectsComponent;\n\n  // @ViewChild('modal', { static: false, read: BaseModalComponent })\n  // modal: BaseModalComponent;\n\n  enableMessaging = ENABLE_FEATURE_USER_MESSAGING;\n  enableFollow = ENABLE_FEATURE_USER_FOLLOW;\n\n  selectedUser$ = this.projectMemberService.selected$;\n  avatarUrl = DEFAULT_USER_AVATAR_TERTIARY;\n  avatarFallback = DEFAULT_USER_AVATAR_TERTIARY;\n  showingBio = false; // toggle the bio display\n\n  joined: string;\n\n  layoutType = LAYOUT_TYPE;\n  recentStacks: StackList = {\n    label: 'Recent', // will be translated onInit\n    // list$: of(), // this.store.select(selectList(this.listIdProjectStacksRecent)),\n    // items$: of(), //this.store.select(selectStackListItems(this.listIdProjectStacksRecent)),\n  };\n\n  private _userId = '';\n  private get listIdMemberStacks() {\n    return `stacks_recent_user_${this.userId || 'anon'}`;\n  }\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private modalController: ModalController,\n    private toaster: ToasterService,\n    private userService: UserService,\n    private projectMemberService: ProjectMemberService,\n    private store: Store<State>,\n    private translate: TranslateService\n  ) {}\n\n  async ngOnInit() {\n    this.selectedUser$\n      .pipe(\n        takeUntil(this.onDestroy$),\n        distinctUntilChanged(\n          (prev, curr) => curr?.userId && curr.userId === prev?.userId && curr?.bio && curr.bio === prev?.bio\n        )\n      )\n      .subscribe(async (user) => {\n        DEBUG_LOGS && console.log(`${PAGE} currentUser$`, user);\n        if (!user || !user.userId) return;\n\n        const joined = user.createdAt || user.updatedAt;\n        if (joined) {\n          this.translate\n            .get('COMMON.DAYS_AGO')\n            .pipe(take(1))\n            .subscribe((res) => {\n              // todo: consider # COMMON.YEARS # days ago ?\n              this.joined = `${Utils.daysAgo(new Date(), new Date(joined))} ${res}`;\n            });\n        }\n\n        this.avatarUrl = this.userService.getUserAvatarUrl(user.userId);\n\n        this.showingBio = user.bio?.length > 0;\n\n        if (this.showRecentStacks) {\n          this.translate\n            .get(['COMMON.RECENT']) // 'COMMON.FEATURED'\n            .pipe(take(1))\n            .subscribe((res) => {\n              this.recentStacks.label = res['COMMON.RECENT'];\n              // this.featuredStacks.label = res['COMMON.FEATURED'];\n            });\n\n          this.recentStacks = {\n            label: this.recentStacks.label,\n            list$: this.store.select(selectList(this.listIdMemberStacks)),\n            items$: this.store.select(selectStackListItems(this.listIdMemberStacks)) as Observable<Stack[]>,\n          };\n          // load RECENT STACKS by project id\n          this.store.dispatch(\n            loadFilteredStacks({\n              listId: this.listIdMemberStacks,\n              filters: {\n                id: this.listIdMemberStacks,\n                userId: this.userId,\n                type: FilterEntityTypes.Recent,\n              },\n            })\n          );\n        }\n      });\n  }\n\n  ngOnDestroy(): void {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  loadMoreStacks(list: List) {\n    this.store.dispatch(\n      loadMoreFilteredStacks({\n        listId: list.id,\n        filters: list.filters,\n        nextToken: list.nextToken,\n      })\n    );\n  }\n\n  async followCrewMember() {\n    console.log('follow btn clicked');\n    await this.toaster.present(`Feature in DEV: Follow User`);\n  }\n\n  async messageCrewMember() {\n    console.log('message btn clicked');\n    await this.toaster.present(`Feature in DEV: Message User`);\n  }\n\n  saveProjectChanges() {\n    console.log('TODO: saveProjectChanges here or in child component?');\n    // this.projectMemberProjectsComponent.saveChanges();\n  }\n}\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n  return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","module.exports = require('./forEach');\n","var arrayEach = require('./_arrayEach'),\n    baseEach = require('./_baseEach'),\n    castFunction = require('./_castFunction'),\n    isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n *   console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n *   console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n  var func = isArray(collection) ? arrayEach : baseEach;\n  return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","var baseIteratee = require('./_baseIteratee'),\n    baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n  return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n"],"x_google_ignoreList":[4,7,8,9,10,11]}