import { useState, useEffect } from "react"; import { invoke } from "@tauri-apps/api/core"; import "./App.css"; interface RcloneConfig { name: string; remote_path: string; local_path: string; access_key: string; secret_key: string; } interface SyncStatus { name: string; status: string; transferred: string; bytes: string; errors: number; last_updated: string; } type Screen = "Main" | "Status"; function App() { const [state, setState] = useState({ name: "", access_key: "", secret_key: "", status_text: "Enter credentials to set up sync", sync_statuses: [] as SyncStatus[], show_config_dialog: false, show_about_dialog: false, current_screen: "Main" as Screen, }); useEffect(() => { if (state.current_screen === "Status") { const interval = setInterval(() => { // In a real app, you would fetch actual configs here // This is just a mock implementation invoke("get_status", { remoteName: "example" }) .then((status) => { setState(prev => ({ ...prev, sync_statuses: [status] })); }) .catch(console.error); }, 5000); return () => clearInterval(interval); } }, [state.current_screen]); const saveConfig = async () => { if (!state.name || !state.access_key || !state.secret_key) { setState(prev => ({ ...prev, status_text: "All fields are required!" })); return; } const config: RcloneConfig = { name: state.name, remote_path: `s3://${state.name}`, local_path: `${window.__TAURI__.path.homeDir}/General Bots/${state.name}`, access_key: state.access_key, secret_key: state.secret_key, }; try { await invoke("save_config", { config }); setState(prev => ({ ...prev, status_text: "New sync saved!", show_config_dialog: false })); } catch (e) { setState(prev => ({ ...prev, status_text: `Failed to save config: ${e}` })); } }; const startSync = async () => { // In a real app, you would fetch actual configs here const config: RcloneConfig = { name: state.name || "example", remote_path: `s3://${state.name || "example"}`, local_path: `${window.__TAURI__.path.homeDir}/General Bots/${state.name || "example"}`, access_key: state.access_key || "dummy", secret_key: state.secret_key || "dummy", }; try { await invoke("start_sync", { config }); setState(prev => ({ ...prev, status_text: "Sync started!" })); } catch (e) { setState(prev => ({ ...prev, status_text: `Failed to start sync: ${e}` })); } }; const stopSync = async () => { try { await invoke("stop_sync"); setState(prev => ({ ...prev, status_text: "Sync stopped." })); } catch (e) { setState(prev => ({ ...prev, status_text: `Failed to stop sync: ${e}` })); } }; return (
{state.current_screen === "Main" ? (

General Bots

{state.status_text}

) : (

Sync Status

{state.sync_statuses.map((status, index) => (

{status.name}

Status: {status.status}

Transferred: {status.transferred}

Bytes: {status.bytes}

Errors: {status.errors}

Last Updated: {status.last_updated}

))}
)} {state.show_config_dialog && (

Add Sync Configuration

setState(prev => ({ ...prev, name: e.target.value }))} placeholder="Enter sync name" /> setState(prev => ({ ...prev, access_key: e.target.value }))} placeholder="Enter access key" /> setState(prev => ({ ...prev, secret_key: e.target.value }))} placeholder="Enter secret key" />
)} {state.show_about_dialog && (

About General Bots

Version: 1.0.0

A professional-grade sync tool for OneDrive/Dropbox-like functionality.

)}
); } export default App;