mirror of
https://github.com/stablyai/orca.git
synced 2026-11-02 18:17:36 +00:00
* [comment audit] Align legacy failure-read counts with cached display * [comment audit] Condense shared provider lifecycle and browser recovery comments [skip ci] * [comment audit] Condense shared generation, path and preview comments [skip ci] * [comment audit] Condense host, file and Git contract rationale [skip ci] * [comment audit] Tighten Git lifecycle and provider contract comments [skip ci] * [comment audit] Clarify shared host authority and launch isolation [skip ci] * [comment audit] simplify local access mobile and native chat contracts [skip ci] * [comment audit] simplify native chat presentation and state contracts [skip ci] * [comment audit] simplify native runtime and provider contracts [skip ci] * [comment audit] simplify migration and orchestration contracts [skip ci] * [comment audit] simplify plugin trust and process capture rationale [skip ci] * [comment audit] simplify terminal delivery and remote compatibility rationale [skip ci] * [comment audit] clarify remote recovery and launch wire rationale [skip ci] * [comment audit] shorten shared RPC compatibility and runtime evidence comments [skip ci] * [comment audit] simplify secure storage shell startup and sidebar rationale [skip ci] * [comment audit] clarify sidebar, skill and SSH invariants [skip ci] * [comment audit] condense structured chat delivery and timing rationale [skip ci] * [comment audit] condense terminal replay and telemetry invariants [skip ci] * [comment audit] clarify launch permission and terminal delivery rationale [skip ci] * [comment audit] clarify workspace ownership and layout contracts [skip ci] * [comment audit] wait for fitted and painted SSH terminal links * [comment audit] clarify layout persistence and session ownership [skip ci] * [comment audit] clarify host routing and workspace lifecycle contracts [skip ci] * [comment audit] clarify startup persistence and app lifetime comments [skip ci] * [comment audit] clarify recovery and activity boundaries [skip ci] * [comment audit] condense activity and artifact invariants [skip ci] * [comment audit] condense automation authority contracts [skip ci] * [comment audit] simplify automation scheduling and history contracts [skip ci] * [comment audit] clarify browser chrome and annotation lifecycles [skip ci] * [comment audit] clarify browser routing and retained guest ownership [skip ci] * [comment audit] clarify browser recovery and document ownership comments [skip ci] * [comment audit] restore hosted runners required by native IME fixtures * [comment audit] shorten preview, palette and dashboard invariants [skip ci] * [comment audit] clarify terminal preview, dashboard and retention comments [skip ci] * [comment audit] clarify diff-note recovery and editor lifecycle comments [skip ci] * [comment audit] shorten rich-text and combined-diff ownership comments [skip ci] * [comment audit] shorten autosave, draft recovery and model ownership comments [skip ci] * [comment audit] shorten save-queue, notebook and Markdown constraints [skip ci] * [comment audit] shorten Monaco, PDF and rich Markdown safeguards [skip ci] * [comment audit] clarify rich Markdown source and selection safeguards [skip ci] * [comment audit] clarify editor loading and emulator stream lifetimes [skip ci] * [comment audit] trim emulator and feature tour narration [skip ci] * [comment audit] clarify floating workspace and GitHub cache ownership [skip ci] * [comment audit] trim provider controls and Linear filter explanations [skip ci] * [comment audit] clarify pairing and chat resume lifetimes [skip ci] * [comment audit] clarify chat delivery and transcript lifetimes [skip ci] * [comment audit] clarify session options and host-owned status [skip ci] * [comment audit] clarify draft durability and live-status precedence [skip ci] * [comment audit] Trim chat send and model ownership explanations [skip ci] * [comment audit] Shorten transcript ownership and send recovery comments [skip ci] * [comment audit] Simplify native chat composer and transcript hook comments [skip ci] * [comment audit] Shorten native chat scroll and structured session explanations [skip ci] * [comment audit] Trim workspace picker and onboarding commentary [skip ci] * [comment audit] Simplify pet rendering, review cache and quick open comments [skip ci] * [comment audit] Trim sidebar and session history explanations [skip ci] * [comment audit] Condense session resume and review checks comments [skip ci] * [comment audit] Shorten checks state and file explorer refresh comments [skip ci] * [comment audit] Trim plugin bridge and source-control action rationale [skip ci] * [comment audit] Trim source-control listing and review rationale [skip ci] * [comment audit] Shorten sidebar lifecycle and explorer safeguards [skip ci] * [comment audit] Condense Settings account and appearance rationale [skip ci] * [comment audit] Trim pairing and repository Settings explanations [skip ci] * [comment audit] Condense Settings search SSH and terminal safeguards [skip ci] * [comment audit] Shorten Settings voice and provider ownership comments [skip ci] * [comment audit] Condense Settings draft persistence and host-state rationale [skip ci] * [comment audit] Trim Settings hooks and sidebar setup rationale [skip ci] * [comment audit] Condense sidebar deletion and board-filter safeguards [skip ci] * [comment audit] Condense worktree cards, host ownership and Markdown contracts [skip ci] * [comment audit] Condense sidebar drag, folder and filtering contracts [skip ci] * [comment audit] Condense sidebar parity, sleep and host ownership contracts [skip ci] * [comment audit] Prune focus-read baseline after comment cleanup * [comment audit] Clarify sidebar visibility, board drops and agent evidence [skip ci] * [comment audit] Tighten sidebar listing, drag and reveal contracts [skip ci] * [comment audit] Clarify viewport geometry and skill update safeguards [skip ci] * [comment audit] Tighten skill inventory, usage and host status comments [skip ci] * [comment audit] Clarify usage ownership and resource kill safeguards [skip ci] * [comment audit] Tighten tab selection, rename and search contracts [skip ci] * [comment audit] Tighten tab-strip geometry and drag ownership comments [skip ci] * [comment audit] Tighten Tasks recovery, pagination and mutation comments [skip ci] * [comment audit] Tighten provider loading and terminal recovery comments [skip ci] * [comment audit] Tighten completion, cadence and PTY ownership comments [skip ci] * [comment audit] Clarify terminal restore and parked-pane boundaries [skip ci] * [comment audit] Tighten PTY startup and replay explanations [skip ci] * [comment audit] Clarify PTY identity and delivery ownership [skip ci] * [comment audit] Shorten remote reconnect and input replay rationale [skip ci] * [comment audit] Condense terminal parking clipboard and file link comments [skip ci] * [comment audit] Clarify IME ownership and trim trace history [skip ci] * [comment audit] Shorten pane recovery and parked watcher explanations [skip ci] * [comment audit] Condense snapshot replay and visibility recovery rationale [skip ci] * [comment audit] Shorten terminal parking and keyboard ownership rationale [skip ci] * [comment audit] Trim renderer lifecycle and menu rationale [skip ci] * [comment audit] Condense workspace cleanup ownership and settlement notes [skip ci] * [comment audit] Clarify renderer hook evidence and source ownership [skip ci] * [comment audit] Tighten IPC ownership and reconnect explanations [skip ci] * [comment audit] Trim renderer focus, paste and attention comments [skip ci] * [comment audit] Shorten scroll, locale and agent lifecycle comments [skip ci] * [comment audit] Trim agent launch, resume and ownership commentary [skip ci] * [comment audit] Shorten account, browser and editor comments [skip ci] * [comment audit] Clarify host-mirror waits, previews and input ownership [skip ci] * [comment audit] Condense launch recovery and editor tokenization comments [skip ci] * [comment audit] Condense workspace selection and terminal pane rationale [skip ci] * [comment audit] Condense terminal fitting and rendering recovery comments [skip ci] * [comment audit] Condense terminal input and host routing explanations [skip ci] * [comment audit] Condense ownership and sleeping-session recovery rationale [skip ci] * [comment audit] Condense structured launch and terminal link explanations [skip ci] * [comment audit] Condense terminal ownership and workspace file routing rationale [skip ci] * [comment audit] Condense session persistence and workspace activation rationale [skip ci] * [comment audit] Condense workspace routing and browser ownership rationale [skip ci] * [comment audit] Condense mirror recovery and layout authority rationale [skip ci] * [comment audit] Condense runtime transport and file safety rationale [skip ci] * [comment audit] Condense runtime graph and structured session rationale [skip ci] * [comment audit] Condense browser creation and remote tab recovery rationale [skip ci] * [comment audit] Condense snapshot authority and publisher recovery rationale [skip ci] * [comment audit] Condense frame, startup and provider cache rationale [skip ci] * [comment audit] Condense host twin and agent lifecycle rationale [skip ci] * [comment audit] Condense browser authority and editor cleanup rationale [skip ci] * [comment audit] Condense editor buffer identity and review cache rationale [skip ci] * [comment audit] Condense provider lifetime and repository ownership rationale [skip ci] * [comment audit] Condense reconnect, hydration and terminal retirement rationale [skip ci] * [comment audit] Condense recovery, reconciliation and persistence rationale [skip ci] * [comment audit] Condense cleanup ownership and listing admission rationale [skip ci] * [comment audit] Condense teardown ordering and terminal ownership rationale [skip ci] * [comment audit] Condense recovery ledger and web host-boundary rationale [skip ci] * [comment audit] Condense web reconnect and credential lifecycle rationale [skip ci] * [comment audit] Condense cloud rollout and assignment safety rationale [skip ci] * [comment audit] Condense relay session and database recovery rationale [skip ci] * [comment audit] Condense relay placement and protocol compatibility rationale [skip ci] * [comment audit] Condense build and packaging constraints [skip ci] * [comment audit] Condense CI gates and validation isolation rationale [skip ci] * [comment audit] Condense catalog identity and browser validation rationale [skip ci] * [comment audit] Condense mobile browser and frame-budget rationale [skip ci] * [comment audit] Shorten mobile route and browser test explanations [skip ci] * [comment audit] Condense editor and session seam test rationale [skip ci] * [comment audit] Trim session and terminal closure history [skip ci] * [comment audit] Shorten terminal browser and census explanations [skip ci] * [comment audit] Preserve root-only E2E diagnostic baseline * [comment audit] Condense mobile seam and HTML preview test rationale [skip ci] * [comment audit] Condense preview instrumentation and render harness rationale [skip ci] * [comment audit] Condense bundle contracts and native-build constraints [skip ci] * [comment audit] Shorten native packaging and CI routing rationale [skip ci] * [comment audit] Condense release tooling and benchmark constraints [skip ci] * [comment audit] Condense packaging and platform gate rationale [skip ci] * [comment audit] Shorten mobile route and history rationale [skip ci] * [comment audit] Condense mobile browser and component rationale [skip ci] * [comment audit] Shorten drawer and workspace-form rationale [skip ci] * [comment audit] Trim mobile review and editor-document explanations [skip ci] * [comment audit] Condense editor lifecycle and Markdown explanations [skip ci] * [comment audit] Trim mobile file, diagnostics and dictation commentary [skip ci] * [comment audit] Simplify mobile host-list and workspace-view explanations [skip ci] * [comment audit] Clarify mobile shell lifetime and bridge delivery constraints [skip ci] * [comment audit] Condense bridge stream, native request and audio rationale [skip ci] * [comment audit] Reduce bridge schema and page-client commentary [skip ci] * [comment audit] Tighten mobile page bridge contracts [skip ci] * [comment audit] Clarify mobile cache and session constraints [skip ci] * [comment audit] Condense mobile route and lifecycle rationale [skip ci] * [comment audit] Tighten mobile shell hook timing rationale [skip ci] * [comment audit] Clarify route handoff and notification compatibility [skip ci] * [comment audit] Clarify push registration and dictation cleanup constraints [skip ci] * [comment audit] Condense keyboard geometry and native media ownership rationale [skip ci] * [comment audit] Tighten mobile chat scroll and composer concurrency rationale [skip ci] * [comment audit] Condense mobile reply compatibility and upload ownership rationale [skip ci] * [comment audit] Condense optimistic echo and scroll ownership rationale [skip ci] * [comment audit] Tighten stream replay and queued session ownership rationale [skip ci] * [comment audit] Condense mobile composer and reply-schema constraints [skip ci] * [comment audit] Clarify mobile transcript recovery and session ownership [skip ci] * [comment audit] Clarify mobile queue and source-control compatibility [skip ci] * [comment audit] Condense storage and task launch constraints [skip ci] * [comment audit] Clarify task schemas and terminal document ownership [skip ci] * [comment audit] Tighten terminal input and viewport rationale [skip ci] * [comment audit] Shorten terminal and RPC recorder contracts [skip ci] * [comment audit] Condense recorder engine and connection contracts [skip ci] * [comment audit] Shorten host credential and relay recovery comments [skip ci] * [comment audit] Tighten pairing recovery and bundle transport rationale [skip ci] * [comment audit] Clarify RPC delivery and workspace catalog boundaries [skip ci] * [comment audit] Condense catalog and relay entry contracts [skip ci] * [comment audit] Shorten shutdown and SSH relay delivery contracts [skip ci] * [comment audit] Condense WSL relay and E2E regression rationale [skip ci] * [comment audit] Shorten cross-version harness and renderer fixture explanations [skip ci] * [comment audit] Condense paired-host and E2E lifecycle rationale [skip ci] * [comment audit] Shorten layout oracle and regression explanations [skip ci] * [comment audit] Condense paired recovery and ownership regression contracts [skip ci] * [comment audit] Shorten restart, sidebar and SSH lifecycle contracts [skip ci] * [comment audit] Condense terminal rendering and IME regression rationale [skip ci] * [comment audit] Shorten terminal recovery and benchmark contracts [skip ci] * [comment audit] Condense tooling and Windows lifecycle proof rationale [skip ci] * [comment audit] Condense workflow routing and release rationale [skip ci] * [comment audit] Condense mobile security and installer contracts [skip ci] * [comment audit] Shorten native rationale and stylesheet workarounds [skip ci] * [comment audit] Shorten Windows visibility probe rationale [skip ci] * [comment audit] Condense embedded release and signing rationale [skip ci] * [comment audit] Retain current main test behavior in final reconciliation [skip ci] * [comment audit] Complete final comment review across current source inventory * [comment audit] Handle consolidated audit reports before final CI * [comment audit] Preserve credential storage census detail [skip ci] * [comment audit] Scale broad changed E2E selections with verified timing shards * [comment audit] Align E2E assertions with browser close and settled session metadata * [comment audit] Match existing E2Es to current resource and windowing contracts * [comment audit] Observe the shared server outage notice in reconnect coverage * [comment audit] Make existing renderer probes measure settled tab and PTY work * [comment audit] Align palette E2E selector with task search * [comment audit] Refresh remaining palette search selectors * [comment audit] Keep selector correction within selected audit specs * [comment audit] Await emoji fixture settings inside renderer evaluation * [comment audit] Cancel fixture fit retries between terminal tests --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
239 lines
9.7 KiB
TypeScript
239 lines
9.7 KiB
TypeScript
import { startAndroidForegroundPushPresentation } from '../src/notifications/android-foreground-push'
|
||
import { registerPushDismissalTask } from '../src/notifications/push-background-dismissal'
|
||
import { readNativeNotificationData } from '../src/notifications/native-notification-data'
|
||
import { setNotificationViewingWorkspace } from '../src/notifications/notification-viewing-policy'
|
||
import { useCallback, useEffect, useRef } from 'react'
|
||
import { View, StyleSheet } from 'react-native'
|
||
import { Stack, useRouter, useGlobalSearchParams, usePathname } from 'expo-router'
|
||
import { StatusBar } from 'expo-status-bar'
|
||
import * as SplashScreen from 'expo-splash-screen'
|
||
import * as Notifications from 'expo-notifications'
|
||
import * as Linking from 'expo-linking'
|
||
import { colors } from '../src/theme/mobile-theme'
|
||
import { OrcaLogo } from '../src/components/OrcaLogo'
|
||
import { RpcClientProvider } from '../src/transport/client-context'
|
||
import { getNotificationNavigationTarget } from '../src/notifications/notification-routing'
|
||
import { useOpenNotificationRoute } from '../src/notifications/use-open-notification-route'
|
||
import {
|
||
isRemotePushTrigger,
|
||
pushNotificationRouteData,
|
||
foregroundNotificationBehavior
|
||
} from '../src/notifications/push-receive'
|
||
import { startPushTokenSync } from '../src/notifications/push-registration'
|
||
import { ensureDesktopNotificationChannel } from '../src/notifications/desktop-notification-channel'
|
||
import { loadHostCatalog } from '../src/transport/host-store'
|
||
import { extractPairingCodeFromUrl } from '../src/transport/pairing'
|
||
import { recoverMobileRelayPairing } from '../src/transport/mobile-relay-pairing-recovery'
|
||
import { appUpdateChecker } from '../src/app-update/app-update-runtime'
|
||
import { SideSafeArea } from '../src/layout/side-safe-area'
|
||
|
||
// Keep splash visible until React content is ready to avoid a blank frame.
|
||
SplashScreen.preventAutoHideAsync()
|
||
|
||
// Create orca-desktop channel at boot: background FCM can arrive before socket subscription, and Android drops unknown-channel pushes.
|
||
void ensureDesktopNotificationChannel().catch(() => {})
|
||
void registerPushDismissalTask().catch(() => {})
|
||
|
||
// Register before scheduling so foreground delivery uses the same suppression policy.
|
||
Notifications.setNotificationHandler({
|
||
handleNotification: foregroundNotificationBehavior
|
||
})
|
||
|
||
export default function RootLayout() {
|
||
const router = useRouter()
|
||
const pathname = usePathname()
|
||
const { hostId, worktreeId, executionHost } = useGlobalSearchParams<{
|
||
hostId?: string
|
||
worktreeId?: string
|
||
executionHost?: string
|
||
}>()
|
||
useEffect(() => {
|
||
setNotificationViewingWorkspace(
|
||
pathname.includes('/session/') && typeof hostId === 'string' && typeof worktreeId === 'string'
|
||
? { hostId, worktreeId, ...(typeof executionHost === 'string' ? { executionHost } : {}) }
|
||
: null
|
||
)
|
||
return () => setNotificationViewingWorkspace(null)
|
||
}, [pathname, hostId, worktreeId, executionHost])
|
||
const openNotificationRoute = useOpenNotificationRoute()
|
||
const handledNotificationIdsRef = useRef<Set<string>>(new Set())
|
||
|
||
useEffect(() => {
|
||
// Reconcile the crash-persistent pairing journal before another scan can replace it.
|
||
void recoverMobileRelayPairing()
|
||
}, [])
|
||
|
||
// Re-register rolled APNs/FCM tokens with every paired host or delivery silently stops.
|
||
useEffect(() => startPushTokenSync(), [])
|
||
// Cold start, then foreground and timer checks on the desktop updater's cadence.
|
||
useEffect(() => appUpdateChecker.start(), [])
|
||
useEffect(() => startAndroidForegroundPushPresentation(), [])
|
||
|
||
// Route pair links through confirmation; getInitialURL covers cold starts and the listener covers warm starts.
|
||
useEffect(() => {
|
||
function handleUrl(url: string) {
|
||
const code = extractPairingCodeFromUrl(url)
|
||
if (code) {
|
||
// Replace Android camera’s unmatched orca://pair route so Cancel/Back cannot reveal the router error.
|
||
router.replace({ pathname: '/pair-confirm', params: { code } })
|
||
}
|
||
}
|
||
|
||
void Linking.getInitialURL().then((url) => {
|
||
if (url) {
|
||
handleUrl(url)
|
||
}
|
||
})
|
||
|
||
const sub = Linking.addEventListener('url', ({ url }) => handleUrl(url))
|
||
return () => sub.remove()
|
||
}, [router])
|
||
|
||
// Notification taps arrive through expo-notifications, not Linking; route both cold and warm responses to their host/worktree.
|
||
useEffect(() => {
|
||
let disposed = false
|
||
|
||
function clearLastNotificationResponse() {
|
||
try {
|
||
Notifications.clearLastNotificationResponse()
|
||
} catch {
|
||
// Older native shells may lack clear API; duplicate guards still protect this JS runtime.
|
||
}
|
||
}
|
||
|
||
function getInitialNotificationResponse(): Notifications.NotificationResponse | null {
|
||
try {
|
||
return Notifications.getLastNotificationResponse()
|
||
} catch {
|
||
return null
|
||
}
|
||
}
|
||
|
||
async function getNavigationTarget(notification: Notifications.Notification) {
|
||
const hosts = await loadHostCatalog().catch(() => null)
|
||
const data = readNativeNotificationData(notification.request)
|
||
// Gateway pushes identify hosts by key fingerprint; without catalog resolution, never fall back to their raw hostId.
|
||
const routeData = pushNotificationRouteData(
|
||
data,
|
||
hosts ?? [],
|
||
isRemotePushTrigger(notification.request.trigger)
|
||
)
|
||
return getNotificationNavigationTarget(routeData, {
|
||
knownHostIds: hosts ? new Set(hosts.map((host) => host.id)) : undefined,
|
||
credentialStatusByHostId: hosts
|
||
? new Map(hosts.map((host) => [host.id, host.credentialStatus]))
|
||
: undefined
|
||
})
|
||
}
|
||
|
||
async function handleNotificationResponse(response: Notifications.NotificationResponse) {
|
||
if (response.actionIdentifier !== Notifications.DEFAULT_ACTION_IDENTIFIER) {
|
||
clearLastNotificationResponse()
|
||
return
|
||
}
|
||
|
||
const notificationId = response.notification.request.identifier
|
||
if (handledNotificationIdsRef.current.has(notificationId)) {
|
||
return
|
||
}
|
||
handledNotificationIdsRef.current.add(notificationId)
|
||
// RootLayout never unmounts; bound tap dedup with FIFO eviction.
|
||
if (handledNotificationIdsRef.current.size > 256) {
|
||
const oldest = handledNotificationIdsRef.current.values().next().value
|
||
if (oldest !== undefined) {
|
||
handledNotificationIdsRef.current.delete(oldest)
|
||
}
|
||
}
|
||
|
||
const target = await getNavigationTarget(response.notification)
|
||
clearLastNotificationResponse()
|
||
if (disposed) {
|
||
return
|
||
}
|
||
if (target) {
|
||
openNotificationRoute(target)
|
||
}
|
||
}
|
||
|
||
const initialResponse = getInitialNotificationResponse()
|
||
if (initialResponse) {
|
||
void handleNotificationResponse(initialResponse)
|
||
}
|
||
|
||
const sub = Notifications.addNotificationResponseReceivedListener((response) => {
|
||
void handleNotificationResponse(response)
|
||
})
|
||
return () => {
|
||
disposed = true
|
||
sub.remove()
|
||
}
|
||
}, [openNotificationRoute])
|
||
|
||
// Hide splash only after Stack layout; a placeholder render can precede real screen content and expose a grey gap.
|
||
const onNavigatorLayout = useCallback(async () => {
|
||
await SplashScreen.hideAsync()
|
||
}, [])
|
||
|
||
return (
|
||
<RpcClientProvider>
|
||
<View style={styles.root} onLayout={onNavigatorLayout}>
|
||
<StatusBar style="light" />
|
||
<SideSafeArea>
|
||
<Stack
|
||
screenOptions={{
|
||
headerStyle: { backgroundColor: colors.bgPanel },
|
||
headerTintColor: colors.textPrimary,
|
||
headerTitleStyle: { fontSize: 16, fontWeight: '600' },
|
||
contentStyle: { backgroundColor: colors.bgBase },
|
||
headerShadowVisible: false
|
||
// Leave orientation unset: react-native-screens overrides rotation lock even for default; Android manifest fullUser honors the user’s setting.
|
||
}}
|
||
>
|
||
<Stack.Screen
|
||
name="index"
|
||
options={{
|
||
headerShown: false,
|
||
headerTitle: () => <OrcaLogo size={22} />
|
||
}}
|
||
/>
|
||
<Stack.Screen name="pair-scan" options={{ headerShown: false }} />
|
||
<Stack.Screen name="pair" options={{ headerShown: false }} />
|
||
<Stack.Screen name="pair-confirm" options={{ headerShown: false }} />
|
||
<Stack.Screen
|
||
name="mobile-onboarding"
|
||
options={{ headerShown: false, presentation: 'modal', gestureEnabled: false }}
|
||
/>
|
||
<Stack.Screen name="settings" options={{ headerShown: false }} />
|
||
<Stack.Screen name="terminal-settings" options={{ headerShown: false }} />
|
||
<Stack.Screen name="native-chat-settings" options={{ headerShown: false }} />
|
||
<Stack.Screen name="browser-settings" options={{ headerShown: false }} />
|
||
<Stack.Screen name="voice-settings" options={{ headerShown: false }} />
|
||
<Stack.Screen name="notifications" options={{ headerShown: false }} />
|
||
<Stack.Screen name="troubleshoot" options={{ headerShown: false }} />
|
||
<Stack.Screen name="connection-log" options={{ headerShown: false }} />
|
||
<Stack.Screen name="about" options={{ headerShown: false }} />
|
||
<Stack.Screen name="h" options={{ headerShown: false }} />
|
||
<Stack.Screen
|
||
name="new-workspace"
|
||
options={{
|
||
headerShown: false,
|
||
// Draws nothing of its own: the drawer is the page's, over Home.
|
||
presentation: 'transparentModal',
|
||
animation: 'none',
|
||
contentStyle: { backgroundColor: 'transparent' }
|
||
}}
|
||
/>
|
||
</Stack>
|
||
</SideSafeArea>
|
||
</View>
|
||
</RpcClientProvider>
|
||
)
|
||
}
|
||
|
||
const styles = StyleSheet.create({
|
||
root: {
|
||
flex: 1,
|
||
backgroundColor: colors.bgBase
|
||
}
|
||
})
|