/* * Vencord, a modification for Discord's desktop app * Copyright (c) 2022 Vendicated and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import { openUserProfile } from "@utils/discord"; import { classes } from "@utils/misc"; import { LazyComponent } from "@utils/react"; import { filters, findBulk } from "@webpack"; import { Alerts, moment, Parser, showToast, Timestamp } from "@webpack/common"; import { Auth, getToken } from "../auth"; import { Review, ReviewType } from "../entities"; import { blockUser, deleteReview, reportReview, unblockUser } from "../reviewDbApi"; import { settings } from "../settings"; import { canBlockReviewAuthor, canDeleteReview, canReportReview, cl } from "../utils"; import { openBlockModal } from "./BlockedUserModal"; import { BlockButton, DeleteButton, ReportButton } from "./MessageButton"; import ReviewBadge from "./ReviewBadge"; export default LazyComponent(() => { // this is terrible, blame mantika const p = filters.byProps; const [ { cozyMessage, buttons, message, buttonsInner, groupStart }, { container, isHeader }, { avatar, clickable, username, wrapper, cozy }, buttonClasses, botTag ] = findBulk( p("cozyMessage"), p("container", "isHeader"), p("avatar", "zalgo"), p("button", "wrapper", "selected"), p("botTag", "botTagRegular") ); const dateFormat = new Intl.DateTimeFormat(); return function ReviewComponent({ review, refetch, profileId }: { review: Review; refetch(): void; profileId: string; }) { function openModal() { openUserProfile(review.sender.discordID); } function delReview() { Alerts.show({ title: "Are you sure?", body: "Do you really want to delete this review?", confirmText: "Delete", cancelText: "Nevermind", onConfirm: async () => { if (!(await getToken())) { return showToast("You must be logged in to delete reviews."); } else { deleteReview(review.id).then(res => { if (res.success) { refetch(); } showToast(res.message); }); } } }); } function reportRev() { Alerts.show({ title: "Are you sure?", body: "Do you really you want to report this review?", confirmText: "Report", cancelText: "Nevermind", // confirmColor: "red", this just adds a class name and breaks the submit button guh onConfirm: async () => { if (!(await getToken())) { return showToast("You must be logged in to report reviews."); } else { reportReview(review.id); } } }); } const isAuthorBlocked = Auth?.user?.blockedUsers?.includes(review.sender.discordID) ?? false; function blockReviewSender() { if (isAuthorBlocked) return unblockUser(review.sender.discordID); Alerts.show({ title: "Are you sure?", body: "Do you really you want to block this user? They will be unable to leave further reviews on your profile. You can unblock users in the plugin settings.", confirmText: "Block", cancelText: "Nevermind", // confirmColor: "red", this just adds a class name and breaks the submit button guh onConfirm: async () => { if (!(await getToken())) { return showToast("You must be logged in to block users."); } else { blockUser(review.sender.discordID); } } }); } return (
openModal()} > {review.sender.username} {review.type === ReviewType.System && ( System )}
{isAuthorBlocked && ( openBlockModal()} /> )} {review.sender.badges.map(badge => )} { !settings.store.hideTimestamps && review.type !== ReviewType.System && ( {dateFormat.format(review.timestamp * 1000)} ) }
{Parser.parseGuildEventDescription(review.comment)}
{review.id !== 0 && (
{canReportReview(review) && } {canBlockReviewAuthor(profileId, review) && } {canDeleteReview(profileId, review) && }
)}
); }; });