diff --git a/context/PortfolioLandingContext.tsx b/context/PortfolioLandingContext.tsx index f6d01eb89..c3cac1daf 100644 --- a/context/PortfolioLandingContext.tsx +++ b/context/PortfolioLandingContext.tsx @@ -13,7 +13,7 @@ import ContactModal from '@modules/portfolio/component/contact-modal'; import Certifications from '@modules/portfolio/component/certification-modal'; import Awards from '@modules/portfolio/component/awards-modal'; import { useAuth } from './AuthContext'; -import ProjectSectionModal from '@modules/portfolio/component/modals/project-section-modal'; +import ProjectSectionModal from '@modules/portfolio/component/modals/project-modal/project-section-modal'; import { useQueries, UseQueryResult } from '@tanstack/react-query'; import $http from '../http/axios'; import { AddShopModal } from '@modules/portfolio/component/addShopErrorModal'; diff --git a/modules/portfolio/component/all-projects-modal.tsx b/modules/portfolio/component/modals/project-modal/all-projects-modal.tsx similarity index 83% rename from modules/portfolio/component/all-projects-modal.tsx rename to modules/portfolio/component/modals/project-modal/all-projects-modal.tsx index b584cdf1b..9379ce066 100644 --- a/modules/portfolio/component/all-projects-modal.tsx +++ b/modules/portfolio/component/modals/project-modal/all-projects-modal.tsx @@ -1,12 +1,12 @@ import React, { Fragment, useEffect, useState } from 'react'; import Image from 'next/image'; import Link from 'next/link'; -import { Data, allRouteOptions } from './modals/project-section-modal'; import Button from '@ui/Button'; import { Add } from 'iconsax-react'; import axios from 'axios'; import { notify } from '@ui/Toast'; import { Edit2, Trash } from 'iconsax-react'; +import { Data, allRouteOptions } from './project-section-modal'; const endpoint = 'https://hng6-r5y3.onrender.com'; const AllProjectsModal = ({ @@ -53,6 +53,7 @@ const AllProjectsModal = ({ .then((res) => { handleLoading(false); handleSetProjects(res.data.data); + console.log(res.data.data, 'all projects'); }) .catch((err) => { handleLoading(false); @@ -111,14 +112,25 @@ const AllProjectsModal = ({ ))} - - Link to project ↗ - + + + Link to project ↗ + + { + handleEdit(project); + handleSetRoute('single-project'); + }} + className="text-green-600 text-sm md:text-base mt-5 font-manropeL font-semibold cursor-pointer" + > + View More + + diff --git a/modules/portfolio/component/modals/project-section-modal.tsx b/modules/portfolio/component/modals/project-modal/project-section-modal.tsx similarity index 84% rename from modules/portfolio/component/modals/project-section-modal.tsx rename to modules/portfolio/component/modals/project-modal/project-section-modal.tsx index 826fefa13..5822930ca 100644 --- a/modules/portfolio/component/modals/project-section-modal.tsx +++ b/modules/portfolio/component/modals/project-modal/project-section-modal.tsx @@ -1,11 +1,12 @@ import Modal from '@ui/Modal'; import { useEffect, useState } from 'react'; import ProjectSection from './projects'; -import AllProjectsModal from '../all-projects-modal'; import axios from 'axios'; import Loader from '@ui/Loader'; +import AllProjectsModal from './all-projects-modal'; +import SingleProject from './single-project'; -export type allRouteOptions = 'add-project' | 'view-projects'; +export type allRouteOptions = 'add-project' | 'view-projects' | 'single-project'; export type Data = { title: string; @@ -28,7 +29,7 @@ type ProjectModalProps = { }; const ProjectSectionModal = ({ isOpen, onCloseModal, onSaveModal, userId }: ProjectModalProps) => { - const allRoutes = ['add-project', 'view-projects']; + const allRoutes = ['add-project', 'view-projects', 'single-project']; const [dataToEdit, setDataToEdit] = useState(null); const [route, setRoute] = useState('add-project'); const [loading, setLoading] = useState(false); @@ -81,7 +82,13 @@ const ProjectSectionModal = ({ isOpen, onCloseModal, onSaveModal, userId }: Proj }, []); return ( - + {loading ? ( <> @@ -110,6 +117,7 @@ const ProjectSectionModal = ({ isOpen, onCloseModal, onSaveModal, userId }: Proj userId={userId} /> )} + {route === allRoutes[2] && } > )} diff --git a/modules/portfolio/component/modals/projects.tsx b/modules/portfolio/component/modals/project-modal/projects.tsx similarity index 99% rename from modules/portfolio/component/modals/projects.tsx rename to modules/portfolio/component/modals/project-modal/projects.tsx index e6f8828fc..f574caddf 100644 --- a/modules/portfolio/component/modals/projects.tsx +++ b/modules/portfolio/component/modals/project-modal/projects.tsx @@ -204,12 +204,11 @@ const ProjectSection: React.FC = ({ }); handleDataClear(); onSaveModal(); - console.log(res); }) .catch((err) => { setLoading(false); notify({ - message: 'Error occurred', + message: err?.response?.data?.message || 'Error occurred', position: 'top-center', theme: 'light', type: 'error', @@ -226,7 +225,7 @@ const ProjectSection: React.FC = ({ setYear(year); setLink(link); setThumbnail(thumbnail); - setSelectedTags(tags.split(',')); + setSelectedTags(tags.trim().split(',')); setDescription(description); setUrlsFromCloudinary(projectsImages); setId(id); diff --git a/modules/portfolio/component/modals/project-modal/single-project.tsx b/modules/portfolio/component/modals/project-modal/single-project.tsx new file mode 100644 index 000000000..379608d87 --- /dev/null +++ b/modules/portfolio/component/modals/project-modal/single-project.tsx @@ -0,0 +1,107 @@ +import Link from 'next/link'; +import { AiOutlineClose } from 'react-icons/ai'; +import { Data, allRouteOptions } from './project-section-modal'; +import Image from 'next/image'; +import { useEffect, useState } from 'react'; +import Loader from '@ui/Loader'; + +type SingleProjectProps = { + dataToEdit: Data | null; + handleSetRoute: (data: allRouteOptions) => void; +}; + +const SingleProject: React.FC = ({ dataToEdit, handleSetRoute }) => { + const [title, setTitle] = useState(''); + const [link, setLink] = useState(''); + const [thumbnail, setThumbnail] = useState(''); + const [tags, setTags] = useState(''); + const [description, setDescription] = useState(''); + const [projectsImages, setProjectsImages] = useState([]); + const [loading, setLoading] = useState(false); + + const handleSingleProjectData = () => { + setLoading(true); + if (dataToEdit !== null) { + const { title, year, link, thumbnail, tags, description, media, id, projectsImages } = dataToEdit; + setTitle(title); + setLink(link); + setThumbnail(thumbnail); + setTags(tags); + setDescription(description); + setProjectsImages(projectsImages); + setLoading(false); + } + }; + + useEffect(() => { + handleSingleProjectData(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [dataToEdit]); + return ( + <> + {loading ? ( + <> + + Please wait + > + ) : ( + + handleSetRoute('view-projects')} + > + + + + {title} + + + {tags.split(',').map((tag, id) => ( + + {tag} + + ))} + + + + {description} + + + + Link to project ↗ + + + + + + + {projectsImages.map((projectImage) => ( + + + + ))} + + + )} + > + ); +}; + +export default SingleProject; diff --git a/pages/view-components/ProjectModal.tsx b/pages/view-components/ProjectModal.tsx index 6c68dd2f4..aeb4c2a36 100644 --- a/pages/view-components/ProjectModal.tsx +++ b/pages/view-components/ProjectModal.tsx @@ -6,6 +6,7 @@ import { ProjectModalProps } from '../../@types'; import projectPlaceholder from '../../public/assets/images/portfolio/project.png'; import Button from '@ui/Button'; import Link from 'next/link'; +import { AiOutlineClose } from 'react-icons/ai'; function ProjectModal({ title = 'Byte Financial App', @@ -35,35 +36,49 @@ function ProjectModal({ > Toggle Project Modal - - - - - + + + + + {title} - - {description} - - - + {tags.map((tag, id) => ( - + {tag} ))} - + + + + {description} + - Link to project ↗ + Link to project ↗ + + + + + + + + + + + >
Please wait
+ {description} +
- {description} -