diff --git a/00-backend/datasource/database.sqlite b/00-backend/datasource/database.sqlite
index 3a21bf7..670744a 100644
Binary files a/00-backend/datasource/database.sqlite and b/00-backend/datasource/database.sqlite differ
diff --git a/01-frontend/src/components/Rating.tsx b/01-frontend/src/components/Rating.tsx
index 3375529..c767c00 100644
--- a/01-frontend/src/components/Rating.tsx
+++ b/01-frontend/src/components/Rating.tsx
@@ -1,8 +1,7 @@
type RatingType = {
- id: string;
rating: number;
- text: string;
- date: string;
+ content: string;
+ timestamp: number;
};
export default RatingType;
\ No newline at end of file
diff --git a/01-frontend/src/helper/adminpanel/ItemsInfo.tsx b/01-frontend/src/helper/adminpanel/ItemsInfo.tsx
new file mode 100644
index 0000000..296d4a3
--- /dev/null
+++ b/01-frontend/src/helper/adminpanel/ItemsInfo.tsx
@@ -0,0 +1,10 @@
+import { Typography } from "@mui/material";
+
+export default function ItemInfo() {
+
+ return (
+
+ Under construction...
+
+ );
+}
\ No newline at end of file
diff --git a/01-frontend/src/helper/homepage/ItemCard.tsx b/01-frontend/src/helper/homepage/ItemCard.tsx
index 237f2bc..a418120 100644
--- a/01-frontend/src/helper/homepage/ItemCard.tsx
+++ b/01-frontend/src/helper/homepage/ItemCard.tsx
@@ -63,7 +63,7 @@ export default function ItemCard({ item }: { item: Item }) {
{item.name}
-
+
{(item.price100 / 100 * (1 - item.discount100 / 100)).toFixed(2)} €
diff --git a/01-frontend/src/helper/productpage/ProductInfo.tsx b/01-frontend/src/helper/productpage/ProductInfo.tsx
index 98f556c..d64ead6 100644
--- a/01-frontend/src/helper/productpage/ProductInfo.tsx
+++ b/01-frontend/src/helper/productpage/ProductInfo.tsx
@@ -104,9 +104,9 @@ export default function ProductInfo({ item }: { item: Item }) {
-
+
- {item.rating > 0 ? `(${item.rating} / 5)` : t('noRatingsYet')}
+ {item.rating > 0 ? `(${item.rating / 2} / 5)` : t('noRatingsYet')}
diff --git a/01-frontend/src/helper/productpage/RatingCard.tsx b/01-frontend/src/helper/productpage/RatingCard.tsx
index 76cb921..ae9469b 100644
--- a/01-frontend/src/helper/productpage/RatingCard.tsx
+++ b/01-frontend/src/helper/productpage/RatingCard.tsx
@@ -7,7 +7,7 @@ export default function RatingCard(ratingType: RatingType) {
const { t } = useTranslation();
const handleClick = () => {
- console.log(`Clicked on rating with id: ${ratingType.id}`);
+ console.log(`Clicked on rating`);
}
return (
@@ -16,11 +16,11 @@ export default function RatingCard(ratingType: RatingType) {
- {t('ratingFrom')} {ratingType.date}
+ {t('ratingFrom')} {new Date(ratingType.timestamp).toLocaleDateString('de-DE')}
-
+
- {ratingType.text}
+ {ratingType.content}
diff --git a/01-frontend/src/helper/productpage/Ratings.tsx b/01-frontend/src/helper/productpage/Ratings.tsx
index 151bbe8..5ff54e4 100644
--- a/01-frontend/src/helper/productpage/Ratings.tsx
+++ b/01-frontend/src/helper/productpage/Ratings.tsx
@@ -1,10 +1,10 @@
import { Close } from "@mui/icons-material";
import { Box, Button, Divider, IconButton, Rating, Snackbar, SnackbarCloseReason, TextField, Typography } from "@mui/material";
import { useQuery } from "@tanstack/react-query";
-import React, { useState } from "react";
+import React, { useMemo, useState } from "react";
import { useTranslation } from 'react-i18next';
import RatingType from "../../components/Rating";
-import { submitRating } from "../query/Queries";
+import { fetchRatingList, submitRating } from "../query/Queries";
import RatingCard from "./RatingCard";
import RatingSubmitType from "../../components/RatingSubmit";
@@ -58,26 +58,22 @@ export default function Ratings({itemId}: {itemId: string}) {
);
- const ratings: RatingType[] = [
- {
- id: "1",
- rating: 4.5,
- text: "Great product!",
- date: "2023-10-01",
- },
- {
- id: "2",
- rating: 3.0,
- text: "Average quality.",
- date: "2023-10-02",
- },
- {
- id: "3",
- rating: 5.0,
- text: "Excellent value for money!",
- date: "2023-10-03",
- },
- ];
+ const { data = [] } = useQuery({
+ queryKey: ['fetchRatingList', itemId],
+ queryFn: () => fetchRatingList(itemId),
+ retry: 3, // Versucht es 3-mal erneut
+ retryDelay: 1000, // Wartezeit zwischen den Versuchen (in ms)
+ });
+
+ const ratings:RatingType[] = useMemo(() => data || [], [data]);
+
+ const getRatings = () => {
+ if (ratings.length === 0)
+ return {t('noRatingsYet')};
+ return ratings.map((ratingType: RatingType) => (
+
+ ))
+ };
return (
<>
@@ -105,9 +101,7 @@ export default function Ratings({itemId}: {itemId: string}) {
- {ratings.map((ratingType: RatingType) => (
-
- ))}
+ {getRatings()}
{
};
export const submitRating = async (ratingData: RatingSubmitType) => {
- const response = await fetch('http://localhost:8085/rating', {
+ const response = await fetch('http://localhost:8085/review?uuid=' + ratingData.articleId + '&rating=' + ratingData.rating * 2, {
method: 'POST',
headers: {
- 'Content-Type': 'application/json',
+ 'Content-Type': 'text/plain',
},
- body: JSON.stringify(ratingData),
+ body: ratingData.content,
});
if (!response.ok) {
@@ -29,4 +29,15 @@ export const submitRating = async (ratingData: RatingSubmitType) => {
const data = await response.json();
console.log("Rating Submitted:", data);
return data;
-}
\ No newline at end of file
+}
+
+export const fetchRatingList = async (itemId: string) => {
+ const response = await fetch('http://localhost:8085/review/all?uuid=' + itemId);
+ console.log("API Response:", response);
+ if (!response.ok) {
+ throw new Error('Fehler beim Laden der Items');
+ }
+ const data = await response.json();
+ console.log("Fetched Items:", data);
+ return data;
+};
\ No newline at end of file
diff --git a/01-frontend/src/pages/AdminPanel.tsx b/01-frontend/src/pages/AdminPanel.tsx
index d44a48a..3baec57 100644
--- a/01-frontend/src/pages/AdminPanel.tsx
+++ b/01-frontend/src/pages/AdminPanel.tsx
@@ -1,10 +1,11 @@
-import { AccountCircle, QueryStats, ReceiptLong } from "@mui/icons-material";
+import { AccountCircle, Category, QueryStats, ReceiptLong } from "@mui/icons-material";
import { Box, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Typography } from "@mui/material";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import AccountsInfo from "../helper/adminpanel/AccountsInfo";
import OrdersInfo from "../helper/adminpanel/OrdersInfo";
import StatisticsInfo from "../helper/adminpanel/StatisticsInfo";
+import ItemInfo from "../helper/adminpanel/ItemsInfo";
export default function AdminPanel() {
const { t } = useTranslation();
@@ -24,6 +25,8 @@ export default function AdminPanel() {
return ;
case "accounts":
return ;
+ case "items":
+ return ;
default:
return ; // Fallback, falls kein gültiger Status
}
@@ -68,6 +71,14 @@ export default function AdminPanel() {
+
+ handleInfoStatus("items")}>
+
+
+
+
+
+