Мы решили выделить три уровня:
Кастомные хуки — для бизнес-логики и состояния.
Маленькие UI-компоненты — для отрисовки частей интерфейса.
Главный компонент — только композиция.
📦 Шаг 1. Выносим логику формы в хук useCreatePostForm
Теперь вся работа с react-hook-form, сабмит и управление ошибками живут отдельно:
// hooks/useCreatePostForm.ts
export function useCreatePostForm(initialScheduledDate?: Date | string | null) {
const currentUser = useStore((s) => s.currentUser);
const { data: authMe } = useAuthMe();
const createPostMutation = useCreatePostMutation();
const [error, setError] = useState<string | null>(null);
const form = useForm({
defaultValues: {
title: "",
content: "",
scheduledDate: new Date().toISOString().split('T')[0],
contentType: "",
selectedPlatforms: [],
priority: "",
}
});
// Подстановка initialScheduledDate при открытии
useEffect(() => {
if (initialScheduledDate) {
const date = typeof initialScheduledDate === "string"
? initialScheduledDate.split("T")[0]
: format(initialScheduledDate, "yyyy-MM-dd");
form.setValue("scheduledDate", date);
}
}, [initialScheduledDate, form.setValue]);
const onSubmit = async (data) => {
setError(null);
const authorId = currentUser?.id ?? authMe?.id;
if (!authorId) {
setError('Не удалось определить автора');
return;
}
try {
await createPostMutation.mutateAsync({ ...data, authorId });
form.reset();
setError(null);
return true; // сигнал об успехе
} catch (err) {
setError(err.message);
}
};
return {
...form,
error,
onSubmit: form.handleSubmit(onSubmit),
isPending: createPostMutation.isPending,
};
}