"use client"; import { Box, Center, Stack, Text, Title } from "@mantine/core"; import dayjs from "dayjs"; import advancedFormat from "dayjs/plugin/advancedFormat"; import type { WidgetComponentProps } from "../definition"; import { AdvancedClockView } from "./advanced-view"; import { clockTimeFormatShowsSeconds, resolveClockTimeFormat } from "./format"; import { useCurrentTime } from "./use-current-time"; import { ClockWeatherSummary } from "./weather-summary"; import { getResolvedLocalTimeZone, isTimeZoneSupported } from "./world-clock"; dayjs.extend(advancedFormat); export default function ClockWidget({ options, width, height, displayMode }: WidgetComponentProps<"clock">) { const isAdvanced = displayMode === "advanced"; const showSeconds = clockTimeFormatShowsSeconds(options.customTimeFormat); const time = useCurrentTime({ showSeconds }); const requestedTimeZone = options.useCustomTimezone ? options.timezone : getResolvedLocalTimeZone(); const primaryTimeZoneInvalid = !isTimeZoneSupported(requestedTimeZone); const primaryTimeZone = primaryTimeZoneInvalid ? "UTC" : requestedTimeZone; const zonedTime = time === null ? null : dayjs(time).tz(primaryTimeZone); if (isAdvanced) { if (time && zonedTime) { return ( ); } return
--:--
; } const resolvedTimeFormat = resolveClockTimeFormat(options.customTimeFormat, options.is24HourFormat); const minimumAxis = Math.min(width, height * 1.5); let sizing: "xs" | "sm" | "md" = "md"; if (minimumAxis < 128) sizing = "xs"; else if (minimumAxis < 196) sizing = "sm"; const showWeatherCorner = options.showWeather && sizing !== "xs"; return ( {showWeatherCorner && ( )} {options.customTitleToggle && ( {options.customTitle} )} <time dateTime={zonedTime?.toISOString()}> {zonedTime === null ? "--:--" : zonedTime.format(resolvedTimeFormat)} </time> {options.showDate && ( {zonedTime?.format(options.dateFormat)} )} ); } const getTitleOrder = (sizing: "xs" | "sm" | "md") => { if (sizing === "md") return 2; if (sizing === "sm") return 4; return 6; };