From 7bbf5e4e0e0f4c278e96b06132995531c0fc695d Mon Sep 17 00:00:00 2001 From: sogav21 Date: Mon, 11 May 2026 16:48:20 +0300 Subject: [PATCH 1/2] Update My Courses to Tailwind UI --- .../CourseCard/CourseCard.module.css | 158 ------------------ .../src/views/Dashboard/CourseCard/index.jsx | 71 +++++--- .../src/views/Dashboard/MyCourses/index.jsx | 6 +- 3 files changed, 47 insertions(+), 188 deletions(-) delete mode 100644 frontend/src/views/Dashboard/CourseCard/CourseCard.module.css diff --git a/frontend/src/views/Dashboard/CourseCard/CourseCard.module.css b/frontend/src/views/Dashboard/CourseCard/CourseCard.module.css deleted file mode 100644 index 09b3f38..0000000 --- a/frontend/src/views/Dashboard/CourseCard/CourseCard.module.css +++ /dev/null @@ -1,158 +0,0 @@ -.details { - width: calc(100% - 34px); - background-color: #f5f9fb; - border: 1px solid #d1e0e7; - border-bottom: 0px; - border-radius: 4px 4px 0px 0px; - padding: 24px 16px; -} -.bookings-0 { - width: calc(100% - 22px); - background-color: #ebf3f7; - border: 1px solid #d1e0e7; - border-top: 0px; - border-radius: 0px 0px 4px 4px; - padding: 10px; -} -.bookings-1 { - width: calc(100% - 22px); - background-color: #fee6da; - border: 1px solid #d1e0e7; - color: #d83341; - border-top: 0px; - border-radius: 0px 0px 4px 4px; - padding: 7px 10px; - display: flex; - align-items: center; -} -.title { - color: #0d1e38; - font-family: 'Rubik-Bold', serif; - font-size: 20px; -} -.title2 { - color: #0d1e38; - font-family: 'Rubik-Regular', serif; - font-size: 20px; - margin-bottom: 12px; -} -.items { - display: flex; - margin-bottom: 24px; -} -.items p { - background-color: #cadbe3; - margin-right: 4px; - border-radius: 100px; - padding: 6px 12px; - color: #335065; - font-family: 'SourceSansPro-Regular', serif; - font-size: 14px; -} -.texts { - display: flex; - flex-direction: column; - row-gap: 8px; - height: 90px; -} -.text { - color: #335065; - font-family: 'SourceSansPro-Regular', serif; - font-size: 14px; -} -.text strong { - font-family: 'SourceSansPro-Bold', serif; -} -.text2 { - font-family: 'SourceSansPro-Bold', serif; - font-size: 14px; -} -.icon-alert { - width: 20px; - height: 20px; - margin-right: 10px; - margin-top: 4px; -} -.buttons { - width: 100%; - display: flex; - flex-direction: row; - justify-content: flex-end; -} -.button-details { - margin-top: 16px; - border-radius: 4px; - border: 1px solid #6254ff; - color: #ffffff; - padding: 12px 24px; - background-color: #6254ff; - margin-left: 12px; - font-family: 'SourceSansPro-SemiBold', serif; - font-size: 18px; -} -.button-details:disabled { - margin-top: 16px; - border-radius: 4px; - border: 1px solid #9f98ee; - color: #ffffff; - padding: 12px 24px; - background-color: #9f98ee; - margin-left: 12px; - font-family: 'SourceSansPro-SemiBold', serif; - font-size: 18px; -} -.button-details:enabled:hover { - cursor: pointer; -} -.button-details2 { - margin-top: 16px; - border-radius: 4px; - border: 1px solid #6254ff; - color: #6254ff; - padding: 12px 24px; - background-color: #00000000; - margin-left: 12px; - font-family: 'SourceSansPro-SemiBold', serif; - font-size: 18px; -} -.button-details2:hover { - cursor: pointer; -} -@media only screen and (max-width: 1440px) and (min-width: 1281px) { - .texts { - display: flex; - flex-direction: column; - row-gap: 8px; - height: 90px; - } - .title { - font-size: 19px; - } - .title2 { - font-size: 19px; - } -} -@media only screen and (max-width: 1280px) and (min-width: 801px) { - .texts { - display: flex; - flex-direction: column; - row-gap: 8px; - height: 100px; - } - .title { - font-size: 18.4px; - } - .title2 { - font-size: 18.4px; - } - .details { - width: calc(100% - 30px); - background-color: #f5f9fb; - border: 1px solid #d1e0e7; - border-bottom: 0px; - border-radius: 4px 4px 0px 0px; - padding: 24px 14px; - } -} -@media only screen and (max-width: 800px) { -} diff --git a/frontend/src/views/Dashboard/CourseCard/index.jsx b/frontend/src/views/Dashboard/CourseCard/index.jsx index a916c51..5fc6e3a 100644 --- a/frontend/src/views/Dashboard/CourseCard/index.jsx +++ b/frontend/src/views/Dashboard/CourseCard/index.jsx @@ -1,39 +1,55 @@ import React from 'react'; -//styles -import Styles from './CourseCard.module.css'; import { useNavigate } from 'react-router-dom'; //icons import { TbAlertTriangle } from 'react-icons/tb'; const CourseCard = ({ data, text, url, text2, url2, subscribed = true }) => { const navigate = useNavigate(); + const bookingClassName = data.extra_alert + ? 'border-[#d1e0e7] bg-[#fee6da] py-[7px] text-[#d83341]' + : 'border-[#d1e0e7] bg-[#ebf3f7] py-2.5 text-[#335065]'; + return ( - <> -
-

{data.title}

-

{data.title_second}

-

{data.title_extra}

-
-

{data.type}

-

{data.duration}

-

Nivel {data.level}

+
+
+

+ {data.title} +

+

+ {data.title_second} +

+

+ {data.title_extra} +

+
+

+ {data.type} +

+

+ {data.duration} +

+

+ Nivel {data.level} +

-
-

- Dominarás: {data.technologies} +

+

+ Dominarás:{' '} + {data.technologies}

-

- Precio: {data.price} +

+ Precio: {data.price}

-

- Inicia: Al llegar a {data.minimum} aplicaciones daremos - fecha. +

+ Inicia: Al llegar a{' '} + {data.minimum} aplicaciones daremos fecha.

-
+
{text2 && url2 && (
-
- {data.extra_alert && } -

{`${ +

+ {data.extra_alert && } +

{`${ data.extra_alert ? '¡Aplica ahora! ' : '' }Reservas confirmadas: ${data.bookings}`}

- +
); }; diff --git a/frontend/src/views/Dashboard/MyCourses/index.jsx b/frontend/src/views/Dashboard/MyCourses/index.jsx index f32c4af..efeb050 100644 --- a/frontend/src/views/Dashboard/MyCourses/index.jsx +++ b/frontend/src/views/Dashboard/MyCourses/index.jsx @@ -1,8 +1,6 @@ import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { useDispatch } from 'react-redux'; -//styles -import Styles from './../Grid.module.css'; //actions import { logOut } from './../../../redux/actions/auth'; //components @@ -25,10 +23,10 @@ const MyCourses = () => { getData(); }, []); return ( -
+
{listCourses.map((course) => { return ( -
+
Date: Mon, 11 May 2026 17:36:59 +0300 Subject: [PATCH 2/2] fix: clear frontend CI build warnings --- .../views/Admin/Courses/Templates/index.jsx | 2 +- .../Dashboard/AvailableCourses/index.jsx | 2 +- .../src/views/Dashboard/MyCourses/index.jsx | 2 +- .../src/views/Dashboard/Setting/index.jsx | 28 ++----------------- 4 files changed, 5 insertions(+), 29 deletions(-) diff --git a/frontend/src/views/Admin/Courses/Templates/index.jsx b/frontend/src/views/Admin/Courses/Templates/index.jsx index 9d047a5..e132c54 100644 --- a/frontend/src/views/Admin/Courses/Templates/index.jsx +++ b/frontend/src/views/Admin/Courses/Templates/index.jsx @@ -5,7 +5,7 @@ import axios from 'axios'; import Styles from './Templates.module.css'; const Templates = () => { - const [error, setError] = useState(''); + const [, setError] = useState(''); const [send, setSend] = useState(false); const [data, setData] = useState({ name: '', diff --git a/frontend/src/views/Dashboard/AvailableCourses/index.jsx b/frontend/src/views/Dashboard/AvailableCourses/index.jsx index 636fea2..fc39eeb 100644 --- a/frontend/src/views/Dashboard/AvailableCourses/index.jsx +++ b/frontend/src/views/Dashboard/AvailableCourses/index.jsx @@ -26,7 +26,7 @@ const AvailableCourses = () => { } }; getData(); - }, []); + }, [dispatch]); return ( <> diff --git a/frontend/src/views/Dashboard/MyCourses/index.jsx b/frontend/src/views/Dashboard/MyCourses/index.jsx index efeb050..8d13d98 100644 --- a/frontend/src/views/Dashboard/MyCourses/index.jsx +++ b/frontend/src/views/Dashboard/MyCourses/index.jsx @@ -21,7 +21,7 @@ const MyCourses = () => { } }; getData(); - }, []); + }, [dispatch]); return (
{listCourses.map((course) => { diff --git a/frontend/src/views/Dashboard/Setting/index.jsx b/frontend/src/views/Dashboard/Setting/index.jsx index a3b7bb0..ed7fa69 100644 --- a/frontend/src/views/Dashboard/Setting/index.jsx +++ b/frontend/src/views/Dashboard/Setting/index.jsx @@ -5,11 +5,10 @@ import axios from 'axios'; //styles import Styles from './Setting.module.css'; //actions -import { updateAccount, updateProfile, updatePhone } from './../../../redux/actions/auth'; +import { updateAccount, updateProfile } from './../../../redux/actions/auth'; //icons import { MdOutlineEdit, MdOutlineEditOff } from 'react-icons/md'; import { AiOutlineCheck } from 'react-icons/ai'; -import { GiConfirmed, GiCancel } from 'react-icons/gi'; //components import Modal from './../../../components/Modal'; @@ -30,8 +29,6 @@ const Setting = () => { address: '', linkedin_url: '' }); - const [phone, setPhone] = useState(user.phone); - const [editPhone, setEditPhone] = useState(false); const handleChangeAccount = (e) => { setAccount({ ...account, [e.target.name]: e.target.value }); }; @@ -74,29 +71,8 @@ const Setting = () => { enqueueSnackbar('500 server error', { variant: 'error' }); } }; - const handlePhone = (e) => { - setPhone(e.target.value); - }; - const handleAddPhone = async () => { - try { - const data = { - phone: phone - }; - const response = await axios.post('/api/user/add-phone', data); - if (response.data.successful) { - dispatch(updatePhone(response.data.user)); - setEditPhone(false); - enqueueSnackbar(response.data.message, { variant: 'success' }); - } else { - enqueueSnackbar(response.data.message, { variant: 'error' }); - } - } catch (error) { - enqueueSnackbar('500 server error', { variant: 'error' }); - } - }; const handleOpenPhone = () => { - setPhone(''); - setEditPhone(true); + setModalPhone(true); }; const handleOpenProfile = () => { setProfile({