| import api from './axiosInstance.api'; |
|
|
| |
| 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[]; |
| } |
|
|
| |
|
|
| 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<Blob> => { |
| const response = await api.get(`/forms/${formId}/export/csv`, { |
| responseType: 'blob' |
| }); |
| return response.data; |
| }; |
|
|