OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / room / room.model.js

120 lines · javascript ref:
import {
  DEFAULT_ROOM_TITLE as e,
  ROOM_TYPE as o,
  ROOM_DESCRIPTION_MAX_LENGTH as s,
  RECENT_ROOM_UPDATE as t,
} from "./room.constant"
import { calcAvatarColorById as i } from "../lib/color"
import { getAvatarUrl as r, getAvatarUrlMedium as a } from "../identity"
export const isDmPeerHasLeft = ({ dmMemberId: e, memberCount: s, roomType: t }) =>
  t === o.DM && !!e && 1 === s
export const parseRecentRoomsAllResponse = (e) => ({
  total: e.rooms?.length ?? 0,
  rooms: e.rooms.map((e) => ({ roomId: e.roomId ?? "", timestamp: e.timestamp ?? 0 })),
})
export const parseRecentRoomsChangeResponse = (e) => ({
  type: t.CHANGED,
  timestamp: e.timestamp ?? 0,
  roomId: e.roomId || "",
})
export const parseRecentRoomsAddRemoveResponse = (e) => {
  switch (e.type) {
    case t.ADDED:
    case t.REMOVED:
      return { type: e.type, timestamp: e.timestamp ?? 0, roomId: e.roomId || "" }
    default:
      return null
  }
}
export const parseRoomConfigIdsResponse = (e) => ({
  roomId: e.roomId ?? "",
  dmMemberId: e.dmMemberId ?? "",
  discoveryId: e.discoveryId ?? "",
  isReadOnly: !e.self?.deviceId,
})
export const parseRoomConfigResponse = (s, t) => {
  const n = s.roomType === o.DM ? "" : e,
    m = "string" != typeof s.canCall || "true" === s.canCall
  return {
    title: s.title ?? n,
    description: s.description ?? "",
    roomType: s.roomType ?? o.ROOM,
    avatarUrl: r(s.avatar),
    avatarUrlMedium: a(s.avatar),
    avatarColor: i(t),
    canCall: m,
    isMembershipEventsDisabled: s.isMembershipEventsDisabled || !1,
  }
}
export const parseRoomVersionResponse = (e, o) => (s) => ({
  roomId: e,
  isCompatible: o >= s?.version,
  version: s?.version,
  experimental: s?.experimental,
  latest: o === s?.version,
})
export const parseRoomVersionFromInfoResponse = (e, o) => (s) => ({
  roomId: e,
  isCompatible: o >= s.digest.abi.version,
  version: s.digest.abi.version ?? 0,
  experimental: !!s.digest.settings.isExperimental,
})
export const parseRoomInfoResponse = (e, o) => {
  const {
      title: s,
      description: t,
      roomType: i,
      avatarUrl: r,
      avatarUrlMedium: a,
      avatarColor: n,
      canCall: m,
      isMembershipEventsDisabled: d,
    } = parseRoomConfigResponse(e.config, e.roomId),
    { dmMemberId: p, discoveryId: l, isReadOnly: c } = parseRoomConfigIdsResponse(e)
  return {
    roomId: e.roomId ?? "",
    dmMemberId: p,
    discoveryId: l,
    isReadOnly: c,
    title: s,
    description: t,
    roomType: i,
    avatarUrl: r,
    avatarUrlMedium: a,
    avatarColor: n,
    canCall: m,
    isMembershipEventsDisabled: d,
    isAttachmentsDisabled: !!e.digest.settings.isAttachmentsDisabled,
    isLinksDisabled: !!e.digest.settings.isLinksDisabled,
    isCompatible: o >= e.digest.abi.version,
    version: e.digest.abi.version ?? 0,
    experimental: !!e.digest.settings.isExperimental,
    isAppendingDisabled: !!e.digest.settings.isAppendingDisabled,
    memberCount: e.stats.members.active,
    sentLength: e.self.sentLength,
    deviceId: e.self.deviceId,
    fileTotalSize: e.fileStats?.total,
    activeCallId: e.activeCall?.callId || "",
    isVerified: e.isVerified,
    isUnread: e.preferences?.status?.isUnread ?? !1,
  }
}
export const createRoomInitialConfig = (
  e,
  { description: s = "", roomType: t = o.ROOM, canCall: i = "true" } = {},
) => ({ title: e, description: s, roomType: t, canCall: i })
export const getRoomConfigChanges = (e, o) =>
  e
    ? Object.keys(o).reduce(
        (s, t) => (e[t] !== o[t] && "avatar" !== t && void 0 !== o[t] && (s[t] = o[t]), s),
        {},
      )
    : o
export const sanitizeRoomDescription = (e) => (e ? e.trim().slice(0, s) : "")
export const sanitizeRoomOpts = (e) => ({
  ...e,
  description: sanitizeRoomDescription(e.description),
})
export const getRecentRoomItemChanged = (e, o) =>
  e ? (e.timestamp !== o.timestamp || e.roomId !== o.roomId ? o : null) : o