From 60700ee11e97ecc8d154a416809d9f7c8475edcb Mon Sep 17 00:00:00 2001 From: Nam Doan Date: Wed, 26 Nov 2025 11:22:08 +0700 Subject: [PATCH] refactor: add interface each component to define props config in JSON file --- .../layout/components/vt-linkbutton/index.tsx | 7 ++- .../layout/templates/vt-banner/banner-cta.tsx | 9 +++- .../layout/templates/vt-banner/banner-nav.tsx | 9 +++- .../templates/vt-banner/banner-ticker.tsx | 14 ++++-- .../layout/templates/vt-banner/index.tsx | 50 ++++++++++++------- .../layout/templates/vt-image/index.tsx | 27 ++++++++++ src/modules/layout/templates/vt-nav/index.tsx | 10 +++- 7 files changed, 100 insertions(+), 26 deletions(-) create mode 100644 src/modules/layout/templates/vt-image/index.tsx diff --git a/src/modules/layout/components/vt-linkbutton/index.tsx b/src/modules/layout/components/vt-linkbutton/index.tsx index 7e7af79..92ff296 100644 --- a/src/modules/layout/components/vt-linkbutton/index.tsx +++ b/src/modules/layout/components/vt-linkbutton/index.tsx @@ -2,8 +2,13 @@ import LocalizedClientLink from "@modules/common/components/localized-client-lin import { LayoutComponentDefinition, LayoutContext } from "vibentec/component-map"; import { clx } from "@medusajs/ui" +interface VtLinkProps { + className?: string + href?: string + label?: string +} export const VtLink = ({ nodes, context }: { nodes: LayoutComponentDefinition; context: LayoutContext }) => { - const props = nodes.config ?? {} + const props = nodes.config as VtLinkProps ?? {} const className = clx("txt-compact-xlarge-plus hover:text-ui-fg-base", props.className) const href = props.href ?? "/" const label = props.label ?? "Medusa Store" diff --git a/src/modules/layout/templates/vt-banner/banner-cta.tsx b/src/modules/layout/templates/vt-banner/banner-cta.tsx index 885f0a4..f0fb507 100644 --- a/src/modules/layout/templates/vt-banner/banner-cta.tsx +++ b/src/modules/layout/templates/vt-banner/banner-cta.tsx @@ -12,8 +12,15 @@ interface BannerCTAProps { context: LayoutContext } +interface BannerConfigProps { + text?: string + href?: string + iconLeft?: string + iconRight?: string + className?: string +} export default function BannerCTA({ node, context }: BannerCTAProps) { - const props = node.config ?? {} + const props = node.config as BannerConfigProps ?? {} const text = props.text ?? "" const href = props.href ?? undefined const iconLeft = props.iconLeft diff --git a/src/modules/layout/templates/vt-banner/banner-nav.tsx b/src/modules/layout/templates/vt-banner/banner-nav.tsx index 488b9c7..361e8be 100644 --- a/src/modules/layout/templates/vt-banner/banner-nav.tsx +++ b/src/modules/layout/templates/vt-banner/banner-nav.tsx @@ -1,8 +1,13 @@ import { DynamicLayoutRenderer } from "vibentec/renderer" import { LayoutComponentDefinition, LayoutContext } from "vibentec/component-map"; -export default function BannerNav({ node: node, context }: { node: LayoutComponentDefinition; context: LayoutContext }) { - const props = node.config ?? {}; +interface BannerNavProps { + left?: LayoutComponentDefinition[] + center?: LayoutComponentDefinition[] + right?: LayoutComponentDefinition[] +} +export default function BannerNav({ node, context }: { node: LayoutComponentDefinition; context: LayoutContext }) { + const props = node.config as BannerNavProps ?? {}; return (