mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2025-12-20 19:06:43 -05:00
feat(gui, tauri): Save settings in Tauri storage (#102)
- Implemented dual persistence strategy: - **User Settings**: Persisted across app restarts using `tauri-plugin-store`. - **Transient State**: Persisted across page reloads using `sessionStorage`. - Added `settingsSlice` reducer for managing persistent user settings. - Updated Redux store configuration to handle multiple persistence layers. - Added a new Settings page in the GUI where users can specify custom Electrum RPC URLs for Bitcoin and Monero node URLs. - Users can input their preferred Electrum server (`ssl://host:port`) and Monero daemon (`http://host:port`). - Input fields include validation to ensure correct URL formats. - Settings persist across application restarts using Tauri's storage plugin. - A reset option is available to revert to default settings. - Improved the Daemon Controller in the Help page: - Renamed `RpcControlBox` to `DaemonControlBox` for clarity. - Users can now start the daemon manually if it isn't running or has failed. - Added a "Restart GUI" button to apply new settings immediately. - Displayed the daemon's status within the controller. - Upgraded Tauri and related plugins to stable version `2.0.0`: - Updated `tauri`, `tauri-build`, and `tauri-utils` to `2.0.0`. - Ensured compatibility with the latest stable release. - Updated Tauri plugins to version `2.0.0`: - `tauri-plugin-clipboard-manager` - `tauri-plugin-shell` - Added new plugins: - `tauri-plugin-store` for settings persistence. - `tauri-plugin-process` to enable application relaunch. - Deferred Context initialization until explicitly triggered from the frontend. - Moved Context setup from the `setup` function to a new `initialize_context` Tauri command. - Allows the application to start without immediately initializing the backend context. - Context initialization now considers user-provided settings for Electrum and Monero nodes. - Introduced a `ValidatedTextField` component for form inputs with validation logic. - Provides immediate feedback on input validity. - Used in the Settings page for Electrum and Monero node URLs. - If the user provides an override Monero remote daemon, we check if it reachable and on the correct network before starting the `monero-wallet-rpc` - Changed `bitcoin_confirmation_target` type from `usize` to `u16`.
This commit is contained in:
parent
d4503a6e9c
commit
253e0b0cf6
40 changed files with 1124 additions and 451 deletions
|
|
@ -1,44 +1,20 @@
|
|||
import { CircularProgress } from "@material-ui/core";
|
||||
import { Button, CircularProgress } from "@material-ui/core";
|
||||
import { Alert, AlertProps } from "@material-ui/lab";
|
||||
import { TauriContextInitializationProgress } from "models/tauriModel";
|
||||
import { useState } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { useAppSelector } from "store/hooks";
|
||||
import { exhaustiveGuard } from "utils/typescriptUtils";
|
||||
|
||||
const FUNNY_INIT_MESSAGES = [
|
||||
"Initializing quantum entanglement...",
|
||||
"Generating one-time pads from cosmic background radiation...",
|
||||
"Negotiating key exchange with aliens...",
|
||||
"Optimizing elliptic curves for maximum sneakiness...",
|
||||
"Transforming plaintext into ciphertext via arcane XOR rituals...",
|
||||
"Salting your hash with exotic mathematical seasonings...",
|
||||
"Performing advanced modular arithmetic gymnastics...",
|
||||
"Consulting the Oracle of Randomness...",
|
||||
"Executing top-secret permutation protocols...",
|
||||
"Summoning prime factors from the mathematical aether...",
|
||||
"Deploying steganographic squirrels to hide your nuts of data...",
|
||||
"Initializing the quantum superposition of your keys...",
|
||||
"Applying post-quantum cryptographic voodoo...",
|
||||
"Encrypting your data with the tears of frustrated regulators...",
|
||||
];
|
||||
|
||||
function LoadingSpinnerAlert({ ...rest }: AlertProps) {
|
||||
return <Alert icon={<CircularProgress size={22} />} {...rest} />;
|
||||
}
|
||||
|
||||
export default function DaemonStatusAlert() {
|
||||
const contextStatus = useAppSelector((s) => s.rpc.status);
|
||||
const navigate = useNavigate();
|
||||
|
||||
const [initMessage] = useState(
|
||||
FUNNY_INIT_MESSAGES[Math.floor(Math.random() * FUNNY_INIT_MESSAGES.length)],
|
||||
);
|
||||
|
||||
if (contextStatus == null) {
|
||||
return (
|
||||
<LoadingSpinnerAlert severity="warning">
|
||||
{initMessage}
|
||||
</LoadingSpinnerAlert>
|
||||
);
|
||||
if (contextStatus === null) {
|
||||
return <Alert severity="info">The daemon is not running</Alert>;
|
||||
}
|
||||
|
||||
switch (contextStatus.type) {
|
||||
|
|
@ -68,7 +44,20 @@ export default function DaemonStatusAlert() {
|
|||
return <Alert severity="success">The daemon is running</Alert>;
|
||||
case "Failed":
|
||||
return (
|
||||
<Alert severity="error">The daemon has stopped unexpectedly</Alert>
|
||||
<Alert
|
||||
severity="error"
|
||||
action={
|
||||
<Button
|
||||
size="small"
|
||||
variant="outlined"
|
||||
onClick={() => navigate("/help")}
|
||||
>
|
||||
View Logs
|
||||
</Button>
|
||||
}
|
||||
>
|
||||
The daemon has stopped unexpectedly
|
||||
</Alert>
|
||||
);
|
||||
default:
|
||||
return exhaustiveGuard(contextStatus);
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ export default function FundsLeftInWalletAlert() {
|
|||
severity="info"
|
||||
action={
|
||||
<Button
|
||||
color="inherit"
|
||||
variant="outlined"
|
||||
size="small"
|
||||
onClick={() => navigate("/wallet")}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ export default function UnfinishedSwapsAlert() {
|
|||
variant="filled"
|
||||
action={
|
||||
<Button
|
||||
color="inherit"
|
||||
variant="outlined"
|
||||
size="small"
|
||||
onClick={() => navigate("/history")}
|
||||
>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue