From 63fea4bed6b6e5c4b95667c9e06bc753e85522fd Mon Sep 17 00:00:00 2001 From: dekzter Date: Tue, 8 Apr 2025 08:47:48 -0400 Subject: [PATCH] fixed epg form --- frontend/src/api.js | 45 ++++++++++++++- frontend/src/components/forms/EPG.jsx | 82 ++++++++++++--------------- frontend/src/components/forms/M3U.jsx | 2 - frontend/src/store/epgs.jsx | 5 ++ 4 files changed, 85 insertions(+), 49 deletions(-) diff --git a/frontend/src/api.js b/frontend/src/api.js index 3adb14f1..1f0a3717 100644 --- a/frontend/src/api.js +++ b/frontend/src/api.js @@ -642,14 +642,14 @@ export default class API { static async addEPG(values) { let body = null; - if (values.epg_file) { + if (values.files) { body = new FormData(); for (const prop in values) { body.append(prop, values[prop]); } } else { body = { ...values }; - delete body.epg_file; + delete body.file; body = JSON.stringify(body); } @@ -674,6 +674,47 @@ export default class API { return retval; } + static async updateEPG(values) { + const { id, ...payload } = values; + + let body = null; + if (payload.files) { + body = new FormData(); + for (const prop in payload) { + if (prop == 'url') { + continue; + } + body.append(prop, payload[prop]); + } + } else { + delete payload.file; + if (!payload.url) { + delete payload.url; + } + body = JSON.stringify(payload); + } + + const response = await fetch(`${host}/api/epg/sources/${id}/`, { + method: 'PATCH', + headers: { + Authorization: `Bearer ${await API.getAuthToken()}`, + ...(values.epg_file + ? {} + : { + 'Content-Type': 'application/json', + }), + }, + body, + }); + + const retval = await response.json(); + if (retval.id) { + useEPGsStore.getState().updateEPG(retval); + } + + return retval; + } + static async deleteEPG(id) { const response = await fetch(`${host}/api/epg/sources/${id}/`, { method: 'DELETE', diff --git a/frontend/src/components/forms/EPG.jsx b/frontend/src/components/forms/EPG.jsx index 37ad1de2..c5d5b6e2 100644 --- a/frontend/src/components/forms/EPG.jsx +++ b/frontend/src/components/forms/EPG.jsx @@ -1,7 +1,5 @@ // Modal.js import React, { useState, useEffect } from 'react'; -import { useFormik } from 'formik'; -import * as Yup from 'yup'; import API from '../../api'; import useEPGsStore from '../../store/epgs'; import { @@ -15,6 +13,7 @@ import { NumberInput, Space, } from '@mantine/core'; +import { isNotEmpty, useForm } from '@mantine/form'; const EPG = ({ epg = null, isOpen, onClose }) => { const epgs = useEPGsStore((state) => state.epgs); @@ -27,7 +26,8 @@ const EPG = ({ epg = null, isOpen, onClose }) => { } }; - const formik = useFormik({ + const form = useForm({ + mode: 'uncontrolled', initialValues: { name: '', source_type: 'xmltv', @@ -36,30 +36,33 @@ const EPG = ({ epg = null, isOpen, onClose }) => { is_active: true, refresh_interval: 24, }, - validationSchema: Yup.object({ - name: Yup.string().required('Name is required'), - source_type: Yup.string().required('Source type is required'), - }), - onSubmit: async (values, { setSubmitting, resetForm }) => { - if (epg?.id) { - await API.updateEPG({ id: epg.id, ...values, epg_file: file }); - } else { - await API.addEPG({ - ...values, - epg_file: file, - }); - } - resetForm(); - setFile(null); - setSubmitting(false); - onClose(); + validate: { + name: isNotEmpty('Please select a name'), + source_type: isNotEmpty('Source type cannot be empty'), }, }); + const onSubmit = async () => { + const values = form.getValues(); + + if (epg?.id) { + await API.updateEPG({ id: epg.id, ...values, file }); + } else { + await API.addEPG({ + ...values, + file, + }); + } + + form.reset(); + setFile(null); + onClose(); + }; + useEffect(() => { if (epg) { - formik.setValues({ + form.setValues({ name: epg.name, source_type: epg.source_type, url: epg.url, @@ -68,7 +71,7 @@ const EPG = ({ epg = null, isOpen, onClose }) => { refresh_interval: epg.refresh_interval, }); } else { - formik.resetForm(); + form.reset(); } }, [epg]); @@ -78,43 +81,37 @@ const EPG = ({ epg = null, isOpen, onClose }) => { return ( -
+ {