diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index e52a9f3..7a4e2b7 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -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() { {/* Home page: list of recipes */} - } /> + } /> {/* Detail page: shows one recipe */} - } /> + } /> {/* Edit page: form to edit a recipe */} - } /> + } /> + + {/* Add page: form to add a recipe */} + } /> ) diff --git a/frontend/src/components/recipes/RecipeDetailPage.tsx b/frontend/src/components/recipes/RecipeDetailPage.tsx index 715b383..2bb952b 100644 --- a/frontend/src/components/recipes/RecipeDetailPage.tsx +++ b/frontend/src/components/recipes/RecipeDetailPage.tsx @@ -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 */}
Bearbeiten Zurueck diff --git a/frontend/src/components/recipes/RecipeEditPage.tsx b/frontend/src/components/recipes/RecipeEditPage.tsx index 624487d..f1022b4 100644 --- a/frontend/src/components/recipes/RecipeEditPage.tsx +++ b/frontend/src/components/recipes/RecipeEditPage.tsx @@ -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 diff --git a/frontend/src/components/recipes/RecipeListPage.tsx b/frontend/src/components/recipes/RecipeListPage.tsx index 90753e0..4ba39ab 100644 --- a/frontend/src/components/recipes/RecipeListPage.tsx +++ b/frontend/src/components/recipes/RecipeListPage.tsx @@ -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,22 +11,26 @@ import { fetchRecipeList } from "../../api/recipePoint" */ export default function RecipeListPage() { - const [recipeList, setRecipeList] = useState(null) - // load recipes once on render - useEffect(() => { - const loadRecipeList = async () => { - try { - // Fetch recipe list - console.log("loading recipe list") - const data = await fetchRecipeList() - setRecipeList(data) - } catch (err) { - console.error(err) - } - } - loadRecipeList() - }, []) + const navigate = useNavigate() + const [recipeList, setRecipeList] = useState(null) + // load recipes once on render + useEffect(() => { + const loadRecipeList = async () => { + try { + // Fetch recipe list + console.log("loading recipe list") + const data = await fetchRecipeList() + setRecipeList(data) + } catch (err) { + console.error(err) + } + } + loadRecipeList() + }, []) + const handleAdd = () => { + navigate(getRecipeAddUrl()) + } if(!recipeList) { return
Unable to load recipes!
} return ( /*Contaier spanning entire screen used to center content horizontally */ @@ -39,7 +45,9 @@ export default function RecipeListPage() { -
@@ -50,7 +58,7 @@ export default function RecipeListPage() { ))} diff --git a/frontend/src/routes.ts b/frontend/src/routes.ts new file mode 100644 index 0000000..b53f7a8 --- /dev/null +++ b/frontend/src/routes.ts @@ -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"} \ No newline at end of file