From 2de9b9e27d6764de9904e471c299527f1f7b4076 Mon Sep 17 00:00:00 2001 From: HotelSync Date: Tue, 21 Apr 2026 00:21:26 +0300 Subject: [PATCH] fix: ReviewsPage use useAuth for slug; reviews redirect by booking source MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace useParams with useAuth().user.hotelSlug in ReviewsPage - Backend: filter platforms by booking source when review_redirect_source=true (booking_com→Booking.com, yandex_travel→Яндекс, airbnb, expedia, vrbo) - If source has matching platform — show only that one; otherwise all platforms Co-Authored-By: Claude Sonnet 4.6 --- backend/src/routes/reviews.ts | 37 ++++++++++++++++++++++++++++------- src/pages/ReviewsPage.tsx | 5 +++-- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/backend/src/routes/reviews.ts b/backend/src/routes/reviews.ts index f3f4640..a7322a5 100644 --- a/backend/src/routes/reviews.ts +++ b/backend/src/routes/reviews.ts @@ -119,13 +119,40 @@ const reviewsRoutes: FastifyPluginAsync = async (fastify) => { AND key IN ( 'review_redirect_threshold','review_platforms', 'review_show_text_field','review_welcome_text', - 'review_brand_color' + 'review_brand_color','review_redirect_source' )`, [row.hotel_id], ) const s: Record = {} for (const r of settings) s[r.key] = r.value + // Mapping booking source → keyword to match in platform name + const SOURCE_KEYWORD: Record = { + booking_com: 'booking', + airbnb: 'airbnb', + expedia: 'expedia', + vrbo: 'vrbo', + yandex_travel: 'яндекс', + } + + const allPlatforms = Array.isArray(s.review_platforms) + ? (s.review_platforms as { name: string; url: string; enabled: boolean }[]) + .filter(p => p.enabled) + : [] + + const useSourceRedirect = s.review_redirect_source !== false + const bookingSrc = row.booking_source ?? 'direct' + const keyword = SOURCE_KEYWORD[bookingSrc] + + // If source redirect is on and we have a matching platform — show only that one + let platforms = allPlatforms.map(p => ({ name: p.name, url: p.url })) + if (useSourceRedirect && keyword) { + const match = allPlatforms.find(p => + p.name.toLowerCase().includes(keyword), + ) + if (match) platforms = [{ name: match.name, url: match.url }] + } + return { hotelName: row.hotel_name, logoLetter: (row.hotel_name as string)[0] ?? 'О', @@ -133,13 +160,9 @@ const reviewsRoutes: FastifyPluginAsync = async (fastify) => { color: (s.review_brand_color as string | undefined) ?? '#2563eb', redirectThreshold: Number(s.review_redirect_threshold ?? 4), showTextField: s.review_show_text_field !== false, - platforms: Array.isArray(s.review_platforms) - ? (s.review_platforms as { name: string; url: string; enabled: boolean }[]) - .filter(p => p.enabled) - .map(p => ({ name: p.name, url: p.url })) - : [], + platforms, guestName: row.guest_name ?? '', - bookingSource: row.booking_source ?? 'direct', + bookingSource: bookingSrc, } }, ) diff --git a/src/pages/ReviewsPage.tsx b/src/pages/ReviewsPage.tsx index 91038dc..7ff99b7 100644 --- a/src/pages/ReviewsPage.tsx +++ b/src/pages/ReviewsPage.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback } from 'react' -import { useParams } from 'react-router-dom' +import { useAuth } from '../contexts/AuthContext' import { Star, ThumbsDown, Copy, CheckCheck, MessageSquare, QrCode, ArrowUpRight, Plus, Trash2, ExternalLink, Settings2, @@ -65,7 +65,8 @@ type Tab = 'pending' | 'published' | 'all' | 'preview' | 'settings' // ── Component ───────────────────────────────────────────────────────────────── export function ReviewsPage() { - const { slug } = useParams<{ slug: string }>() + const { user } = useAuth() + const slug = user?.hotelSlug ?? '' const [reviews, setReviews] = useState([]) const [loading, setLoading] = useState(true)