summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/app.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/app.js')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/app.js30
1 files changed, 29 insertions, 1 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/app.js b/packages/meshbay-hub/src/meshbay_hub/static/app.js
index 34f146a..4091ae7 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/app.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/app.js
@@ -675,7 +675,7 @@ function FirstRunPage({ onSet }) {
await window.meshbay.setHubBase(url.trim());
onSet();
} catch (err) {
- setError(err.message || String(err));
+ setError(platform.bridgeMessage(err));
setBusy(false);
}
};
@@ -3999,6 +3999,11 @@ function SettingsPage({ user, theme, onThemeChange, groups }) {
// headless session, a minimal desktop — and does it silently. Somebody who
// believes the OS is protecting their keys deserves to be told when it is not.
const [keyBackend, setKeyBackend] = useState('');
+ // Changing the hub after the first run. Without this a typo on the first
+ // screen was permanent: the prompt only appears when no hub is set, so a
+ // wrong one left editing a JSON file by hand as the only way out.
+ const [hubInput, setHubInput] = useState('');
+ const [hubError, setHubError] = useState('');
useEffect(() => {
if (!platform.secrets.available) return;
platform.secrets.backend().then(setKeyBackend).catch(() => {});
@@ -4105,6 +4110,29 @@ function SettingsPage({ user, theme, onThemeChange, groups }) {
</div>
`}
+ ${platform.isNative && html`
+ <div class="settings-section">
+ <h3 class="settings-heading">${t('settings.hub_heading')}</h3>
+ <div class="settings-row">
+ <span class="settings-label">${t('settings.hub_current')}</span>
+ <span class="settings-value">${platform.hubBase() || '—'}</span>
+ </div>
+ <p class="settings-hint">${t('settings.hub_hint')}</p>
+ <form onSubmit=${async (e) => {
+ e.preventDefault();
+ setHubError('');
+ try {
+ await window.meshbay.setHubBase(hubInput.trim());
+ } catch (err) { setHubError(platform.bridgeMessage(err)); }
+ }} style="display:flex;gap:8px">
+ <input type="text" placeholder=${platform.hubBase()}
+ value=${hubInput} onInput=${e => setHubInput(e.target.value)} />
+ <button class="admin-btn" type="submit">${t('settings.hub_change')}</button>
+ </form>
+ ${hubError && html`<p class="error-msg">${hubError}</p>`}
+ </div>
+ `}
+
${keyBackend && html`
<div class="settings-section">
<h3 class="settings-heading">${t('settings.keys_heading')}</h3>