Skip to content
Snippets Groups Projects
Forked from TO / cf-online-ui
150 commits behind the upstream repository.
PostsContainer.jsx 4.28 KiB
import React from "react";
import pick from "lodash/pick";

import {
  acceptProposal,
  announceProposal,
  dislike,
  hide,
  like,
  rejectProposal,
} from "actions/posts";
import { ban } from "actions/users";
import ModalConfirm from "components/modals/ModalConfirm";
import PostList from "components/posts/PostList";
import { useItemActionConfirm } from "hooks";
import { PostStore } from "stores";

const PostsContainer = ({ className }) => {
  const [
    userToBan,
    setUserToBan,
    onBanUserConfirm,
    onBanUserCancel,
  ] = useItemActionConfirm(ban);
  const [
    postToHide,
    setPostToHide,
    onPostHideConfirm,
    onPostHideCancel,
  ] = useItemActionConfirm(hide);
  const [
    postToAnnounce,
    setPostToAnnounce,
    onAnnounceConfirm,
    onAnnounceCancel,
  ] = useItemActionConfirm(announceProposal);
  const [
    postToAccept,
    setPostToAccept,
    onAcceptConfirm,
    onAcceptCancel,
  ] = useItemActionConfirm(acceptProposal);
  const [
    postToReject,
    setPostToReject,
    onRejectConfirm,
    onRejectCancel,
  ] = useItemActionConfirm(rejectProposal);

  const { window, items } = PostStore.useState((state) =>
    pick(state, ["window", "items"])
  );
  const showingArchivedOnly = PostStore.useState(
    (state) => state.filters.flags === "archived"
  );

  /**
   * Ban a post's author.
   * @param {CF2021.Post} post
   */
  const onBanUser = (post) => {
    setUserToBan(post.author);
  };

  /**
   * Mark down user saw this post already.
   * @param {CF2021.Post} post
   */
  const markSeen = (post) => {
    PostStore.update((state) => {
      state.items[post.id].seen = true;
    });
  };

  const sliceStart = (window.page - 1) * window.perPage;
  const sliceEnd = window.page * window.perPage;

  return (
    <>
      <PostList
        items={window.items
          .slice(sliceStart, sliceEnd)
          .map((postId) => items[postId])}
        onLike={like.run}
        onDislike={dislike.run}
        onSeen={markSeen}
        className={className}
        dimArchived={!showingArchivedOnly}
        displayActions={true}
        onHide={setPostToHide}
        onBanUser={onBanUser}
        onAnnounceProcedureProposal={setPostToAnnounce}
        onAcceptProcedureProposal={setPostToAccept}
        onRejectProcedureProposal={setPostToReject}
      />
      <ModalConfirm
        isOpen={!!userToBan}
        onConfirm={onBanUserConfirm}
        onCancel={onBanUserCancel}
        title={`Zablokovat uživatele ${userToBan ? userToBan.name : null}?`}
        yesActionLabel="Zablokovat"
      >
        Uživatel <strong>{userToBan ? userToBan.name : null}</strong> bude
        zablokován a nebude dále moci vkládat nové příspěvky. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToHide}
        onConfirm={onPostHideConfirm}
        onCancel={onPostHideCancel}
        title="Skrýt příspěvek?"
        yesActionLabel="Potvrdit"
      >
        Příspěvek se skryje a uživatelé ho neuvidí. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToHide}
        onConfirm={onPostHideConfirm}
        onCancel={onPostHideCancel}
        title="Skrýt příspěvek?"
        yesActionLabel="Potvrdit"
      >
        Příspěvek se skryje a uživatelé ho neuvidí. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToAnnounce}
        onConfirm={onAnnounceConfirm}
        onCancel={onAnnounceCancel}
        title="Vyhlásit procedurální návrh?"
        yesActionLabel="Vyhlásit návrh"
      >
        Procedurální návrh bude <strong>vyhlášen</strong>. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToAccept}
        onConfirm={onAcceptConfirm}
        onCancel={onAcceptCancel}
        title="Schválit procedurální návrh?"
        yesActionLabel="Schválit návrh"
      >
        Procedurální návrh bude <strong>schválen</strong>. Opravdu to chcete?
      </ModalConfirm>
      <ModalConfirm
        isOpen={!!postToReject}
        onConfirm={onRejectConfirm}
        onCancel={onRejectCancel}
        title="Zamítnout procedurální návrh?"
        yesActionLabel="Zamítnout návrh"
      >
        Procedurální návrh bude <strong>zamítnut</strong>. Opravdu to chcete?
      </ModalConfirm>
    </>
  );
};

export default PostsContainer;