import React, { useEffect, useState } from "react"; import { FaClipboardList } from "react-icons/fa"; import { definePlugin } from "decky-frontend-lib"; import { marked } from "marked"; import DOMPurify from "dompurify"; function Content() { const [changelog, setChangelog] = useState(null); const [error, setError] = useState(null); const [isRefreshing, setIsRefreshing] = useState(false); // For button state feedback const fetchChangelog = async (signal?: AbortSignal) => { const url = "https://api.github.com/repos/ublue-os/bazzite/releases/tags/41.20250106.2"; 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(); setChangelog(data.body); setError(null); // Clear previous errors } 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(); // Cleanup on unmount }; }, []); const refreshChangelog = async () => { setIsRefreshing(true); // Start refresh animation or feedback setChangelog(null); // Clear existing changelog to show loading setError(null); // Clear any errors try { await fetchChangelog(); } finally { setIsRefreshing(false); // End refresh animation } }; return (

Bazzite Release Notes

{error ? (

{error}

) : changelog ? (
) : (

Loading...

)}
); } export default definePlugin(() => { return { name: "Bazzite Changelog Viewer", title:
Bazzite Changelog
, icon: , content: , onDismount() {}, }; });