11import React , { useEffect , useState } from "react" ;
22import { IRoomAgenda } from "@/types/agenda.ts" ;
3- import { Link } from "react-router-dom" ;
43import { useAppContext } from "@/context/AppContext.tsx" ;
54import { ISession } from "@/types/speakers.ts" ;
65import { Star } from "lucide-react" ;
6+ import { Button } from "@/components/ui/button.tsx" ;
7+ import { useNavigate } from "react-router-dom" ;
78
89interface CardEventProps {
910 room : IRoomAgenda ;
@@ -12,6 +13,7 @@ interface CardEventProps {
1213const CardEvent : React . FC < CardEventProps > = ( { room } ) => {
1314 const { savedSessions, setSavedSessions, displayAll } = useAppContext ( ) ;
1415 const session = room . session ;
16+ const navigate = useNavigate ( ) ;
1517 const [ isSaved , setIsSaved ] = useState ( false ) ;
1618
1719 useEffect ( ( ) => {
@@ -21,11 +23,12 @@ const CardEvent: React.FC<CardEventProps> = ({ room }) => {
2123
2224 const handleSaveSession = ( session : ISession ) => {
2325 // @ts -ignore
24- setSavedSessions ( prev => {
25- const newSet = new Set ( prev ) ;
26+ setSavedSessions ( ( prev : Set < number > ) => {
27+ const newSet : Set < number > = new Set ( prev ) ;
2628 if ( newSet . has ( session . id ) ) {
2729 newSet . delete ( session . id ) ;
2830 setIsSaved ( false ) ;
31+ if ( navigator . vibrate ) navigator . vibrate ( 25 ) ;
2932 } else {
3033 newSet . add ( session . id ) ;
3134 setIsSaved ( true ) ;
@@ -36,30 +39,46 @@ const CardEvent: React.FC<CardEventProps> = ({ room }) => {
3639
3740 if ( ! displayAll && ! savedSessions . has ( session . id ) ) return null ;
3841 return (
39- < div id = { `session-${ session . id } ` } className = "flex flex-col gap-4 mt-6 w-full" >
40- < h3 className = "font-bold text-2xl" > Sala: { room . name } </ h3 >
41- < WrappedCardEvent className = { `${ isSaved ? "bg-primary-700" : "bg-white" } relative flex flex-col gap-2 border-2 border-primary-600 rounded-lg w-full min-h-52 h-full shadow-sm shadow-gray-600 p-4` }
42- session = { session }
42+ < div id = { `session-${ session . id } ` } className = "flex flex-col gap-4 mt-6" >
43+ < h3 className = { `font-bold text-2xl` } > Sala: { room . name } </ h3 >
44+ < WrappedCardEvent className = { `relative
45+ bg-white shadow-sm shadow-gray-600 border-2 border-primary-600
46+ flex flex-col gap-2 rounded-lg min-h-52 h-full p-4
47+ transition-all duration-300
48+ ` }
49+ session = { session }
4350 >
44- < h4 className = { ` text-2xl font-bold ${ isSaved ? "text-white" : "text-alternative-600" } ` } >
51+ < aside className = "flex w-full items-center" >
52+ { isSaved && (
53+ < span className = "bg-primary-500 text-white text-xs font-bold px-2 py-1 rounded-full shadow w-20 text-center justify-self-start" > Guardado</ span >
54+ ) }
55+ < div className = "flex-1" />
56+ < button
57+ type = "button"
58+ onClick = { ( e ) => {
59+ e . preventDefault ( ) ;
60+ handleSaveSession ( session ) ;
61+ } }
62+ className = { `bg-white justify-self-end group flex justify-center items-center gap-2 border border-primary-500 font-bold px-2 py-1 rounded-lg transition-colors duration-300` }
63+ >
64+ < Star className = { `h-4 w-4 text-primary-500 ${ isSaved ? "fill-primary-500" : "fill-white group-hover:fill-primary-500" } ` } />
65+ </ button >
66+ </ aside >
67+
68+ < h4 className = { ` text-2xl font-bold text-alternative-600 ${ isSaved ? "" : "" } ` } >
4569 { session . title }
4670 </ h4 >
47- < aside className = "h-full" hidden = { session . speakers . length == 0 } >
71+ < div className = "h-full" hidden = { session . speakers . length == 0 } >
4872 { session . speakers . map ( ( speaker ) => (
49- < p key = { speaker . id } className = { `${ isSaved ? "text-gray-300 " : "text-gray-500" } font-bold text-2xl` } > { speaker . name } </ p >
73+ < p key = { speaker . id } className = { `${ isSaved ? "text-gray-600 " : "text-gray-500" } font-bold text-2xl` } > { speaker . name } </ p >
5074 ) ) }
51- </ aside >
52- < p hidden = { session . speakers . length > 0 } className = { `h-full ${ isSaved ? "text-gray-300" : "text-gray-500" } font-bold text-2xl` } > { session . description } </ p >
53- < button
54- type = "button"
55- onClick = { ( e ) => {
56- e . preventDefault ( ) ;
57- handleSaveSession ( session ) ;
58- } }
59- className = "self-end"
60- >
61- < Star className = { `h-8 w-8 ${ isSaved ? " fill-white text-primary-700 hover:text-white hover:fill-primary-600" : "text-primary-600 hover:fill-primary-600" } transition-colors duration-300` } />
62- </ button >
75+ </ div >
76+ < p hidden = { session . speakers . length > 0 } className = { `h-full ${ isSaved ? "text-gray-600" : "text-gray-500" } font-bold text-2xl` } > { session . description } </ p >
77+ { session . speakers . length > 0 && (
78+ < Button variant = "ghost" onClick = { ( ) => navigate ( `/session/${ session . id } ` ) } >
79+ Ver detalles
80+ </ Button >
81+ ) }
6382 </ WrappedCardEvent >
6483 </ div >
6584 ) ;
@@ -73,11 +92,10 @@ interface WrappedCardEventProps {
7392
7493const WrappedCardEvent : React . FC < WrappedCardEventProps > = ( { session, children, className} ) => {
7594 if ( session . speakers . length === 0 ) return ( < div className = { className } > { children } </ div > )
76- return < Link
77- to = { `/session/${ session . id } ` }
95+ return < div
7896 className = { className }
7997 > { children }
80- </ Link >
98+ </ div >
8199}
82100
83101export default CardEvent ;
0 commit comments