centralize all routes

This commit is contained in:
Anika Raemer 2025-09-13 10:19:11 +02:00
parent 5726bdb154
commit a10f3e37c2
5 changed files with 53 additions and 24 deletions

View file

@ -2,6 +2,7 @@ import { BrowserRouter as Router, Routes, Route } from "react-router-dom"
import RecipeDetailPage from "./components/recipes/RecipeDetailPage"
import RecipeEditPage from "./components/recipes/RecipeEditPage"
import RecipeListPage from "./components/recipes/RecipeListPage"
import { getRecipeAddUrlDefinition, getRecipeDetailsUrlDefinition, getRecipeEditUrlDefinition, getRootUrlDefinition } from "./routes"
import "./App.css"
@ -14,13 +15,16 @@ function App() {
<Router>
<Routes>
{/* Home page: list of recipes */}
<Route path="/" element={<RecipeListPage />} />
<Route path= {getRootUrlDefinition()} element={<RecipeListPage />} />
{/* Detail page: shows one recipe */}
<Route path="/recipe/:id" element={<RecipeDetailPage />} />
<Route path={getRecipeDetailsUrlDefinition()} element={<RecipeDetailPage />} />
{/* Edit page: form to edit a recipe */}
<Route path="/recipe/:id/edit" element={<RecipeEditPage />} />
<Route path={getRecipeEditUrlDefinition()} element={<RecipeEditPage />} />
{/* Add page: form to add a recipe */}
<Route path={getRecipeAddUrlDefinition()} element={<RecipeEditPage />} />
</Routes>
</Router>
)

View file

@ -2,6 +2,7 @@ import { useParams, Link } from "react-router-dom"
import type { Recipe } from "../../types/recipe"
import { useEffect, useState } from "react"
import { fetchRecipe } from "../../api/recipePoint"
import { getRecipeEditUrl, getRecipeListUrl } from "../../routes"
/**
@ -123,13 +124,13 @@ export default function RecipeDetailPage() {
{/* Action buttons */}
<div className="button-group">
<Link
to={`/recipe/${recipe.id}/edit`}
to={ getRecipeEditUrl(recipe.id) }
className="primary-button"
>
Bearbeiten
</Link>
<Link
to="/"
to={getRecipeListUrl()}
className="default-button"
>
Zurueck

View file

@ -3,6 +3,7 @@ import { useEffect, useState } from "react"
import type { Recipe } from "../../types/recipe"
import RecipeEditor from "./RecipeEditor"
import { fetchRecipe, createRecipe, updateRecipe } from "../../api/recipePoint"
import { getRecipeDetailUrl, getRecipeListUrl, getRootUrl } from "../../routes"
export default function RecipeEditPage() {
// Extract recipe ID from route params
@ -62,10 +63,10 @@ export default function RecipeEditPage() {
const navigateBack = () => {
if(recipe && recipe.id){
console.log("navigating to recipe with id", recipe.id)
navigate("/recipe/" + recipe.id) // go back to detail view
navigate(getRecipeDetailUrl(recipe.id)) // go back to detail view
} else {
console.log("navigating back to list as no recipe was selected")
navigate("/") // no recipe -> go back to list
navigate(getRecipeListUrl()) // no recipe -> go back to list
}
}
// error handling -> if there is no recipe, we cannot open edit view

View file

@ -2,6 +2,8 @@ import { useEffect, useState } from "react"
import RecipeListItem from "./RecipeListItem"
import type { Recipe } from "../../types/recipe"
import { fetchRecipeList } from "../../api/recipePoint"
import { useNavigate } from "react-router-dom"
import { getRecipeAddUrl, getRecipeAddUrlDefinition, getRecipeDetailUrl } from "../../routes"
/**
* Displays a list of recipes in a sidebar layout.
@ -9,6 +11,7 @@ import { fetchRecipeList } from "../../api/recipePoint"
*/
export default function RecipeListPage() {
const navigate = useNavigate()
const [recipeList, setRecipeList] = useState<Recipe[]|null>(null)
// load recipes once on render
useEffect(() => {
@ -25,6 +28,9 @@ export default function RecipeListPage() {
loadRecipeList()
}, [])
const handleAdd = () => {
navigate(getRecipeAddUrl())
}
if(!recipeList) { return <div>Unable to load recipes!</div>}
return (
/*Contaier spanning entire screen used to center content horizontally */
@ -39,7 +45,9 @@ export default function RecipeListPage() {
<input className="input-field"
placeholder="Search"
></input>
<button className="primary-button">
<button className="primary-button"
onClick={handleAdd}
>
Add recipe
</button>
</div>
@ -50,7 +58,7 @@ export default function RecipeListPage() {
<RecipeListItem
key={recipe.id}
title = {recipe.title}
targetPath={'recipe/'+recipe.id}
targetPath={getRecipeDetailUrl(recipe.id)}
/>
))}
</div>

15
frontend/src/routes.ts Normal file
View file

@ -0,0 +1,15 @@
/**
* Routes for all pages
*/
// Route definitions using :id as placeholder for the id
export function getRootUrlDefinition() : string { return getRootUrl()}
export function getRecipeDetailsUrlDefinition() : string {return getRecipeDetailUrl(":id")}
export function getRecipeEditUrlDefinition() : string {return getRecipeEditUrl(":id")}
export function getRecipeAddUrlDefinition() : string {return getRecipeAddUrl()}
// URLs including id
export function getRootUrl () : string { return "/"}
export function getRecipeListUrl() : string {return getRootUrl()}
export function getRecipeDetailUrl(id: string) : string {return "/recipe/" + id}
export function getRecipeEditUrl(id: string) : string {return "/recipe/" + id + "/edit"}
export function getRecipeAddUrl() : string {return "/new-recipe"}