From 36dccac0e560583e1731c266d898196e2be4b417 Mon Sep 17 00:00:00 2001 From: Krzysztof Polak Date: Fri, 2 Jan 2026 15:06:00 +0100 Subject: [PATCH 01/49] chore: add prettier for code formatting --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index ca04d16..5010623 100755 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ "@types/react": "^18.3.2", "@types/react-dom": "^18.2.25", "awilix": "^8.0.1", + "prettier": "^3.0.0", "dotenv": "^17.2.3", "prop-types": "^15.8.1", "react": "^18.2.0", From f9b9a92425d859213714197b79fbb8e74f084b39 Mon Sep 17 00:00:00 2001 From: Krzysztof Polak Date: Fri, 2 Jan 2026 15:07:12 +0100 Subject: [PATCH 02/49] chore: update code formatting with prettier --- package.json | 2 +- .../count-down-timer/count-down-timer.tsx | 15 +- .../json-view-section/json-view-section.tsx | 91 ++++++--- .../metadata-section/metadata-section.tsx | 11 +- .../components/common/section/section-row.tsx | 6 +- .../inputs/chip-input/chip-input.tsx | 61 +++++-- src/admin/components/json-view-section.tsx | 96 +++++++--- .../pages/two-column-page/two-column-page.tsx | 63 +++++-- .../fields/components/checkbox-field.tsx | 18 +- .../metadata/fields/components/form-field.tsx | 10 +- .../fields/components/number-field.tsx | 12 +- .../fields/components/save-fields-button.tsx | 7 +- .../fields/components/select-field.tsx | 19 +- .../fields/components/text-area-field.tsx | 12 +- .../metadata/fields/components/text-field.tsx | 12 +- .../metadata/fields/fields-widget.tsx | 49 +++-- src/admin/components/metadata/fields/index.ts | 2 +- .../metadata/fields/manager-fields.tsx | 98 ++++++---- src/admin/components/metadata/fields/types.ts | 23 ++- .../components/metadata/images/image-item.tsx | 21 ++- .../metadata/images/image-uploader.tsx | 12 +- .../metadata/images/images-display.tsx | 31 +++- .../metadata/images/images-list.tsx | 11 +- .../metadata/images/images-manager.tsx | 53 +++--- src/admin/components/metadata/images/index.ts | 2 +- .../metadata/images/save-button.tsx | 7 +- .../images/universal-images-widget.tsx | 56 ++++-- .../groups/contact-form/contact-form.tsx | 50 ++--- .../groups/contact-form/index.tsx | 7 +- .../groups/order/index.tsx | 29 +-- .../groups/order/order-placed.tsx | 81 +++++---- .../components/order-actions.tsx | 46 +++-- .../components/order-payment-actions.tsx | 44 +++-- .../notification-order-payment.tsx | 30 ++- .../notification-order.tsx | 30 ++- .../notifications-detail.tsx | 8 +- .../notifications-full-list.tsx | 75 +++++--- .../notifications-list/notifications-list.tsx | 87 ++++++--- .../routes/notifications-emails/list/page.tsx | 25 ++- .../notifications-emails/render/page.tsx | 66 ++++--- .../order-notification-activity-widget.tsx | 13 +- .../admin/notification-plugin/events/route.ts | 19 +- .../notifications/route.ts | 24 ++- .../render-template/route.ts | 41 ++++- src/api/middlewares.ts | 64 ++++--- src/hooks/api/events.ts | 32 ++-- src/hooks/api/notifications.ts | 77 ++++---- src/hooks/api/orders.ts | 62 ++++--- src/hooks/api/preview.ts | 24 ++- src/subscribers/order-completed.ts | 77 +++++--- src/subscribers/order-placed.ts | 83 +++++---- src/templates/emails/base-template/index.tsx | 24 ++- .../emails/base-template/template.tsx | 46 +++-- .../emails/blocks/components/heading.tsx | 22 +-- .../emails/blocks/components/product-item.tsx | 38 +++- .../emails/blocks/components/repeater.tsx | 21 +-- .../emails/blocks/components/row.tsx | 28 ++- .../emails/blocks/components/section.tsx | 21 ++- .../emails/blocks/components/separator.tsx | 14 +- .../emails/blocks/components/text.tsx | 25 ++- src/templates/emails/blocks/index.tsx | 92 +++++----- src/templates/emails/blocks/types.ts | 2 +- src/templates/emails/contact-form/config.ts | 16 +- src/templates/emails/contact-form/index.tsx | 2 +- .../emails/email-template-service.ts | 94 ++++++---- src/templates/emails/index.ts | 33 +++- .../emails/inventory-level/config.ts | 37 ++-- src/templates/emails/inventory-level/index.ts | 2 +- .../inventory-level/translations/index.ts | 9 +- .../emails/order/completed/config.ts | 40 ++-- src/templates/emails/order/completed/index.ts | 3 +- .../order/completed/translations/index.ts | 9 +- src/templates/emails/order/placed/config.ts | 40 ++-- src/templates/emails/order/placed/index.ts | 2 +- .../emails/order/placed/translations/index.ts | 9 +- src/templates/emails/order/updated/config.ts | 40 ++-- src/templates/emails/order/updated/index.ts | 2 +- .../order/updated/translations/index.ts | 9 +- src/templates/emails/types.ts | 33 ++-- .../shared/abstract-template-service.ts | 53 ++++-- src/templates/shared/index.ts | 1 - src/templates/shared/theme/index.ts | 2 +- .../shared/theme/presets/default/index.ts | 15 +- src/templates/shared/types.ts | 1 - src/templates/shared/utils/index.ts | 12 +- src/templates/slack/index.ts | 13 +- src/templates/slack/inventory-level/config.ts | 23 ++- src/templates/slack/inventory-level/index.ts | 2 +- src/templates/slack/order/archived/config.ts | 15 +- src/templates/slack/order/archived/index.ts | 3 +- .../order/archived/translations/index.ts | 9 +- src/templates/slack/order/canceled/config.ts | 15 +- src/templates/slack/order/canceled/index.ts | 3 +- .../order/canceled/translations/index.ts | 9 +- src/templates/slack/order/completed/config.ts | 15 +- src/templates/slack/order/completed/index.ts | 3 +- .../order/completed/translations/index.ts | 9 +- src/templates/slack/order/placed/config.ts | 15 +- src/templates/slack/order/placed/index.ts | 3 +- .../slack/order/placed/translations/index.ts | 9 +- src/templates/slack/order/updated/config.ts | 15 +- src/templates/slack/order/updated/index.ts | 3 +- .../slack/order/updated/translations/index.ts | 9 +- src/templates/slack/product-variant/config.ts | 17 +- src/templates/slack/product-variant/index.ts | 2 +- src/templates/slack/product/config.ts | 17 +- src/templates/slack/product/index.ts | 2 +- src/templates/slack/slack-template-service.ts | 97 +++++++--- src/templates/slack/types.ts | 12 +- src/utils/addresses.ts | 17 +- src/utils/data/countries.ts | 12 +- src/utils/data/country-states.ts | 12 +- src/utils/data/modules/index.ts | 2 +- src/utils/data/modules/inventory/inventory.ts | 38 ++-- src/utils/data/modules/order/order.ts | 172 +++++++++++------- .../product-category/product-category.ts | 42 +++-- .../data/modules/product-tag/product-tag.ts | 26 ++- .../data/modules/product-type/product-type.ts | 26 ++- .../product-variant/product-variant.ts | 63 +++++-- src/utils/data/modules/product/helpers.ts | 5 +- src/utils/data/modules/product/product.ts | 85 ++++++--- src/utils/i18n/i18n.ts | 78 +++++--- src/utils/index.ts | 30 +-- src/utils/money-amount-helpers.ts | 29 ++- src/utils/omit.ts | 13 +- src/utils/payment.ts | 4 +- src/utils/pick-value-from-object.ts | 4 +- src/utils/plugins.ts | 15 +- src/utils/transforms/index.ts | 18 +- src/utils/transforms/order-transformer.ts | 75 +++++--- src/workflows/order/get-order-by-id.ts | 1 - src/workflows/order/index.ts | 1 - src/workflows/order/steps/get-order-by-id.ts | 6 +- src/workflows/order/steps/index.ts | 1 - 134 files changed, 2422 insertions(+), 1364 deletions(-) diff --git a/package.json b/package.json index 5010623..efeb992 100755 --- a/package.json +++ b/package.json @@ -78,8 +78,8 @@ "@types/react": "^18.3.2", "@types/react-dom": "^18.2.25", "awilix": "^8.0.1", - "prettier": "^3.0.0", "dotenv": "^17.2.3", + "prettier": "^3.0.0", "prop-types": "^15.8.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/src/admin/components/common/count-down-timer/count-down-timer.tsx b/src/admin/components/common/count-down-timer/count-down-timer.tsx index 6f5889e..7865fe1 100644 --- a/src/admin/components/common/count-down-timer/count-down-timer.tsx +++ b/src/admin/components/common/count-down-timer/count-down-timer.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from "react" -import { getTimeLeft } from "../../../../utils"; +import { getTimeLeft } from "../../../../utils" type CountDownTimerProps = { expires_at: string | number | Date @@ -7,8 +7,14 @@ type CountDownTimerProps = { text_before: string } -export const CountDownTimer = ({ expires_at, text_expired, text_before }: CountDownTimerProps) => { - const [timeLeft, setTimeLeft] = useState(() => getTimeLeft(expires_at)) +export const CountDownTimer = ({ + expires_at, + text_expired, + text_before, +}: CountDownTimerProps) => { + const [timeLeft, setTimeLeft] = useState(() => + getTimeLeft(expires_at) + ) useEffect(() => { const interval = setInterval(() => { @@ -25,7 +31,8 @@ export const CountDownTimer = ({ expires_at, text_expired, text_before }: CountD return ( - {text_before}: {timeLeft.hours}h, {timeLeft.minutes}m, {timeLeft.seconds}s + {text_before}: {timeLeft.hours}h, {timeLeft.minutes}m,{" "} + {timeLeft.seconds}s ) } diff --git a/src/admin/components/common/json-view-section/json-view-section.tsx b/src/admin/components/common/json-view-section/json-view-section.tsx index ba157b5..b9cc5a7 100644 --- a/src/admin/components/common/json-view-section/json-view-section.tsx +++ b/src/admin/components/common/json-view-section/json-view-section.tsx @@ -14,7 +14,12 @@ import { Kbd, } from "@medusajs/ui" import Primitive from "@uiw/react-json-view" -import { CSSProperties, MouseEvent, Suspense, useState } from "react" +import { + CSSProperties, + MouseEvent, + Suspense, + useState, +} from "react" import { Trans, useTranslation } from "react-i18next" type JsonViewSectionProps = { @@ -22,7 +27,9 @@ type JsonViewSectionProps = { title?: string } -export const JsonViewSection = ({ data }: JsonViewSectionProps) => { +export const JsonViewSection = ({ + data, +}: JsonViewSectionProps) => { const { t } = useTranslation() const numberOfKeys = Object.keys(data).length @@ -55,7 +62,10 @@ export const JsonViewSection = ({ data }: JsonViewSectionProps) => { i18nKey="json.drawer.header" count={numberOfKeys} components={[ - , + , ]} /> @@ -82,46 +92,70 @@ export const JsonViewSection = ({ data }: JsonViewSectionProps) => {
} + fallback={ +
+ } > - } /> + } + /> ( - null + + null + )} /> ( - undefined + + undefined + )} /> { return ( {t("general.items", { - count: Object.keys(value as object).length, + count: Object.keys( + value as object + ).length, })} ) @@ -143,7 +179,12 @@ export const JsonViewSection = ({ data }: JsonViewSectionProps) => { { - return + return ( + + ) }} /> diff --git a/src/admin/components/common/metadata-section/metadata-section.tsx b/src/admin/components/common/metadata-section/metadata-section.tsx index 691f3c3..1f17fd6 100644 --- a/src/admin/components/common/metadata-section/metadata-section.tsx +++ b/src/admin/components/common/metadata-section/metadata-section.tsx @@ -1,5 +1,10 @@ import { ArrowUpRightOnBox } from "@medusajs/icons" -import { Badge, Container, Heading, IconButton } from "@medusajs/ui" +import { + Badge, + Container, + Heading, + IconButton, +} from "@medusajs/ui" import { useTranslation } from "react-i18next" type MetadataSectionProps = { @@ -21,7 +26,9 @@ export const MetadataSection = ({ return null } - const numberOfKeys = data.metadata ? Object.keys(data.metadata).length : 0 + const numberOfKeys = data.metadata + ? Object.keys(data.metadata).length + : 0 return ( diff --git a/src/admin/components/common/section/section-row.tsx b/src/admin/components/common/section/section-row.tsx index d03151f..fc7d459 100644 --- a/src/admin/components/common/section/section-row.tsx +++ b/src/admin/components/common/section/section-row.tsx @@ -7,7 +7,11 @@ export type SectionRowProps = { actions?: ReactNode } -export const SectionRow = ({ title, value, actions }: SectionRowProps) => { +export const SectionRow = ({ + title, + value, + actions, +}: SectionRowProps) => { const isValueString = typeof value === "string" || !value return ( diff --git a/src/admin/components/inputs/chip-input/chip-input.tsx b/src/admin/components/inputs/chip-input/chip-input.tsx index ce942d4..f88045b 100644 --- a/src/admin/components/inputs/chip-input/chip-input.tsx +++ b/src/admin/components/inputs/chip-input/chip-input.tsx @@ -23,7 +23,10 @@ type ChipInputProps = { className?: string } -export const ChipInput = forwardRef( +export const ChipInput = forwardRef< + HTMLInputElement, + ChipInputProps +>( ( { value, @@ -41,19 +44,26 @@ export const ChipInput = forwardRef( ) => { const innerRef = useRef(null) - const isControlledRef = useRef(typeof value !== "undefined") + const isControlledRef = useRef( + typeof value !== "undefined" + ) const isControlled = isControlledRef.current - const [uncontrolledValue, setUncontrolledValue] = useState([]) + const [uncontrolledValue, setUncontrolledValue] = + useState([]) - useImperativeHandle( - ref, - () => innerRef.current - ) + useImperativeHandle< + HTMLInputElement | null, + HTMLInputElement | null + >(ref, () => innerRef.current) - const [duplicateIndex, setDuplicateIndex] = useState(null) + const [duplicateIndex, setDuplicateIndex] = useState< + number | null + >(null) - const chips = isControlled ? (value as string[]) : uncontrolledValue + const chips = isControlled + ? (value as string[]) + : uncontrolledValue const handleAddChip = (chip: string) => { const cleanValue = chip.trim() @@ -83,11 +93,15 @@ export const ChipInput = forwardRef( onChange?.(chips.filter((v) => v !== chip)) if (!isControlled) { - setUncontrolledValue(chips.filter((v) => v !== chip)) + setUncontrolledValue( + chips.filter((v) => v !== chip) + ) } } - const handleBlur = (e: FocusEvent) => { + const handleBlur = ( + e: FocusEvent + ) => { onBlur?.() if (e.target.value) { @@ -96,7 +110,9 @@ export const ChipInput = forwardRef( } } - const handleKeyDown = (e: KeyboardEvent) => { + const handleKeyDown = ( + e: KeyboardEvent + ) => { if (e.key === "Enter" || e.key === ",") { e.preventDefault() @@ -109,7 +125,10 @@ export const ChipInput = forwardRef( innerRef.current?.focus() } - if (e.key === "Backspace" && innerRef.current?.value === "") { + if ( + e.key === "Backspace" && + innerRef.current?.value === "" + ) { handleRemoveChip(chips[chips.length - 1]) } } @@ -129,7 +148,8 @@ export const ChipInput = forwardRef( { "bg-ui-bg-field-component hover:bg-ui-bg-field-component-hover": variant === "contrast", - "bg-ui-bg-field hover:bg-ui-bg-field-hover": variant === "base", + "bg-ui-bg-field hover:bg-ui-bg-field-hover": + variant === "base", }, className )} @@ -143,12 +163,17 @@ export const ChipInput = forwardRef( size="2xsmall" className={clx("gap-x-0.5 pl-1.5 pr-1.5", { "transition-fg pr-1": showRemove, - "shadow-borders-focus": index === duplicateIndex, + "shadow-borders-focus": + index === duplicateIndex, })} asChild > {v} {showRemove && ( @@ -180,7 +205,9 @@ export const ChipInput = forwardRef( disabled={disabled} name={name} ref={innerRef} - placeholder={chips.length === 0 ? placeholder : undefined} + placeholder={ + chips.length === 0 ? placeholder : undefined + } autoComplete="off" /> diff --git a/src/admin/components/json-view-section.tsx b/src/admin/components/json-view-section.tsx index 96200d1..b3e552e 100644 --- a/src/admin/components/json-view-section.tsx +++ b/src/admin/components/json-view-section.tsx @@ -14,14 +14,21 @@ import { Kbd, } from "@medusajs/ui" import Primitive from "@uiw/react-json-view" -import { CSSProperties, MouseEvent, Suspense, useState } from "react" +import { + CSSProperties, + MouseEvent, + Suspense, + useState, +} from "react" type JsonViewSectionProps = { data: object title?: string } -export const JsonViewSection = ({ data }: JsonViewSectionProps) => { +export const JsonViewSection = ({ + data, +}: JsonViewSectionProps) => { const numberOfKeys = Object.keys(data).length return ( @@ -47,9 +54,9 @@ export const JsonViewSection = ({ data }: JsonViewSectionProps) => {
- - {numberOfKeys} - + + {numberOfKeys} +
@@ -71,53 +78,81 @@ export const JsonViewSection = ({ data }: JsonViewSectionProps) => {
} + fallback={ +
+ } > - } /> + } + /> ( - null + + null + )} /> ( - undefined + + undefined + )} /> { return ( - {Object.keys(value as object).length} items + { + Object.keys(value as object) + .length + }{" "} + items ) }} @@ -130,7 +165,12 @@ export const JsonViewSection = ({ data }: JsonViewSectionProps) => { { - return + return ( + + ) }} /> @@ -182,4 +222,4 @@ const Copied = ({ style, value }: CopiedProps) => {
) -} \ No newline at end of file +} diff --git a/src/admin/components/layout/pages/two-column-page/two-column-page.tsx b/src/admin/components/layout/pages/two-column-page/two-column-page.tsx index d1e8777..0e4b3ea 100644 --- a/src/admin/components/layout/pages/two-column-page/two-column-page.tsx +++ b/src/admin/components/layout/pages/two-column-page/two-column-page.tsx @@ -1,12 +1,18 @@ import { clx, Text } from "@medusajs/ui" -import { Children, ComponentPropsWithoutRef, ComponentType } from "react" +import { + Children, + ComponentPropsWithoutRef, + ComponentType, +} from "react" import { useTranslation } from "react-i18next" import { JsonViewSection } from "../../../common/json-view-section" import { MetadataSection } from "../../../common/metadata-section" import { PageProps } from "../types" import { Providers } from "../../../../../providers" -interface TwoColumnPageProps extends PageProps {} +interface TwoColumnPageProps< + TData, +> extends PageProps {} const Root = ({ children, @@ -23,7 +29,7 @@ const Root = ({ */ showMetadata = false, - isLoading = false + isLoading = false, }: TwoColumnPageProps) => { if (showJSON && !data) { if (process.env.NODE_ENV === "development") { @@ -48,7 +54,9 @@ const Root = ({ const childrenArray = Children.toArray(children) if (childrenArray.length !== 2) { - throw new Error("TwoColumnPage expects exactly two children") + throw new Error( + "TwoColumnPage expects exactly two children" + ) } const [main, sidebar] = childrenArray @@ -56,12 +64,30 @@ const Root = ({ return ( - {!isLoading ? RootHTML(data, main, sidebar, showExtraData, showMetadata, showJSON) : } + {!isLoading ? ( + RootHTML( + data, + main, + sidebar, + showExtraData, + showMetadata, + showJSON + ) + ) : ( + + )} ) } -const RootHTML = (data, main, sidebar, showExtraData: boolean, showMetadata: boolean, showJSON: boolean) => { +const RootHTML = ( + data, + main, + sidebar, + showExtraData: boolean, + showMetadata: boolean, + showJSON: boolean +) => { return (
@@ -69,7 +95,9 @@ const RootHTML = (data, main, sidebar, showExtraData: boolean, showMetadata: boo {main} {showExtraData && (
- {showMetadata && } + {showMetadata && ( + + )} {showJSON && }
)} @@ -78,13 +106,15 @@ const RootHTML = (data, main, sidebar, showExtraData: boolean, showMetadata: boo {sidebar} {showExtraData && (
- {showMetadata && } + {showMetadata && ( + + )} {showJSON && }
)}
- + ) } @@ -94,7 +124,13 @@ const Main = ({ ...props }: ComponentPropsWithoutRef<"div">) => { return ( -
+
{children}
) @@ -124,10 +160,13 @@ const Loading = () => { return ( <>
- {t('general.loading')} + {t("general.loading")}
) } -export const TwoColumnPage = Object.assign(Root, { Main, Sidebar }) +export const TwoColumnPage = Object.assign(Root, { + Main, + Sidebar, +}) diff --git a/src/admin/components/metadata/fields/components/checkbox-field.tsx b/src/admin/components/metadata/fields/components/checkbox-field.tsx index 63cb1e5..d7a5462 100644 --- a/src/admin/components/metadata/fields/components/checkbox-field.tsx +++ b/src/admin/components/metadata/fields/components/checkbox-field.tsx @@ -8,12 +8,12 @@ interface CheckboxFieldProps { disabled?: boolean } -export const CheckboxField = ({ - label, - checked, - onChange, +export const CheckboxField = ({ + label, + checked, + onChange, required = false, - disabled = false + disabled = false, }: CheckboxFieldProps) => { return (
@@ -23,13 +23,15 @@ export const CheckboxField = ({ disabled={disabled} id={`checkbox-${label}`} /> -
) -} +} diff --git a/src/admin/components/metadata/fields/components/form-field.tsx b/src/admin/components/metadata/fields/components/form-field.tsx index 80d0685..09b9a12 100644 --- a/src/admin/components/metadata/fields/components/form-field.tsx +++ b/src/admin/components/metadata/fields/components/form-field.tsx @@ -6,20 +6,22 @@ interface FormFieldProps { children: React.ReactNode } -export const FormField = ({ +export const FormField = ({ label, required, - children + children, }: FormFieldProps) => { return (
{children}
) -} +} diff --git a/src/admin/components/metadata/fields/components/number-field.tsx b/src/admin/components/metadata/fields/components/number-field.tsx index d746ba7..9fec747 100644 --- a/src/admin/components/metadata/fields/components/number-field.tsx +++ b/src/admin/components/metadata/fields/components/number-field.tsx @@ -12,16 +12,16 @@ interface NumberFieldProps { step?: number } -export const NumberField = ({ - label, - value, - onChange, +export const NumberField = ({ + label, + value, + onChange, placeholder = "", required = false, disabled = false, min, max, - step = 1 + step = 1, }: NumberFieldProps) => { return ( ) -} +} diff --git a/src/admin/components/metadata/fields/components/save-fields-button.tsx b/src/admin/components/metadata/fields/components/save-fields-button.tsx index 6497546..c179ec5 100644 --- a/src/admin/components/metadata/fields/components/save-fields-button.tsx +++ b/src/admin/components/metadata/fields/components/save-fields-button.tsx @@ -5,7 +5,10 @@ interface SaveFieldsButtonProps { disabled: boolean } -export const SaveFieldsButton = ({ onSave, disabled }: SaveFieldsButtonProps) => { +export const SaveFieldsButton = ({ + onSave, + disabled, +}: SaveFieldsButtonProps) => { return (
) -} +} diff --git a/src/admin/components/metadata/fields/components/select-field.tsx b/src/admin/components/metadata/fields/components/select-field.tsx index a5b4d42..3c34462 100644 --- a/src/admin/components/metadata/fields/components/select-field.tsx +++ b/src/admin/components/metadata/fields/components/select-field.tsx @@ -9,13 +9,13 @@ interface SelectFieldProps { disabled?: boolean } -export const SelectField = ({ - label, - value, - onChange, +export const SelectField = ({ + label, + value, + onChange, options, required = false, - disabled = false + disabled = false, }: SelectFieldProps) => { return ( ) -} +} diff --git a/src/admin/components/metadata/fields/components/text-area-field.tsx b/src/admin/components/metadata/fields/components/text-area-field.tsx index fe75f48..0b4d050 100644 --- a/src/admin/components/metadata/fields/components/text-area-field.tsx +++ b/src/admin/components/metadata/fields/components/text-area-field.tsx @@ -10,14 +10,14 @@ interface TextAreaFieldProps { rows?: number } -export const TextAreaField = ({ - label, - value, - onChange, +export const TextAreaField = ({ + label, + value, + onChange, placeholder = "", required = false, disabled = false, - rows = 3 + rows = 3, }: TextAreaFieldProps) => { return (