Ctrl K
ComunidadGuías…

app/models/Team.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { computed, observable } from "mobx";
import { TeamPreferenceDefaults } from "@shared/constants";
import { CommentingAccess, TeamPreference } from "@shared/types";
import type {
  Plan,
  PlanFeature,
  TeamPreferences,
  UserRole,
} from "@shared/types";
import { stringToColor } from "@shared/utils/color";
import Model from "./base/Model";
import Field from "./decorators/Field";

class Team extends Model {
  static modelName = "Team";

  constructor(fields: Record<string, unknown>, store: Model["store"]) {
    super(fields, store);
    this.initialize(fields);
  }

  @Field
  @observable
  name: string;

  @Field
  @observable
  description: string | null;

  @Field
  @observable
  avatarUrl: string;

  @Field
  @observable
  sharing: boolean;

  @Field
  @observable
  inviteRequired: boolean;

  @Field
  @observable
  commenting: boolean;

  @Field
  @observable
  documentEmbeds: boolean;

  @Field
  @observable
  defaultCollectionId: string | null;

  @Field
  @observable
  memberCollectionCreate: boolean;

  @Field
  @observable
  memberTeamCreate: boolean;

  @Field
  @observable
  guestSignin: boolean;

  @Field
  @observable
  passkeysEnabled: boolean;

  @Field
  @observable
  subdomain: string | null | undefined = undefined;

  @Field
  @observable
  defaultUserRole: UserRole;

  @Field
  @observable
  guidanceMCP: string | null;

  @Field
  @observable
  preferences: TeamPreferences | null;

  @observable
  domain: string | null | undefined = undefined;

  @observable
  url: string;

  @Field
  @observable
  allowedDomains: string[] | null | undefined = undefined;

  @observable
  plan: Plan;

  @observable
  entitlements: PlanFeature[];

  @computed
  get signinMethods(): string {
    return "SSO";
  }

  @computed
  get color(): string {
    return stringToColor(this.id);
  }

  @computed
  get initial(): string {
    return (this.name ? this.name[0] : "?").toUpperCase();
  }

  /**
   * Whether commenting is enabled for the team, for either members or
   * members and guests.
   *
   * @returns true if commenting is enabled, false otherwise.
   */
  @computed
  get commentingEnabled(): boolean {
    const access = this.getPreference(TeamPreference.Commenting);
    // A legacy boolean `false` (team not yet migrated) means disabled.
    return access !== CommentingAccess.None && access !== false;
  }

  /**
   * Whether the team is entitled to use the given feature.
   *
   * @param feature The feature to check for.
   * @returns true if the team is entitled to the feature, false otherwise.
   */
  hasEntitlement(feature: PlanFeature): boolean {
    return !!this.entitlements?.includes(feature);
  }

  /**
   * Returns the value of the provided preference.
   *
   * @param preference The team preference to retrieve
   * @returns The preference value if set, else the default value
   */
  getPreference<T extends keyof TeamPreferences>(
    key: T,
    defaultValue?: TeamPreferences[T]
  ): TeamPreferences[T] | false {
    return (
      this.preferences?.[key] ??
      TeamPreferenceDefaults[key] ??
      defaultValue ??
      false
    );
  }

  /**
   * Set the value for a specific preference key.
   *
   * @param key The TeamPreference key to set.
   * @param value The value to set.
   */
  setPreference<T extends TeamPreference>(key: T, value: TeamPreferences[T]) {
    this.preferences = {
      ...this.preferences,
      [key]: value,
    };
  }
}

export default Team;