Skip to content

feat(mobile-remote): add platform adapter and Tauri iOS shell - #1271

Merged
Harry19081 merged 9 commits into
developfrom
junyu/mobile-remote-ios-clean
Sep 4, 2026
Merged

feat(mobile-remote): add platform adapter and Tauri iOS shell#1271
Harry19081 merged 9 commits into
developfrom
junyu/mobile-remote-ios-clean

Conversation

@beruro

@beruro beruro commented Sep 4, 2026

Copy link
Copy Markdown
Collaborator

Problem

Mobile Remote (#1150, merged) ships the browser/PWA control surface on develop, but there is no installable iOS host and the shared UI still depends on browser globals for OAuth, storage, sockets, timers, and visibility. The prior stacked PRs (#1220 platform adapter on junyu/mobile-remote-control, #1222 iOS shell on junyu/ios-remote-shared) were hard to review and merge independently, and the local ios-remote-shell worktree accumulated Cloud-tab UI experiments that are out of scope for the iOS shell.

Solution

Consolidate #1220 + #1222 into one branch rebased on current develop, keeping the merged Mobile Remote product UI (sessions/devices/settings, pairing, composer) and excluding Cloud-only home-tab UI.

  • Introduce MobileRemotePlatform with browser and Tauri iOS adapters (platform/browser, platform/tauri, shared supabaseMobileAuthClient).
  • Add the lightweight Tauri iOS shell under apps/remote-ios/ plus mobileRemoteNativeEntry.tsx, build:mobile-native, and native OAuth/Keychain/deep-link pairing.
  • Preserve develop mobile UX fixes on the platform boundary (attachment sends, portalContainer() for model dropdown portals, PKCE persistence, device label resolution).
  • Supersedes refactor(mobile-remote): add platform adapter boundary #1220 and feat(mobile-remote): add Tauri iOS shell #1222; those branches should close after this lands.

Potential risks

  • Simulator build/launch is verified in the source PRs, but signed physical-device OAuth, Keychain persistence across terminate/relaunch, foreground/background, keyboard, Dynamic Type, and VoiceOver still need device soak.
  • Supabase must allow org2remote://auth/callback outside this repository.
  • Backgrounding closes the relay socket and reconnects on foreground; a brief reconnect/loading transition is expected.
  • This is a large cross-layer change (109 files); unrelated develop drift during rebase may still hide edge regressions.

Verification

  • pnpm typecheck — passed
  • pnpm test -- src/modules/MobileRemote src/mobileRemoteEntry.test.ts --reporter=dot — 45 files, 241 tests passed
  • Rebased cleanly onto origin/develop (2026-09-04)
  • Confirmed no CloudTab, CloudSessionScreen, HomeEntryTabs, or useMobileCloudCatalog under src/modules/MobileRemote/ on this branch
  • NOT RUN: pnpm build, pnpm build:mobile-native, cargo check --target aarch64-apple-ios, Xcode simulator launch, physical-device matrix

Supersedes

beruro and others added 9 commits September 4, 2026 20:22
The Tauri shell registers org2remote://pair and hands the raw link to the
shared parser, but parsePairingLink only accepted orgii:// and http(s)://.
Every native pairing link therefore failed to parse, and because
MobileRemoteApp suppresses the stored-desktop bootstrap whenever a pairing
intent is present, the phone also skipped loading its paired desktops and
sat on the welcome screen with an empty Devices tab.

Accept org2remote://pair and read the payload from the pair query
parameter as well as the fragment, matching what the shell's
hasOpaquePairPayload accepts.
Carry develop mobile UX onto the platform boundary: route model dropdown
portals through runtime.portalContainer(), keep Supabase PKCE persistence
enabled in the shared auth client, and wrap composer tests with the
platform provider the app already supplies.
The bridge now reads runtime timers from the injected platform port, so
its regression suite must mount the same provider the app supplies.
…test

The adapter test built a real Supabase client, whose RealtimeClient throws on
a Node runtime without a global WebSocket. CI runs Node 20, so the suite failed
there while passing on local Node 22.

Mock `@supabase/supabase-js` the way `auth/mobileAuthClient.test.ts` already
does; the adapter under test only owns storage, error mapping and the
server-session opt-out.
@Harry19081
Harry19081 merged commit efafda2 into develop Sep 4, 2026
6 checks passed
@Harry19081 Harry19081 added enhancement New feature or request security Security-sensitive behavior, credentials, secrets, or advisories cloud-collaboration Cloud sync, organizations, channels, or collaboration frontend-ui Frontend UI, design system, accessibility, layout, or theming labels Sep 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud-collaboration Cloud sync, organizations, channels, or collaboration enhancement New feature or request frontend-ui Frontend UI, design system, accessibility, layout, or theming security Security-sensitive behavior, credentials, secrets, or advisories

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants