diff --git a/assets/images/splash-icon-default.png b/assets/images/splash-icon-default.png new file mode 100644 index 0000000..03d6f6b Binary files /dev/null and b/assets/images/splash-icon-default.png differ diff --git a/assets/images/splash-icon.png b/assets/images/splash-icon.png index 03d6f6b..81ebd78 100644 Binary files a/assets/images/splash-icon.png and b/assets/images/splash-icon.png differ diff --git a/src/api.ts b/src/api.ts index c77c3e1..a5970b1 100644 --- a/src/api.ts +++ b/src/api.ts @@ -300,6 +300,13 @@ export async function getAllDoctypesFromLocal(): Promise< } const parsed = parseJson(value); if (parsed?.payload) { + // Validate that payload has the expected structure + if (!parsed.payload.data) { + return; + } + if (!parsed.payload.fields) { + return; + } result[normalizeDoctypeName(parsed.name)] = parsed.payload; } }); @@ -352,6 +359,7 @@ const defaultFetcher = async (name: string): Promise => { const response = await getDoctypeByName({ path: { form_name: name }, }); + const data = (response as any)?.data?.data ?? (response as any)?.data ?? @@ -359,6 +367,42 @@ const defaultFetcher = async (name: string): Promise => { if (!data) { throw new Error(`Doctype response missing data for ${name}`); } + + // Validate that we have fields array + if (!data.fields || !Array.isArray(data.fields)) { + throw new Error(`Invalid doctype structure for ${name}: missing fields array`); + } + + // Check if data object exists, if not try to create it from top-level properties + if (!data.data || typeof data.data !== 'object') { + // Look for doctype metadata at the top level + const doctypeMetadata: any = {}; + const metadataFields = [ + 'name', 'creation', 'modified', 'modified_by', 'owner', 'docStatus', + 'idx', 'issingle', 'istable', 'editable_grid', 'track_changes', 'module', + 'autoname', 'name_case', 'sort_field', 'sort_order', 'readonly', 'in_create', + 'allow_copy', 'allow_rename', 'allow_import', 'hide_toolbar', 'track_seen', + 'max_attachments', 'document_type', 'engine', 'is_submittable', + 'show_name_in_global_search', 'custom', 'beta', 'has_web_view', + 'allow_guest_to_view', 'qick_entry', 'is_tree', 'track_views', + 'all_events_in_timeline', 'allow_auto_repeat', 'show_preview_popup', + 'email_append_to', 'index_web_pages_for_search', 'docType' + ]; + + metadataFields.forEach(field => { + if (data[field] !== undefined) { + doctypeMetadata[field] = data[field]; + } + }); + + // If we found metadata, create the nested structure + if (Object.keys(doctypeMetadata).length > 0) { + data.data = doctypeMetadata; + } else { + throw new Error(`Invalid doctype structure for ${name}: missing data object`); + } + } + return data as DocType; }; diff --git a/src/app/screens/home/FormDetail.tsx b/src/app/screens/home/FormDetail.tsx index a374644..46ff8d0 100644 --- a/src/app/screens/home/FormDetail.tsx +++ b/src/app/screens/home/FormDetail.tsx @@ -190,9 +190,8 @@ const FormDetail: React.FC = ({ navigation }) => { data: formData, schemaHash, status: 'pending' as 'pending' | 'submitted' | 'failed', - is_submittable: doctype.data?.is_submittable ?? 0, + is_submittable: doctype.data.is_submittable }; - setLoading(true); setConfirmModalVisible(false); try {