/* * 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 { classes } from "@utils/misc"; import { useAwaiter, useForceUpdater } from "@utils/react"; import { findByPropsLazy } from "@webpack"; import { Forms, React, RelationshipStore, UserStore } from "@webpack/common"; import type { KeyboardEvent } from "react"; import { Review } from "../entities"; import { addReview, getReviews, Response, REVIEWS_PER_PAGE } from "../reviewDbApi"; import { settings } from "../settings"; import { authorize, cl, showToast } from "../utils"; import ReviewComponent from "./ReviewComponent"; const Classes = findByPropsLazy("inputDefault", "editable"); interface UserProps { discordId: string; name: string; } interface Props extends UserProps { onFetchReviews(data: Response): void; refetchSignal?: unknown; showInput?: boolean; page?: number; scrollToTop?(): void; hideOwnReview?: boolean; } export default function ReviewsView({ discordId, name, onFetchReviews, refetchSignal, scrollToTop, page = 1, showInput = false, hideOwnReview = false, }: Props) { const [signal, refetch] = useForceUpdater(true); const [reviewData] = useAwaiter(() => getReviews(discordId, (page - 1) * REVIEWS_PER_PAGE), { fallbackValue: null, deps: [refetchSignal, signal, page], onSuccess: data => { if (settings.store.hideBlockedUsers) data!.reviews = data!.reviews?.filter(r => !RelationshipStore.isBlocked(r.sender.discordID)); scrollToTop?.(); onFetchReviews(data!); } }); if (!reviewData) return null; return ( <> {showInput && ( r.sender.discordID === UserStore.getCurrentUser().id)} /> )} ); } function ReviewList({ refetch, reviews, hideOwnReview }: { refetch(): void; reviews: Review[]; hideOwnReview: boolean; }) { const myId = UserStore.getCurrentUser().id; return (
{reviews?.map(review => (review.sender.discordID !== myId || !hideOwnReview) && )} {reviews?.length === 0 && ( Looks like nobody reviewed this user yet. You could be the first! )}
); } export function ReviewsInputComponent({ discordId, isAuthor, refetch, name }: { discordId: string, name: string; isAuthor: boolean; refetch(): void; }) { const { token } = settings.store; function onKeyPress({ key, target }: KeyboardEvent) { if (key === "Enter") { addReview({ userid: discordId, comment: (target as HTMLInputElement).value, star: -1 }).then(res => { if (res?.success) { (target as HTMLInputElement).value = ""; // clear the input refetch(); } else if (res?.message) { showToast(res.message); } }); } } return (