Includes business, customer, and super-admin apps with shared packages and production deploy scripts. Co-authored-by: Cursor <cursoragent@cursor.com>
83 lines
2.1 KiB
TypeScript
83 lines
2.1 KiB
TypeScript
import { apiRequest } from '../lib/api'
|
|
import { getActiveBusinessId } from '../lib/businessContext'
|
|
import type {
|
|
CategoryTechnicalForm,
|
|
TechnicalFormFieldDraft,
|
|
TechnicalFormField,
|
|
} from '../types/technicalForm'
|
|
|
|
function businessPath(categoryId: string) {
|
|
const businessId = getActiveBusinessId()
|
|
if (!businessId) {
|
|
throw new Error('No active business selected. Please sign in again.')
|
|
}
|
|
return `/businesses/${businessId}/categories/${categoryId}/technical-form`
|
|
}
|
|
|
|
export function mapApiFieldToDraft(field: TechnicalFormField): TechnicalFormFieldDraft {
|
|
return {
|
|
id: field.id,
|
|
label: field.label,
|
|
type: field.type,
|
|
isRequired: field.isRequired,
|
|
options: field.options.map((option) => option.label),
|
|
}
|
|
}
|
|
|
|
export function mapDraftToPayload(fields: TechnicalFormFieldDraft[]) {
|
|
return {
|
|
fields: fields.map((field) => ({
|
|
label: field.label.trim(),
|
|
type: field.type,
|
|
isRequired: field.isRequired,
|
|
...(field.type === 'select' || field.type === 'multi_select'
|
|
? { options: field.options.map((option) => option.trim()).filter(Boolean) }
|
|
: {}),
|
|
})),
|
|
}
|
|
}
|
|
|
|
export async function getCategoryTechnicalForm(categoryId: string, signal?: AbortSignal) {
|
|
const data = await apiRequest<{ form: CategoryTechnicalForm | null }>(
|
|
businessPath(categoryId),
|
|
{ auth: true, signal },
|
|
)
|
|
return data.form
|
|
}
|
|
|
|
export async function saveCategoryTechnicalForm(
|
|
categoryId: string,
|
|
fields: TechnicalFormFieldDraft[],
|
|
) {
|
|
const data = await apiRequest<{ form: CategoryTechnicalForm | null }>(
|
|
businessPath(categoryId),
|
|
{
|
|
method: 'PUT',
|
|
auth: true,
|
|
body: mapDraftToPayload(fields),
|
|
},
|
|
)
|
|
return data.form
|
|
}
|
|
|
|
export async function suggestCategoryTechnicalFormByAi(
|
|
categoryId: string,
|
|
hint?: string,
|
|
) {
|
|
const data = await apiRequest<{
|
|
message: string
|
|
fields: {
|
|
label: string
|
|
type: TechnicalFormFieldDraft['type']
|
|
isRequired: boolean
|
|
options?: string[]
|
|
}[]
|
|
}>(`${businessPath(categoryId)}/ai-suggest`, {
|
|
method: 'POST',
|
|
auth: true,
|
|
body: hint ? { hint } : {},
|
|
})
|
|
|
|
return data.fields
|
|
}
|