summaryrefslogtreecommitdiff
path: root/app/page.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'app/page.tsx')
-rw-r--r--app/page.tsx74
1 files changed, 74 insertions, 0 deletions
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..8584df0
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,74 @@
+"use client";
+
+import { useState, useEffect } from "react";
+import { useTheme } from "next-themes";
+import DateWeatherLinks from "./components/DateWeatherLinks";
+import WhoisChart from "./components/WhoisChart";
+import {
+ Data,
+ DataContext,
+ fetchWeather,
+ fetchWhois,
+} from "@/lib/data-context";
+
+export default function Home() {
+ // god i hate next.
+ const [mounted, setMounted] = useState<boolean>(false);
+ const { theme, setTheme } = useTheme();
+ const [data, setData] = useState<Data>({});
+
+ useEffect(() => {
+ setMounted(true);
+ }, []);
+
+ useEffect(() => {
+ const update = () =>
+ fetchWeather().then((weather) =>
+ setData((data) => data && { ...data, weather })
+ );
+ update();
+ const interval = setInterval(update, 5 * 60_000); // 5 mins
+ return () => clearInterval(interval);
+ }, []);
+
+ useEffect(() => {
+ const update = () =>
+ fetchWhois().then((whois) =>
+ setData((data) => data && { ...data, whois })
+ );
+ update();
+ const interval = setInterval(update, 5 * 1_000); // 5 seconds
+ return () => clearInterval(interval);
+ }, []);
+
+ if (!mounted) return null;
+
+ return (
+ <DataContext.Provider value={data}>
+ <div className="min-h-screen p-8">
+ <div className="max-w-4xl mx-auto">
+ <header className="glass p-6 flex justify-between items-center mb-8">
+ <h1 className="text-4xl font-bold text-gray-800 dark:text-gray-100">
+ 🐧 Penguin New Tab
+ </h1>
+ <button
+ onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
+ className="p-2 rounded-full bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200"
+ >
+ {theme === "dark" ? "🌙" : "☀️"}
+ </button>
+ </header>
+ <main className="space-y-8">
+ <DateWeatherLinks />
+ <WhoisChart />
+ </main>
+ <footer className="mt-8 text-center">
+ <p className="text-sm text-gray-600 dark:text-gray-400">
+ Made with 💖 by Penguin Lovers
+ </p>
+ </footer>
+ </div>
+ </div>
+ </DataContext.Provider>
+ );
+}