From 2f42c6712f5e7e5b9937f121bcb72f5c3a6d17b6 Mon Sep 17 00:00:00 2001
From: theg
diff --git a/apps/desktop/src/OpenWithDialog.tsx b/apps/desktop/src/OpenWithDialog.tsx
index 17921f9..703a861 100644
--- a/apps/desktop/src/OpenWithDialog.tsx
+++ b/apps/desktop/src/OpenWithDialog.tsx
@@ -12,7 +12,11 @@ type Props = {
open?: boolean;
onClose?: () => void;
browsers: BrowserProfile[];
- onChoose: (browser: BrowserProfile, persist: 'just-once' | 'always') => void;
+ onChoose: (
+ browser: BrowserProfile,
+ persist: 'just-once' | 'always'
+ ) => Promise {actionError}
+ Live indicators show how the hand-off service is behaving while the
+ desktop shell stays in the background.
+
- {item.browser}{' '}
-
- {item.profile ?? 'Default profile'}
+ recentHistory.map(item => {
+ const status = statusById[item.id];
+ const error = errorsById[item.id];
+ const statusClass = status ? STATUS_CLASS[status] : '';
+ const statusLabel = status ? STATUS_LABEL[status] : '';
+ return (
+
+ {item.browser}{' '}
+
+ {item.profile ?? 'Default profile'}
+
+
+ {item.url.replace(/^https?:\/\//, '')}
+
+ {item.sourceApp} •{' '}
+ {new Date(item.decidedAt).toLocaleTimeString(
+ undefined,
+ {
+ hour: '2-digit',
+ minute: '2-digit',
+ }
+ )}
+
- {item.url.replace(/^https?:\/\//, '')}
-
- {item.sourceApp} •{' '}
- {new Date(item.decidedAt).toLocaleTimeString(undefined, {
- hour: '2-digit',
- minute: '2-digit',
- })}
-
+ {label}
+ {value}
+ Make Open With Browser the default handler so links intercepted
+ from chat apps land here first. The operating system will show a
+ confirmation dialog before the change takes effect.
+
+ {defaultStatusLabel}
+ {defaultError} Detected browsers {availableBrowsers.join(', ')} System
+ {[
+ systemInfo.osType,
+ systemInfo.platform,
+ systemInfo.arch,
+ systemInfo.version,
+ ].join(' · ')}
+ Family: {systemInfo.family} {actionError}
+ No browsers detected yet. Refresh from Settings to register installed
+ browsers.
+
{recommendedBrowser?.name}
- {recommendedBrowser?.profile
- ? ` · ${recommendedBrowser.profile}`
+ {recommendedBrowser?.profileLabel
+ ? ` · ${recommendedBrowser.profileLabel}`
: ''}
@@ -228,19 +206,27 @@ export default function Dashboard({
+ No browsers detected yet. Check Settings → System setup to load
+ installed browsers.
+
{item.browser}{' '}
- {item.profile ?? 'Default profile'}
+ {item.profileLabel ?? 'Default profile'}
@@ -378,11 +364,12 @@ export default function Dashboard({
{error} Loading rules…
{activeLink
@@ -99,10 +176,11 @@ export default function Dashboard({
Routing stats
+
+ System setup
+
+ Browser orchestration
- ) : (
- fallbackGlyph
- )}
-
+ ) : (
+ fallbackGlyph
+ )}
+
@@ -81,31 +612,81 @@ export default function Rules() {
Policy
Latency budget
Status
+ Actions
- {domainRules.map(rule => (
-
-
- {rule.domain}
-
- {rule.browser}
-
-
- {rule.policy}
-
-
- {rule.latency}
-
-
- Active
-
+ {domainRules.length === 0 ? (
+
+
- ))}
+ ) : (
+ domainRules.map(rule => (
+
+ No domain rules yet. Add one to preselect browsers
+ automatically.
+
+ ))
+ )}
+
+ {rule.browserLabel}
+
+
+ {rule.policy}
+
+
+
+ {rule.latency}
+
+
+
+ {rule.enabled ? 'Active' : 'Paused'}
+
+
+
+
+
- Open With -
-Browser Studio
-+ Open With Browser +
+Desktop
++
{activeNavLabel}
-- Preview the incoming context, confirm the browser, and hand off in - the background. -
Choose the browser profile that should receive this launch request.
- Shared by{' '} - - {activeLink.contactName} - {' '} - via {activeLink.sourceApp}. Keep the chat window focused while - the browser spins up in the background. -
++ {activeLink.contactName} • {activeLink.sourceApp} +
+ {activeLink.sourceContext ? ( ++ {activeLink.sourceContext} +
+ ) : null} + {activeLink.preview ? ( ++ “{activeLink.preview}” +
+ ) : null} +- As soon as a messaging app shares a link, it will appear here - with the suggested browser profile. + Waiting for the next link hand-off.
)}+ Recommendation +
++ {recommendedBrowser + ? `${recommendedBrowser.name}${ + recommendedBrowser.profileLabel + ? ` · ${recommendedBrowser.profileLabel}` + : '' + }` + : 'None'} +
+{actionError}
) : dialogBrowsers.length === 0 ? (- No browsers detected yet. Refresh from Settings to register installed - browsers. + No browsers detected. Refresh in Settings to scan installations.
) : null}- Contact -
-- {activeLink.contactName} -
-- {activeLink.sourceContext} -
-- Message preview: “{activeLink.preview}” -
-- Recommended browser -
-- {recommendedBrowser?.name} - {recommendedBrowser?.profileLabel - ? ` · ${recommendedBrowser.profileLabel}` - : ''} -
-- Based on your rule set for links shared from{' '} - {activeLink.sourceApp}. -
-- No browsers detected yet. Check Settings → System setup to load - installed browsers. -
- ) : null}- Live indicators show how the hand-off service is behaving while the - desktop shell stays in the background. -
-- Track how messaging links were opened so you can adjust rules or - resolve issues quickly. -
-- Stay in WhatsApp -
-- Link launches are orchestrated without stealing focus, so you keep - typing while the browser adopts the task. -
-- Tuned per context -
-- Recommendations depend on which conversation the link came from - and which profile you trust with it. -
-- Override anytime -
-- One click to pick another browser or make it a one-off. The system - adapts based on your choices. -
-- {label} -
-{value}
-- Describe how domains and file types map to browser profiles. These - rules power the asynchronous hand-off without blocking the desktop - shell. -
{error}
- ) : null} + {error ?{error}
: null} {loading ? (Loading rules…
) : null} @@ -479,14 +509,7 @@ export default function Rules({ availableBrowsers }: RulesProps) {- Control which browser profile is selected when a link matches a - domain. The asynchronous worker resolves these rules before the - dialog renders. -
-