import React, { useState, useEffect } from 'react'; import { ButtonItem, PanelSection, PanelSectionRow, Field, Focusable } from '@decky/ui'; import { checkForPluginUpdate, downloadPluginUpdate, UpdateCheckResult, UpdateDownloadResult } from '../api/lsfgApi'; interface PluginUpdateCheckerProps { // Add any props if needed } interface UpdateInfo { updateAvailable: boolean; currentVersion: string; latestVersion: string; releaseNotes: string; releaseDate: string; downloadUrl: string; } export const PluginUpdateChecker: React.FC = () => { const [checkingUpdate, setCheckingUpdate] = useState(false); const [downloadingUpdate, setDownloadingUpdate] = useState(false); const [updateInfo, setUpdateInfo] = useState(null); const [updateError, setUpdateError] = useState(null); const [downloadResult, setDownloadResult] = useState(null); // Auto-hide error messages after 5 seconds useEffect(() => { if (updateError) { const timer = setTimeout(() => { setUpdateError(null); }, 5000); return () => clearTimeout(timer); } return undefined; }, [updateError]); const handleCheckForUpdate = async () => { setCheckingUpdate(true); setUpdateError(null); setUpdateInfo(null); setDownloadResult(null); // Clear previous download result try { const result: UpdateCheckResult = await checkForPluginUpdate(); if (result.success) { setUpdateInfo({ updateAvailable: result.update_available, currentVersion: result.current_version, latestVersion: result.latest_version, releaseNotes: result.release_notes, releaseDate: result.release_date, downloadUrl: result.download_url }); // Simple console log instead of toast since showToast may not be available if (result.update_available) { console.log("Update available!", `Version ${result.latest_version} is now available.`); } else { console.log("Up to date!", "You have the latest version installed."); } } else { setUpdateError(result.error || "Failed to check for updates"); } } catch (error) { setUpdateError(`Error checking for updates: ${error}`); } finally { setCheckingUpdate(false); } }; const handleDownloadUpdate = async () => { if (!updateInfo?.downloadUrl) return; setDownloadingUpdate(true); setUpdateError(null); setDownloadResult(null); try { const result: UpdateDownloadResult = await downloadPluginUpdate(updateInfo.downloadUrl); if (result.success) { setDownloadResult(result); console.log("✓ Download complete!", `Plugin downloaded to ${result.download_path}`); } else { setUpdateError(result.error || "Failed to download update"); } } catch (error) { setUpdateError(`Error downloading update: ${error}`); } finally { setDownloadingUpdate(false); } }; const getStatusMessage = () => { if (!updateInfo) return null; if (updateInfo.updateAvailable) { if (downloadResult?.success) { return "✓ v" + updateInfo.latestVersion + " downloaded - ready to install"; } else { return "Update available: v" + updateInfo.latestVersion; } } else { return "Up to date (v" + updateInfo.currentVersion + ")"; } }; return ( {checkingUpdate ? 'Checking for updates...' : 'Check for Updates'} {updateInfo && updateInfo.updateAvailable && !downloadResult?.success && ( {downloadingUpdate ? 'Downloading...' : 'Download Update'} )} {downloadResult?.success && ( <> File saved to: {downloadResult.download_path} 1. Go to Decky Loader settings
2. Click "Developer" tab
3. Click "Uninstall" next to "decky-lsfg-vk"
4. Click "Install from ZIP"
5. Select the downloaded file
6. Restart Steam or reload plugins
)} {updateError && ( {updateError} )}
); };