diff --git a/lib/features/account/screens/account_screen.dart b/lib/features/account/screens/account_screen.dart index 3404860b..9c6db065 100644 --- a/lib/features/account/screens/account_screen.dart +++ b/lib/features/account/screens/account_screen.dart @@ -10,6 +10,7 @@ import 'package:mostro/features/account/providers/backup_reminder_provider.dart' import 'package:mostro/features/account/providers/privacy_mode_provider.dart'; import 'package:mostro/l10n/app_localizations.dart'; import 'package:mostro/shared/providers/session_provider.dart'; +import 'package:mostro/src/rust/api/orders.dart' as orders_api; /// Account screen — Route `/key_management`. /// @@ -451,9 +452,27 @@ class _AccountScreenState extends ConsumerState { child: const Text('Cancel'), ), FilledButton( - onPressed: () { + onPressed: () async { Navigator.pop(dialogContext); - // TODO: wire restore-session action in Phase 7. + try { + await orders_api.restartOrdersSubscription(); + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Order book refreshed')), + ); + } catch (e) { + debugPrint('[account] refresh error: $e'); + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + kDebugMode + ? 'Refresh failed: $e' + : 'Refresh failed', + ), + ), + ); + } }, child: const Text('Refresh'), ), diff --git a/lib/features/home/providers/home_order_providers.dart b/lib/features/home/providers/home_order_providers.dart index d8a8bfc6..fe4dfa87 100644 --- a/lib/features/home/providers/home_order_providers.dart +++ b/lib/features/home/providers/home_order_providers.dart @@ -44,13 +44,6 @@ int _platformInt64ToInt(dynamic v) => v is BigInt ? v.toInt() : v as int; // ── Order model ─────────────────────────────────────────────────────────────── /// Lightweight Dart-side order model for the UI layer. -/// -/// TODO(Phase 18+): Add `OrderItem.fromInfo(OrderInfo info)` factory once -/// `flutter_rust_bridge_codegen generate` has been run and the generated -/// `OrderInfo` type is available at `package:rust/src/rust/api/orders.dart`. -/// Field mapping: id, kind.name.toLowerCase(), fiatAmount, fiatAmountMin, -/// fiatAmountMax, fiatCode, paymentMethod, premium, creatorPubkey, -/// DateTime.fromMillisecondsSinceEpoch(createdAt * 1000), expiresAt. class OrderItem { OrderItem({ required this.id, diff --git a/lib/features/order/screens/take_order_screen.dart b/lib/features/order/screens/take_order_screen.dart index e6b6de9a..c3ba5bd3 100644 --- a/lib/features/order/screens/take_order_screen.dart +++ b/lib/features/order/screens/take_order_screen.dart @@ -284,8 +284,8 @@ class _TakeOrderScreenState extends ConsumerState { const SizedBox(height: AppSpacing.sm), // Card 5: Creator reputation — hidden in full privacy mode. - // TODO(bridge): the rate_counterpart route should also be skipped - // when privacy mode is on (controlled via the trade flow, not here). + // Rating step is skipped in trade_detail_screen.dart when privacy + // mode is active. if (!privacyMode) ...[ _InfoCard( color: cardBg, diff --git a/lib/features/trades/screens/trade_detail_screen.dart b/lib/features/trades/screens/trade_detail_screen.dart index adb03da3..90278afc 100644 --- a/lib/features/trades/screens/trade_detail_screen.dart +++ b/lib/features/trades/screens/trade_detail_screen.dart @@ -9,6 +9,7 @@ import 'package:mostro/core/app_routes.dart'; import 'package:mostro/core/app_theme.dart'; import 'package:mostro/src/rust/api/disputes.dart' as disputes_api; import 'package:mostro/src/rust/api/orders.dart' as orders_api; +import 'package:mostro/features/account/providers/privacy_mode_provider.dart'; import 'package:mostro/features/disputes/providers/disputes_providers.dart'; import 'package:mostro/features/home/providers/home_order_providers.dart'; import 'package:mostro/features/order/providers/trade_state_provider.dart'; @@ -283,7 +284,10 @@ class _TradeDetailScreenState extends ConsumerState { if (confirmed != true || !context.mounted) return; try { await orders_api.releaseOrder(orderId: widget.orderId); - if (context.mounted) { + if (!context.mounted) return; + if (ref.read(privacyModeProvider)) { + context.go(AppRoute.home); + } else { context.push(AppRoute.rateUserPath(widget.orderId)); } } catch (e, st) { @@ -754,8 +758,13 @@ class _TradeDetailScreenState extends ConsumerState { // ── Pending rating — RATE + CLOSE ───────────────────────────── if (status == TradeStatus.pendingRating) ...[ FilledButton.icon( - onPressed: () => - context.push(AppRoute.rateUserPath(widget.orderId)), + onPressed: () { + if (ref.read(privacyModeProvider)) { + context.go(AppRoute.home); + } else { + context.push(AppRoute.rateUserPath(widget.orderId)); + } + }, icon: const Icon(Icons.star_outline, size: 16), label: const Text('RATE'), style: FilledButton.styleFrom( diff --git a/rust/src/api/orders.rs b/rust/src/api/orders.rs index 1dff7fb6..72e90bf8 100644 --- a/rust/src/api/orders.rs +++ b/rust/src/api/orders.rs @@ -1002,6 +1002,17 @@ pub async fn subscribe_orders() { }); } +/// Force-restart the orders subscription. +/// +/// Tears down the existing subscription (if any) by resetting the guard, +/// then spawns a fresh subscription loop. Used by the UI "Refresh" action +/// so users get a real re-subscribe instead of a silent no-op. +pub async fn restart_orders_subscription() { + // Clear the guard so subscribe_orders can acquire it again. + SUBSCRIPTION_ACTIVE.store(false, Ordering::Release); + subscribe_orders().await; +} + async fn _run_order_subscription() { let Ok(pool) = crate::api::nostr::get_pool() else { log::error!("[orders] subscription failed: relay pool not initialized"); diff --git a/rust/src/api/settings.rs b/rust/src/api/settings.rs index d1d9414e..72f78633 100644 --- a/rust/src/api/settings.rs +++ b/rust/src/api/settings.rs @@ -9,6 +9,7 @@ use tokio::sync::{broadcast, RwLock}; use tokio::sync::broadcast::error::RecvError; use crate::api::types::{AppSettings, ThemeMode}; +use crate::db::Storage; // ── SettingsStore ───────────────────────────────────────────────────────────── @@ -200,6 +201,33 @@ pub fn get_mostro_pubkey() -> String { crate::config::active_mostro_pubkey() } +/// Return the active Mostro node info, falling back to the compiled +/// default if none has been persisted yet. +pub async fn get_mostro_node() -> Result { + if let Some(db) = crate::db::app_db::db() { + if let Ok(Some(node)) = db.get_active_mostro_node().await { + return Ok(node); + } + } + Ok(crate::db::seeds::get_default_mostro_node()) +} + +/// Persist a new active Mostro node selection. +/// +/// Also updates the in-memory pubkey override so the relay pool and +/// outgoing events use the new node immediately. +/// +/// TODO(#93): After updating the pubkey, refresh relay subscriptions so +/// `subscribe_order_and_dm_feeds` re-subscribes with the new node's key. +pub async fn set_mostro_node(node: crate::api::types::MostroNodeInfo) -> Result<()> { + let pubkey = node.pubkey.clone(); + if let Some(db) = crate::db::app_db::db() { + db.save_mostro_node(&node).await?; + } + crate::config::set_active_mostro_pubkey(Some(pubkey)); + Ok(()) +} + /// Toggle the in-memory logging flag (not persisted to disk). /// /// When a Tokio runtime is available the update is dispatched asynchronously diff --git a/rust/src/db/indexeddb.rs b/rust/src/db/indexeddb.rs index 4975d29c..2ffc61c3 100644 --- a/rust/src/db/indexeddb.rs +++ b/rust/src/db/indexeddb.rs @@ -89,6 +89,18 @@ impl Storage for IndexedDbStorage { Ok(None) // no persisted key: caller will treat absence correctly } + async fn save_mostro_node(&self, _node: &crate::api::types::MostroNodeInfo) -> Result<()> { + log::warn!("save_mostro_node: IndexedDB backend not implemented — node selection will not survive reload"); + // TODO(#93): implement IndexedDB persistence for Mostro node selection + Ok(()) + } + + async fn get_active_mostro_node(&self) -> Result> { + log::warn!("get_active_mostro_node: IndexedDB backend not implemented — falling back to default"); + // TODO(#93): implement IndexedDB persistence for Mostro node selection + Ok(None) + } + async fn get_trade_by_order_id( &self, _order_id: &str, diff --git a/rust/src/db/mod.rs b/rust/src/db/mod.rs index 1550c95d..5e7ffd94 100644 --- a/rust/src/db/mod.rs +++ b/rust/src/db/mod.rs @@ -62,6 +62,14 @@ pub trait Storage: Send + Sync { /// Retrieve the BIP-32 key index for `order_id`, or `None` if not found. async fn get_trade_key(&self, order_id: &str) -> Result>; + // ── Settings / Mostro node ──────────────────────────────────────────────── + + /// Persist a Mostro node info record, replacing any existing one. + async fn save_mostro_node(&self, node: &crate::api::types::MostroNodeInfo) -> Result<()>; + + /// Return the currently active Mostro node, or `None` if none has been saved. + async fn get_active_mostro_node(&self) -> Result>; + /// Look up a persisted trade by the order ID it is associated with. async fn get_trade_by_order_id( &self, diff --git a/rust/src/db/schema.rs b/rust/src/db/schema.rs index 61d44c0a..53a2ee77 100644 --- a/rust/src/db/schema.rs +++ b/rust/src/db/schema.rs @@ -56,6 +56,12 @@ CREATE TABLE IF NOT EXISTS queued_messages ( next_retry_at INTEGER ); +-- Generic key-value settings store (Mostro node, preferences, etc.). +CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL +); + -- Maps order_id → BIP-32 trade key index used when taking/creating that order. -- Persists across restarts so fiat-sent, release, and cancel can re-derive the -- correct signing key even after the app is killed between protocol steps. diff --git a/rust/src/db/seeds.rs b/rust/src/db/seeds.rs index aea6df54..5398871b 100644 --- a/rust/src/db/seeds.rs +++ b/rust/src/db/seeds.rs @@ -40,18 +40,13 @@ async fn seed_default_relays(storage: &S) -> Result<()> { } /// Seed the default Mostro node if no active node is configured. -/// -/// Stores the node info in the settings table. Since the `Storage` trait -/// doesn't have Mostro-node-specific methods yet, we store it as a relay -/// with a special source marker and use a separate settings key. -/// -/// TODO: Add `save_mostro_node` / `get_active_mostro_node` to Storage -/// trait when the settings/about screens are implemented (Phase 16-17). async fn seed_default_mostro_node(storage: &S) -> Result<()> { - // For now, the default Mostro node info is served from the compiled - // constant via `get_default_mostro_node()`. Persistence will be added - // when the Storage trait gains Mostro-node methods. - let _ = storage; + if storage.get_active_mostro_node().await?.is_some() { + return Ok(()); + } + let node = get_default_mostro_node(); + storage.save_mostro_node(&node).await?; + log::info!("[seeds] default Mostro node seeded: {}", node.pubkey); Ok(()) } diff --git a/rust/src/db/sqlite.rs b/rust/src/db/sqlite.rs index 3e57aa1c..a9b2def0 100644 --- a/rust/src/db/sqlite.rs +++ b/rust/src/db/sqlite.rs @@ -283,6 +283,31 @@ impl Storage for SqliteStorage { Ok(row.map(|(idx,)| idx as u32)) } + async fn save_mostro_node(&self, node: &crate::api::types::MostroNodeInfo) -> Result<()> { + let json = serde_json::to_string(node)?; + sqlx::query( + "INSERT OR REPLACE INTO settings (key, value) VALUES ('active_mostro_node', ?)", + ) + .bind(&json) + .execute(&self.pool) + .await?; + Ok(()) + } + + async fn get_active_mostro_node( + &self, + ) -> Result> { + let row: Option<(String,)> = sqlx::query_as( + "SELECT value FROM settings WHERE key = 'active_mostro_node'", + ) + .fetch_optional(&self.pool) + .await?; + match row { + None => Ok(None), + Some((json,)) => Ok(Some(serde_json::from_str(&json)?)), + } + } + async fn get_trade_by_order_id(&self, order_id: &str) -> Result> { // The `data` column holds the full JSON-serialised TradeInfo; use // SQLite's json_extract to filter by the nested order id without diff --git a/rust/src/frb_generated.rs b/rust/src/frb_generated.rs index 1b20885c..921258ff 100644 --- a/rust/src/frb_generated.rs +++ b/rust/src/frb_generated.rs @@ -45,7 +45,7 @@ flutter_rust_bridge::frb_generated_boilerplate!( default_rust_auto_opaque = RustAutoOpaqueMoi, ); pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.11.1"; -pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -327029727; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 1165020131; // Section: executor @@ -1732,6 +1732,41 @@ fn wire__crate__api__messages__get_messages_impl( }, ) } +fn wire__crate__api__settings__get_mostro_node_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "get_mostro_node", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::settings::get_mostro_node().await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} fn wire__crate__api__settings__get_mostro_pubkey_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, @@ -3250,6 +3285,43 @@ fn wire__crate__api__orders__resolve_maker_order_impl( }, ) } +fn wire__crate__api__orders__restart_orders_subscription_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "restart_orders_subscription", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let output_ok = Result::<_, ()>::Ok({ + crate::api::orders::restart_orders_subscription().await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} fn wire__crate__api__orders__send_fiat_sent_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, @@ -3558,6 +3630,42 @@ fn wire__crate__api__settings__set_logging_enabled_impl( }, ) } +fn wire__crate__api__settings__set_mostro_node_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "set_mostro_node", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_node = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::settings::set_mostro_node(api_node).await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} fn wire__crate__api__settings__set_mostro_pubkey_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, @@ -4515,6 +4623,38 @@ impl SseDecode for crate::api::types::MessageType { } } +impl SseDecode for crate::api::types::MostroNodeInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_pubkey = ::sse_decode(deserializer); + let mut var_name = >::sse_decode(deserializer); + let mut var_version = >::sse_decode(deserializer); + let mut var_expirationHours = ::sse_decode(deserializer); + let mut var_expirationSeconds = ::sse_decode(deserializer); + let mut var_feePct = >::sse_decode(deserializer); + let mut var_maxOrderAmount = >::sse_decode(deserializer); + let mut var_minOrderAmount = >::sse_decode(deserializer); + let mut var_supportedCurrencies = >>::sse_decode(deserializer); + let mut var_lnNodeId = >::sse_decode(deserializer); + let mut var_lnNodeAlias = >::sse_decode(deserializer); + let mut var_isActive = ::sse_decode(deserializer); + return crate::api::types::MostroNodeInfo { + pubkey: var_pubkey, + name: var_name, + version: var_version, + expiration_hours: var_expirationHours, + expiration_seconds: var_expirationSeconds, + fee_pct: var_feePct, + max_order_amount: var_maxOrderAmount, + min_order_amount: var_minOrderAmount, + supported_currencies: var_supportedCurrencies, + ln_node_id: var_lnNodeId, + ln_node_alias: var_lnNodeAlias, + is_active: var_isActive, + }; + } +} + impl SseDecode for crate::api::types::NewOrderParams { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -5314,135 +5454,143 @@ fn pde_ffi_dispatcher_primary_impl( 35 => wire__crate__api__disputes__get_dispute_impl(port, ptr, rust_vec_len, data_len), 36 => wire__crate__api__identity__get_identity_impl(port, ptr, rust_vec_len, data_len), 37 => wire__crate__api__messages__get_messages_impl(port, ptr, rust_vec_len, data_len), - 38 => wire__crate__api__settings__get_mostro_pubkey_impl(port, ptr, rust_vec_len, data_len), - 39 => wire__crate__api__identity__get_nym_identity_impl(port, ptr, rust_vec_len, data_len), - 40 => wire__crate__api__orders__get_order_impl(port, ptr, rust_vec_len, data_len), - 41 => wire__crate__api__orders__get_orders_impl(port, ptr, rust_vec_len, data_len), - 42 => { + 38 => wire__crate__api__settings__get_mostro_node_impl(port, ptr, rust_vec_len, data_len), + 39 => wire__crate__api__settings__get_mostro_pubkey_impl(port, ptr, rust_vec_len, data_len), + 40 => wire__crate__api__identity__get_nym_identity_impl(port, ptr, rust_vec_len, data_len), + 41 => wire__crate__api__orders__get_order_impl(port, ptr, rust_vec_len, data_len), + 42 => wire__crate__api__orders__get_orders_impl(port, ptr, rust_vec_len, data_len), + 43 => { wire__crate__api__reputation__get_privacy_mode_impl(port, ptr, rust_vec_len, data_len) } - 43 => wire__crate__api__reputation__get_rating_for_trade_impl( + 44 => wire__crate__api__reputation__get_rating_for_trade_impl( port, ptr, rust_vec_len, data_len, ), - 44 => wire__crate__api__nostr__get_relays_impl(port, ptr, rust_vec_len, data_len), - 45 => wire__crate__api__settings__get_settings_impl(port, ptr, rust_vec_len, data_len), - 46 => wire__crate__api__identity__get_trade_key_impl(port, ptr, rust_vec_len, data_len), - 47 => wire__crate__api__orders__get_trade_role_impl(port, ptr, rust_vec_len, data_len), - 48 => wire__crate__api__messages__get_unread_count_impl(port, ptr, rust_vec_len, data_len), - 49 => wire__crate__api__nwc__get_wallet_impl(port, ptr, rust_vec_len, data_len), - 50 => wire__crate__api__disputes__handle_admin_canceled_impl( + 45 => wire__crate__api__nostr__get_relays_impl(port, ptr, rust_vec_len, data_len), + 46 => wire__crate__api__settings__get_settings_impl(port, ptr, rust_vec_len, data_len), + 47 => wire__crate__api__identity__get_trade_key_impl(port, ptr, rust_vec_len, data_len), + 48 => wire__crate__api__orders__get_trade_role_impl(port, ptr, rust_vec_len, data_len), + 49 => wire__crate__api__messages__get_unread_count_impl(port, ptr, rust_vec_len, data_len), + 50 => wire__crate__api__nwc__get_wallet_impl(port, ptr, rust_vec_len, data_len), + 51 => wire__crate__api__disputes__handle_admin_canceled_impl( port, ptr, rust_vec_len, data_len, ), - 51 => { + 52 => { wire__crate__api__disputes__handle_admin_settled_impl(port, ptr, rust_vec_len, data_len) } - 52 => wire__crate__api__disputes__handle_admin_took_dispute_impl( + 53 => wire__crate__api__disputes__handle_admin_took_dispute_impl( port, ptr, rust_vec_len, data_len, ), - 53 => wire__crate__api__reputation__handle_rating_received_impl( + 54 => wire__crate__api__reputation__handle_rating_received_impl( port, ptr, rust_vec_len, data_len, ), - 54 => { + 55 => { wire__crate__api__identity__import_from_mnemonic_impl(port, ptr, rust_vec_len, data_len) } - 55 => wire__crate__api__identity__import_from_nsec_impl(port, ptr, rust_vec_len, data_len), - 56 => wire__crate__api__init_db_impl(port, ptr, rust_vec_len, data_len), - 57 => wire__crate__api__nostr__initialize_impl(port, ptr, rust_vec_len, data_len), - 58 => wire__crate__api__logging__install_log_bridge_impl(port, ptr, rust_vec_len, data_len), - 59 => wire__crate__api__orders__list_trades_impl(port, ptr, rust_vec_len, data_len), - 60 => wire__crate__api__identity__load_identity_from_mnemonic_impl( + 56 => wire__crate__api__identity__import_from_nsec_impl(port, ptr, rust_vec_len, data_len), + 57 => wire__crate__api__init_db_impl(port, ptr, rust_vec_len, data_len), + 58 => wire__crate__api__nostr__initialize_impl(port, ptr, rust_vec_len, data_len), + 59 => wire__crate__api__logging__install_log_bridge_impl(port, ptr, rust_vec_len, data_len), + 60 => wire__crate__api__orders__list_trades_impl(port, ptr, rust_vec_len, data_len), + 61 => wire__crate__api__identity__load_identity_from_mnemonic_impl( port, ptr, rust_vec_len, data_len, ), - 61 => wire__crate__api__nwc__make_invoice_impl(port, ptr, rust_vec_len, data_len), - 62 => wire__crate__api__messages__mark_as_read_impl(port, ptr, rust_vec_len, data_len), - 63 => wire__crate__api__messages__on_attachment_progress_impl( + 62 => wire__crate__api__nwc__make_invoice_impl(port, ptr, rust_vec_len, data_len), + 63 => wire__crate__api__messages__mark_as_read_impl(port, ptr, rust_vec_len, data_len), + 64 => wire__crate__api__messages__on_attachment_progress_impl( port, ptr, rust_vec_len, data_len, ), - 64 => wire__crate__api__nostr__on_connection_state_changed_impl( + 65 => wire__crate__api__nostr__on_connection_state_changed_impl( port, ptr, rust_vec_len, data_len, ), - 65 => { + 66 => { wire__crate__api__disputes__on_dispute_updated_impl(port, ptr, rust_vec_len, data_len) } - 66 => wire__crate__api__logging__on_log_entry_impl(port, ptr, rust_vec_len, data_len), - 67 => wire__crate__api__messages__on_new_message_impl(port, ptr, rust_vec_len, data_len), - 68 => wire__crate__api__orders__on_orders_updated_impl(port, ptr, rust_vec_len, data_len), - 69 => { + 67 => wire__crate__api__logging__on_log_entry_impl(port, ptr, rust_vec_len, data_len), + 68 => wire__crate__api__messages__on_new_message_impl(port, ptr, rust_vec_len, data_len), + 69 => wire__crate__api__orders__on_orders_updated_impl(port, ptr, rust_vec_len, data_len), + 70 => { wire__crate__api__reputation__on_rating_received_impl(port, ptr, rust_vec_len, data_len) } - 70 => { + 71 => { wire__crate__api__nostr__on_relay_status_changed_impl(port, ptr, rust_vec_len, data_len) } - 71 => { + 72 => { wire__crate__api__settings__on_settings_changed_impl(port, ptr, rust_vec_len, data_len) } - 72 => wire__crate__api__messages__on_unread_count_changed_impl( + 73 => wire__crate__api__messages__on_unread_count_changed_impl( port, ptr, rust_vec_len, data_len, ), - 73 => { + 74 => { wire__crate__api__nwc__on_wallet_status_changed_impl(port, ptr, rust_vec_len, data_len) } - 74 => wire__crate__api__disputes__open_dispute_impl(port, ptr, rust_vec_len, data_len), - 75 => { + 75 => wire__crate__api__disputes__open_dispute_impl(port, ptr, rust_vec_len, data_len), + 76 => { wire__crate__api__orders__order_filters_default_impl(port, ptr, rust_vec_len, data_len) } - 76 => wire__crate__api__nwc__pay_invoice_impl(port, ptr, rust_vec_len, data_len), - 77 => wire__crate__api__orders__release_order_impl(port, ptr, rust_vec_len, data_len), - 78 => wire__crate__api__nostr__remove_relay_impl(port, ptr, rust_vec_len, data_len), - 79 => wire__crate__api__orders__resolve_maker_order_impl(port, ptr, rust_vec_len, data_len), - 80 => wire__crate__api__orders__send_fiat_sent_impl(port, ptr, rust_vec_len, data_len), - 81 => wire__crate__api__messages__send_file_impl(port, ptr, rust_vec_len, data_len), - 82 => wire__crate__api__orders__send_invoice_impl(port, ptr, rust_vec_len, data_len), - 83 => wire__crate__api__messages__send_message_impl(port, ptr, rust_vec_len, data_len), - 84 => wire__crate__api__settings__set_default_fiat_code_impl( + 77 => wire__crate__api__nwc__pay_invoice_impl(port, ptr, rust_vec_len, data_len), + 78 => wire__crate__api__orders__release_order_impl(port, ptr, rust_vec_len, data_len), + 79 => wire__crate__api__nostr__remove_relay_impl(port, ptr, rust_vec_len, data_len), + 80 => wire__crate__api__orders__resolve_maker_order_impl(port, ptr, rust_vec_len, data_len), + 81 => wire__crate__api__orders__restart_orders_subscription_impl( port, ptr, rust_vec_len, data_len, ), - 85 => wire__crate__api__settings__set_default_lightning_address_impl( + 82 => wire__crate__api__orders__send_fiat_sent_impl(port, ptr, rust_vec_len, data_len), + 83 => wire__crate__api__messages__send_file_impl(port, ptr, rust_vec_len, data_len), + 84 => wire__crate__api__orders__send_invoice_impl(port, ptr, rust_vec_len, data_len), + 85 => wire__crate__api__messages__send_message_impl(port, ptr, rust_vec_len, data_len), + 86 => wire__crate__api__settings__set_default_fiat_code_impl( port, ptr, rust_vec_len, data_len, ), - 86 => wire__crate__api__settings__set_language_impl(port, ptr, rust_vec_len, data_len), - 87 => { + 87 => wire__crate__api__settings__set_default_lightning_address_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 88 => wire__crate__api__settings__set_language_impl(port, ptr, rust_vec_len, data_len), + 89 => { wire__crate__api__settings__set_logging_enabled_impl(port, ptr, rust_vec_len, data_len) } - 88 => wire__crate__api__settings__set_mostro_pubkey_impl(port, ptr, rust_vec_len, data_len), - 89 => { + 90 => wire__crate__api__settings__set_mostro_node_impl(port, ptr, rust_vec_len, data_len), + 91 => wire__crate__api__settings__set_mostro_pubkey_impl(port, ptr, rust_vec_len, data_len), + 92 => { wire__crate__api__reputation__set_privacy_mode_impl(port, ptr, rust_vec_len, data_len) } - 90 => wire__crate__api__settings__set_theme_impl(port, ptr, rust_vec_len, data_len), - 91 => wire__crate__api__disputes__submit_evidence_impl(port, ptr, rust_vec_len, data_len), - 92 => wire__crate__api__reputation__submit_rating_impl(port, ptr, rust_vec_len, data_len), - 93 => wire__crate__api__orders__subscribe_orders_impl(port, ptr, rust_vec_len, data_len), - 94 => wire__crate__api__orders__take_order_impl(port, ptr, rust_vec_len, data_len), + 93 => wire__crate__api__settings__set_theme_impl(port, ptr, rust_vec_len, data_len), + 94 => wire__crate__api__disputes__submit_evidence_impl(port, ptr, rust_vec_len, data_len), + 95 => wire__crate__api__reputation__submit_rating_impl(port, ptr, rust_vec_len, data_len), + 96 => wire__crate__api__orders__subscribe_orders_impl(port, ptr, rust_vec_len, data_len), + 97 => wire__crate__api__orders__take_order_impl(port, ptr, rust_vec_len, data_len), _ => unreachable!(), } } @@ -6041,6 +6189,37 @@ impl flutter_rust_bridge::IntoIntoDart } } // Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::types::MostroNodeInfo { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.pubkey.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.version.into_into_dart().into_dart(), + self.expiration_hours.into_into_dart().into_dart(), + self.expiration_seconds.into_into_dart().into_dart(), + self.fee_pct.into_into_dart().into_dart(), + self.max_order_amount.into_into_dart().into_dart(), + self.min_order_amount.into_into_dart().into_dart(), + self.supported_currencies.into_into_dart().into_dart(), + self.ln_node_id.into_into_dart().into_dart(), + self.ln_node_alias.into_into_dart().into_dart(), + self.is_active.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::types::MostroNodeInfo +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::types::MostroNodeInfo +{ + fn into_into_dart(self) -> crate::api::types::MostroNodeInfo { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs impl flutter_rust_bridge::IntoDart for crate::api::types::NewOrderParams { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ @@ -7129,6 +7308,24 @@ impl SseEncode for crate::api::types::MessageType { } } +impl SseEncode for crate::api::types::MostroNodeInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.pubkey, serializer); + >::sse_encode(self.name, serializer); + >::sse_encode(self.version, serializer); + ::sse_encode(self.expiration_hours, serializer); + ::sse_encode(self.expiration_seconds, serializer); + >::sse_encode(self.fee_pct, serializer); + >::sse_encode(self.max_order_amount, serializer); + >::sse_encode(self.min_order_amount, serializer); + >>::sse_encode(self.supported_currencies, serializer); + >::sse_encode(self.ln_node_id, serializer); + >::sse_encode(self.ln_node_alias, serializer); + ::sse_encode(self.is_active, serializer); + } +} + impl SseEncode for crate::api::types::NewOrderParams { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {