refactor(marketing): Standardize marketing wizard steps with initial data support

- Add support for initial data in all marketing wizard step components
- Update step presenters to accept and handle initial data
- Modify forwardRef implementations to include initialData prop
- Add TypeScript interfaces for step component props
- Improve type safety and data handling across marketing wizard steps
- Prepare components for edit and create workflows with consistent data management
This commit is contained in:
AmirReza Jamali
2025-11-11 10:43:32 +03:30
parent b444f6a08f
commit bd79b7ed14
19 changed files with 842 additions and 688 deletions
+71 -65
View File
@@ -6,73 +6,79 @@ import { FormErrorMessages } from "@/constants/Texts";
import { forwardRef, useImperativeHandle } from "react";
import useFooterStepPresenter from "./useFooterStepPresenter";
const FooterStep = forwardRef((props, ref) => {
const { errors, handleSubmit, onSubmit, register, getValues } =
useFooterStepPresenter();
interface FooterStepProps {
initialData?: any;
}
useImperativeHandle(ref, () => ({
getData: () => getValues(),
}));
const FooterStep = forwardRef<unknown, FooterStepProps>(
({ initialData }, ref) => {
const { errors, handleSubmit, onSubmit, register, getValues } =
useFooterStepPresenter(initialData);
return (
<form
className="grid grid-cols-1 items-start gap-9 rounded-xl bg-gray-1 p-10 dark:bg-gray-7"
onSubmit={handleSubmit(onSubmit)}
>
<ShowcaseSection title="Footer Section" className="flex flex-col gap-5">
<div className="flex flex-col gap-9">
<InputGroup
{...register("email", {
required: { message: FormErrorMessages.required, value: true },
pattern: {
value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
message: "Invalid email format",
},
})}
label="Email"
name="email"
required
type="email"
placeholder="Enter Email"
/>
{errors.email && (
<p className="mt-1 text-sm text-red-500">
{errors.email.message as string}
</p>
)}
<InputGroup
{...register("phone")}
label="Phone Number"
name="phone"
type="text"
placeholder="Enter Phone Number"
/>
<InputGroup
{...register("location")}
label="Location"
name="location"
type="text"
placeholder="Enter Location"
/>
<TextAreaGroup
label="Tagline"
{...register("tagline")}
name="tagline"
placeholder="Enter Tagline"
/>
<InputGroup
{...register("copyright")}
label="Copyright"
name="copyright"
type="text"
placeholder="Enter Copyright Text"
/>
</div>
</ShowcaseSection>
</form>
);
});
useImperativeHandle(ref, () => ({
getData: () => getValues(),
}));
return (
<form
className="grid grid-cols-1 items-start gap-9 rounded-xl bg-gray-1 p-10 dark:bg-gray-7"
onSubmit={handleSubmit(onSubmit)}
>
<ShowcaseSection title="Footer Section" className="flex flex-col gap-5">
<div className="flex flex-col gap-9">
<InputGroup
{...register("email", {
required: { message: FormErrorMessages.required, value: true },
pattern: {
value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
message: "Invalid email format",
},
})}
label="Email"
name="email"
required
type="email"
placeholder="Enter Email"
/>
{errors.email && (
<p className="mt-1 text-sm text-red-500">
{errors.email.message as string}
</p>
)}
<InputGroup
{...register("phone")}
label="Phone Number"
name="phone"
type="text"
placeholder="Enter Phone Number"
/>
<InputGroup
{...register("location")}
label="Location"
name="location"
type="text"
placeholder="Enter Location"
/>
<TextAreaGroup
label="Tagline"
{...register("tagline")}
name="tagline"
placeholder="Enter Tagline"
/>
<InputGroup
{...register("copyright")}
label="Copyright"
name="copyright"
type="text"
placeholder="Enter Copyright Text"
/>
</div>
</ShowcaseSection>
</form>
);
},
);
FooterStep.displayName = "FooterStep";
export default FooterStep;
export default FooterStep;