frontend route handlers

This commit is contained in:
2025-05-29 12:08:38 +03:00
parent 403c7e4153
commit 6987560a37
3 changed files with 162 additions and 34 deletions

View File

@@ -11,46 +11,96 @@ export default function UserRoutes() {
const [error, setError] = useState<string | null>(null) const [error, setError] = useState<string | null>(null)
const [loading, setLoading] = useState(true) const [loading, setLoading] = useState(true)
useEffect(() => { const fetchRoutes = async () => {
const fetchRoutes = async () => { try {
try { const response = await fetch('/api/account/routes', {
const response = await fetch('/api/account/routes', { method: 'GET',
method: 'GET', headers: {
headers: { 'Content-Type': 'application/json',
'Content-Type': 'application/json', },
}, })
})
if (!response.ok) { if (!response.ok) {
const error = await response.json() const error = await response.json()
throw new Error(error.message || 'Failed to fetch routes') throw new Error(error.message || 'Failed to fetch routes')
}
const data = await response.json()
setRoutes(data || [])
} catch (error) {
console.error('Error fetching routes:', error)
setError(error instanceof Error ? error.message : 'Не удалось загрузить маршруты')
} finally {
setLoading(false)
} }
}
const data = await response.json()
setRoutes(data || [])
} catch (error) {
console.error('Error fetching routes:', error)
setError(error instanceof Error ? error.message : 'Не удалось загрузить маршруты')
} finally {
setLoading(false)
}
}
useEffect(() => {
fetchRoutes() fetchRoutes()
}, []) }, [])
const handleHighlight = () => { const handleHighlight = async (route: Route) => {
showToast({ try {
type: 'success', const response = await fetch(`/api/account/highlight`, {
message: 'Ваше объявление выделено на сутки!', method: 'PATCH',
}) headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
route_id: route.id,
}),
})
if (!response.ok) {
const error = await response.json()
throw new Error(error.message || 'Failed to highlight route')
}
await fetchRoutes()
showToast({
type: 'success',
message: 'Ваше объявление выделено на сутки!',
})
} catch (error) {
console.error('Error highlighting route:', error)
showToast({
type: 'error',
message: 'Не удалось выделить объявление',
})
}
} }
const handleUpper = () => { const handleUpper = async (route: Route) => {
showToast({ try {
type: 'success', const response = await fetch(`/api/account/upper`, {
message: 'Ваше объявление поднято в выдаче!', method: 'PATCH',
}) headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
route_id: route.id,
}),
})
if (!response.ok) {
const error = await response.json()
throw new Error(error.message || 'Failed to upper route')
}
await fetchRoutes()
showToast({
type: 'success',
message: 'Ваше объявление поднято в выдаче!',
})
} catch (error) {
console.error('Error upper route:', error)
showToast({
type: 'error',
message: 'Не удалось поднять объявление',
})
}
} }
if (loading) { if (loading) {
@@ -149,12 +199,12 @@ export default function UserRoutes() {
<Button <Button
text="Поднять объявление" text="Поднять объявление"
className="border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-100 focus:outline-none" className="border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-100 focus:outline-none"
onClick={handleUpper} onClick={() => handleUpper(route)}
/> />
<Button <Button
text="Выделить рамкой" text="Выделить рамкой"
className="border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-100 focus:outline-none" className="border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-100 focus:outline-none"
onClick={handleHighlight} onClick={() => handleHighlight(route)}
/> />
</div> </div>
</div> </div>

View File

@@ -0,0 +1,39 @@
import { NextRequest } from 'next/server'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/app/api/auth/[...nextauth]/route'
export async function PATCH(req: NextRequest) {
try {
const session = await getServerSession(authOptions)
if (!session) {
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
status: 401,
})
}
const { route_id } = await req.json()
const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/account/route_highlight/`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${session.accessToken}`,
},
body: JSON.stringify({ route_id }),
})
if (!response.ok) {
const error = await response.json()
return new Response(JSON.stringify(error), { status: response.status })
}
const result = await response.json()
return new Response(JSON.stringify(result), { status: 200 })
} catch (error) {
console.error('PATCH /api/account/highlight error:', error)
return new Response(JSON.stringify({ error: 'Internal Server Error' }), {
status: 500,
})
}
}

View File

@@ -0,0 +1,39 @@
import { NextRequest } from 'next/server'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/app/api/auth/[...nextauth]/route'
export async function PATCH(req: NextRequest) {
try {
const session = await getServerSession(authOptions)
if (!session) {
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
status: 401,
})
}
const { route_id } = await req.json()
const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/account/route_up/`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${session.accessToken}`,
},
body: JSON.stringify({ route_id }),
})
if (!response.ok) {
const error = await response.json()
return new Response(JSON.stringify(error), { status: response.status })
}
const result = await response.json()
return new Response(JSON.stringify(result), { status: 200 })
} catch (error) {
console.error('PATCH /api/account/route_up error:', error)
return new Response(JSON.stringify({ error: 'Internal Server Error' }), {
status: 500,
})
}
}