diff --git a/src/app/api-utlities/clients/taylor.client.ts b/src/app/api-utlities/clients/taylor.client.ts index 7247e4a..1bb09c0 100644 --- a/src/app/api-utlities/clients/taylor.client.ts +++ b/src/app/api-utlities/clients/taylor.client.ts @@ -2,7 +2,7 @@ import { jsonToGraphQLQuery } from 'json-to-graphql-query'; export const requestTaylor = async (query: object, variables?: object) => { const body = JSON.stringify({ - query: jsonToGraphQLQuery({ query }), + query: jsonToGraphQLQuery(query), variables, }); diff --git a/src/app/api-utlities/requests/common.ts b/src/app/api-utlities/requests/common.ts index 742ee1f..136dd39 100644 --- a/src/app/api-utlities/requests/common.ts +++ b/src/app/api-utlities/requests/common.ts @@ -1,4 +1,4 @@ -import { EnumType } from 'json-to-graphql-query'; +import { EnumType, VariableType } from 'json-to-graphql-query'; export const stationsRequest = { _azs: { @@ -146,6 +146,18 @@ export const historyRequest = { export const reviewsRequest = { _otzyvy: { + __args: { + filtersSet: { + conjunction: new EnumType('and'), + filtersSet: [ + { + field: new EnumType('_status'), + operator: 'contains', + value: 'Опубликовано', + }, + ], + }, + }, records: { id: true, _name: true, @@ -182,3 +194,17 @@ export const certificatesRequest = { }, }, }; + +export const createReviewMutation = { + __variables: { + review: 'TableOtzyvyMutationParameters', + }, + _otzyvy: { + createRecord: { + __args: { + records: [new VariableType('review')], + }, + id: true, + }, + }, +}; diff --git a/src/app/api/reviews/create/route.ts b/src/app/api/reviews/create/route.ts new file mode 100644 index 0000000..24a3d01 --- /dev/null +++ b/src/app/api/reviews/create/route.ts @@ -0,0 +1,32 @@ +import { NextRequest } from 'next/server'; +import { z } from 'zod'; + +import { requestTaylor } from '@/app/api-utlities/clients/taylor.client'; +import { createReviewMutation } from '@/app/api-utlities/requests/common'; + +export const POST = async (req: NextRequest) => { + const body = await req.json(); + + const validatedRequest = z + .object({ + name: z.string(), + text: z.string(), + rating: z.number().min(0).max(5), + }) + .parse(body); + + await requestTaylor( + { mutation: createReviewMutation }, + { + review: { + _name: validatedRequest.name, + _otzyv: validatedRequest.text, + _rejting: validatedRequest.rating, + }, + }, + ); + + return new Response(JSON.stringify({ success: true }), { + status: 201, + }); +}; diff --git a/src/entities/transactions/model/types.ts b/src/entities/transactions/model/types.ts index 46fb6c8..02cc3c8 100644 --- a/src/entities/transactions/model/types.ts +++ b/src/entities/transactions/model/types.ts @@ -10,7 +10,8 @@ export interface TransactionResponse { export interface Transaction { id: number; date_create: string; - station: string; + station?: string; + station_name?: string; product_name: string; amount: string; price_real: string; diff --git a/src/features/review-form/api/reviews.api.ts b/src/features/review-form/api/reviews.api.ts new file mode 100644 index 0000000..3d23019 --- /dev/null +++ b/src/features/review-form/api/reviews.api.ts @@ -0,0 +1,17 @@ +import { baseAPI } from '@/shared/api/base-api'; + +import { ReviewFormValues } from '../model/review-form.schema'; + +export const reviewsAPI = baseAPI.injectEndpoints({ + endpoints: (build) => ({ + createReview: build.mutation({ + query: (body) => ({ + url: 'reviews/create', + method: 'POST', + body, + }), + }), + }), +}); + +export const { useCreateReviewMutation } = reviewsAPI; diff --git a/src/features/review-form/ui/index.tsx b/src/features/review-form/ui/index.tsx index dfa88e8..9b412c3 100644 --- a/src/features/review-form/ui/index.tsx +++ b/src/features/review-form/ui/index.tsx @@ -27,12 +27,8 @@ import { } from '@/shared/shadcn-ui/form'; import { Input } from '@/shared/shadcn-ui/input'; import { Textarea } from '@/shared/shadcn-ui/textarea'; -import { - Tooltip, - TooltipContent, - TooltipTrigger, -} from '@/shared/shadcn-ui/tooltip'; +import { useCreateReviewMutation } from '../api/reviews.api'; import { ReviewFormValues, reviewSchema } from '../model/review-form.schema'; export function ReviewForm() { @@ -40,6 +36,8 @@ export function ReviewForm() { const [isSubmitting, setIsSubmitting] = useState(false); const [hoveredStar, setHoveredStar] = useState(0); + const [createReview] = useCreateReviewMutation(); + const form = useForm({ resolver: zodResolver(reviewSchema), defaultValues: { @@ -53,7 +51,7 @@ export function ReviewForm() { setIsSubmitting(true); try { - await new Promise((resolve) => setTimeout(resolve, 1500)); + await createReview(data); toast.success( 'Спасибо за ваш отзыв! Он будет опубликован после модерации.', diff --git a/src/pages-templates/about/index.tsx b/src/pages-templates/about/index.tsx index a0259f1..5eebb9a 100644 --- a/src/pages-templates/about/index.tsx +++ b/src/pages-templates/about/index.tsx @@ -4,14 +4,12 @@ import { Fuel, History, MapPin, Star, Target, Users } from 'lucide-react'; import Image from 'next/image'; import Link from 'next/link'; -import { Reviews } from '@/app/api-utlities/@types'; import { AboutUsPageData } from '@/app/api-utlities/@types/pages'; import { ReviewForm } from '@/features/review-form/ui'; import AnimatedCounter from '@/shared/components/animated-counter'; import { Container } from '@/shared/components/container'; -import { Rating } from '@/shared/components/rating'; import { Review } from '@/shared/components/review'; import { useTextController } from '@/shared/language/hooks/use-text-controller'; import { Button } from '@/shared/shadcn-ui/button'; @@ -296,7 +294,7 @@ export default function AboutPage({ content }: AboutPageProps) { ))} -
+
diff --git a/src/widgets/transactions-table.tsx b/src/widgets/transactions-table.tsx index f67f90b..596ff81 100644 --- a/src/widgets/transactions-table.tsx +++ b/src/widgets/transactions-table.tsx @@ -199,7 +199,9 @@ export const TransactionsTable = ({ {format(new Date(transaction.date_create), 'dd.MM.yyyy')} - {transaction.station} + + {transaction.station || transaction.station_name} + {transaction.product_name} {transaction.price_real} @@ -268,7 +270,9 @@ export const TransactionsTable = ({
- {t('transactions.entries')} + + {t('transactions.entries')} +