From c0ca7108c7543ed6dc8813cec84b9e027918c144 Mon Sep 17 00:00:00 2001 From: Schneider Roland Date: Mon, 8 Sep 2025 22:21:56 +0200 Subject: [PATCH] [yoga-15] improve service list rendering --- yoga-app/src/app/layout.tsx | 4 +- yoga-app/src/app/serviceList/page.tsx | 4 +- .../components/block.with.image.component.tsx | 35 ++++++++++++++++ .../block.with.left.image.component.tsx | 42 +++++++++++++++++++ .../block.with.right.image.component.tsx | 40 ++++++++++++++++++ .../components/single.service.component.tsx | 29 ++++++------- yoga-app/src/types/types.ts | 21 ++++++++++ 7 files changed, 154 insertions(+), 21 deletions(-) create mode 100644 yoga-app/src/components/block.with.image.component.tsx create mode 100644 yoga-app/src/components/block.with.left.image.component.tsx create mode 100644 yoga-app/src/components/block.with.right.image.component.tsx diff --git a/yoga-app/src/app/layout.tsx b/yoga-app/src/app/layout.tsx index 3cec9cd..152bf9d 100644 --- a/yoga-app/src/app/layout.tsx +++ b/yoga-app/src/app/layout.tsx @@ -73,8 +73,8 @@ const generateIcons = ( ): IconDescriptor[] => { export const metadata: Metadata = { - title: "Yoga App", - description: "Yoga App", + title: "Reverseyoga", + description: "Reverseyoga - Yoga mindenkinek", icons: generateIcons(), manifest: "./assets/images/favicon/manifest.json", other: { diff --git a/yoga-app/src/app/serviceList/page.tsx b/yoga-app/src/app/serviceList/page.tsx index f541895..303c701 100644 --- a/yoga-app/src/app/serviceList/page.tsx +++ b/yoga-app/src/app/serviceList/page.tsx @@ -20,9 +20,9 @@ export default async function Services() { <> { - services && services.length > 0 && services.map( singleService => { + services && services.length > 0 && services.map( (singleService,index) => { return ( - + ) }) } diff --git a/yoga-app/src/components/block.with.image.component.tsx b/yoga-app/src/components/block.with.image.component.tsx new file mode 100644 index 0000000..c371de6 --- /dev/null +++ b/yoga-app/src/components/block.with.image.component.tsx @@ -0,0 +1,35 @@ +import {ButtonConfig, ImageConfig} from "@/types/types"; +import {BlocksContent} from "@strapi/blocks-react-renderer"; +import BlockWithRightImage from "@/components/block.with.right.image.component"; +import BlockWithLeftImage from "@/components/block.with.left.image.component"; + + +export interface BlockWithImageComponentProps { + id: number; + title?: string; + header?: string; + block: BlocksContent; + image: ImageConfig; + button?: ButtonConfig; +} + +export default function BlockWithImageComponent({ + block, + image, + id, + title, + header, + button + }: BlockWithImageComponentProps) { + return ( + <> + {image?.position == 'Right' && } + {image?.position == 'Left' && } + + ); +} diff --git a/yoga-app/src/components/block.with.left.image.component.tsx b/yoga-app/src/components/block.with.left.image.component.tsx new file mode 100644 index 0000000..cacf7c1 --- /dev/null +++ b/yoga-app/src/components/block.with.left.image.component.tsx @@ -0,0 +1,42 @@ +import YogaImageComponent from "@/components/yoga.image.component"; +import NextBlocksRenderer from "@/components/next.blocks.renderer"; +import {BlockWithImageComponentProps} from "@/components/block.with.image.component"; + + + +export default function BlockWithLeftImage ( { + title,header,image,block,button +} : BlockWithImageComponentProps){ + + + + return ( +
+
+
+
+
+
+
+
+
+
+
+
{title}
+

{header}

+ +
+ {button && {button.label}} +
+
+
+
+
+
+ +
+
+
+ + ) +} diff --git a/yoga-app/src/components/block.with.right.image.component.tsx b/yoga-app/src/components/block.with.right.image.component.tsx new file mode 100644 index 0000000..8207eb7 --- /dev/null +++ b/yoga-app/src/components/block.with.right.image.component.tsx @@ -0,0 +1,40 @@ +import YogaImageComponent from "@/components/yoga.image.component"; +import {BlockWithImageComponentProps} from "@/components/block.with.image.component"; +import NextBlocksRenderer from "@/components/next.blocks.renderer"; + +export default function BlockWithRightImage ({ + title,header, block,button, image: { + url, + } , + }: BlockWithImageComponentProps){ + + + return ( +
+
+
+
+
+
+ {title &&
{title}
} + {header &&

{header}

} + +
+ {button && {button.label}} +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ ) +} diff --git a/yoga-app/src/components/single.service.component.tsx b/yoga-app/src/components/single.service.component.tsx index 2d7f86c..1cbcd9e 100644 --- a/yoga-app/src/components/single.service.component.tsx +++ b/yoga-app/src/components/single.service.component.tsx @@ -1,31 +1,26 @@ import {YogaSingleService_Plain} from "@/types/generated-strapi-interfaces/api/yoga-single-service"; -import clsx from "clsx"; -import NextBlocksRenderer from "@/components/next.blocks.renderer"; -import {BlocksContent} from "@strapi/blocks-react-renderer"; import React from "react"; +import BlockWithImageComponent from "@/components/block.with.image.component"; +import {ImagePosition, StrapiFile} from "@/types/types"; +import strapiApi from "@/api/strapi/strapi-api"; export interface Props { - config: YogaSingleService_Plain + config: YogaSingleService_Plain, + index: number } -const SingleService = ({config}: Props) => { - if (!config || !config.article) { +const SingleService = ({config,index}: Props) => { + if (!config || !config.article || !config.image) { return null; // or some fallback UI } + const {article, image, id, header } = config; + const strapiFile = image as StrapiFile; + const imageUrl = strapiApi.getImageUrl(strapiFile?.url); + return ( -
-
-
-
- -
-
-
-
+ ); } diff --git a/yoga-app/src/types/types.ts b/yoga-app/src/types/types.ts index bd9376a..9db8b94 100644 --- a/yoga-app/src/types/types.ts +++ b/yoga-app/src/types/types.ts @@ -1,3 +1,4 @@ + export interface StrapiFile{ "id": string, "documentId": string, @@ -5,3 +6,23 @@ export interface StrapiFile{ "mime": string, "url": string } + +export enum ImagePosition { + Left = 'Left', + Right = 'Right',} + +export interface ButtonConfig{ + label?: string, + link?: string, + style?: 'Primary' | 'Secondary' | 'Outline' | 'Text', + size?: 'Small' | 'Medium' | 'Large', + openInNewTab?: boolean, +} + +export interface ImageConfig{ + position: ImagePosition, + url: string, + alt?: string, + width?: number, + height?: number, +}