-
-
-
{ev.title}
- {ev.time &&
{ev.time}
}
+
+ {WEEK_DAYS.map(d => (
+
{d}
+ ))}
+ {cells.map((day, i) => {
+ if (!day) return
;
+ const dateStr = `${year}-${String(month+1).padStart(2,"0")}-${String(day).padStart(2,"0")}`;
+ const isToday = dateStr === todayStr;
+ const isSelected = dateStr === selectedDate;
+ const hasEvents = datesWithEvents.has(dateStr);
+ return (
+
+ );
+ })}
+
+
+ {selectedDate && (
+
+
+
+ {new Date(selectedDate + "T12:00:00").toLocaleDateString("ru-RU", { day: "numeric", month: "long" })}
+
+
+
+
+ {showCreate && (
+
- ))}
+ )}
+
+ {loadingDay ? (
+
+ ) : dayEvents.length === 0 ? (
+
Нет событий
+ ) : (
+
+ {dayEvents.map(ev => (
+
+
+
+
{ev.title}
+
+
+ {ev.allDay ? "Весь день" : formatTime(ev.start)}
+ {ev.end && !ev.allDay && ` — ${formatTime(ev.end)}`}
+
+
+ {ev.htmlLink && (
+
+
+
+ )}
+
+ ))}
+
+ )}
)}
diff --git a/src/components/widgets/WeatherWidget.tsx b/src/components/widgets/WeatherWidget.tsx
index eb646ce..7f9c538 100644
--- a/src/components/widgets/WeatherWidget.tsx
+++ b/src/components/widgets/WeatherWidget.tsx
@@ -1,83 +1,114 @@
"use client";
import { useEffect, useState } from "react";
-import { Cloud, Thermometer, Wind, Droplets, RefreshCw } from "lucide-react";
+import { RefreshCw, Wind, Droplets, Thermometer } from "lucide-react";
-interface WeatherData {
- current_condition: Array<{
- temp_C: string;
- FeelsLikeC: string;
- humidity: string;
- windspeedKmph: string;
- weatherDesc: Array<{ value: string }>;
- }>;
+interface CurrentWeather {
+ temp: number; feelsLike: number; humidity: number; windKmh: number; desc: string; icon: string;
}
+interface DayForecast {
+ date: string; maxTemp: number; minTemp: number; desc: string; icon: string; precipProb: number;
+}
+interface WeatherData {
+ current: CurrentWeather;
+ forecast: DayForecast[];
+}
+
+const DAY_NAMES = ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"];
+const MONTH_NAMES = ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"];
export function WeatherWidget() {
const [data, setData] = useState
(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(false);
+ const [selected, setSelected] = useState(0);
- const fetchWeather = async () => {
- setLoading(true);
- setError(false);
+ const fetchData = async () => {
+ setLoading(true); setError(false);
try {
const res = await fetch("/api/weather");
if (!res.ok) throw new Error();
- const json = await res.json();
- setData(json);
- } catch {
- setError(true);
- } finally {
- setLoading(false);
- }
+ setData(await res.json());
+ } catch { setError(true); }
+ finally { setLoading(false); }
};
- useEffect(() => { fetchWeather(); }, []);
+ useEffect(() => { fetchData(); }, []);
- const current = data?.current_condition?.[0];
+ const c = data?.current;
+ const day = data?.forecast?.[selected];
+ const formatDate = (dateStr: string) => {
+ const d = new Date(dateStr + "T12:00:00");
+ return `${DAY_NAMES[d.getDay()]}, ${d.getDate()} ${MONTH_NAMES[d.getMonth()]}`;
+ };
return (
-
-
-
-
- Погода
-
-