summaryrefslogtreecommitdiff
path: root/app/page.tsx
blob: 8584df02ceb48ab05f03d14960cf5128bc50bec7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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>
  );
}