use serde::{Deserialize, Serialize}; use std::collections::HashMap; #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct AuthRequest { pub auth_url: String, } #[derive(Debug, Clone, Default, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct AuthResponse { pub redirect_url: String, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct CopyURIRequest { pub uri: String, pub dst: String, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct CopyURIResponse { pub success: bool, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct UseBackgroundAudioRequest { pub enabled: bool, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct InstallPackageRequest { pub path: String, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct InstallPackageResponse { pub success: bool, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetSystemUIVisibilityRequest { pub visible: bool, pub dark_mode: bool, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetSystemUIVisibilityResponse { pub success: bool, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetStatusBarHeightResponse { pub height: u32, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetSysFontsListResponse { pub fonts: HashMap, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct InterceptKeysRequest { pub volume_keys: Option, pub back_key: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct LockScreenOrientationRequest { pub orientation: String, } #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct Product { pub id: String, pub title: String, pub description: String, pub price: String, pub price_currency_code: Option, pub price_amount_micros: i64, pub product_type: String, // "consumable", "non_consumable", or "subscription" } #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct Purchase { pub platform: String, // "ios" or "android" pub package_name: Option, pub product_id: String, pub transaction_id: Option, pub original_transaction_id: Option, pub order_id: Option, pub purchase_token: Option, pub purchase_date: String, pub purchase_state: String, // "purchased", "pending", "cancelled", "restored" } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct IAPIsAvailableResponse { pub available: bool, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct IAPInitializeRequest { pub public_key: Option, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct IAPInitializeResponse { pub success: bool, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct IAPFetchProductsRequest { pub product_ids: Vec, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct IAPFetchProductsResponse { pub products: Vec, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct IAPPurchaseProductRequest { pub product_id: String, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct IAPPurchaseProductResponse { pub purchase: Option, pub cancelled_purchase: Option, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct IAPRestorePurchasesResponse { pub purchases: Vec, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetSystemColorSchemeResponse { pub color_scheme: String, // "light" or "dark" } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetSafeAreaInsetsResponse { pub top: f64, pub bottom: f64, pub left: f64, pub right: f64, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetScreenBrightnessResponse { pub brightness: f64, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetScreenBrightnessRequest { pub brightness: f64, // 0.0 to 1.0 } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetScreenBrightnessResponse { pub success: bool, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetExternalSDCardPathResponse { pub path: Option, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct RequestManageStoragePermissionResponse { pub manage_storage: String, // "granted", "denied", or "prompt" } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct OpenExternalUrlRequest { pub url: String, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct OpenExternalUrlResponse { pub success: bool, pub error: Option, } /// Hand a word off to the platform's native dictionary surface. /// /// On iOS this presents `UIReferenceLibraryViewController` modally /// (the same UI Apple uses for `Look Up` in UIKit text views). On /// Android it dispatches `ACTION_PROCESS_TEXT` so any installed /// dictionary app (ColorDict, GoldenDict, 欧路, etc.) can handle the /// word; we don't bind to a specific package so users can stick with /// their preferred dictionary. Desktop platforms return /// `UnsupportedPlatformError` — macOS goes through a separate native /// command in `src/macos/system_dictionary.rs` that uses the AppKit /// HUD surface, which doesn't exist on iOS/Android. #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ShowLookupPopoverRequest { pub word: String, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ShowLookupPopoverResponse { pub success: bool, /// `unavailable` is set on Android when no app responded to the /// `ACTION_PROCESS_TEXT` intent (i.e. the user has no dictionary /// installed). The TS layer can surface a "no dictionary app" /// hint without us having to push a localized string from /// native code. pub unavailable: Option, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SelectDirectoryResponse { pub cancelled: Option, pub uri: Option, pub path: Option, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetStorefrontRegionCodeResponse { pub region_code: Option, pub error: Option, } // ── Sync passphrase keychain ──────────────────────────────────────────── // // Persist the sync passphrase across app launches via the OS keychain // so native users don't re-enter it every session. The replica-sync // CryptoSession (TS side) reads/writes via these commands; web users // keep using the in-memory ephemeral store. #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SetSyncPassphraseRequest { pub passphrase: String, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SyncPassphraseResponse { pub success: bool, pub error: Option, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GetSyncPassphraseResponse { /// Present iff a passphrase is stored. Absent (and `error: None`) /// means "no entry on this device" — caller should prompt. pub passphrase: Option, pub error: Option, } /// Args for the mobile URL-clip flow. Mirrors the public `ClipOptions` /// struct in `clip_url.rs` so the JS caller can pass the same payload /// to both desktop and mobile without branching. The native side honors /// `background`/`foreground` for the overlay backdrop and `windowTitle`/ /// `overlayTitle`/`loadingStatus`/`capturingStatus`/`savedTitle` for the /// chrome and progress labels. #[derive(Debug, Default, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ClipUrlRequest { pub url: String, #[serde(default)] pub window_title: Option, #[serde(default)] pub overlay_title: Option, #[serde(default)] pub loading_status: Option, #[serde(default)] pub capturing_status: Option, #[serde(default)] pub saved_title: Option, #[serde(default)] pub background: Option, #[serde(default)] pub foreground: Option, } #[derive(Debug, Default, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ClipUrlResponse { /// Rendered `document.documentElement.outerHTML` captured from the /// hidden WKWebView / WebView once load+settle completed. pub html: String, } #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SyncKeychainAvailableResponse { pub available: bool, pub error: Option, }