import api from './axiosInstance.api'; // Types based on backend models export type FieldType = | 'short_text' | 'long_text' | 'multiple_choice' | 'checkboxes' | 'dropdown' | 'linear_scale' | 'date' | 'time' | 'email' | 'phone' | 'number' | 'file_upload'; export interface IFormField { id: string; type: FieldType; label: string; description?: string; required: boolean; options?: string[]; validation?: { min?: number; max?: number; pattern?: string; maxLength?: number; minLength?: number; fileTypes?: string[]; maxFileSize?: number; }; order: number; } export interface IForm { _id: string; title: string; description?: string; event?: any; organization: any; createdBy: any; fields: IFormField[]; accessType: 'event_attendees' | 'verified_users' | 'public'; restrictToAttendees: boolean; oneResponsePerUser: boolean; shortCode: string; shareToken: string; qrCode?: string; acceptingResponses: boolean; showResponseSummary: boolean; allowEditing: boolean; responseCount: number; status: 'draft' | 'active' | 'closed'; createdAt: string; updatedAt: string; } export interface IFieldResponse { fieldId: string; value: any; fileUrl?: string; } export interface IFormResponse { _id: string; form: string | IForm; event?: string; respondent: any; responses: IFieldResponse[]; submittedAt: string; lastEditedAt?: string; isComplete: boolean; } export interface CreateFormRequest { title: string; description?: string; eventId?: string; fields: IFormField[]; accessType?: 'event_attendees' | 'verified_users' | 'public'; restrictToAttendees?: boolean; oneResponsePerUser?: boolean; showResponseSummary?: boolean; allowEditing?: boolean; } export interface UpdateFormRequest { title?: string; description?: string; fields?: IFormField[]; accessType?: 'event_attendees' | 'verified_users' | 'public'; restrictToAttendees?: boolean; oneResponsePerUser?: boolean; acceptingResponses?: boolean; showResponseSummary?: boolean; allowEditing?: boolean; status?: 'draft' | 'active' | 'closed'; } export interface SubmitResponseRequest { responses: IFieldResponse[]; } // API Functions export const createForm = async (data: CreateFormRequest): Promise<{ message: string; form: any }> => { console.log("sending create form request"); const response = await api.post('/forms/create', data); return response.data; }; export const updateForm = async (formId: string, data: UpdateFormRequest): Promise<{ message: string; form: IForm }> => { const response = await api.put(`/forms/${formId}`, data); return response.data; }; export const getFormDetails = async (formId: string, token?: string): Promise<{ form: IForm; hasSubmitted: boolean; canEdit: boolean }> => { const url = token ? `/forms/${formId}?token=${token}` : `/forms/${formId}`; const response = await api.get(url); return response.data; }; export const submitFormResponse = async (formId: string, data: SubmitResponseRequest): Promise<{ message: string; response: IFormResponse }> => { const response = await api.post(`/forms/${formId}/submit`, data); return response.data; }; export const getFormResponses = async (formId: string): Promise<{ form: { title: string; responseCount: number }; responses: IFormResponse[] }> => { const response = await api.get(`/forms/${formId}/responses`); return response.data; }; export const getMyForms = async (eventId?: string): Promise<{ forms: IForm[] }> => { const url = eventId ? `/forms/my-forms?eventId=${eventId}` : '/forms/my-forms'; const response = await api.get(url); return response.data; }; export const deleteForm = async (formId: string): Promise<{ message: string }> => { const response = await api.delete(`/forms/${formId}`); return response.data; }; export const getMyResponse = async (formId: string): Promise<{ response: IFormResponse }> => { const response = await api.get(`/forms/${formId}/my-response`); return response.data; }; export const exportResponsesToCSV = async (formId: string): Promise => { const response = await api.get(`/forms/${formId}/export/csv`, { responseType: 'blob' }); return response.data; };