OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / chat / pin-message / pin-message.reducer.js

91 lines · javascript ref:
import { EMPTY_ARRAY as e } from "../../lib/array"
import { isMessageChanged as s } from "../message"
import {
  setIsPinnedLimitMessageShown as n,
  setPinnedMessages as i,
  setPinnedTabIsOpen as d,
  updateChatPinnedMessage as a,
  updateChatPinnedMessageBlocked as t,
} from "./pin-message.action"
export const PIN_MESSAGE_INITIAL_STATE = {
  pinnedMessages: e,
  isPinnedTabOpen: !1,
  isPinnedLimitShown: !1,
  isMessagePinnedMap: {},
}
export const pinMessageReducer = (e = PIN_MESSAGE_INITIAL_STATE, p) => {
  switch (p.type) {
    case i.type: {
      const { payload: n } = p,
        { pinnedMessages: i } = e,
        d = [],
        a = {}
      let t = n.length !== i.length
      for (let e = n.length - 1; e >= 0; e -= 1) {
        const p = n[e],
          g = i.find((e) => e?.id === p?.id)
        p && !p.deleted
          ? (!g || s(g, p) ? ((t = !0), d.push(p)) : d.push(g || p), (a[p.id] = !0))
          : (t = !0)
      }
      return t ? { ...e, pinnedMessages: d, isMessagePinnedMap: a } : e
    }
    case a.type: {
      const { payload: n } = p,
        {
          nextMessages: i,
          isChanged: d,
          isDeleted: a,
        } = e.pinnedMessages.reduce(
          (e, i) => (
            i.id === n.id
              ? n.deleted
                ? (e.isDeleted = !0)
                : s(i, n) && (e.nextMessages.push(n), (e.isChanged = !0))
              : e.nextMessages.push(i),
            e
          ),
          { nextMessages: [], isChanged: !1, isDeleted: !1 },
        )
      return d || a
        ? {
            ...e,
            pinnedMessages: i,
            isMessagePinnedMap: a ? { ...e.isMessagePinnedMap, [n.id]: !1 } : e.isMessagePinnedMap,
          }
        : e
    }
    case t.type: {
      const { blockedByMemberId: s, ignoreBlocked: n } = p.payload,
        { pinnedMessages: i } = e
      if (!i.length) return e
      const { pinnedMessages: d, isChanged: a } = i.reduce(
        (e, i) => {
          let d
          return (
            s[i.memberId] && !n
              ? ((e.isChanged = !0), (d = { ...i, blocked: !0 }))
              : i.blocked
                ? ((e.isChanged = !0), (d = { ...i, blocked: !1 }))
                : (d = i),
            e.pinnedMessages.push(d),
            e
          )
        },
        { pinnedMessages: [], isChanged: !1 },
      )
      return a ? { ...e, pinnedMessages: d } : e
    }
    case d.type: {
      const { payload: s } = p
      return s === e.isPinnedTabOpen ? e : { ...e, isPinnedTabOpen: s }
    }
    case n.type: {
      const { payload: s } = p
      return s === e.isPinnedLimitShown ? e : { ...e, isPinnedLimitShown: s }
    }
    default:
      return e
  }
}