feat(task-005): complete article intake dashboard detail flow
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
import type { TargetSiteConfig } from "@pipeline/shared";
|
||||
|
||||
export type NewArticleDraft = {
|
||||
targetSiteId: string;
|
||||
briefDescription: string;
|
||||
workingTitle: string;
|
||||
contentType: string;
|
||||
primaryKeyword: string;
|
||||
};
|
||||
|
||||
export type FieldErrors = Record<string, string>;
|
||||
|
||||
export type NewArticleFormState = {
|
||||
values: NewArticleDraft;
|
||||
errors: FieldErrors;
|
||||
formError?: string;
|
||||
};
|
||||
|
||||
export function initialDraft(sites: readonly TargetSiteConfig[]): NewArticleDraft {
|
||||
return {
|
||||
targetSiteId: sites.length > 0 ? sites[0].id : "",
|
||||
briefDescription: "",
|
||||
workingTitle: "",
|
||||
contentType: "longform_guide",
|
||||
primaryKeyword: "",
|
||||
};
|
||||
}
|
||||
|
||||
export function validateArticleDraft(values: NewArticleDraft): FieldErrors {
|
||||
const errors: FieldErrors = {};
|
||||
|
||||
if (!values.targetSiteId) {
|
||||
errors.targetSiteId = "Select a target site";
|
||||
}
|
||||
if (!values.briefDescription.trim()) {
|
||||
errors.briefDescription = "Brief description is required";
|
||||
}
|
||||
if (!values.contentType.trim()) {
|
||||
errors.contentType = "Content type is required";
|
||||
}
|
||||
|
||||
return errors;
|
||||
}
|
||||
Reference in New Issue
Block a user