diff --git a/frontend/src/basic/RobotPage/index.tsx b/frontend/src/basic/RobotPage/index.tsx index 6e648929..5ff2599f 100644 --- a/frontend/src/basic/RobotPage/index.tsx +++ b/frontend/src/basic/RobotPage/index.tsx @@ -44,7 +44,7 @@ const RobotPage = (): JSX.Element => { const token = urlToken ?? garage.currentSlot; if (token !== undefined && token !== null && page === 'robot') { setInputToken(token); - if (window.NativeRobosats === undefined || torStatus === 'ON') { + if (window.NativeRobosats === undefined || torStatus === 'ON' || !settings.useProxy) { getGenerateRobot(token); setView('profile'); } @@ -83,7 +83,7 @@ const RobotPage = (): JSX.Element => { garage.deleteSlot(); }; - if (!(window.NativeRobosats === undefined) && !(torStatus === 'ON')) { + if (settings.useProxy && !(window.NativeRobosats === undefined) && !(torStatus === 'ON')) { return ( { - // Why? - // const slot = garage.getSlot(); - // if (slot?.token) void federation.fetchRobot(garage, slot?.token); - }, [garage.currentSlot]); - useEffect(() => { setCurrencyCode(currencyDict[fav.currency === 0 ? 1 : fav.currency]); }, [coordinatorUpdatedAt]); diff --git a/frontend/src/components/SettingsForm/index.tsx b/frontend/src/components/SettingsForm/index.tsx index 1624675b..22eaef92 100644 --- a/frontend/src/components/SettingsForm/index.tsx +++ b/frontend/src/components/SettingsForm/index.tsx @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import React, { useContext, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { type UseAppStoreType, AppContext } from '../../contexts/AppContext'; import { @@ -28,17 +28,19 @@ import { QrCode, } from '@mui/icons-material'; import { systemClient } from '../../services/System'; +import { TorIcon } from '../Icons'; import SwapCalls from '@mui/icons-material/SwapCalls'; import { FederationContext, type UseFederationStoreType } from '../../contexts/FederationContext'; +import { GarageContext, UseGarageStoreType } from '../../contexts/GarageContext'; interface SettingsFormProps { dense?: boolean; } const SettingsForm = ({ dense = false }: SettingsFormProps): JSX.Element => { - const { fav, setFav, origin, hostUrl, settings, setSettings } = - useContext(AppContext); + const { fav, setFav, settings, setSettings } = useContext(AppContext); const { federation } = useContext(FederationContext); + const { garage } = useContext(GarageContext); const theme = useTheme(); const { t } = useTranslation(); const fontSizes = [ @@ -237,6 +239,29 @@ const SettingsForm = ({ dense = false }: SettingsFormProps): JSX.Element => { + + {window.NativeRobosats !== undefined && ( + + + + + { + setSettings({ ...settings, useProxy }); + systemClient.setItem('settings_use_proxy', String(useProxy)); + }} + > + + {t('Build-in')} + + + {t('Disabled')} + + + + )} diff --git a/frontend/src/components/TorConnection.tsx b/frontend/src/components/TorConnection.tsx index 006dd1b0..b9d068be 100644 --- a/frontend/src/components/TorConnection.tsx +++ b/frontend/src/components/TorConnection.tsx @@ -55,10 +55,10 @@ const TorIndicator = ({ }; const TorConnectionBadge = (): JSX.Element => { - const { torStatus } = useContext(AppContext); + const { torStatus, settings } = useContext(AppContext); const { t } = useTranslation(); - if (window?.NativeRobosats == null) { + if (window?.NativeRobosats == null || !settings.useProxy) { return <>; } diff --git a/frontend/src/contexts/FederationContext.tsx b/frontend/src/contexts/FederationContext.tsx index dc146e0d..b7998111 100644 --- a/frontend/src/contexts/FederationContext.tsx +++ b/frontend/src/contexts/FederationContext.tsx @@ -111,12 +111,14 @@ export const FederationContextProvider = ({ }, []); useEffect(() => { - // On bitcoin network change we reset book, limits and federation info and fetch everything again - if (window.NativeRobosats === undefined || torStatus === 'ON') { + if (window.NativeRobosats === undefined || torStatus === 'ON' || !settings.useProxy) { void federation.updateUrl(origin, settings, hostUrl); void federation.update(); + + const token = garage.getSlot()?.getRobot()?.token; + if (token) void federation.fetchRobot(garage, token); } - }, [settings.network, torStatus]); + }, [settings.network, settings.useProxy, torStatus]); const onOrderReceived = (order: Order): void => { let newDelay = defaultDelay; @@ -178,15 +180,6 @@ export const FederationContextProvider = ({ if (page === 'offers') void federation.updateBook(); }, [page]); - // use effects to fetchRobots on app start and network change - useEffect(() => { - const slot = garage.getSlot(); - const robot = slot?.getRobot(); - - if (robot && garage.currentSlot && slot?.token && robot.encPrivKey && robot.pubKey) { - void federation.fetchRobot(garage, slot.token); - } - }, [settings.network]); // use effects to fetchRobots on Profile open useEffect(() => { const slot = garage.getSlot(); diff --git a/frontend/src/models/Coordinator.model.ts b/frontend/src/models/Coordinator.model.ts index ef1abb19..c07e771b 100644 --- a/frontend/src/models/Coordinator.model.ts +++ b/frontend/src/models/Coordinator.model.ts @@ -145,7 +145,7 @@ export class Coordinator { public loadingInfo: boolean = false; public limits: LimitList = {}; public loadingLimits: boolean = false; - public loadingRobot: boolean = true; + public loadingRobot: string | null; updateUrl = (origin: Origin, settings: Settings, hostUrl: string): void => { if (settings.selfhostedClient && this.shortAlias !== 'local') { @@ -185,6 +185,7 @@ export class Coordinator { if (this.loadingBook) return; this.loadingBook = true; + this.book = []; apiClient .get(this.url, `${this.basePath}/api/book/`) @@ -297,7 +298,7 @@ export class Coordinator { }; fetchRobot = async (garage: Garage, token: string): Promise => { - if (!this.enabled || !token) return null; + if (!this.enabled || !token || this.loadingRobot === token) return null; const robot = garage?.getSlot(token)?.getRobot() ?? null; const authHeaders = robot?.getAuthHeaders(); @@ -308,6 +309,8 @@ export class Coordinator { if (!hasEnoughEntropy) return null; + this.loadingRobot = token; + garage.updateRobot(token, this.shortAlias, { loading: true }); const newAttributes = await apiClient @@ -330,7 +333,8 @@ export class Coordinator { }) .catch((e) => { console.log(e); - }); + }) + .finally(() => (this.loadingRobot = null)); garage.updateRobot(token, this.shortAlias, { ...newAttributes, diff --git a/frontend/src/models/Federation.model.ts b/frontend/src/models/Federation.model.ts index 7f72531e..2d31e6ce 100644 --- a/frontend/src/models/Federation.model.ts +++ b/frontend/src/models/Federation.model.ts @@ -100,7 +100,7 @@ export class Federation { this.exchange.loadingCoordinators = Object.keys(this.coordinators).length; this.updateEnabledCoordinators(); for (const coor of Object.values(this.coordinators)) { - await coor.update(() => { + coor.update(() => { this.exchange.onlineCoordinators = this.exchange.onlineCoordinators + 1; this.onCoordinatorSaved(); }); @@ -109,10 +109,11 @@ export class Federation { updateBook = async (): Promise => { this.loading = true; + this.book = []; this.triggerHook('onCoordinatorUpdate'); this.exchange.loadingCoordinators = Object.keys(this.coordinators).length; for (const coor of Object.values(this.coordinators)) { - await coor.updateBook(() => { + coor.updateBook(() => { this.onCoordinatorSaved(); }); } diff --git a/frontend/src/models/Settings.model.ts b/frontend/src/models/Settings.model.ts index 203d979f..cbb0ed7a 100644 --- a/frontend/src/models/Settings.model.ts +++ b/frontend/src/models/Settings.model.ts @@ -1,5 +1,6 @@ import i18n from '../i18n/Web'; import { systemClient } from '../services/System'; +import { apiClient } from '../services/api'; import { getHost } from '../utils'; export type Language = @@ -42,8 +43,13 @@ class BaseSettings { : i18n.resolvedLanguage.substring(0, 2); const networkCookie = systemClient.getItem('settings_network'); - this.network = networkCookie !== '' ? networkCookie : 'mainnet'; + this.network = networkCookie && networkCookie !== '' ? networkCookie : 'mainnet'; this.host = getHost(); + + const useProxy = systemClient.getItem('settings_use_proxy'); + this.useProxy = window.NativeRobosats !== undefined && useProxy !== 'false'; + + apiClient.useProxy = this.useProxy; } public frontend: 'basic' | 'pro' = 'basic'; @@ -56,6 +62,7 @@ class BaseSettings { public host?: string; public unsafeClient: boolean = false; public selfhostedClient: boolean = false; + public useProxy: boolean; } export default BaseSettings; diff --git a/frontend/src/services/System/SystemNativeClient/index.ts b/frontend/src/services/System/SystemNativeClient/index.ts index c426442a..9f554c3a 100644 --- a/frontend/src/services/System/SystemNativeClient/index.ts +++ b/frontend/src/services/System/SystemNativeClient/index.ts @@ -28,7 +28,7 @@ class SystemNativeClient implements SystemClient { }; public setCookie: (key: string, value: string) => void = (key, value) => { - delete window.NativeRobosats?.cookies[key]; + window.NativeRobosats?.loadCookie({ key, value }); void window.NativeRobosats?.postMessage({ category: 'system', type: 'setCookie', diff --git a/frontend/src/services/api/ApiNativeClient/index.ts b/frontend/src/services/api/ApiNativeClient/index.ts index 6f794eec..93f8ba39 100644 --- a/frontend/src/services/api/ApiNativeClient/index.ts +++ b/frontend/src/services/api/ApiNativeClient/index.ts @@ -1,8 +1,12 @@ import { type ApiClient, type Auth } from '..'; import { systemClient } from '../../System'; +import ApiWebClient from '../ApiWebClient'; class ApiNativeClient implements ApiClient { - private assetsCache: Record = {}; + public useProxy = true; + + private webClient: ApiClient = new ApiWebClient(); + private readonly assetsPromises = new Map>(); private readonly getHeaders: (auth?: Auth) => HeadersInit = (auth) => { @@ -51,6 +55,7 @@ class ApiNativeClient implements ApiClient { public delete: (baseUrl: string, path: string, auth?: Auth) => Promise = async (baseUrl, path, auth) => { + if (!this.proxy) this.webClient.delete(baseUrl, path, auth); return await window.NativeRobosats?.postMessage({ category: 'http', type: 'delete', @@ -66,6 +71,7 @@ class ApiNativeClient implements ApiClient { body: object, auth?: Auth, ) => Promise = async (baseUrl, path, body, auth) => { + if (!this.proxy) this.webClient.post(baseUrl, path, body, auth); return await window.NativeRobosats?.postMessage({ category: 'http', type: 'post', @@ -81,6 +87,7 @@ class ApiNativeClient implements ApiClient { path, auth, ) => { + if (!this.proxy) this.webClient.get(baseUrl, path, auth); return await window.NativeRobosats?.postMessage({ category: 'http', type: 'get', diff --git a/frontend/src/services/api/ApiWebClient/index.ts b/frontend/src/services/api/ApiWebClient/index.ts index 02fe4054..b28edf27 100644 --- a/frontend/src/services/api/ApiWebClient/index.ts +++ b/frontend/src/services/api/ApiWebClient/index.ts @@ -1,6 +1,8 @@ import { type ApiClient, type Auth } from '..'; class ApiWebClient implements ApiClient { + public useProxy = false; + private readonly getHeaders: (auth?: Auth) => HeadersInit = (auth) => { let headers = { 'Content-Type': 'application/json', diff --git a/frontend/src/services/api/index.ts b/frontend/src/services/api/index.ts index d0013324..21b8effd 100644 --- a/frontend/src/services/api/index.ts +++ b/frontend/src/services/api/index.ts @@ -7,6 +7,7 @@ export interface Auth { } export interface ApiClient { + useProxy: boolean; post: (baseUrl: string, path: string, body: object, auth?: Auth) => Promise; put: (baseUrl: string, path: string, body: object, auth?: Auth) => Promise; get: (baseUrl: string, path: string, auth?: Auth) => Promise; diff --git a/frontend/src/utils/federationLottery.ts b/frontend/src/utils/federationLottery.ts index 4768e256..da49be3b 100644 --- a/frontend/src/utils/federationLottery.ts +++ b/frontend/src/utils/federationLottery.ts @@ -45,7 +45,6 @@ export default function federationLottery(federation: Federation): string[] { // federation[shortAlias] = { badges:{ donatesToDevFund }}; // } -// console.log(federation) // return federation; // } @@ -58,5 +57,4 @@ export default function federationLottery(federation: Federation): string[] { // results.push(rankedCoordinators); // } -// console.log(results) // } diff --git a/frontend/static/locales/ca.json b/frontend/static/locales/ca.json index bfbf6f8b..640e4e82 100644 --- a/frontend/static/locales/ca.json +++ b/frontend/static/locales/ca.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "La teva última ordre #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Fosc", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Clar", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/cs.json b/frontend/static/locales/cs.json index fbe6e0d7..8e12cb8f 100644 --- a/frontend/static/locales/cs.json +++ b/frontend/static/locales/cs.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Tvá poslední nabídka #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Dark", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Light", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/de.json b/frontend/static/locales/de.json index 2d49cc15..81d79fbe 100644 --- a/frontend/static/locales/de.json +++ b/frontend/static/locales/de.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Deine letzte Order #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Dark", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Light", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/en.json b/frontend/static/locales/en.json index 4ef3952a..a22e5f96 100644 --- a/frontend/static/locales/en.json +++ b/frontend/static/locales/en.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Your last order #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Dark", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Light", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/es.json b/frontend/static/locales/es.json index ad038432..0faffd60 100644 --- a/frontend/static/locales/es.json +++ b/frontend/static/locales/es.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Tu última orden #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Oscuro", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Claro", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/eu.json b/frontend/static/locales/eu.json index 88f7ae8b..7f3340a0 100644 --- a/frontend/static/locales/eu.json +++ b/frontend/static/locales/eu.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Zure azken eskaera #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Dark", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Light", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/fr.json b/frontend/static/locales/fr.json index cc764b70..746c8e0b 100644 --- a/frontend/static/locales/fr.json +++ b/frontend/static/locales/fr.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Votre dernière commande #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Sombre", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Light", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/it.json b/frontend/static/locales/it.json index cf129bf7..9ec8bfdb 100644 --- a/frontend/static/locales/it.json +++ b/frontend/static/locales/it.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Il tuo ultimo ordine #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Scuro", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Chiaro", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/ja.json b/frontend/static/locales/ja.json index cf80e724..c2ecdaae 100644 --- a/frontend/static/locales/ja.json +++ b/frontend/static/locales/ja.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "前回のオーダー #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "ダーク", + "Disabled": "Disabled", "Fiat": "フィアット", "Light": "ライト", "Mainnet": "メインネット", diff --git a/frontend/static/locales/pl.json b/frontend/static/locales/pl.json index ee779ba2..1b2c8cea 100644 --- a/frontend/static/locales/pl.json +++ b/frontend/static/locales/pl.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Your last order #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Dark", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Light", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/pt.json b/frontend/static/locales/pt.json index 1d5c18ec..8252db48 100644 --- a/frontend/static/locales/pt.json +++ b/frontend/static/locales/pt.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Sua última ordem #{{orderID}}", "finished order": "ordem finalizada", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Dark", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Light", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/ru.json b/frontend/static/locales/ru.json index 9e0266e7..335d3892 100644 --- a/frontend/static/locales/ru.json +++ b/frontend/static/locales/ru.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Ваш последний ордер #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Темный", + "Disabled": "Disabled", "Fiat": "Фиат", "Light": "Светлый", "Mainnet": "Основная сеть", diff --git a/frontend/static/locales/sv.json b/frontend/static/locales/sv.json index 28143f9d..328576cf 100644 --- a/frontend/static/locales/sv.json +++ b/frontend/static/locales/sv.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Din senaste order #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Dark", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Light", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/sw.json b/frontend/static/locales/sw.json index 65c2ddb6..b07a497c 100644 --- a/frontend/static/locales/sw.json +++ b/frontend/static/locales/sw.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "Amri yako ya mwisho #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Giza", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Nuru", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/th.json b/frontend/static/locales/th.json index d7a70132..c96bc579 100644 --- a/frontend/static/locales/th.json +++ b/frontend/static/locales/th.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "รายการล่าสุดของคุณ #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "Dark", + "Disabled": "Disabled", "Fiat": "Fiat", "Light": "Light", "Mainnet": "Mainnet", diff --git a/frontend/static/locales/zh-SI.json b/frontend/static/locales/zh-SI.json index e1462ba4..671f4b67 100644 --- a/frontend/static/locales/zh-SI.json +++ b/frontend/static/locales/zh-SI.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "你的上一笔交易 #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "深色", + "Disabled": "Disabled", "Fiat": "法币", "Light": "浅色", "Mainnet": "主网", diff --git a/frontend/static/locales/zh-TR.json b/frontend/static/locales/zh-TR.json index 7abecf29..8b2c666e 100644 --- a/frontend/static/locales/zh-TR.json +++ b/frontend/static/locales/zh-TR.json @@ -489,7 +489,9 @@ "Your last order #{{orderID}}": "你的上一筆交易 #{{orderID}}", "finished order": "finished order", "#43": "Phrases in components/SettingsForm/index.tsx", + "Build-in": "Build-in", "Dark": "深色", + "Disabled": "Disabled", "Fiat": "法幣", "Light": "淺色", "Mainnet": "主網", diff --git a/mobile/App.tsx b/mobile/App.tsx index d61444be..e2977573 100644 --- a/mobile/App.tsx +++ b/mobile/App.tsx @@ -71,6 +71,7 @@ const App = () => { loadCookie('settings_mode'); loadCookie('settings_light_qr'); loadCookie('settings_network'); + loadCookie('settings_use_proxy'); loadCookie('garage_slots').then(() => injectMessageResolve(responseId)); };