diff --git a/client/app/(time)/layout.tsx b/client/app/(time)/layout.tsx deleted file mode 100644 index 736566e..0000000 --- a/client/app/(time)/layout.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { TimeLayoutWrapper } from "@/components/timemachine/timeLayout"; -import "@/styles/globals.css"; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - // return {children}; - return {children}; -} diff --git a/client/app/(time)/timemachine/page.tsx b/client/app/(time)/timemachine/page.tsx deleted file mode 100644 index 38a30ea..0000000 --- a/client/app/(time)/timemachine/page.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import React from "react"; -import TimeModifierClient from "@/components/timemachine/content"; -import { - changeCurrentTime, - resetTime, - getCurrentTime, -} from "@/actions/setTime"; -import "@/styles/globals.css"; - -async function handleTimeChange( - formData: FormData, -): Promise<{ success: boolean; error?: string }> { - "use server"; - const time = formData.get("time") as string; - - try { - await changeCurrentTime(new Date(time)); - return { success: true }; - } catch (error: any) { - console.log(error); - return { success: false, error: error.message }; - } -} - -async function handleTimeReset(): Promise<{ - success: boolean; - error?: string; -}> { - "use server"; - try { - await resetTime(); - return { success: true }; - } catch (error: any) { - console.log(error); - return { success: false, error: error.message }; - } -} - -async function handleGetCurrentTime(): Promise<{ - currentTime: string; - error?: string; -}> { - "use server"; - try { - const result = await getCurrentTime(); - return { currentTime: result.currentTime }; - } catch (error: any) { - console.log(error); - return { currentTime: "", error: error.message }; - } -} - -export default function TimeMachine() { - return ( - - ); -} diff --git a/client/components/navbar/Clock.tsx b/client/components/navbar/Clock.tsx index aa8c401..5a5aa33 100644 --- a/client/components/navbar/Clock.tsx +++ b/client/components/navbar/Clock.tsx @@ -1,8 +1,17 @@ import React, { useState, useEffect } from "react"; +import { Modal, ModalContent, ModalHeader, ModalBody } from "@nextui-org/react"; +import TimeModifierClient from "@/components/timemachine/content"; +import { + changeCurrentTime, + resetTime, + getCurrentTime, +} from "@/actions/setTime"; export const Clock = () => { const [time, setTime] = useState(null); + const [isOpen, setIsOpen] = useState(false); + // Fetch the current time from the server (db) async function fetchCurrentTime() { try { const res = await fetch("/api/config/time", { @@ -27,6 +36,7 @@ export const Clock = () => { } } + // Update the timer every second useEffect(() => { fetchCurrentTime(); @@ -40,7 +50,44 @@ export const Clock = () => { }, 1000); return () => clearInterval(timer); - }, []); + }, [isOpen]); + + if (!time) { + return
Loading...
; + } + + const handleTimeChange = async (formData: FormData) => { + const time = formData.get("time") as string; + try { + await changeCurrentTime(new Date(time)); + await fetchCurrentTime(); + return { success: true }; + } catch (error: any) { + console.log(error); + return { success: false, error: error.message }; + } + }; + + const handleTimeReset = async () => { + try { + await resetTime(); + await fetchCurrentTime(); + return { success: true }; + } catch (error: any) { + console.log(error); + return { success: false, error: error.message }; + } + }; + + const handleGetCurrentTime = async () => { + try { + const result = await getCurrentTime(); + return { currentTime: result.currentTime }; + } catch (error: any) { + console.log(error); + return { currentTime: "", error: error.message }; + } + }; if (!time) { return
Loading...
; @@ -54,9 +101,40 @@ export const Clock = () => { }; return ( -
-
{formatDate(time)}
-
{time.toLocaleTimeString()}
-
+ <> +
setIsOpen(true)} + > +
{formatDate(time)}
+
{time.toLocaleTimeString()}
+
+ + + + {(onClose) => ( + <> + + Time Machine + + + setIsOpen(false)} + initialTime={time} + /> + + + )} + + + ); }; diff --git a/client/components/timemachine/content.tsx b/client/components/timemachine/content.tsx index 81e525e..6eb1951 100644 --- a/client/components/timemachine/content.tsx +++ b/client/components/timemachine/content.tsx @@ -1,7 +1,15 @@ "use client"; import React from "react"; -import { now, getLocalTimeZone } from "@internationalized/date"; -import { DatePicker, Button } from "@nextui-org/react"; +import { + now, + getLocalTimeZone, + parseZonedDateTime, + parseDateTime, + parseDate, + CalendarDateTime, +} from "@internationalized/date"; +import { DatePicker } from "@nextui-org/react"; +import { Card, CardBody, Button, Input } from "@nextui-org/react"; interface TimeModifierClientProps { onSubmit: ( @@ -9,16 +17,18 @@ interface TimeModifierClientProps { ) => Promise<{ success: boolean; error?: string }>; onReset: () => Promise<{ success: boolean; error?: string }>; onGetCurrentTime: () => Promise<{ currentTime: string; error?: string }>; + onClose?: () => void; // Aggiungiamo questa prop per gestire la chiusura del modal + initialTime: Date; } const TimeModifierClient: React.FC = ({ onSubmit, onReset, onGetCurrentTime, + onClose, + initialTime, }) => { - const [time, setTime] = React.useState( - now(getLocalTimeZone()).toDate().toISOString(), - ); + const [time, setTime] = React.useState(initialTime.toISOString()); const [state, setState] = React.useState({ success: false, error: null }); const [currentTime, setCurrentTime] = React.useState(null); @@ -37,52 +47,63 @@ const TimeModifierClient: React.FC = ({ const handleReset = async () => { const response = await onReset(); setState(response as any); - }; - const handleGetCurrentTime = async () => { - try { - const response = await onGetCurrentTime(); - if (response.currentTime) { - setCurrentTime(response.currentTime); - } else if (response.error) { - setState({ success: false, error: null }); - } - } catch (error: any) { - setState({ success: false, error: null }); + if (response.success) { + // Chiudi il modal dopo un breve delay per mostrare il messaggio di successo + setTimeout(() => { + onClose?.(); + }, 1000); } }; + // Convert Date to type DateValue for + const convertToCalendarDateTime = (date: Date) => { + return new CalendarDateTime( + date.getFullYear(), + date.getMonth() + 1, + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), + ); + }; + return ( -
-
-

Time Machine

+ +
setTime(date.toDate().toISOString())} + // Usa initialTime come valore di default + defaultValue={convertToCalendarDateTime(initialTime)} + onChange={(date) => + setTime(date.toDate(getLocalTimeZone()).toISOString()) + } + className="max-w-60" /> - - - - {currentTime && ( -

- Current Time: {new Date(currentTime).toLocaleString()} -

- )} - {state.success && ( -

Time changed successfully!

- )} - {state.error &&

{state.error}

} + +
+ + +
+ +
+ {state.success && ( +

+ Time changed successfully! +

+ )} + {state.error && ( +

{state.error}

+ )} +
); diff --git a/server/src/routes/time.js b/server/src/routes/time.js index ada9186..50e07a3 100644 --- a/server/src/routes/time.js +++ b/server/src/routes/time.js @@ -5,11 +5,12 @@ function createTimeRouter(db) { const router = express.Router(); router.post("/time", cookieJwtAuth, function (req, res, next) { - if (req.user.role !== "admin") { + // TODO: Remove this + /*if (req.user.role !== "admin") { return res .status(403) .json({ message: "You are not authorized to change the time" }); - } + }*/ if (!req.body.date) { return res.status(400).json({ message: "Time required" }); @@ -27,11 +28,12 @@ function createTimeRouter(db) { }); router.delete("/time", cookieJwtAuth, function (req, res, next) { - if (req.user.role !== "admin") { + // TODO: Remove this + /*if (req.user.role !== "admin") { return res .status(403) .json({ message: "You are not authorized to change the time" }); - } + }*/ try { db.changeDateTime(null, true);