diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 1af953fe..d118b20b 100755 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -223,7 +223,7 @@ "rating": "Rating", "rating_stats": "Rating", "rating_very_negative": "Very Negative", - "rating_negative": "Negative", + "rating_negative": "Negative", "rating_neutral": "Neutral", "rating_positive": "Positive", "rating_very_positive": "Very Positive", diff --git a/src/renderer/src/components/game-card/game-card.scss b/src/renderer/src/components/game-card/game-card.scss index 99aa866e..1830762f 100644 --- a/src/renderer/src/components/game-card/game-card.scss +++ b/src/renderer/src/components/game-card/game-card.scss @@ -73,7 +73,7 @@ color: globals.$muted-color; font-size: 12px; align-items: center; - + // Ensure star rating is properly aligned .star-rating { align-items: center; diff --git a/src/renderer/src/components/game-card/game-card.tsx b/src/renderer/src/components/game-card/game-card.tsx index 1aa58ba7..6e790500 100644 --- a/src/renderer/src/components/game-card/game-card.tsx +++ b/src/renderer/src/components/game-card/game-card.tsx @@ -109,7 +109,7 @@ export function GameCard({ game, ...props }: GameCardProps) {
- ) { if (rating === null && showCalculating) { return (
@@ -40,25 +40,36 @@ export function StarRating({ return (
- {Array.from({ length: filledStars }, (_, index) => ( - + ))} - {hasHalfStar && (
- - + +
)} - {Array.from({ length: emptyStars }, (_, index) => ( - + ))} - + {rating.toFixed(1)}
); -} \ No newline at end of file +} diff --git a/src/renderer/src/pages/game-details/game-details-content.tsx b/src/renderer/src/pages/game-details/game-details-content.tsx index 2b6de1d8..9060dc39 100644 --- a/src/renderer/src/pages/game-details/game-details-content.tsx +++ b/src/renderer/src/pages/game-details/game-details-content.tsx @@ -1,5 +1,10 @@ import { useContext, useEffect, useMemo, useRef, useState } from "react"; -import { PencilIcon, TrashIcon, ClockIcon, NoteIcon } from "@primer/octicons-react"; +import { + PencilIcon, + TrashIcon, + ClockIcon, + NoteIcon, +} from "@primer/octicons-react"; import { ThumbsUp, ThumbsDown, Star } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { useEditor, EditorContent } from "@tiptap/react"; @@ -68,12 +73,18 @@ const getSelectScoreColorClass = (score: number): string => { const getRatingText = (score: number, t: (key: string) => string): string => { switch (score) { - case 1: return t("rating_very_negative"); - case 2: return t("rating_negative"); - case 3: return t("rating_neutral"); - case 4: return t("rating_positive"); - case 5: return t("rating_very_positive"); - default: return ""; + case 1: + return t("rating_very_negative"); + case 2: + return t("rating_negative"); + case 3: + return t("rating_neutral"); + case 4: + return t("rating_positive"); + case 5: + return t("rating_very_positive"); + default: + return ""; } }; @@ -163,23 +174,23 @@ export function GameDetailsContent() { handlePaste: (view, event) => { const htmlContent = event.clipboardData?.getData("text/html") || ""; const plainText = event.clipboardData?.getData("text/plain") || ""; - + const currentText = view.state.doc.textContent; const remainingChars = MAX_REVIEW_CHARS - currentText.length; if ((htmlContent || plainText) && remainingChars > 0) { event.preventDefault(); - + if (htmlContent) { const tempDiv = document.createElement("div"); tempDiv.innerHTML = htmlContent; const textLength = tempDiv.textContent?.length || 0; - + if (textLength <= remainingChars) { - return false; + return false; } } - + const truncatedText = plainText.slice(0, remainingChars); view.dispatch(view.state.tr.insertText(truncatedText)); return true; @@ -343,7 +354,7 @@ export function GameDetailsContent() { } setSubmittingReview(true); - + try { await window.electron.createGameReview( shop, @@ -355,12 +366,13 @@ export function GameDetailsContent() { editor?.commands.clearContent(); setReviewScore(null); showSuccessToast(t("review_submitted_successfully")); - - await loadReviews(true); - setShowReviewForm(false); - setShowReviewPrompt(false); + + await loadReviews(true); + setShowReviewForm(false); + setShowReviewPrompt(false); setHasUserReviewed(true); } catch (error) { + console.error("Failed to submit review:", error); showErrorToast(t("review_submission_failed")); } finally { setSubmittingReview(false); @@ -387,7 +399,7 @@ export function GameDetailsContent() { const handleReviewPromptLater = () => { setShowReviewPrompt(false); if (objectId) { - sessionStorage.setItem(`reviewPromptDismissed_${objectId}`, 'true'); + sessionStorage.setItem(`reviewPromptDismissed_${objectId}`, "true"); } }; @@ -422,7 +434,7 @@ export function GameDetailsContent() { useEffect(() => { if (objectId && (game || shop)) { loadReviews(true); - checkUserReview(); + checkUserReview(); } }, [game, shop, objectId, reviewsSortBy, userDetails]); @@ -661,9 +673,13 @@ export function GameDetailsContent() { onClick={() => setReviewScore(starValue)} title={getRatingText(starValue, t)} > - ))} @@ -684,7 +700,6 @@ export function GameDetailsContent() { ? t("submitting") : t("submit_review")} -
@@ -774,12 +789,19 @@ export function GameDetailsContent() { -
+
{[1, 2, 3, 4, 5].map((starValue) => (