import { mdiChartTimelineVariant, mdiUpload } from '@mdi/js' import axios from 'axios' import Head from 'next/head' import React, { ReactElement, useEffect, useState } from 'react' import CardBox from '../../components/CardBox' import LayoutAuthenticated from '../../layouts/Authenticated' import SectionMain from '../../components/SectionMain' import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton' import { getPageTitle } from '../../config' import { Field, Form, Formik } from 'formik' import FormField from '../../components/FormField' import BaseDivider from '../../components/BaseDivider' import BaseButtons from '../../components/BaseButtons' import BaseButton from '../../components/BaseButton' import FormCheckRadio from '../../components/FormCheckRadio' import FormCheckRadioGroup from '../../components/FormCheckRadioGroup' import FormFilePicker from '../../components/FormFilePicker' import FormImagePicker from '../../components/FormImagePicker' import { SelectField } from "../../components/SelectField"; import { SelectFieldMany } from "../../components/SelectFieldMany"; import {RichTextField} from "../../components/RichTextField"; import { deleteItem, update, fetch } from '../../stores/projects/projectsSlice' import { useAppDispatch, useAppSelector } from '../../stores/hooks' import { useRouter } from 'next/router' import {saveFile} from "../../helpers/fileSaver"; import dataFormatter from '../../helpers/dataFormatter'; import ImageField from "../../components/ImageField"; const EditProjectsPage = () => { const router = useRouter() const dispatch = useAppDispatch() const initVals = { 'name': '', 'slug': '', description: '', phase: '', 'logo_url': '', 'favicon_url': '', 'og_image_url': '', theme_config_json: '', custom_css_json: '', 'cdn_base_url': '', 'entry_page_slug': '', is_deleted: false, deleted_at_time: new Date(), } const [initialValues, setInitialValues] = useState(initVals) const [logoAssets, setLogoAssets] = useState([]) const [isLoadingLogoAssets, setIsLoadingLogoAssets] = useState(false) const { projects } = useAppSelector((state) => state.projects) const { id } = router.query useEffect(() => { dispatch(fetch({ id: id })) }, [id]) const loadLogoAssets = async (projectId: string) => { if (!projectId) { setLogoAssets([]) return } setIsLoadingLogoAssets(true) try { const response = await axios.get( `/assets?limit=500&page=0&sort=desc&field=createdAt&project=${projectId}`, ) const rows = Array.isArray(response?.data?.rows) ? response.data.rows : [] const taggedLogoAssets = rows.filter( (asset: any) => typeof asset?.cdn_url === 'string' && asset.cdn_url && asset?.asset_type === 'image' && typeof asset?.name === 'string' && asset.name.startsWith('[LOGO] '), ) setLogoAssets(taggedLogoAssets) } catch (error: any) { console.error('Failed to load logo assets for project edit:', error?.message || error) setLogoAssets([]) } finally { setIsLoadingLogoAssets(false) } } useEffect(() => { if (typeof id === 'string' && id) { void loadLogoAssets(id) return } setLogoAssets([]) }, [id]) useEffect(() => { if (typeof projects === 'object') { setInitialValues(projects) } }, [projects]) useEffect(() => { if (typeof projects === 'object') { const newInitialVal = {...initVals}; Object.keys(initVals).forEach(el => newInitialVal[el] = (projects)[el]) setInitialValues(newInitialVal); } }, [projects]) const handleSubmit = async (data) => { await dispatch(update({ id: id, data })) await router.push('/projects/projects-list') } const handleDelete = async () => { const projectId = typeof id === 'string' ? id : null if (!projectId) { return } if (!window.confirm('Are you sure you want to delete this project?')) { return } await dispatch(deleteItem(projectId)) await router.push('/projects/projects-list') } return ( <> {getPageTitle('Edit projects')} {''} handleSubmit(values)} > {({ values }) => (
{logoAssets.map((asset: any) => ( ))} {values.logo_url && !logoAssets.some((asset: any) => asset.cdn_url === values.logo_url) && ( )} {values.logo_url && ( Preview selected logo )} {logoAssets.map((asset: any) => ( ))} {values.favicon_url && !logoAssets.some((asset: any) => asset.cdn_url === values.favicon_url) && ( )} {values.favicon_url && ( Preview selected favicon )} {logoAssets.map((asset: any) => ( ))} {values.og_image_url && !logoAssets.some((asset: any) => asset.cdn_url === values.og_image_url) && ( )} {values.og_image_url && ( Preview selected OG image )} router.push('/projects/projects-list')}/> )}
) } EditProjectsPage.getLayout = function getLayout(page: ReactElement) { return ( {page} ) } export default EditProjectsPage