import React from "react"; import pick from "lodash/pick"; import { acceptProposal, announceProposal, dislike, hide, like, rejectProposal, removeDislike, removeLike, } 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" ); /** * * @param {CF2021.Post} post */ const onLike = (post) => { if (post.ranking.myVote === "none") { return like.run(post); } if (post.ranking.myVote === "like") { return removeLike.run(post); } }; /** * * @param {CF2021.Post} post */ const onDislike = (post) => { if (post.ranking.myVote === "none") { return dislike.run(post); } if (post.ranking.myVote === "dislike") { return removeDislike.run(post); } }; /** * Ban a post's author. * @param {CF2021.Post} post */ const onBanUser = (post) => { setUserToBan(post.author); }; 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={onLike} onDislike={onDislike} 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;