-
-
- Имя: {userName}
-
-
-
-
-
-
-
-
-
+ isLoading ?
: (
+
+
+
+ Имя: {userName}
+
+
+
+
+
+
+
+
+
+
+
+ {onClose && }
+
+
-
- {onClose && }
-
-
-
-
+ )
);
}
\ No newline at end of file
diff --git a/src/components/review-form/use-review-form.jsx b/src/components/review-form/use-review-form.jsx
index 016a8b8..60a5616 100644
--- a/src/components/review-form/use-review-form.jsx
+++ b/src/components/review-form/use-review-form.jsx
@@ -1,19 +1,14 @@
+"use client"
import { useCallback } from "react";
import { useReducer } from "react";
const INITIAL_VALUE = {
- // name: "",
text: "",
rating: 1,
};
const reducer = (state, { type, payload }) => {
switch (type) {
- // case "setName":
- // return {
- // ...INITIAL_VALUE,
- // name: payload,
- // };
case "setText":
return {
...state,
@@ -30,14 +25,9 @@ const reducer = (state, { type, payload }) => {
}
};
-export const useReviewForm = (initialValue = INITIAL_VALUE) => {
+export const useReviewForm = (initialValue = INITIAL_VALUE, userId) => {
const [form, dispatch] = useReducer(reducer, initialValue);
- // const setName = useCallback(
- // (event) => dispatch({ type: "setName", payload: event.target.value }),
- // []
- // );
-
const setText = useCallback((event) => {
dispatch({ type: "setText", payload: event.target.value });
}, []);
@@ -47,9 +37,13 @@ export const useReviewForm = (initialValue = INITIAL_VALUE) => {
[]
);
+ const formWithUserId = {
+ ...form,
+ userId,
+ };
+
return {
- form,
- //setName,
+ form: formWithUserId,
setText,
setRating,
};
diff --git a/src/components/review/component.jsx b/src/components/review/component.jsx
index 05bd4a8..4166e6a 100644
--- a/src/components/review/component.jsx
+++ b/src/components/review/component.jsx
@@ -4,9 +4,8 @@ import { Button } from '../button/component';
import { useState } from 'react';
import { UpdateReviewFormContainer } from '../update-review-form/container';
-export const Review = ({ review, user }) => {
+export const Review = ({ review, user, onUpdate }) => {
const [isEditMode, setIsEditMode] = useState(false);
-
const setEditMode = () => {
setIsEditMode(true);
};
@@ -18,14 +17,15 @@ export const Review = ({ review, user }) => {
return (
- {user && {user.name + ': '}}
+ {user.name + ': '}
{review.text + ' '}
- {isEditMode && setIsEditMode(false)} onClose={handleCancelClick}
- />}
+ {isEditMode && }
+
)
}
diff --git a/src/components/review/container.jsx b/src/components/review/container.jsx
index b862f9c..f353ecd 100644
--- a/src/components/review/container.jsx
+++ b/src/components/review/container.jsx
@@ -1,8 +1,11 @@
import { getUserById } from '@/services/api';
import { Review } from './component';
-export const ReviewContainer = async ({ review }) => {
+export const ReviewContainer = async ({ review, onUpdate }) => {
const user = await getUserById(review.userId);
- return
+ return (
+
+ )
+
}
diff --git a/src/components/reviews/component.jsx b/src/components/reviews/component.jsx
index d3e81ea..1614dad 100644
--- a/src/components/reviews/component.jsx
+++ b/src/components/reviews/component.jsx
@@ -1,6 +1,7 @@
+import { CreateReviewFormContainer } from "../create-review-form/container";
import { ReviewContainer } from "../review/container";
-export const Reviews = ({ reviews }) => {
+export const Reviews = ({ reviews, onSave, onUpdate }) => {
return (
<>
@@ -9,11 +10,12 @@ export const Reviews = ({ reviews }) => {
{reviews?.map((review) => {
return (
-
+
);
})}
+
>
);
};
diff --git a/src/components/reviews/container.jsx b/src/components/reviews/container.jsx
new file mode 100644
index 0000000..aa7c22e
--- /dev/null
+++ b/src/components/reviews/container.jsx
@@ -0,0 +1,19 @@
+import { Reviews } from "./component";
+import { createReview, updateReview, getReviewsByRestaurantId } from "@/services/api";
+
+export const ReviewsContainer = async ({ restaurantId }) => {
+ const reviews = await getReviewsByRestaurantId(restaurantId);
+ const onSave = async (newReview) => {
+ "use server";
+ await createReview(restaurantId, newReview);
+ };
+ const onUpdate = async (updatedReview) => {
+ "use server";
+ await updateReview(updatedReview);
+ };
+
+
+ return (
+
+ );
+};
diff --git a/src/components/reviews/styles.module.scss b/src/components/reviews/styles.module.scss
deleted file mode 100644
index e271e71..0000000
--- a/src/components/reviews/styles.module.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/components/tabs/components.jsx b/src/components/tabs/components.jsx
index 3c88da0..70a1112 100644
--- a/src/components/tabs/components.jsx
+++ b/src/components/tabs/components.jsx
@@ -1,15 +1,25 @@
+
+'use client'
import Link from 'next/link';
import styles from './styles.module.scss';
-import { Button } from '../button/component';
+import { ButtonMemoized } from '../button/component';
+import { usePathname } from 'next/navigation'
export const Tabs = ({ restaurants }) => {
+ const pathname = usePathname();
return (
- {restaurants.map((restaurant) => (
-
-
-
- ))}
+ {restaurants.map((restaurant) => {
+ const id = restaurant.id.toString();
+ const isActive = pathname.endsWith(id);
+
+ return (
+
+ {restaurant.name}
+
+ );
+ })}
);
};
\ No newline at end of file
diff --git a/src/components/update-review-form/container.jsx b/src/components/update-review-form/container.jsx
index 6291857..7c53557 100644
--- a/src/components/update-review-form/container.jsx
+++ b/src/components/update-review-form/container.jsx
@@ -1,38 +1,15 @@
-import { Loader } from "../loader/component";
import { ReviewForm } from "../review-form/component"
-export const UpdateReviewFormContainer = ({ review, user, onUpdatedFinishet, onClose }) => {
- // const [updateReview, { isLoading, isSuccess }] = useUpdateReviewMutation();
- // useEffect(() => {
- // if (isSuccess) {
- // onUpdatedFinishet();
- // }
- // }, [isSuccess, onUpdatedFinishet]);
-
- // if (!user || !review) {
- // return null;
- // }
-
- // if (isLoading) {
- // return ;
- // }
+export const UpdateReviewFormContainer = ({ review, user, onClose, onUpdate }) => {
const { id, text, rating } = review;
-
return (
updateReview({
- // reviewId: id,
- // review: {
- // ...updatedReview,
- // userId: user.id,
- // id,
- // }
- // })}
-
- onClose={onClose}
- />
+ userId={user?.id}
+ onSave={onUpdate}
+ onClose={onClose}
+ />
);
}
diff --git a/src/components/user/component.jsx b/src/components/user/component.jsx
index c88ed3b..1448f87 100644
--- a/src/components/user/component.jsx
+++ b/src/components/user/component.jsx
@@ -26,11 +26,12 @@ export const User = () => {
<>
{isAuthenticated ? (
-
+ <>
name: {name}
e-mail: {email}
+ id: {id}
-
+ >
) : (
<>
diff --git a/src/context/store-provider.js b/src/context/store-provider.js
deleted file mode 100644
index e66abc4..0000000
--- a/src/context/store-provider.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use client";
-
-import React, { useState } from 'react';
-
-export const UserContext = React.createContext();
-
-export const UserProvider = ({ children }) => {
-
- const [user, setUser] = useState({ name: "", email: "" });
-
- const updateUser = (newUser) => {
- setUser(newUser);
- };
-
- return (
-
- {children}
-
- );
-};
-
-
diff --git a/src/context/user-provider.js b/src/context/user-provider.js
index 649d4ba..0a19205 100644
--- a/src/context/user-provider.js
+++ b/src/context/user-provider.js
@@ -6,7 +6,7 @@ export const UserContext = React.createContext();
export const UserProvider = ({ children }) => {
- const [user, setUser] = useState({ name: "", email: "" });
+ const [user, setUser] = useState({ name: "", email: "", id:"" });
const updateUser = (newUser) => {
setUser(newUser);
diff --git a/src/services/api.js b/src/services/api.js
index bf34d49..40d8329 100644
--- a/src/services/api.js
+++ b/src/services/api.js
@@ -1,3 +1,4 @@
+import { revalidateTag } from "next/cache";
export async function getRestaurants() {
const response = await fetch('http://localhost:3001/api/restaurants');
return await response.json();
@@ -13,11 +14,6 @@ export async function getDishesByRestaurantId(restaurantId) {
return await response.json();
}
-export async function getReviewsByRestaurantId(restaurantId) {
- const response = await fetch(`http://localhost:3001/api/reviews?restaurantId=${restaurantId}`);
- return await response.json();
-}
-
export async function getUser() {
const response = await fetch(`http://localhost:3001/api/users`);
return await response.json();
@@ -30,3 +26,42 @@ export async function getUserById(userId) {
return user;
}
+export async function getReviewsByRestaurantId(restaurantId) {
+ const response = await fetch(`http://localhost:3001/api/reviews?restaurantId=${restaurantId}`,
+ { next: { tags: ['reviews'] } }
+ )
+ return await response.json();
+}
+export async function createReview(restaurantId, newReview) {
+ console.log("createReview : ", newReview.text);
+ const requestOptions = {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(newReview),
+ };
+
+ await fetch(`http://localhost:3001/api/review/${restaurantId}`,
+ requestOptions);
+ revalidateTag('reviews');
+};
+
+export async function updateReview(review) {
+ const requestOptions = {
+ method: 'PATCH',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(review),
+ };
+
+ await fetch(`http://localhost:3001/api/review/${review.id}`, requestOptions);
+ revalidateTag('reviews');
+};
+
+export async function getDishById(dishId) {
+ const response = await fetch(`http://localhost:3001/api/dish/${dishId}`);
+ return await response.json();;
+};
+
+
+
+
+