all ready for home details

This commit is contained in:
Michael Freno
2025-12-19 00:20:47 -05:00
parent 01f8e7e45c
commit a8481b8f7c
2 changed files with 127 additions and 122 deletions

View File

@@ -1,97 +1,59 @@
import { Typewriter } from "./Typewriter"; import { Typewriter } from "./Typewriter";
import { useBars } from "~/context/bars"; import { useBars } from "~/context/bars";
import { onMount, createEffect, createSignal, Show, For } from "solid-js"; import {
onMount,
createEffect,
createSignal,
createResource,
Show,
For,
Suspense
} from "solid-js";
import { api } from "~/lib/api"; import { api } from "~/lib/api";
import { TerminalSplash } from "./TerminalSplash"; import { TerminalSplash } from "./TerminalSplash";
import { insertSoftHyphens } from "~/lib/client-utils"; import { insertSoftHyphens } from "~/lib/client-utils";
import GitHub from "./icons/GitHub"; import GitHub from "./icons/GitHub";
import LinkedIn from "./icons/LinkedIn"; import LinkedIn from "./icons/LinkedIn";
import MoonIcon from "./icons/MoonIcon";
import SunIcon from "./icons/SunIcon";
import { RecentCommits } from "./RecentCommits"; import { RecentCommits } from "./RecentCommits";
import { ActivityHeatmap } from "./ActivityHeatmap"; import { ActivityHeatmap } from "./ActivityHeatmap";
import { DarkModeToggle } from "./DarkModeToggle";
export function RightBarContent() { export function RightBarContent() {
const [isDark, setIsDark] = createSignal(false); const [githubCommits] = createResource(async () => {
const [githubCommits, setGithubCommits] = createSignal<any[] | undefined>(
undefined
);
const [giteaCommits, setGiteaCommits] = createSignal<any[] | undefined>(
undefined
);
const [githubActivity, setGithubActivity] = createSignal<any[] | undefined>(
undefined
);
const [giteaActivity, setGiteaActivity] = createSignal<any[] | undefined>(
undefined
);
onMount(async () => {
const prefersDark = window.matchMedia(
"(prefers-color-scheme: dark)"
).matches;
if (prefersDark) {
setIsDark(true);
document.documentElement.classList.add("dark");
document.documentElement.classList.remove("light");
} else {
setIsDark(false);
document.documentElement.classList.add("light");
document.documentElement.classList.remove("dark");
}
// Fetch GitHub activity
try { try {
const commits = await api.gitActivity.getGitHubCommits.query({ return await api.gitActivity.getGitHubCommits.query({ limit: 3 });
limit: 3
});
setGithubCommits(commits as any[]);
} catch (error) { } catch (error) {
console.error("Failed to fetch GitHub commits:", error); console.error("Failed to fetch GitHub commits:", error);
setGithubCommits([]); return [];
}
try {
const activity = await api.gitActivity.getGitHubActivity.query();
setGithubActivity(activity as any[]);
} catch (error) {
console.error("Failed to fetch GitHub activity:", error);
setGithubActivity([]);
}
// Fetch Gitea activity
try {
const commits = await api.gitActivity.getGiteaCommits.query({
limit: 3
});
setGiteaCommits(commits as any[]);
} catch (error) {
console.error("Failed to fetch Gitea commits:", error);
setGiteaCommits([]);
}
try {
const activity = await api.gitActivity.getGiteaActivity.query();
setGiteaActivity(activity as any[]);
} catch (error) {
console.error("Failed to fetch Gitea activity:", error);
setGiteaActivity([]);
} }
}); });
const toggleDarkMode = () => { const [giteaCommits] = createResource(async () => {
const newDarkMode = !isDark(); try {
setIsDark(newDarkMode); return await api.gitActivity.getGiteaCommits.query({ limit: 3 });
} catch (error) {
if (newDarkMode) { console.error("Failed to fetch Gitea commits:", error);
document.documentElement.classList.add("dark"); return [];
document.documentElement.classList.remove("light");
} else {
document.documentElement.classList.add("light");
document.documentElement.classList.remove("dark");
} }
}; });
const [githubActivity] = createResource(async () => {
try {
return await api.gitActivity.getGitHubActivity.query();
} catch (error) {
console.error("Failed to fetch GitHub activity:", error);
return [];
}
});
const [giteaActivity] = createResource(async () => {
try {
return await api.gitActivity.getGiteaActivity.query();
} catch (error) {
console.error("Failed to fetch Gitea activity:", error);
return [];
}
});
return ( return (
<div class="text-text flex h-full flex-col gap-6 overflow-y-auto pb-6"> <div class="text-text flex h-full flex-col gap-6 overflow-y-auto pb-6">
@@ -149,53 +111,31 @@ export function RightBarContent() {
</Typewriter> </Typewriter>
{/* Git Activity Section */} {/* Git Activity Section */}
<div class="border-overlay0 flex flex-col gap-6 border-t px-4 pt-6"> <Suspense fallback={<TerminalSplash />}>
<RecentCommits <div class="border-overlay0 flex flex-col gap-6 border-t px-4 pt-6">
commits={githubCommits()} <RecentCommits
title="Recent GitHub Commits" commits={githubCommits()}
loading={githubCommits() === undefined} title="Recent GitHub Commits"
/> loading={githubCommits.loading}
<ActivityHeatmap />
contributions={githubActivity()} <ActivityHeatmap
title="GitHub Activity" contributions={githubActivity()}
/> title="GitHub Activity"
<div> />
<a href="https://git.freno.me">Self-hosted Git!</a> <div>
<a href="https://git.freno.me">Self-hosted Git!</a>
</div>
<RecentCommits
commits={giteaCommits()}
title="Recent Gitea Commits"
loading={giteaCommits.loading}
/>
<ActivityHeatmap
contributions={giteaActivity()}
title="Gitea Activity"
/>
</div> </div>
<RecentCommits </Suspense>
commits={giteaCommits()}
title="Recent Gitea Commits"
loading={giteaCommits() === undefined}
/>
<ActivityHeatmap
contributions={giteaActivity()}
title="Gitea Activity"
/>
</div>
{/* Dark Mode Toggle */}
<div class="border-overlay0 mt-auto border-t px-4 pt-6">
<button
onClick={toggleDarkMode}
class="hover:bg-surface0 flex w-full items-center gap-3 rounded-lg p-3 transition-all duration-200 ease-in-out hover:scale-105"
aria-label="Toggle dark mode"
>
<Show
when={isDark()}
fallback={<SunIcon size={24} fill="var(--color-text)" />}
>
<MoonIcon size={24} fill="var(--color-text)" />
</Show>
<span class="font-semibold">
<Show
when={isDark()}
fallback={<Typewriter keepAlive={false}>Light Mode</Typewriter>}
>
<Typewriter keepAlive={false}>Dark Mode</Typewriter>
</Show>
</span>
</button>
</div>
</div> </div>
); );
} }
@@ -434,6 +374,11 @@ export function LeftBar() {
</ul> </ul>
</Typewriter> </Typewriter>
{/* Dark Mode Toggle */}
<div class="border-overlay0 border-t pt-6">
<DarkModeToggle />
</div>
{/* RightBar content on mobile */} {/* RightBar content on mobile */}
<div class="border-overlay0 border-t pt-8 md:hidden"> <div class="border-overlay0 border-t pt-8 md:hidden">
<RightBarContent /> <RightBarContent />

View File

@@ -0,0 +1,60 @@
import { createSignal, onMount, Show } from "solid-js";
import MoonIcon from "./icons/MoonIcon";
import SunIcon from "./icons/SunIcon";
import { Typewriter } from "./Typewriter";
export function DarkModeToggle() {
const [isDark, setIsDark] = createSignal(false);
onMount(() => {
const prefersDark = window.matchMedia(
"(prefers-color-scheme: dark)"
).matches;
if (prefersDark) {
setIsDark(true);
document.documentElement.classList.add("dark");
document.documentElement.classList.remove("light");
} else {
setIsDark(false);
document.documentElement.classList.add("light");
document.documentElement.classList.remove("dark");
}
});
const toggleDarkMode = () => {
const newDarkMode = !isDark();
setIsDark(newDarkMode);
if (newDarkMode) {
document.documentElement.classList.add("dark");
document.documentElement.classList.remove("light");
} else {
document.documentElement.classList.add("light");
document.documentElement.classList.remove("dark");
}
};
return (
<button
onClick={toggleDarkMode}
class="hover:bg-surface0 flex w-full items-center gap-3 rounded-lg p-3 transition-all duration-200 ease-in-out hover:scale-105"
aria-label="Toggle dark mode"
>
<Show
when={isDark()}
fallback={<SunIcon size={24} fill="var(--color-text)" />}
>
<MoonIcon size={24} fill="var(--color-text)" />
</Show>
<span class="text-lg font-semibold">
<Show
when={isDark()}
fallback={<Typewriter keepAlive={false}>Light Mode</Typewriter>}
>
<Typewriter keepAlive={false}>Dark Mode</Typewriter>
</Show>
</span>
</button>
);
}