/* * 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 { useAwaiter, useForceUpdater } from "@utils/react"; import { findByPropsLazy, findComponentByCodeLazy } from "@webpack"; import { Forms, React, RelationshipStore, useRef, UserStore } from "@webpack/common"; import { Auth, authorize } from "../auth"; import { Review } from "../entities"; import { addReview, getReviews, Response, REVIEWS_PER_PAGE } from "../reviewDbApi"; import { settings } from "../settings"; import { cl, showToast } from "../utils"; import ReviewComponent from "./ReviewComponent"; const { Editor, Transforms } = findByPropsLazy("Editor", "Transforms"); const { ChatInputTypes } = findByPropsLazy("ChatInputTypes"); const InputComponent = findComponentByCodeLazy("default.CHANNEL_TEXT_AREA"); const { createChannelRecordFromServer } = findByPropsLazy("createChannelRecordFromServer"); 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, profileId }: { refetch(): void; reviews: Review[]; hideOwnReview: boolean; profileId: string; }) { 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 } = Auth; const editorRef = useRef(null); const inputType = ChatInputTypes.FORM; inputType.disableAutoFocus = true; const channel = createChannelRecordFromServer({ id: "0", type: 1 }); return ( <>
{ if (!token) { showToast("Opening authorization window..."); authorize(); } }}> editorRef.current = ref} textValue="" onSubmit={ async res => { const response = await addReview({ userid: discordId, comment: res.value, }); if (response) { refetch(); const slateEditor = editorRef.current.ref.current.getSlateEditor(); // clear editor Transforms.delete(slateEditor, { at: { anchor: Editor.start(slateEditor, []), focus: Editor.end(slateEditor, []), } }); } // even tho we need to return this, it doesnt do anything return { shouldClear: false, shouldRefocus: true, }; } } />
); }