import {useEffect, useState} from "react"; import {FaClipboardList} from "react-icons/fa"; import {definePlugin} from "decky-frontend-lib"; import remarkHtml from "remark-html" import remarkParse from "remark-parse" import remarkGfm from "remark-gfm" import {unified} from "unified" import {patchPartnerEventStore} from "./PartnerEventStorePatch"; import {staticClasses} from "@decky/ui"; function Content() { const [changelogHtml, setChangelogHtml] = useState(null); const [error, setError] = useState(null); const [isRefreshing, setIsRefreshing] = useState(false); const fetchChangelog = async (signal?: AbortSignal) => { const url = "https://api.github.com/repos/ublue-os/bazzite/releases/latest"; try { const response = await fetch(url, { headers: { Accept: "application/vnd.github.v3+json", }, signal, }); if (!response.ok) { throw new Error(`Failed to fetch: ${response.statusText}`); } const data = await response.json(); const html = await unified() .use(remarkParse) .use(remarkGfm) .use(remarkHtml) .process(data.body) setChangelogHtml(html.value as string); setError(null); } catch (err) { if (err instanceof DOMException && err.name === "AbortError") return; const errorMessage = err instanceof Error ? err.message : "An unknown error occurred while fetching the changelog."; setError(errorMessage); } }; useEffect(() => { const controller = new AbortController(); fetchChangelog(controller.signal); return () => { controller.abort(); }; }, []); const refreshChangelog = async () => { setIsRefreshing(true); setChangelogHtml(null); setError(null); try { await fetchChangelog(); } finally { setIsRefreshing(false); } }; return (

Bazzite Release Notes

{error ? (

{error}

) : changelogHtml ? (
) : (

Loading...

)}
); } export default definePlugin(() => { const patches = patchPartnerEventStore(); return { name: "Bazzite Changelog Viewer", title:
Bazzite Buddy
, icon: , content: , onDismount() { patches.forEach(patch => { patch.unpatch(); }); }, }; });