@comergehq/studio 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -10
- package/dist/index.d.ts +2 -10
- package/dist/index.js +39 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +39 -20
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/core/services/http/public.ts +19 -0
- package/src/studio/ComergeStudio.tsx +3 -10
- package/src/studio/bootstrap/StudioBootstrap.tsx +2 -2
- package/src/studio/bootstrap/useStudioBootstrap.ts +7 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/studio/ComergeStudio.tsx","../src/studio/bootstrap/StudioBootstrap.tsx","../src/components/primitives/Text.tsx","../src/theme/useTheme.ts","../src/theme/tokens.ts","../src/studio/bootstrap/useStudioBootstrap.ts","../src/core/services/supabase/client.ts","../src/core/services/supabase/auth.ts","../src/data/base-repository.ts","../src/core/services/http/public.ts","../src/core/services/http/baseUrl.ts","../src/data/base-remote.ts","../src/data/public/studio-config/remote.ts","../src/data/public/studio-config/repository.ts","../src/studio/hooks/useApp.ts","../src/core/services/http/index.ts","../src/core/logger.ts","../src/data/apps/remote.ts","../src/data/apps/repository.ts","../src/studio/hooks/useThreadMessages.ts","../src/data/messages/remote.ts","../src/data/messages/repository.ts","../src/studio/hooks/useBundleManager.ts","../src/data/apps/bundles/remote.ts","../src/data/apps/bundles/repository.ts","../src/studio/hooks/useMergeRequests.ts","../src/data/merge-requests/remote.ts","../src/data/merge-requests/repository.ts","../src/data/users/remote.ts","../src/data/users/repository.ts","../src/studio/hooks/useAttachmentUpload.ts","../src/data/attachment/remote.ts","../src/data/attachment/repository.ts","../src/studio/hooks/useStudioActions.ts","../src/data/agent/remote.ts","../src/data/agent/repository.ts","../src/studio/lib/chat.ts","../src/studio/ui/RuntimeRenderer.tsx","../src/studio/ui/StudioOverlay.tsx","../src/components/studio-sheet/StudioBottomSheet.tsx","../src/components/studio-sheet/StudioSheetBackground.tsx","../src/components/studio-sheet/StudioSheetPager.tsx","../src/components/floating-draggable-button/FloatingDraggableButton.tsx","../src/components/floating-draggable-button/constants.ts","../src/components/overlays/EdgeGlowFrame.tsx","../src/components/utils/color.ts","../src/components/draw/DrawModeOverlay.tsx","../src/components/draw/DrawSurface.tsx","../src/components/draw/strokes.ts","../src/components/draw/DrawToolbar.tsx","../src/components/draw/optionalHaptics.ts","../src/components/draw/DrawColorPicker.tsx","../src/components/comments/AppCommentsSheet.tsx","../src/components/chat/ChatComposer.tsx","../src/components/chat/MultilineTextInput.tsx","../src/components/icons/StudioIcons.tsx","../src/components/comments/CommentRow.tsx","../src/components/primitives/Avatar.tsx","../src/components/utils/formatTimeAgo.ts","../src/components/comments/useAppComments.ts","../src/data/comments/remote.ts","../src/data/comments/repository.ts","../src/components/comments/useAppDetails.ts","../src/components/comments/useIosKeyboardSnapFix.ts","../src/studio/ui/PreviewPanel.tsx","../src/components/preview/PreviewPage.tsx","../src/studio/ui/preview-panel/PreviewPanelHeader.tsx","../src/components/studio-sheet/StudioSheetHeader.tsx","../src/components/studio-sheet/StudioSheetHeaderIconButton.tsx","../src/components/preview/PreviewHeroCard.tsx","../src/components/primitives/Surface.tsx","../src/components/primitives/Card.tsx","../src/components/preview/PreviewPlaceholder.tsx","../src/components/preview/PreviewImage.tsx","../src/components/preview/StatsBar.tsx","../src/components/icons/MergeIcon.tsx","../src/components/preview/PreviewStatusBadge.tsx","../src/data/apps/types.ts","../src/studio/ui/preview-panel/PreviewHeroSection.tsx","../src/studio/ui/preview-panel/PreviewMetaSection.tsx","../src/components/preview/PreviewMetaRow.tsx","../src/studio/ui/preview-panel/utils.ts","../src/studio/ui/preview-panel/PreviewCustomizeSection.tsx","../src/studio/ui/preview-panel/PressableCardRow.tsx","../src/studio/ui/preview-panel/SectionTitle.tsx","../src/studio/ui/preview-panel/PreviewCollaborateSection.tsx","../src/components/merge-requests/MergeRequestStatusCard.tsx","../src/components/primitives/MarkdownText.tsx","../src/components/merge-requests/mergeRequestStatusDisplay.ts","../src/components/merge-requests/toIsoString.ts","../src/components/merge-requests/useControlledExpansion.ts","../src/components/merge-requests/ReviewMergeRequestCarousel.tsx","../src/components/merge-requests/ReviewMergeRequestCard.tsx","../src/components/merge-requests/ReviewMergeRequestActionButton.tsx","../src/studio/ui/preview-panel/usePreviewPanelData.ts","../src/data/apps/images/remote.ts","../src/data/apps/images/repository.ts","../src/studio/hooks/useAppStats.ts","../src/data/likes/remote.ts","../src/data/likes/repository.ts","../src/studio/ui/ChatPanel.tsx","../src/components/chat/ChatPage.tsx","../src/components/chat/ChatMessageList.tsx","../src/components/chat/ChatMessageBubble.tsx","../src/components/chat/TypingIndicator.tsx","../src/components/chat/ScrollToBottomButton.tsx","../src/components/chat/ChatHeader.tsx","../src/components/chat/ForkNoticeBanner.tsx","../src/components/dialogs/ConfirmMergeRequestDialog.tsx","../src/components/primitives/Modal.tsx","../src/studio/ui/ConfirmMergeFlow.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Platform as RNPlatform, View, type ViewStyle } from 'react-native';\nimport { BottomSheetModalProvider } from '@gorhom/bottom-sheet';\n\nimport type { Platform as BundlePlatform } from '../data/apps/bundles/types';\nimport { StudioBootstrap } from './bootstrap/StudioBootstrap';\nimport { useApp } from './hooks/useApp';\nimport { useThreadMessages } from './hooks/useThreadMessages';\nimport { useBundleManager } from './hooks/useBundleManager';\nimport { useMergeRequests } from './hooks/useMergeRequests';\nimport { useAttachmentUpload } from './hooks/useAttachmentUpload';\nimport { useStudioActions } from './hooks/useStudioActions';\nimport { hasNoOutcomeAfterLastHuman } from './lib/chat';\nimport { RuntimeRenderer } from './ui/RuntimeRenderer';\nimport { StudioOverlay } from './ui/StudioOverlay';\n\nexport type ComergeStudioProps = {\n /**\n * App to open in the runtime and studio.\n */\n appId: string;\n /**\n * App root key exposed by the bundle (defaults to MicroMain).\n */\n appKey?: string;\n /**\n * Optional callback for a “home” button.\n */\n onNavigateHome?: () => void;\n style?: ViewStyle;\n};\n\nexport function ComergeStudio({\n appId,\n appKey = 'MicroMain',\n onNavigateHome,\n style,\n}: ComergeStudioProps) {\n const [activeAppId, setActiveAppId] = React.useState(appId);\n const [runtimeAppId, setRuntimeAppId] = React.useState(appId);\n const [pendingRuntimeTargetAppId, setPendingRuntimeTargetAppId] = React.useState<string | null>(null);\n const platform = React.useMemo<BundlePlatform>(() => (RNPlatform.OS === 'ios' ? 'ios' : 'android'), []);\n\n React.useEffect(() => {\n setActiveAppId(appId);\n setRuntimeAppId(appId);\n setPendingRuntimeTargetAppId(null);\n }, [appId]);\n\n const captureTargetRef = React.useRef<View | null>(null);\n\n return (\n <StudioBootstrap>\n {({ userId }) => (\n <BottomSheetModalProvider>\n <ComergeStudioInner\n userId={userId}\n activeAppId={activeAppId}\n setActiveAppId={setActiveAppId}\n runtimeAppId={runtimeAppId}\n setRuntimeAppId={setRuntimeAppId}\n pendingRuntimeTargetAppId={pendingRuntimeTargetAppId}\n setPendingRuntimeTargetAppId={setPendingRuntimeTargetAppId}\n appKey={appKey}\n platform={platform}\n onNavigateHome={onNavigateHome}\n captureTargetRef={captureTargetRef}\n style={style}\n />\n </BottomSheetModalProvider>\n )}\n </StudioBootstrap>\n );\n}\n\ntype InnerProps = {\n userId: string;\n activeAppId: string;\n setActiveAppId: (id: string) => void;\n runtimeAppId: string;\n setRuntimeAppId: (id: string) => void;\n pendingRuntimeTargetAppId: string | null;\n setPendingRuntimeTargetAppId: (id: string | null) => void;\n appKey: string;\n platform: BundlePlatform;\n onNavigateHome?: () => void;\n captureTargetRef: React.RefObject<View | null>;\n style?: ViewStyle;\n};\n\nfunction ComergeStudioInner({\n userId,\n activeAppId,\n setActiveAppId,\n runtimeAppId,\n setRuntimeAppId,\n pendingRuntimeTargetAppId,\n setPendingRuntimeTargetAppId,\n appKey,\n platform,\n onNavigateHome,\n captureTargetRef,\n style,\n}: InnerProps) {\n const { app, loading: appLoading } = useApp(activeAppId);\n const { app: runtimeAppFromHook } = useApp(runtimeAppId, { enabled: runtimeAppId !== activeAppId });\n const runtimeApp = runtimeAppId === activeAppId ? app : runtimeAppFromHook;\n\n // When we fork+edit, we keep rendering the original app until the forked app completes the edit.\n // We unlock the runtime switch once we observe the forked app go editing -> ready.\n const sawEditingOnPendingTargetRef = React.useRef(false);\n React.useEffect(() => {\n sawEditingOnPendingTargetRef.current = false;\n }, [pendingRuntimeTargetAppId]);\n\n React.useEffect(() => {\n if (!pendingRuntimeTargetAppId) return;\n if (activeAppId !== pendingRuntimeTargetAppId) return;\n if (app?.status === 'editing') {\n sawEditingOnPendingTargetRef.current = true;\n }\n if (sawEditingOnPendingTargetRef.current && app?.status === 'ready') {\n setRuntimeAppId(pendingRuntimeTargetAppId);\n setPendingRuntimeTargetAppId(null);\n sawEditingOnPendingTargetRef.current = false;\n }\n }, [activeAppId, app?.status, app?.id, pendingRuntimeTargetAppId, setPendingRuntimeTargetAppId, setRuntimeAppId]);\n\n const bundle = useBundleManager({\n base: { appId: runtimeAppId, commitId: runtimeApp?.headCommitId ?? undefined },\n platform,\n canRequestLatest: runtimeApp?.status === 'ready',\n });\n\n const threadId = app?.threadId ?? '';\n const thread = useThreadMessages(threadId);\n\n const mergeRequests = useMergeRequests({ appId: activeAppId });\n const hasOpenOutgoingMr = React.useMemo(() => {\n return mergeRequests.lists.outgoing.some((mr) => mr.status === 'open');\n }, [mergeRequests.lists.outgoing]);\n\n const incomingReviewMrs = React.useMemo(() => {\n if (!userId) return mergeRequests.lists.incoming;\n return mergeRequests.lists.incoming.filter((mr) => mr.createdBy !== userId);\n }, [mergeRequests.lists.incoming, userId]);\n\n const uploader = useAttachmentUpload();\n\n const actions = useStudioActions({\n userId,\n app,\n onForkedApp: (id, opts) => {\n setActiveAppId(id);\n const keepRenderingAppId = opts?.keepRenderingAppId;\n if (keepRenderingAppId) {\n setRuntimeAppId(keepRenderingAppId);\n setPendingRuntimeTargetAppId(id);\n } else {\n setRuntimeAppId(id);\n setPendingRuntimeTargetAppId(null);\n }\n },\n uploadAttachments: uploader.uploadBase64Images,\n });\n\n const chatSendDisabled = hasNoOutcomeAfterLastHuman(thread.raw);\n\n const [processingMrId, setProcessingMrId] = React.useState<string | null>(null);\n const [testingMrId, setTestingMrId] = React.useState<string | null>(null);\n\n // Show typing dots when the last message isn't an outcome (agent still working).\n const chatShowTypingIndicator = React.useMemo(() => {\n if (!thread.raw || thread.raw.length === 0) return false;\n const last = thread.raw[thread.raw.length - 1];\n const payloadType = typeof (last.payload as any)?.type === 'string' ? String((last.payload as any).type) : undefined;\n return payloadType !== 'outcome';\n }, [thread.raw]);\n\n return (\n <View style={[{ flex: 1 }, style]}>\n <View ref={captureTargetRef} style={{ flex: 1 }} collapsable={false}>\n <RuntimeRenderer appKey={appKey} bundlePath={bundle.bundlePath} renderToken={bundle.renderToken} />\n\n <StudioOverlay\n captureTargetRef={captureTargetRef}\n app={app}\n appLoading={appLoading}\n isOwner={actions.isOwner}\n shouldForkOnEdit={actions.shouldForkOnEdit}\n isTesting={bundle.isTesting}\n onRestoreBase={async () => {\n setTestingMrId(null);\n await bundle.restoreBase();\n }}\n incomingMergeRequests={incomingReviewMrs}\n outgoingMergeRequests={mergeRequests.lists.outgoing}\n creatorStatsById={mergeRequests.creatorStatsById}\n processingMrId={processingMrId}\n isBuildingMrTest={bundle.loading}\n testingMrId={testingMrId}\n toMergeRequestSummary={mergeRequests.toSummary}\n onSubmitMergeRequest={\n app?.forkedFromAppId && actions.isOwner && !hasOpenOutgoingMr\n ? async () => {\n await mergeRequests.actions.openMergeRequest(activeAppId);\n }\n : undefined\n }\n onApprove={async (mr) => {\n if (processingMrId) return;\n setProcessingMrId(mr.id);\n try {\n await mergeRequests.actions.approve(mr.id);\n } finally {\n setProcessingMrId(null);\n }\n }}\n onReject={async (mr) => {\n if (processingMrId) return;\n setProcessingMrId(mr.id);\n try {\n await mergeRequests.actions.reject(mr.id);\n } finally {\n setProcessingMrId(null);\n }\n }}\n onTestMr={async (mr) => {\n setTestingMrId(mr.id);\n await bundle.loadTest({ appId: mr.sourceAppId, commitId: mr.sourceTipCommitId ?? mr.sourceCommitId });\n }}\n chatMessages={thread.messages}\n chatLoading={thread.loading}\n chatSendDisabled={chatSendDisabled}\n chatForking={actions.forking}\n chatSending={actions.sending}\n chatShowTypingIndicator={chatShowTypingIndicator}\n onSendChat={(text, attachments) => actions.sendEdit({ prompt: text, attachments })}\n onNavigateHome={onNavigateHome}\n />\n </View>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\n\nimport { Text } from '../../components/primitives/Text';\nimport { useStudioBootstrap, type UseStudioBootstrapOptions } from './useStudioBootstrap';\n\nexport type StudioBootstrapProps = UseStudioBootstrapOptions & {\n children: React.ReactNode | ((params: { userId: string }) => React.ReactNode);\n /**\n * Optional custom loading UI.\n */\n fallback?: React.ReactNode;\n /**\n * Optional custom error UI. If not provided, a minimal message is shown.\n */\n renderError?: (error: Error) => React.ReactNode;\n};\n\nexport function StudioBootstrap({ children, fallback, renderError }: StudioBootstrapProps) {\n const { ready, error, userId } = useStudioBootstrap({});\n\n if (error) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }}>\n {renderError ? renderError(error) : <Text variant=\"bodyMuted\">{error.message}</Text>}\n </View>\n );\n }\n\n if (!ready) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }}>\n {fallback ?? <Text variant=\"bodyMuted\">Loading…</Text>}\n </View>\n );\n }\n\n if (typeof children === 'function') {\n return <>{children({ userId: userId ?? '' })}</>;\n }\n\n return <>{children}</>;\n}\n\n\n","import * as React from 'react';\nimport { Text as RNText, type TextProps as RNTextProps, type TextStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport type { TextAlign, TextVariant, WithStyle } from './types';\n\nexport type TextProps = RNTextProps &\n WithStyle<TextStyle> & {\n variant?: TextVariant;\n align?: TextAlign;\n /**\n * Optional explicit color override. Prefer `variant` + theme.\n * Use sparingly for semantic emphasis.\n */\n color?: string;\n };\n\nfunction getVariantStyle(variant: TextVariant, theme: ReturnType<typeof useTheme>): TextStyle {\n const { colors, typography } = theme;\n switch (variant) {\n case 'title':\n return {\n color: colors.text,\n fontSize: typography.fontSize.xl,\n lineHeight: typography.lineHeight.xl,\n fontWeight: typography.fontWeight.semibold,\n };\n case 'caption':\n return {\n color: colors.text,\n fontSize: typography.fontSize.xs,\n lineHeight: typography.lineHeight.xs,\n fontWeight: typography.fontWeight.medium,\n };\n case 'captionMuted':\n return {\n color: colors.textSubtle,\n fontSize: typography.fontSize.xs,\n lineHeight: typography.lineHeight.xs,\n fontWeight: typography.fontWeight.medium,\n };\n case 'bodyMuted':\n return {\n color: colors.textMuted,\n fontSize: typography.fontSize.md,\n lineHeight: typography.lineHeight.md,\n fontWeight: typography.fontWeight.regular,\n };\n case 'body':\n default:\n return {\n color: colors.text,\n fontSize: typography.fontSize.md,\n lineHeight: typography.lineHeight.md,\n fontWeight: typography.fontWeight.regular,\n };\n }\n}\n\nexport function Text({\n variant = 'body',\n align,\n color,\n style,\n ...props\n}: TextProps) {\n const theme = useTheme();\n const base = getVariantStyle(variant, theme);\n\n return (\n <RNText\n {...props}\n style={[\n base,\n align ? { textAlign: align } : null,\n color ? { color } : null,\n style,\n ]}\n />\n );\n}\n\n\n","import { useColorScheme } from 'react-native';\n\nimport { themes } from './tokens';\nimport type { Theme, ThemeScheme } from './types';\n\nexport function useTheme(): Theme {\n const scheme = (useColorScheme() ?? 'light') as ThemeScheme;\n return themes[scheme] ?? themes.light;\n}\n\n\n","import type { Theme } from './types';\n\nexport const lightTheme = {\n scheme: 'light',\n colors: {\n text: '#09090B',\n textMuted: '#898994',\n textSubtle: 'rgba(137, 137, 148, 0.70)',\n\n background: '#FFFFFF',\n surface: '#F6F6F6',\n surfaceRaised: '#FFFFFF',\n\n border: '#E4E4E7',\n borderStrong: '#D4D4D8',\n\n primary: '#6200EE',\n onPrimary: '#FFFFFF',\n\n neutral: '#ECECEE',\n onNeutral: '#09090B',\n\n danger: '#F43F5E',\n onDanger: '#FFFFFF',\n dangerSubtle: 'rgba(244, 63, 94, 0.12)',\n\n success: '#10B981',\n onSuccess: '#FFFFFF',\n successSubtle: 'rgba(16, 185, 129, 0.12)',\n\n warning: '#FACC15',\n onWarning: '#09090B',\n warningSubtle: 'rgba(250, 204, 21, 0.14)',\n\n link: '#6200EE',\n\n backdrop: 'rgba(0, 0, 0, 0.35)',\n\n handleIndicator: '#71717A',\n\n floatingSurface: 'rgba(255, 255, 255, 0.6)',\n floatingContent: '#000000',\n\n accentRingFrom: 'rgba(98, 0, 238, 0.20)',\n accentRingTo: 'rgba(98, 0, 238, 0.90)',\n dangerRingFrom: 'rgba(244, 63, 94, 0.35)',\n dangerRingTo: 'rgba(244, 63, 94, 1.0)',\n },\n spacing: { xs: 4, sm: 8, md: 12, lg: 16, xl: 24 },\n radii: { sm: 8, md: 12, lg: 16, xl: 24, pill: 999 },\n typography: {\n fontSize: { xs: 12, sm: 13, md: 15, lg: 17, xl: 20 },\n lineHeight: { xs: 16, sm: 18, md: 20, lg: 22, xl: 26 },\n fontWeight: { regular: '400', medium: '500', semibold: '600', bold: '700' },\n },\n} as const satisfies Theme;\n\nexport const darkTheme = {\n scheme: 'dark',\n colors: {\n text: '#FFFFFF',\n textMuted: '#A1A1AA',\n textSubtle: 'rgba(161, 161, 170, 0.70)',\n\n background: '#0B080F',\n surface: '#18181B',\n surfaceRaised: '#0B080F',\n\n border: '#404049',\n borderStrong: '#52525B',\n\n primary: '#6200EE',\n onPrimary: '#FFFFFF',\n\n neutral: '#0B080F',\n onNeutral: '#FFFFFF',\n\n danger: '#F43F5E',\n onDanger: '#FFFFFF',\n dangerSubtle: 'rgba(244, 63, 94, 0.18)',\n\n success: '#10B981',\n onSuccess: '#0B080F',\n successSubtle: 'rgba(16, 185, 129, 0.16)',\n\n warning: '#FBBF24',\n onWarning: '#0B080F',\n warningSubtle: 'rgba(251, 191, 36, 0.18)',\n\n link: '#6200EE',\n\n backdrop: 'rgba(0, 0, 0, 0.55)',\n\n handleIndicator: '#A1A1AA',\n\n floatingSurface: 'rgba(0, 0, 0, 0.6)',\n floatingContent: '#FFFFFF',\n\n accentRingFrom: 'rgba(98, 0, 238, 0.20)',\n accentRingTo: 'rgba(98, 0, 238, 0.90)',\n dangerRingFrom: 'rgba(244, 63, 94, 0.35)',\n dangerRingTo: 'rgba(244, 63, 94, 1.0)',\n },\n spacing: { xs: 4, sm: 8, md: 12, lg: 16, xl: 24 },\n radii: { sm: 8, md: 12, lg: 16, xl: 24, pill: 999 },\n typography: {\n fontSize: { xs: 12, sm: 13, md: 15, lg: 17, xl: 20 },\n lineHeight: { xs: 16, sm: 18, md: 20, lg: 22, xl: 26 },\n fontWeight: { regular: '400', medium: '500', semibold: '600', bold: '700' },\n },\n} as const satisfies Theme;\n\nexport const themes = {\n light: lightTheme,\n dark: darkTheme,\n} as const;\n\n\n","import * as React from 'react';\n\nimport { ensureAuthenticatedSession, ensureAnonymousSession } from '../../core/services/supabase/auth';\nimport { isSupabaseClientInjected, setSupabaseConfig } from '../../core/services/supabase/client';\nimport { studioConfigRepository } from '../../data/public/studio-config/repository';\n\nexport type UseStudioBootstrapOptions = {};\n\nexport type StudioBootstrapState = {\n ready: boolean;\n userId: string | null;\n error: Error | null;\n};\n\nexport function useStudioBootstrap(options?: UseStudioBootstrapOptions): StudioBootstrapState {\n const [state, setState] = React.useState<StudioBootstrapState>({\n ready: false,\n userId: null,\n error: null,\n });\n\n React.useEffect(() => {\n let cancelled = false;\n\n (async () => {\n try {\n const requireAuth = isSupabaseClientInjected();\n if (!requireAuth) {\n const cfg = await studioConfigRepository.get();\n setSupabaseConfig(cfg);\n }\n const { user } = requireAuth ? await ensureAuthenticatedSession() : await ensureAnonymousSession();\n\n if (cancelled) return;\n setState({ ready: true, userId: user.id, error: null });\n } catch (e) {\n if (cancelled) return;\n const err = e instanceof Error ? e : new Error(String(e));\n setState({ ready: false, userId: null, error: err });\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n return state;\n}\n\n\n","import { createClient, type SupabaseClient } from '@supabase/supabase-js';\n\nlet clientSingleton: SupabaseClient | null = null;\nlet injectedClient: SupabaseClient | null = null;\nlet hasInjectedClient = false;\nlet runtimeConfig: { url: string; anonKey: string } | null = null;\n\nexport function setSupabaseClient(client: SupabaseClient) {\n injectedClient = client;\n clientSingleton = client;\n hasInjectedClient = true;\n}\n\nexport function isSupabaseClientInjected(): boolean {\n return hasInjectedClient;\n}\n\nexport function setSupabaseConfig(config: { url: string; anonKey: string }) {\n runtimeConfig = config;\n}\n\nexport function getSupabaseClient(): SupabaseClient {\n if (clientSingleton) return clientSingleton;\n if (injectedClient) return injectedClient;\n\n if (!runtimeConfig?.url) {\n throw new Error('comerge-studio: Supabase config not initialized (missing url).');\n }\n if (!runtimeConfig?.anonKey) {\n throw new Error('comerge-studio: Supabase config not initialized (missing anonKey).');\n }\n\n clientSingleton = createClient(runtimeConfig.url, runtimeConfig.anonKey, {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: false,\n },\n });\n\n return clientSingleton;\n}\n\n","import type { User } from '@supabase/supabase-js';\n\nimport { getSupabaseClient } from './client';\n\nexport type EnsureAnonymousSessionResult = {\n user: User;\n isNew: boolean;\n};\n\nexport type EnsureAuthenticatedSessionResult = {\n user: User;\n};\n\nexport async function ensureAuthenticatedSession(): Promise<EnsureAuthenticatedSessionResult> {\n const supabase = getSupabaseClient();\n const { data, error } = await supabase.auth.getSession();\n if (error) throw error;\n const user = data.session?.user ?? null;\n if (!user) {\n throw new Error('comerge-studio: no authenticated Supabase session found.');\n }\n return { user };\n}\n\nexport async function ensureAnonymousSession(): Promise<EnsureAnonymousSessionResult> {\n const supabase = getSupabaseClient();\n\n const { data: sessionData, error: sessionError } = await supabase.auth.getSession();\n if (sessionError) throw sessionError;\n\n const existingUser = sessionData.session?.user ?? null;\n if (existingUser) return { user: existingUser, isNew: false };\n\n const { data, error } = await supabase.auth.signInAnonymously();\n if (error) throw error;\n if (!data.user) throw new Error('comerge-studio: anonymous sign-in returned no user');\n\n return { user: data.user, isNew: true };\n}\n\n\n","import type { ServiceResponse } from './types';\n\nexport abstract class BaseRepository {\n protected unwrapOrThrow<T>(res: ServiceResponse<T>): T {\n if (res.success && res.responseObject) return res.responseObject;\n const msg = res.message || 'Request failed';\n throw new Error(msg);\n }\n}\n\n\n","import axios from \"axios\";\n\nimport { BASE_URL } from \"./baseUrl\";\n\nexport const publicApi = axios.create({\n\tbaseURL: BASE_URL,\n\ttimeout: 30_000,\n\theaders: {\n\t\tAccept: \"application/json\",\n\t\t\"Content-Type\": \"application/json\",\n\t},\n});\n\n\n","export const BASE_URL = \"http://192.168.8.175:8080\";\n\n\n","export abstract class BaseRemote {}\n\n\n","import { publicApi } from \"../../../core/services/http/public\";\nimport type { ServiceResponse } from \"../../types\";\nimport { BaseRemote } from \"../../base-remote\";\nimport type { StudioConfig } from \"./types\";\n\nexport interface StudioConfigRemoteDataSource {\n\tget(): Promise<ServiceResponse<StudioConfig>>;\n}\n\nclass StudioConfigRemoteDataSourceImpl extends BaseRemote implements StudioConfigRemoteDataSource {\n\tasync get(): Promise<ServiceResponse<StudioConfig>> {\n\t\tconst { data } = await publicApi.get<ServiceResponse<StudioConfig>>(\"/v1/public/studio-config\");\n\t\treturn data;\n\t}\n}\n\nexport const studioConfigRemoteDataSource: StudioConfigRemoteDataSource = new StudioConfigRemoteDataSourceImpl();\n\n\n","import { BaseRepository } from \"../../base-repository\";\nimport type { StudioConfig } from \"./types\";\nimport type { StudioConfigRemoteDataSource } from \"./remote\";\nimport { studioConfigRemoteDataSource } from \"./remote\";\n\nexport interface StudioConfigRepository {\n\tget(): Promise<StudioConfig>;\n}\n\nclass StudioConfigRepositoryImpl extends BaseRepository implements StudioConfigRepository {\n\tconstructor(private readonly remote: StudioConfigRemoteDataSource) {\n\t\tsuper();\n\t}\n\n\tasync get(): Promise<StudioConfig> {\n\t\tconst res = await this.remote.get();\n\t\treturn this.unwrapOrThrow(res);\n\t}\n}\n\nexport const studioConfigRepository: StudioConfigRepository = new StudioConfigRepositoryImpl(studioConfigRemoteDataSource);\n\n\n","import * as React from 'react';\n\nimport type { App } from '../../data/apps/types';\nimport { appsRepository } from '../../data/apps/repository';\n\nexport type UseAppResult = {\n app: App | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n};\n\nexport type UseAppOptions = {\n /**\n * When false, this hook won't fetch or subscribe.\n * Useful to avoid duplicate Supabase channel subscriptions for the same app id.\n */\n enabled?: boolean;\n};\n\nexport function useApp(appId: string, options?: UseAppOptions): UseAppResult {\n const enabled = options?.enabled ?? true;\n const [app, setApp] = React.useState<App | null>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const mergeApp = React.useCallback((prev: App | null, next: App): App => {\n // Realtime (Supabase) rows don't include \"viewer-specific\" fields like `isLiked`,\n // and may omit derived fields like `insights`. Preserve those from the last REST fetch.\n const merged: App = {\n ...(prev ?? ({} as App)),\n ...next,\n isLiked: next.isLiked ?? prev?.isLiked,\n insights: next.insights ?? prev?.insights,\n };\n return merged;\n }, []);\n\n const fetchOnce = React.useCallback(async () => {\n if (!enabled) return;\n if (!appId) return;\n setLoading(true);\n setError(null);\n try {\n const next = await appsRepository.getById(appId);\n setApp((prev) => mergeApp(prev, next));\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n setApp(null);\n } finally {\n setLoading(false);\n }\n }, [appId, enabled]);\n\n React.useEffect(() => {\n if (!enabled) return;\n void fetchOnce();\n }, [enabled, fetchOnce]);\n\n React.useEffect(() => {\n if (!enabled) return;\n if (!appId) return;\n const unsubscribe = appsRepository.subscribeApp(appId, {\n onInsert: (a) => {\n console.log('[useApp] onInsert', a);\n setApp((prev) => mergeApp(prev, a));\n },\n onUpdate: (a) => {\n console.log('[useApp] onUpdate', a);\n setApp((prev) => mergeApp(prev, a));\n },\n onDelete: () => {\n console.log('[useApp] onDelete');\n setApp(null);\n },\n });\n return unsubscribe;\n }, [appId, enabled, mergeApp]);\n\n return { app, loading, error, refetch: fetchOnce };\n}\n\n\n","import axios, {\n AxiosError,\n AxiosInstance,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\nimport { getSupabaseClient } from '../supabase';\nimport { log } from '../../logger';\nimport { BASE_URL } from './baseUrl';\n\ndeclare module 'axios' {\n export interface AxiosRequestConfig {\n _retried?: boolean;\n }\n}\n\nexport const createApiClient = (baseURL: string): AxiosInstance => {\n const apiClient = axios.create({\n baseURL,\n timeout: 3 * 60 * 1000,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\n const maskAuthHeader = (headers: unknown) => {\n if (!headers || typeof headers !== 'object') return headers;\n const copy: Record<string, unknown> = { ...(headers as any) };\n const auth = (copy.Authorization ?? copy.authorization) as unknown;\n if (typeof auth === 'string' && auth.startsWith('Bearer ')) {\n copy.Authorization = 'Bearer [REDACTED]';\n }\n return copy;\n };\n\n apiClient.interceptors.request.use(\n async (config: InternalAxiosRequestConfig) => {\n try {\n const supabase = getSupabaseClient();\n const { data } = await supabase.auth.getSession();\n const accessToken = data.session?.access_token;\n if (accessToken) {\n config.headers = config.headers ?? {};\n (config.headers).Authorization = `Bearer ${accessToken}`;\n }\n } catch (err) {\n log.warn('Failed to attach auth token to request', err);\n }\n\n log.debug('Request:', {\n url: config.url,\n method: config.method,\n headers: maskAuthHeader(config.headers),\n data: config.data,\n });\n return config;\n },\n (error: AxiosError) => {\n log.error('Request Error:', error);\n return Promise.reject(error);\n }\n );\n\n apiClient.interceptors.response.use(\n (response: AxiosResponse) => {\n log.debug('Response:', {\n url: response.config?.url,\n status: response.status,\n headers: response.headers,\n data: response.data,\n });\n return response;\n },\n async (error: AxiosError) => {\n const originalRequest = error.config as\n | (InternalAxiosRequestConfig & { _retried?: boolean })\n | undefined;\n log.error('Response Error:', {\n message: error.message,\n code: error.code,\n url: originalRequest?.url,\n method: originalRequest?.method,\n requestHeaders: maskAuthHeader(originalRequest?.headers),\n requestData: originalRequest?.data,\n status: error.response?.status,\n statusText: (error.response as any)?.statusText,\n responseHeaders: error.response?.headers,\n responseData: error.response?.data,\n });\n\n if (!originalRequest) {\n return Promise.reject(error);\n }\n\n const authHeader = (originalRequest.headers as any)?.Authorization as string | undefined;\n const hasBearerToken = Boolean(authHeader && authHeader.startsWith('Bearer '));\n\n if (error.response?.status === 401 && hasBearerToken && !originalRequest._retried) {\n originalRequest._retried = true;\n try {\n const supabase = getSupabaseClient();\n const { data, error: refreshError } = await supabase.auth.refreshSession();\n if (refreshError) throw refreshError;\n const newToken = data.session?.access_token;\n if (newToken && originalRequest.headers) {\n (originalRequest.headers as any).Authorization = `Bearer ${newToken}`;\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n return apiClient(originalRequest);\n } catch (refreshErr) {\n log.warn('Token refresh failed', refreshErr);\n return Promise.reject(refreshErr);\n }\n }\n\n return Promise.reject(error);\n }\n );\n\n return apiClient;\n};\n\nexport const api = createApiClient(BASE_URL);\n\nexport default createApiClient;\n\n\n","import { logger, consoleTransport } from 'react-native-logs';\n\nexport type StudioLogger = {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n extend: (extension: string) => Pick<StudioLogger, 'debug' | 'info' | 'warn' | 'error'>;\n enable: (extension?: string) => boolean;\n disable: (extension?: string) => boolean;\n getExtensions: () => string[];\n setSeverity: (level: string) => string;\n getSeverity: () => string;\n patchConsole: () => void;\n};\n\nexport const log: StudioLogger = logger.createLogger({\n levels: {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n },\n severity: \"debug\",\n transport: consoleTransport,\n transportOptions: {\n colors: {\n info: \"blueBright\",\n warn: \"yellowBright\",\n error: \"redBright\",\n },\n },\n async: true,\n dateFormat: \"time\",\n printLevel: true,\n printDate: true,\n fixedExtLvlLength: false,\n enabled: true,\n }\n) as unknown as StudioLogger;\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type {\n App,\n AppAnalyticsParams,\n AppAnalyticsPoint,\n AppInsights,\n AppsSummary,\n ForkAppRequest,\n ImportGithubAppRequest,\n ImportGithubAppResponse,\n ListAppsSummaryParams,\n ListLikedAppsParams,\n ListPublicAppsParams,\n LikedAppsList,\n} from './types';\n\nexport interface AppsRemoteDataSource {\n list(projectId?: string): Promise<ServiceResponse<App[]>>;\n listPublicOthers(params?: ListPublicAppsParams): Promise<ServiceResponse<App[]>>;\n listSummary(params?: ListAppsSummaryParams): Promise<ServiceResponse<AppsSummary>>;\n listLiked(params?: ListLikedAppsParams): Promise<ServiceResponse<LikedAppsList>>;\n getById(appId: string): Promise<ServiceResponse<App>>;\n fork(appId: string, payload: ForkAppRequest): Promise<ServiceResponse<App>>;\n getInsights(appId: string): Promise<ServiceResponse<AppInsights>>;\n getAnalytics(appId: string, params: AppAnalyticsParams): Promise<ServiceResponse<AppAnalyticsPoint[]>>;\n importFromGithub(payload: ImportGithubAppRequest): Promise<ServiceResponse<ImportGithubAppResponse>>;\n}\n\nclass AppsRemoteDataSourceImpl extends BaseRemote implements AppsRemoteDataSource {\n async list(projectId?: string): Promise<ServiceResponse<App[]>> {\n const params = projectId ? { projectId } : undefined;\n const { data } = await api.get<ServiceResponse<App[]>>('/v1/apps', { params });\n return data;\n }\n\n async listPublicOthers(params?: ListPublicAppsParams): Promise<ServiceResponse<App[]>> {\n const query = params ? { ...params } : undefined;\n const { data } = await api.get<ServiceResponse<App[]>>('/v1/apps/public', { params: query });\n return data;\n }\n\n async listSummary(params?: ListAppsSummaryParams): Promise<ServiceResponse<AppsSummary>> {\n const query = params ? { ...params } : undefined;\n const { data } = await api.get<ServiceResponse<AppsSummary>>('/v1/apps/summary', {\n params: query,\n });\n return data;\n }\n\n async listLiked(params?: ListLikedAppsParams): Promise<ServiceResponse<LikedAppsList>> {\n const query = params ? { ...params } : undefined;\n const { data } = await api.get<ServiceResponse<LikedAppsList>>('/v1/apps/likes/mine', {\n params: query,\n });\n return data;\n }\n\n async getById(appId: string): Promise<ServiceResponse<App>> {\n const { data } = await api.get<ServiceResponse<App>>(`/v1/apps/${encodeURIComponent(appId)}`);\n return data;\n }\n\n async fork(appId: string, payload: ForkAppRequest): Promise<ServiceResponse<App>> {\n const { data } = await api.post<ServiceResponse<App>>(`/v1/apps/${encodeURIComponent(appId)}/fork`, payload);\n return data;\n }\n\n async importFromGithub(payload: ImportGithubAppRequest): Promise<ServiceResponse<ImportGithubAppResponse>> {\n const { data } = await api.post<ServiceResponse<ImportGithubAppResponse>>('/v1/apps/import/github', payload);\n return data;\n }\n\n async getInsights(appId: string): Promise<ServiceResponse<AppInsights>> {\n const { data } = await api.get<ServiceResponse<AppInsights>>(\n `/v1/apps/${encodeURIComponent(appId)}/insights`,\n );\n return data;\n }\n\n async getAnalytics(\n appId: string,\n params: AppAnalyticsParams,\n ): Promise<ServiceResponse<AppAnalyticsPoint[]>> {\n const query = { ...params };\n const { data } = await api.get<ServiceResponse<AppAnalyticsPoint[]>>(\n `/v1/apps/${encodeURIComponent(appId)}/analytics`,\n { params: query },\n );\n return data;\n }\n}\n\nexport const appsRemoteDataSource: AppsRemoteDataSource = new AppsRemoteDataSourceImpl();\n\n\n","import type {\n App,\n AppAnalyticsParams,\n AppAnalyticsPoint,\n AppInsights,\n AppsSummary,\n ForkAppRequest,\n ImportGithubAppRequest,\n ImportGithubAppResponse,\n ListAppsSummaryParams,\n ListLikedAppsParams,\n ListPublicAppsParams,\n LikedAppsList,\n} from './types';\nimport { appsRemoteDataSource } from './remote';\nimport type { AppsRemoteDataSource } from './remote';\nimport { BaseRepository } from '../../data/base-repository';\nimport { getSupabaseClient } from '../../core/services/supabase';\n\ntype DbAppRow = {\n id: string;\n name: string;\n description: string | null;\n apple_app_store_category: string | null;\n google_play_category: string | null;\n pg_rating: string | null;\n project_id: string;\n platform: string | null;\n is_public: boolean;\n created_by: string;\n status: App['status'];\n status_error: string | null;\n status_changed_at: string | null;\n head_commit_id: string | null;\n forked_from_commit_id: string | null;\n forked_from_app_id: string | null;\n thread_id: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype AppSubscriptionHandlers = {\n onInsert?: (app: App) => void;\n onUpdate?: (app: App) => void;\n onDelete?: (app: App) => void;\n};\n\nfunction mapDbAppRow(row: DbAppRow): App {\n return {\n id: row.id,\n name: row.name,\n description: row.description,\n appleAppStoreCategory: row.apple_app_store_category,\n googlePlayCategory: row.google_play_category,\n pgRating: row.pg_rating,\n projectId: row.project_id,\n platform: row.platform,\n isPublic: row.is_public,\n createdBy: row.created_by,\n status: row.status,\n statusError: row.status_error,\n statusChangedAt: row.status_changed_at,\n headCommitId: row.head_commit_id,\n forkedFromCommitId: row.forked_from_commit_id,\n forkedFromAppId: row.forked_from_app_id,\n threadId: row.thread_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n insights: null,\n };\n}\n\nexport interface AppsRepository {\n list(projectId?: string): Promise<App[]>;\n listPublicOthers(params?: ListPublicAppsParams): Promise<App[]>;\n getSummary(params?: ListAppsSummaryParams): Promise<AppsSummary>;\n listLiked(params?: ListLikedAppsParams): Promise<LikedAppsList>;\n getById(appId: string): Promise<App>;\n fork(appId: string, payload: ForkAppRequest): Promise<App>;\n getInsights(appId: string): Promise<AppInsights>;\n getAnalytics(appId: string, params: AppAnalyticsParams): Promise<AppAnalyticsPoint[]>;\n subscribeCreatedApps(userId: string, handlers: AppSubscriptionHandlers): () => void;\n subscribeApp(appId: string, handlers: AppSubscriptionHandlers): () => void;\n importFromGithub(payload: ImportGithubAppRequest): Promise<ImportGithubAppResponse>;\n}\n\nclass AppsRepositoryImpl extends BaseRepository implements AppsRepository {\n constructor(private readonly remote: AppsRemoteDataSource) {\n super();\n }\n\n async list(projectId?: string): Promise<App[]> {\n const res = await this.remote.list(projectId);\n return this.unwrapOrThrow(res);\n }\n\n async listPublicOthers(params?: ListPublicAppsParams): Promise<App[]> {\n const res = await this.remote.listPublicOthers(params);\n return this.unwrapOrThrow(res);\n }\n\n async getSummary(params?: ListAppsSummaryParams): Promise<AppsSummary> {\n const res = await this.remote.listSummary(params);\n return this.unwrapOrThrow(res);\n }\n\n async listLiked(params?: ListLikedAppsParams): Promise<LikedAppsList> {\n const res = await this.remote.listLiked(params);\n return this.unwrapOrThrow(res);\n }\n\n async getById(appId: string): Promise<App> {\n const res = await this.remote.getById(appId);\n return this.unwrapOrThrow(res);\n }\n\n async fork(appId: string, payload: ForkAppRequest): Promise<App> {\n const res = await this.remote.fork(appId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async getInsights(appId: string): Promise<AppInsights> {\n const res = await this.remote.getInsights(appId);\n return this.unwrapOrThrow(res);\n }\n\n async getAnalytics(appId: string, params: AppAnalyticsParams): Promise<AppAnalyticsPoint[]> {\n const res = await this.remote.getAnalytics(appId, params);\n return this.unwrapOrThrow(res);\n }\n\n async importFromGithub(payload: ImportGithubAppRequest): Promise<ImportGithubAppResponse> {\n const res = await this.remote.importFromGithub(payload);\n return this.unwrapOrThrow(res);\n }\n\n subscribeCreatedApps(userId: string, handlers: AppSubscriptionHandlers): () => void {\n if (!userId) return () => {};\n return this.subscribeToAppChannel(`apps:createdBy:${userId}`, `created_by=eq.${userId}`, handlers);\n }\n\n subscribeApp(appId: string, handlers: AppSubscriptionHandlers): () => void {\n if (!appId) return () => {};\n return this.subscribeToAppChannel(`apps:id:${appId}`, `id=eq.${appId}`, handlers);\n }\n\n private subscribeToAppChannel(channelKey: string, filter: string, handlers: AppSubscriptionHandlers): () => void {\n const supabase = getSupabaseClient();\n const channel = supabase\n .channel(channelKey)\n .on(\n 'postgres_changes',\n { event: 'INSERT', schema: 'public', table: 'app', filter },\n (payload) => {\n console.log('[subscribeToAppChannel] onInsert', payload);\n handlers.onInsert?.(mapDbAppRow(payload.new as DbAppRow));\n }\n )\n .on(\n 'postgres_changes',\n { event: 'UPDATE', schema: 'public', table: 'app', filter },\n (payload) => {\n console.log('[subscribeToAppChannel] onUpdate', payload);\n handlers.onUpdate?.(mapDbAppRow(payload.new as DbAppRow));\n }\n )\n .on(\n 'postgres_changes',\n { event: 'DELETE', schema: 'public', table: 'app', filter },\n (payload) => {\n console.log('[subscribeToAppChannel] onDelete', payload);\n handlers.onDelete?.(mapDbAppRow(payload.old as DbAppRow));\n }\n )\n .subscribe();\n\n return () => {\n supabase.removeChannel(channel);\n };\n }\n}\n\nexport const appsRepository: AppsRepository = new AppsRepositoryImpl(appsRemoteDataSource);\n\n\n","import * as React from 'react';\n\nimport type { Message } from '../../data/messages/types';\nimport { messagesRepository } from '../../data/messages/repository';\nimport type { ChatMessage } from '../../components/models/types';\n\nexport type UseThreadMessagesResult = {\n raw: Message[];\n messages: ChatMessage[];\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n};\n\nfunction extractMeta(payload: unknown): ChatMessage['meta'] {\n const meta = (payload as any)?.meta;\n if (!meta || typeof meta !== 'object') return null;\n const obj = meta as Record<string, unknown>;\n return {\n kind: typeof obj.kind === 'string' ? obj.kind : undefined,\n event: typeof obj.event === 'string' ? obj.event : undefined,\n status: typeof obj.status === 'string' ? (obj.status as any) : undefined,\n mergeRequestId: typeof obj.mergeRequestId === 'string' ? obj.mergeRequestId : undefined,\n sourceAppId: typeof obj.sourceAppId === 'string' ? obj.sourceAppId : undefined,\n targetAppId: typeof obj.targetAppId === 'string' ? obj.targetAppId : undefined,\n appId: typeof obj.appId === 'string' ? obj.appId : undefined,\n threadId: typeof obj.threadId === 'string' ? obj.threadId : undefined,\n };\n}\n\nfunction mapMessageToChatMessage(m: Message): ChatMessage {\n const kind = typeof (m.payload as any)?.type === 'string' ? String((m.payload as any).type) : null;\n return {\n id: m.id,\n author: m.authorType === 'ai' ? 'assistant' : 'human',\n content: typeof m.payload?.content === 'string' ? m.payload.content : '',\n createdAt: m.createdAt,\n kind,\n meta: extractMeta(m.payload),\n };\n}\n\nexport function useThreadMessages(threadId: string): UseThreadMessagesResult {\n const [raw, setRaw] = React.useState<Message[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const refetch = React.useCallback(async () => {\n if (!threadId) {\n setRaw([]);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const list = await messagesRepository.list(threadId);\n setRaw(list);\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n setRaw([]);\n } finally {\n setLoading(false);\n }\n }, [threadId]);\n\n React.useEffect(() => {\n void refetch();\n }, [refetch]);\n\n React.useEffect(() => {\n if (!threadId) return;\n const unsubscribe = messagesRepository.subscribeThread(threadId, {\n onInsert: (m) => setRaw((prev) => [...prev, m]),\n onUpdate: (m) => setRaw((prev) => prev.map((x) => (x.id === m.id ? m : x))),\n onDelete: (m) => setRaw((prev) => prev.filter((x) => x.id !== m.id)),\n });\n return unsubscribe;\n }, [threadId]);\n\n const messages = React.useMemo(() => raw.map(mapMessageToChatMessage), [raw]);\n\n return { raw, messages, loading, error, refetch };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport type { Message } from './types';\nimport { BaseRemote } from '../base-remote';\n\nexport interface MessagesRemoteDataSource {\n list(threadId: string): Promise<ServiceResponse<Message[]>>;\n}\n\nclass MessagesRemoteDataSourceImpl extends BaseRemote implements MessagesRemoteDataSource {\n async list(threadId: string): Promise<ServiceResponse<Message[]>> {\n const { data } = await api.get<ServiceResponse<Message[]>>(\n `/v1/threads/${encodeURIComponent(threadId)}/messages`\n );\n return data;\n }\n}\n\nexport const messagesRemoteDataSource: MessagesRemoteDataSource = new MessagesRemoteDataSourceImpl();\n\n\n","import type { MessagesRemoteDataSource } from './remote';\nimport { messagesRemoteDataSource } from './remote';\nimport type { Message } from './types';\nimport { BaseRepository } from '../../data/base-repository';\nimport { getSupabaseClient } from '../../core/services/supabase';\n\ntype DbMessageRow = {\n id: string;\n app_id: string;\n thread_id: string;\n commit_id: string | null;\n parent_message_id: string | null;\n author_type: 'human' | 'ai' | 'system';\n user_id: string | null;\n payload: Record<string, unknown>;\n reference_id: string | null;\n created_at: string;\n updated_at: string;\n};\n\nfunction mapDbRowToMessage(row: DbMessageRow): Message {\n return {\n id: row.id,\n appId: row.app_id,\n threadId: row.thread_id,\n commitId: row.commit_id,\n parentMessageId: row.parent_message_id,\n authorType: row.author_type === 'system' ? 'ai' : row.author_type,\n userId: row.user_id,\n payload: row.payload,\n referenceId: row.reference_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nexport interface MessagesRepository {\n list(threadId: string): Promise<Message[]>;\n subscribeThread(\n threadId: string,\n handlers: {\n onInsert?: (m: Message) => void;\n onUpdate?: (m: Message) => void;\n onDelete?: (m: Message) => void;\n }\n ): () => void;\n}\n\nclass MessagesRepositoryImpl extends BaseRepository implements MessagesRepository {\n constructor(private readonly remote: MessagesRemoteDataSource) {\n super();\n }\n\n async list(threadId: string): Promise<Message[]> {\n const res = await this.remote.list(threadId);\n return this.unwrapOrThrow(res);\n }\n\n subscribeThread(\n threadId: string,\n handlers: {\n onInsert?: (m: Message) => void;\n onUpdate?: (m: Message) => void;\n onDelete?: (m: Message) => void;\n }\n ): () => void {\n const supabase = getSupabaseClient();\n const channel = supabase\n .channel(`messages:thread:${threadId}`)\n .on(\n 'postgres_changes',\n { event: 'INSERT', schema: 'public', table: 'message', filter: `thread_id=eq.${threadId}` },\n (payload) => {\n const row = payload.new as DbMessageRow;\n handlers.onInsert?.(mapDbRowToMessage(row));\n }\n )\n .on(\n 'postgres_changes',\n { event: 'UPDATE', schema: 'public', table: 'message', filter: `thread_id=eq.${threadId}` },\n (payload) => {\n const row = payload.new as DbMessageRow;\n handlers.onUpdate?.(mapDbRowToMessage(row));\n }\n )\n .on(\n 'postgres_changes',\n { event: 'DELETE', schema: 'public', table: 'message', filter: `thread_id=eq.${threadId}` },\n (payload) => {\n const row = payload.old as DbMessageRow;\n handlers.onDelete?.(mapDbRowToMessage(row));\n }\n )\n .subscribe();\n\n return () => {\n supabase.removeChannel(channel);\n };\n }\n}\n\nexport const messagesRepository: MessagesRepository = new MessagesRepositoryImpl(messagesRemoteDataSource);\n\n\n","import * as React from 'react';\nimport * as FileSystem from 'expo-file-system/legacy';\n\nimport type { Platform as BundlePlatform, Bundle } from '../../data/apps/bundles/types';\nimport { bundlesRepository } from '../../data/apps/bundles/repository';\n\ntype BundleSource = {\n appId: string;\n commitId?: string | null;\n};\n\nexport type UseBundleManagerParams = {\n base: BundleSource;\n platform: BundlePlatform;\n /**\n * When false, we will NOT initiate/build/download the latest base bundle.\n * We'll keep rendering whatever base bundle we already have (or hydrate from disk).\n *\n * Test bundles (merge request previews) are NOT gated by this.\n */\n canRequestLatest?: boolean;\n};\n\nexport type BundleLoadState = {\n bundlePath: string | null;\n /**\n * Monotonic token to force runtime remount when the bundle file path stays the same\n * (e.g. base bundle is replaced in-place).\n */\n renderToken: number;\n loading: boolean;\n statusLabel: string | null;\n error: string | null;\n /**\n * True when showing a temporary/testing bundle (e.g. merge request preview).\n */\n isTesting: boolean;\n};\n\nexport type UseBundleManagerResult = BundleLoadState & {\n loadBase: () => Promise<void>;\n loadTest: (src: BundleSource) => Promise<void>;\n restoreBase: () => Promise<void>;\n};\n\nfunction safeName(s: string) {\n return s.replace(/[^a-zA-Z0-9._-]/g, '_');\n}\n\nfunction bundlesCacheDir(): string {\n if (!FileSystem.cacheDirectory) {\n throw new Error('expo-file-system cacheDirectory is not available.');\n }\n return `${FileSystem.cacheDirectory}comerge/bundles/`;\n}\n\nasync function ensureDir(path: string) {\n const info = await FileSystem.getInfoAsync(path);\n if (info.exists) return;\n await FileSystem.makeDirectoryAsync(path, { intermediates: true });\n}\n\nfunction baseBundleKey(appId: string, platform: BundlePlatform): string {\n return `base:${appId}:${platform}`;\n}\n\nfunction testBundleKey(appId: string, commitId: string | null | undefined, platform: BundlePlatform, bundleId: string): string {\n return `test:${appId}:${commitId ?? 'head'}:${platform}:${bundleId}`;\n}\n\nfunction toBundleFileUri(key: string): string {\n const dir = bundlesCacheDir();\n return `${dir}${safeName(key)}.jsbundle`;\n}\n\nfunction toBundleMetaFileUri(key: string): string {\n const dir = bundlesCacheDir();\n return `${dir}${safeName(key)}.meta.json`;\n}\n\ntype BaseBundleMeta = {\n fingerprint: string;\n bundleId: string;\n checksumSha256: string | null;\n size: number | null;\n updatedAt: string;\n};\n\nasync function readJsonFile<T>(fileUri: string): Promise<T | null> {\n try {\n const info = await FileSystem.getInfoAsync(fileUri);\n if (!info.exists) return null;\n const raw = await (FileSystem as any).readAsStringAsync(fileUri);\n if (!raw || !String(raw).trim()) return null;\n return JSON.parse(String(raw)) as T;\n } catch {\n return null;\n }\n}\n\nasync function writeJsonFile(fileUri: string, value: unknown): Promise<void> {\n try {\n await (FileSystem as any).writeAsStringAsync(fileUri, JSON.stringify(value));\n } catch {\n \n }\n}\n\nasync function getExistingNonEmptyFileUri(fileUri: string): Promise<string | null> {\n try {\n const info = await FileSystem.getInfoAsync(fileUri);\n if (info.exists && info.size && info.size > 0) return fileUri;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function downloadIfMissing(url: string, fileUri: string): Promise<string> {\n const existing = await getExistingNonEmptyFileUri(fileUri);\n if (existing) return existing;\n const res = await FileSystem.downloadAsync(url, fileUri);\n return res.uri;\n}\n\nasync function deleteFileIfExists(fileUri: string) {\n try {\n const info = await FileSystem.getInfoAsync(fileUri);\n if (!info.exists) return;\n await FileSystem.deleteAsync(fileUri).catch(() => {});\n } catch {\n \n }\n}\n\nasync function safeReplaceFileFromUrl(url: string, targetUri: string, tmpKey: string): Promise<string> {\n const tmpUri = toBundleFileUri(`tmp:${tmpKey}:${Date.now()}`);\n try {\n await FileSystem.downloadAsync(url, tmpUri);\n const tmpOk = await getExistingNonEmptyFileUri(tmpUri);\n if (!tmpOk) {\n throw new Error('Downloaded bundle is empty.');\n }\n\n await deleteFileIfExists(targetUri);\n await FileSystem.moveAsync({ from: tmpUri, to: targetUri });\n\n const finalOk = await getExistingNonEmptyFileUri(targetUri);\n if (!finalOk) throw new Error('Bundle replacement failed.');\n return targetUri;\n } finally {\n await deleteFileIfExists(tmpUri);\n }\n}\n\nasync function pollBundle(appId: string, bundleId: string, opts: { timeoutMs: number; intervalMs: number }): Promise<Bundle> {\n const start = Date.now();\n while (true) {\n const bundle = await bundlesRepository.getById(appId, bundleId);\n if (bundle.status === 'succeeded' || bundle.status === 'failed') return bundle;\n if (Date.now() - start > opts.timeoutMs) {\n throw new Error('Bundle build timed out.');\n }\n await new Promise((r) => setTimeout(r, opts.intervalMs));\n }\n}\n\nasync function resolveBundlePath(\n src: BundleSource,\n platform: BundlePlatform,\n mode: 'base' | 'test'\n): Promise<{ bundlePath: string; label: string; bundle: Bundle }> {\n const { appId, commitId } = src;\n const dir = bundlesCacheDir();\n await ensureDir(dir);\n\n const initiate = await bundlesRepository.initiate(appId, {\n platform,\n commitId: commitId ?? undefined,\n idempotencyKey: `${appId}:${commitId ?? 'head'}:${platform}`,\n });\n\n const finalBundle =\n initiate.status === 'succeeded' || initiate.status === 'failed'\n ? initiate\n : await pollBundle(appId, initiate.id, { timeoutMs: 3 * 60 * 1000, intervalMs: 1200 });\n\n if (finalBundle.status === 'failed') {\n throw new Error('Bundle build failed.');\n }\n\n const signed = await bundlesRepository.getSignedDownloadUrl(appId, finalBundle.id, { redirect: false });\n const bundlePath =\n mode === 'base'\n ? await safeReplaceFileFromUrl(\n signed.url,\n toBundleFileUri(baseBundleKey(appId, platform)),\n `${appId}:${commitId ?? 'head'}:${platform}:${finalBundle.id}`\n )\n : await downloadIfMissing(signed.url, toBundleFileUri(testBundleKey(appId, commitId, platform, finalBundle.id)));\n return { bundlePath, label: 'Ready', bundle: finalBundle };\n}\n\nexport function useBundleManager({\n base,\n platform,\n canRequestLatest = true,\n}: UseBundleManagerParams): UseBundleManagerResult {\n const [bundlePath, setBundlePath] = React.useState<string | null>(null);\n const [renderToken, setRenderToken] = React.useState(0);\n const [loading, setLoading] = React.useState(false);\n const [statusLabel, setStatusLabel] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [isTesting, setIsTesting] = React.useState(false);\n\n const baseRef = React.useRef(base);\n baseRef.current = base;\n\n // Monotonic operation ids to prevent stale async loads from overwriting newer ones.\n const baseOpIdRef = React.useRef(0);\n const testOpIdRef = React.useRef(0);\n const activeLoadModeRef = React.useRef<'base' | 'test' | null>(null);\n\n const canRequestLatestRef = React.useRef<boolean>(canRequestLatest);\n React.useEffect(() => {\n canRequestLatestRef.current = canRequestLatest;\n if (!canRequestLatest) {\n // Stop any in-flight base load from updating UI while the app is not ready.\n baseOpIdRef.current += 1;\n if (activeLoadModeRef.current === 'base') {\n setLoading(false);\n setStatusLabel(null);\n activeLoadModeRef.current = null;\n }\n }\n }, [canRequestLatest]);\n // Track the most recently successfully loaded base bundle so we can instantly exit test mode.\n const lastBaseBundlePathRef = React.useRef<string | null>(null);\n const lastBaseFingerprintRef = React.useRef<string | null>(null);\n // Only used to suppress an unnecessary remount on cold start when the network bundle matches the disk bundle.\n const initialHydratedBaseFromDiskRef = React.useRef(false);\n const hasCompletedFirstNetworkBaseLoadRef = React.useRef(false);\n\n const hydrateBaseFromDisk = React.useCallback(\n async (appId: string, reason: 'initial' | 'fallback') => {\n try {\n const dir = bundlesCacheDir();\n await ensureDir(dir);\n const key = baseBundleKey(appId, platform);\n const uri = toBundleFileUri(key);\n const existing = await getExistingNonEmptyFileUri(uri);\n if (existing) {\n lastBaseBundlePathRef.current = existing;\n setBundlePath(existing);\n const meta = await readJsonFile<BaseBundleMeta>(toBundleMetaFileUri(key));\n if (meta?.fingerprint) {\n lastBaseFingerprintRef.current = meta.fingerprint;\n }\n if (reason === 'initial') {\n initialHydratedBaseFromDiskRef.current = true;\n hasCompletedFirstNetworkBaseLoadRef.current = false;\n }\n }\n } catch {\n \n }\n },\n [platform]\n );\n\n // On cold reopen, try to load the last base bundle from disk as early as possible.\n React.useEffect(() => {\n if (!base.appId) return;\n initialHydratedBaseFromDiskRef.current = false;\n hasCompletedFirstNetworkBaseLoadRef.current = false;\n void hydrateBaseFromDisk(base.appId, 'initial');\n }, [base.appId, platform, hydrateBaseFromDisk]);\n\n const activateCachedBase = React.useCallback(\n async (appId: string) => {\n setIsTesting(false);\n setStatusLabel(null);\n setError(null);\n const cachedBase = lastBaseBundlePathRef.current;\n if (cachedBase) {\n setBundlePath(cachedBase);\n } else {\n await hydrateBaseFromDisk(appId, 'fallback');\n }\n },\n [hydrateBaseFromDisk]\n );\n\n const load = React.useCallback(async (src: BundleSource, mode: 'base' | 'test') => {\n if (!src.appId) return;\n\n const canRequestLatest = canRequestLatestRef.current;\n if (mode === 'base' && !canRequestLatest) {\n await activateCachedBase(src.appId);\n return;\n }\n\n const opId = mode === 'base' ? ++baseOpIdRef.current : ++testOpIdRef.current;\n activeLoadModeRef.current = mode;\n setLoading(true);\n setError(null);\n setStatusLabel(mode === 'test' ? 'Loading test bundle…' : 'Loading latest build…');\n\n if (mode === 'base') {\n void activateCachedBase(src.appId);\n }\n\n try {\n const { bundlePath: path, bundle } = await resolveBundlePath(src, platform, mode);\n if (mode === 'base' && opId !== baseOpIdRef.current) return;\n if (mode === 'test' && opId !== testOpIdRef.current) return;\n setBundlePath(path);\n const fingerprint = bundle.checksumSha256 ?? `id:${bundle.id}`;\n\n // If we started by rendering a base bundle from disk and the network \"latest\" bundle is the same,\n // avoid a pointless remount (no visual flicker) ONLY for that first refresh.\n const shouldSkipInitialBaseRemount =\n mode === 'base' &&\n initialHydratedBaseFromDiskRef.current &&\n !hasCompletedFirstNetworkBaseLoadRef.current &&\n Boolean(lastBaseFingerprintRef.current) &&\n lastBaseFingerprintRef.current === fingerprint;\n\n if (!shouldSkipInitialBaseRemount) {\n setRenderToken((t) => t + 1);\n }\n\n if (mode === 'base') {\n lastBaseBundlePathRef.current = path;\n lastBaseFingerprintRef.current = fingerprint;\n hasCompletedFirstNetworkBaseLoadRef.current = true;\n initialHydratedBaseFromDiskRef.current = false;\n void writeJsonFile(toBundleMetaFileUri(baseBundleKey(src.appId, platform)), {\n fingerprint,\n bundleId: bundle.id,\n checksumSha256: bundle.checksumSha256 ?? null,\n size: bundle.size ?? null,\n updatedAt: new Date().toISOString(),\n } satisfies BaseBundleMeta);\n setIsTesting(false);\n } else {\n setIsTesting(true);\n }\n setStatusLabel(null);\n } catch (e) {\n if (mode === 'base' && opId !== baseOpIdRef.current) return;\n if (mode === 'test' && opId !== testOpIdRef.current) return;\n const msg = e instanceof Error ? e.message : String(e);\n setError(msg);\n setStatusLabel(null);\n } finally {\n if (mode === 'base' && opId !== baseOpIdRef.current) return;\n if (mode === 'test' && opId !== testOpIdRef.current) return;\n setLoading(false);\n if (activeLoadModeRef.current === mode) activeLoadModeRef.current = null;\n }\n }, [activateCachedBase, platform]);\n\n const loadBase = React.useCallback(async () => {\n await load(baseRef.current, 'base');\n }, [load]);\n\n const loadTest = React.useCallback(async (src: BundleSource) => {\n await load(src, 'test');\n }, [load]);\n\n const restoreBase = React.useCallback(async () => {\n const src = baseRef.current;\n if (!src.appId) return;\n await activateCachedBase(src.appId);\n if (canRequestLatestRef.current) {\n await load(src, 'base');\n }\n }, [activateCachedBase, load]);\n\n React.useEffect(() => {\n if (!canRequestLatest) return;\n void loadBase();\n }, [base.appId, base.commitId, platform, canRequestLatest, loadBase]);\n\n return { bundlePath, renderToken, loading, statusLabel, error, isTesting, loadBase, loadTest, restoreBase };\n}\n\n\n","import { api } from '../../../core/services/http';\nimport type { ServiceResponse } from '../../types';\nimport { BaseRemote } from '../../base-remote';\nimport type { Bundle, InitiateBundleRequest } from './types';\n\nexport interface BundlesRemoteDataSource {\n initiate(appId: string, payload: InitiateBundleRequest): Promise<ServiceResponse<Bundle>>;\n getById(appId: string, bundleId: string): Promise<ServiceResponse<Bundle>>;\n getSignedDownloadUrl(\n appId: string,\n bundleId: string,\n options?: { redirect?: boolean }\n ): Promise<ServiceResponse<{ url: string; redirect: boolean }>>;\n}\n\nclass BundlesRemoteDataSourceImpl extends BaseRemote implements BundlesRemoteDataSource {\n async initiate(appId: string, payload: InitiateBundleRequest): Promise<ServiceResponse<Bundle>> {\n const { data } = await api.post<ServiceResponse<Bundle>>(\n `/v1/apps/${encodeURIComponent(appId)}/bundles`,\n payload\n );\n return data;\n }\n\n async getById(appId: string, bundleId: string): Promise<ServiceResponse<Bundle>> {\n const { data } = await api.get<ServiceResponse<Bundle>>(\n `/v1/apps/${encodeURIComponent(appId)}/bundles/${encodeURIComponent(bundleId)}`\n );\n return data;\n }\n\n async getSignedDownloadUrl(\n appId: string,\n bundleId: string,\n options?: { redirect?: boolean }\n ): Promise<ServiceResponse<{ url: string; redirect: boolean }>> {\n const { data } = await api.get<ServiceResponse<{ url: string; redirect: boolean }>>(\n `/v1/apps/${encodeURIComponent(appId)}/bundles/${encodeURIComponent(bundleId)}/download`,\n { params: { redirect: options?.redirect ?? false } }\n );\n return data;\n }\n}\n\nexport const bundlesRemoteDataSource: BundlesRemoteDataSource = new BundlesRemoteDataSourceImpl();\n\n\n","import type { BundlesRemoteDataSource } from './remote';\nimport { bundlesRemoteDataSource } from './remote';\nimport type { Bundle, InitiateBundleRequest } from './types';\nimport { BaseRepository } from '../../base-repository';\n\nexport interface BundlesRepository {\n initiate(appId: string, payload: InitiateBundleRequest): Promise<Bundle>;\n getById(appId: string, bundleId: string): Promise<Bundle>;\n getSignedDownloadUrl(appId: string, bundleId: string, options?: { redirect?: boolean }): Promise<{ url: string; redirect: boolean }>;\n}\n\nclass BundlesRepositoryImpl extends BaseRepository implements BundlesRepository {\n constructor(private readonly remote: BundlesRemoteDataSource) {\n super();\n }\n\n async initiate(appId: string, payload: InitiateBundleRequest): Promise<Bundle> {\n const res = await this.remote.initiate(appId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async getById(appId: string, bundleId: string): Promise<Bundle> {\n const res = await this.remote.getById(appId, bundleId);\n return this.unwrapOrThrow(res);\n }\n\n async getSignedDownloadUrl(appId: string, bundleId: string, options?: { redirect?: boolean }): Promise<{ url: string; redirect: boolean }> {\n const res = await this.remote.getSignedDownloadUrl(appId, bundleId, options);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const bundlesRepository: BundlesRepository = new BundlesRepositoryImpl(bundlesRemoteDataSource);\n\n\n","import * as React from 'react';\n\nimport type { MergeRequest, MergeRequestStatus } from '../../data/merge-requests/types';\nimport { mergeRequestsRepository } from '../../data/merge-requests/repository';\nimport type { MergeRequestSummary } from '../../components/models/types';\nimport { usersRepository } from '../../data/users/repository';\nimport type { UserStats } from '../../data/users/types';\n\nexport type MergeRequestLists = {\n /**\n * Merge requests targeting the current app (for owners/reviewers).\n */\n incoming: MergeRequest[];\n /**\n * Merge requests created from the current app (for contributors).\n */\n outgoing: MergeRequest[];\n};\n\nexport type MergeRequestActions = {\n refresh: () => Promise<void>;\n openMergeRequest: (sourceAppId: string) => Promise<MergeRequest>;\n approve: (mrId: string) => Promise<MergeRequest>;\n reject: (mrId: string) => Promise<MergeRequest>;\n};\n\nexport type UseMergeRequestsResult = {\n loading: boolean;\n error: Error | null;\n lists: MergeRequestLists;\n actions: MergeRequestActions;\n toSummary: (mr: MergeRequest) => MergeRequestSummary;\n byId: Record<string, MergeRequest>;\n creatorStatsById: Record<string, UserStats>;\n};\n\nconst incomingStatuses: MergeRequestStatus[] = ['open', 'approved'];\nconst outgoingStatuses: MergeRequestStatus[] = ['open', 'approved', 'rejected', 'merged', 'closed'];\n\nfunction toUiStatus(status: MergeRequestStatus): MergeRequestSummary['status'] {\n switch (status) {\n case 'open':\n case 'approved':\n case 'rejected':\n case 'merged':\n return status;\n case 'closed':\n default:\n return 'rejected';\n }\n}\n\nexport function useMergeRequests(params: { appId: string }): UseMergeRequestsResult {\n const { appId } = params;\n const [incoming, setIncoming] = React.useState<MergeRequest[]>([]);\n const [outgoing, setOutgoing] = React.useState<MergeRequest[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n const [creatorStatsById, setCreatorStatsById] = React.useState<Record<string, UserStats>>({});\n\n const pollUntilMerged = React.useCallback(async (mrId: string) => {\n const startedAt = Date.now();\n const timeoutMs = 2 * 60 * 1000;\n for (;;) {\n const mr = await mergeRequestsRepository.getById(mrId);\n if (mr.status === 'merged') return mr;\n if (Date.now() - startedAt > timeoutMs) return mr;\n await new Promise((r) => setTimeout(r, 1500));\n }\n }, []);\n\n const refresh = React.useCallback(async () => {\n if (!appId) {\n setIncoming([]);\n setOutgoing([]);\n setCreatorStatsById({});\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const [inc, out] = await Promise.all([\n mergeRequestsRepository.listByStatuses({ targetAppId: appId, statuses: incomingStatuses }).then((x) => {\n return (Object.values(x).flat() as MergeRequest[]).filter(Boolean);\n }),\n mergeRequestsRepository.listByStatuses({ sourceAppId: appId, statuses: outgoingStatuses }).then((x) => {\n return (Object.values(x).flat() as MergeRequest[]).filter(Boolean);\n }),\n ]);\n setIncoming(inc);\n setOutgoing(out);\n\n const ids = Array.from(new Set([...inc, ...out].map((m) => m.createdBy).filter(Boolean)));\n if (ids.length === 0) {\n setCreatorStatsById({});\n } else {\n try {\n const map = await usersRepository.getStatsBatch(ids);\n setCreatorStatsById(map);\n } catch {\n // Keep whatever we already have.\n }\n }\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n setIncoming([]);\n setOutgoing([]);\n setCreatorStatsById({});\n } finally {\n setLoading(false);\n }\n }, [appId]);\n\n React.useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const openMergeRequest = React.useCallback(async (sourceAppId: string) => {\n const mr = await mergeRequestsRepository.open({ sourceAppId });\n await refresh();\n return mr;\n }, [refresh]);\n\n const approve = React.useCallback(async (mrId: string) => {\n const mr = await mergeRequestsRepository.update(mrId, { status: 'approved' });\n await refresh();\n const merged = await pollUntilMerged(mrId);\n await refresh();\n return merged ?? mr;\n }, [pollUntilMerged, refresh]);\n\n const reject = React.useCallback(async (mrId: string) => {\n const mr = await mergeRequestsRepository.update(mrId, { status: 'rejected' });\n await refresh();\n return mr;\n }, [refresh]);\n\n const toSummary = React.useCallback((mr: MergeRequest): MergeRequestSummary => {\n const stats = creatorStatsById[mr.createdBy];\n return {\n id: mr.id,\n title: mr.title ?? undefined,\n description: mr.description ?? undefined,\n status: toUiStatus(mr.status),\n creator: {\n id: mr.createdBy,\n name: stats?.name ?? undefined,\n avatarUri: stats?.avatar ?? undefined,\n },\n createdAt: mr.createdAt,\n updatedAt: mr.updatedAt,\n };\n }, [creatorStatsById]);\n\n const byId = React.useMemo(() => {\n const all = [...incoming, ...outgoing];\n const map: Record<string, MergeRequest> = {};\n for (const mr of all) map[mr.id] = mr;\n return map;\n }, [incoming, outgoing]);\n\n return {\n loading,\n error,\n lists: { incoming, outgoing },\n actions: { refresh, openMergeRequest, approve, reject },\n toSummary,\n byId,\n creatorStatsById,\n };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type {\n MergeRequest,\n MergeRequestStatus,\n MergeRequestsByStatus,\n OpenMergeRequestRequest,\n UpdateMergeRequestRequest,\n} from './types';\n\nexport interface MergeRequestsRemoteDataSource {\n list(params: { sourceAppId?: string; targetAppId?: string; status?: MergeRequestStatus }): Promise<ServiceResponse<MergeRequest[]>>;\n listByStatuses(params: {\n sourceAppId?: string;\n targetAppId?: string;\n statuses: MergeRequestStatus[];\n }): Promise<ServiceResponse<MergeRequestsByStatus | MergeRequest[]>>;\n open(payload: OpenMergeRequestRequest): Promise<ServiceResponse<MergeRequest>>;\n getById(mrId: string): Promise<ServiceResponse<MergeRequest>>;\n update(mrId: string, payload: UpdateMergeRequestRequest): Promise<ServiceResponse<MergeRequest>>;\n}\n\nclass MergeRequestsRemoteDataSourceImpl extends BaseRemote implements MergeRequestsRemoteDataSource {\n async list(params: { sourceAppId?: string; targetAppId?: string; status?: MergeRequestStatus }): Promise<ServiceResponse<MergeRequest[]>> {\n const query: Record<string, string> = {};\n if (params.sourceAppId) query.sourceAppId = params.sourceAppId;\n if (params.targetAppId) query.targetAppId = params.targetAppId;\n if (params.status) query.status = params.status;\n const { data } = await api.get<ServiceResponse<MergeRequest[]>>('/v1/merge-requests', { params: query });\n return data;\n }\n\n async listByStatuses(params: {\n sourceAppId?: string;\n targetAppId?: string;\n statuses: MergeRequestStatus[];\n }): Promise<ServiceResponse<MergeRequestsByStatus | MergeRequest[]>> {\n const query: Record<string, string | string[]> = {};\n if (params.sourceAppId) query.sourceAppId = params.sourceAppId;\n if (params.targetAppId) query.targetAppId = params.targetAppId;\n query.status = params.statuses;\n const { data } = await api.get<ServiceResponse<MergeRequestsByStatus | MergeRequest[]>>(\n '/v1/merge-requests',\n {\n params: query,\n paramsSerializer: {\n indexes: null,\n },\n }\n );\n return data;\n }\n\n async open(payload: OpenMergeRequestRequest): Promise<ServiceResponse<MergeRequest>> {\n const { data } = await api.post<ServiceResponse<MergeRequest>>('/v1/merge-requests', payload);\n return data;\n }\n\n async getById(mrId: string): Promise<ServiceResponse<MergeRequest>> {\n const { data } = await api.get<ServiceResponse<MergeRequest>>(`/v1/merge-requests/${encodeURIComponent(mrId)}`);\n return data;\n }\n\n async update(mrId: string, payload: UpdateMergeRequestRequest): Promise<ServiceResponse<MergeRequest>> {\n const { data } = await api.patch<ServiceResponse<MergeRequest>>(\n `/v1/merge-requests/${encodeURIComponent(mrId)}`,\n payload\n );\n return data;\n }\n}\n\nexport const mergeRequestsRemoteDataSource: MergeRequestsRemoteDataSource = new MergeRequestsRemoteDataSourceImpl();\n\n\n","import type { MergeRequestsRemoteDataSource } from './remote';\nimport { mergeRequestsRemoteDataSource } from './remote';\nimport type {\n MergeRequest,\n MergeRequestStatus,\n MergeRequestsByStatus,\n OpenMergeRequestRequest,\n UpdateMergeRequestRequest,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface MergeRequestsRepository {\n list(params: { sourceAppId?: string; targetAppId?: string; status?: MergeRequestStatus }): Promise<MergeRequest[]>;\n listByStatuses(params: {\n sourceAppId?: string;\n targetAppId?: string;\n statuses: MergeRequestStatus[];\n }): Promise<MergeRequestsByStatus>;\n open(payload: OpenMergeRequestRequest): Promise<MergeRequest>;\n getById(mrId: string): Promise<MergeRequest>;\n update(mrId: string, payload: UpdateMergeRequestRequest): Promise<MergeRequest>;\n}\n\nclass MergeRequestsRepositoryImpl extends BaseRepository implements MergeRequestsRepository {\n constructor(private readonly remote: MergeRequestsRemoteDataSource) {\n super();\n }\n\n async list(params: { sourceAppId?: string; targetAppId?: string; status?: MergeRequestStatus }): Promise<MergeRequest[]> {\n const res = await this.remote.list(params);\n return this.unwrapOrThrow(res);\n }\n\n async listByStatuses(params: {\n sourceAppId?: string;\n targetAppId?: string;\n statuses: MergeRequestStatus[];\n }): Promise<MergeRequestsByStatus> {\n if (!params.statuses || params.statuses.length === 0) return {};\n const res = await this.remote.listByStatuses(params);\n const payload = this.unwrapOrThrow(res);\n if (Array.isArray(payload)) {\n return { [params.statuses[0]]: payload };\n }\n return payload;\n }\n\n async open(payload: OpenMergeRequestRequest): Promise<MergeRequest> {\n const res = await this.remote.open(payload);\n return this.unwrapOrThrow(res);\n }\n\n async getById(mrId: string): Promise<MergeRequest> {\n const res = await this.remote.getById(mrId);\n return this.unwrapOrThrow(res);\n }\n\n async update(mrId: string, payload: UpdateMergeRequestRequest): Promise<MergeRequest> {\n const res = await this.remote.update(mrId, payload);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const mergeRequestsRepository: MergeRequestsRepository = new MergeRequestsRepositoryImpl(mergeRequestsRemoteDataSource);\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type { UserStats, UserStatsBatchResponse } from './types';\n\nexport interface UsersRemoteDataSource {\n getStats(userId: string): Promise<ServiceResponse<UserStats>>;\n getStatsBatch(userIds: string[]): Promise<ServiceResponse<UserStatsBatchResponse>>;\n}\n\nclass UsersRemoteDataSourceImpl extends BaseRemote implements UsersRemoteDataSource {\n async getStats(userId: string): Promise<ServiceResponse<UserStats>> {\n const { data } = await api.get<ServiceResponse<UserStats>>(\n `/v1/users/${encodeURIComponent(userId)}/stats`\n );\n return data;\n }\n\n async getStatsBatch(userIds: string[]): Promise<ServiceResponse<UserStatsBatchResponse>> {\n const { data } = await api.post<ServiceResponse<UserStatsBatchResponse>>(\n '/v1/users/stats/batch',\n { userIds }\n );\n return data;\n }\n}\n\nexport const usersRemoteDataSource: UsersRemoteDataSource = new UsersRemoteDataSourceImpl();\n\n\n\n","import type { UsersRemoteDataSource } from './remote';\nimport { usersRemoteDataSource } from './remote';\nimport type { UserStats, UserStatsBatchResponse } from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface UsersRepository {\n getStats(userId: string): Promise<UserStats>;\n getStatsBatch(userIds: string[]): Promise<Record<string, UserStats>>;\n}\n\nclass UsersRepositoryImpl extends BaseRepository implements UsersRepository {\n constructor(private readonly remote: UsersRemoteDataSource) {\n super();\n }\n\n async getStats(userId: string): Promise<UserStats> {\n const res = await this.remote.getStats(userId);\n return this.unwrapOrThrow(res);\n }\n\n async getStatsBatch(userIds: string[]): Promise<Record<string, UserStats>> {\n if (userIds.length === 0) return {};\n const res = await this.remote.getStatsBatch(userIds);\n if (res.responseObject && !res.success) {\n return this.extractStats(res.responseObject);\n }\n const payload = this.unwrapOrThrow(res);\n return this.extractStats(payload);\n }\n\n private extractStats(payload: UserStatsBatchResponse): Record<string, UserStats> {\n const result: Record<string, UserStats> = {};\n Object.entries(payload.stats).forEach(([userId, stats]) => {\n if (stats) {\n result[userId] = stats;\n }\n });\n return result;\n }\n}\n\nexport const usersRepository: UsersRepository = new UsersRepositoryImpl(usersRemoteDataSource);\n\n\n\n","import * as React from 'react';\n\nimport { attachmentRepository } from '../../data/attachment/repository';\nimport type { AttachmentMeta } from '../../data/attachment/types';\n\nexport type UploadBase64AttachmentsParams = {\n threadId: string;\n appId: string;\n dataUrls: string[];\n};\n\nexport type UseAttachmentUploadResult = {\n uploadBase64Images: (params: UploadBase64AttachmentsParams) => Promise<AttachmentMeta[]>;\n uploading: boolean;\n error: Error | null;\n};\n\nexport function useAttachmentUpload(): UseAttachmentUploadResult {\n const [uploading, setUploading] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const uploadBase64Images = React.useCallback(async ({ threadId, appId, dataUrls }: UploadBase64AttachmentsParams) => {\n if (!threadId || !appId) return [];\n if (!dataUrls || dataUrls.length === 0) return [];\n\n setUploading(true);\n setError(null);\n try {\n const blobs = await Promise.all(\n dataUrls.map(async (dataUrl, idx) => {\n const normalized = dataUrl.startsWith('data:') ? dataUrl : `data:image/png;base64,${dataUrl}`;\n const resp = await fetch(normalized);\n const blob = await resp.blob();\n return { blob, idx };\n })\n );\n\n const files = blobs.map(({ blob }, idx) => ({\n name: `attachment-${Date.now()}-${idx}.png`,\n size: blob.size,\n mimeType: blob.type || 'image/png',\n }));\n\n const presign = await attachmentRepository.presign({ threadId, appId, files });\n await Promise.all(presign.uploads.map((u, index) => attachmentRepository.upload(u, blobs[index].blob)));\n return presign.uploads.map((u) => u.attachment);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setUploading(false);\n }\n }, []);\n\n return { uploadBase64Images, uploading, error };\n}\n\n\n","import { api } from '../../core/services/http';\nimport { BaseRemote } from '../base-remote';\nimport type { ServiceResponse } from '../types';\nimport type {\n PresignAttachmentsRequest,\n PresignAttachmentsResponse,\n} from './types';\n\nexport interface AttachmentRemoteDataSource {\n presign(\n payload: PresignAttachmentsRequest\n ): Promise<ServiceResponse<PresignAttachmentsResponse>>;\n}\n\nclass AttachmentRemoteDataSourceImpl\n extends BaseRemote\n implements AttachmentRemoteDataSource\n{\n async presign(\n payload: PresignAttachmentsRequest\n ): Promise<ServiceResponse<PresignAttachmentsResponse>> {\n const { data } = await api.post<ServiceResponse<PresignAttachmentsResponse>>(\n '/v1/attachments/presign',\n payload\n );\n return data;\n }\n}\n\nexport const attachmentRemoteDataSource: AttachmentRemoteDataSource =\n new AttachmentRemoteDataSourceImpl();\n\n","import type { AttachmentRemoteDataSource } from './remote';\nimport { attachmentRemoteDataSource } from './remote';\nimport type {\n PresignAttachmentsRequest,\n PresignAttachmentsResponse,\n PresignedUpload,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface AttachmentRepository {\n presign(payload: PresignAttachmentsRequest): Promise<PresignAttachmentsResponse>;\n upload(upload: PresignedUpload, file: Blob | File): Promise<void>;\n}\n\nclass AttachmentRepositoryImpl extends BaseRepository implements AttachmentRepository {\n constructor(private readonly remote: AttachmentRemoteDataSource) {\n super();\n }\n\n async presign(payload: PresignAttachmentsRequest): Promise<PresignAttachmentsResponse> {\n const res = await this.remote.presign(payload);\n return this.unwrapOrThrow(res);\n }\n\n async upload(upload: PresignedUpload, file: Blob | File): Promise<void> {\n const resp = await fetch(upload.uploadUrl, {\n method: 'PUT',\n headers: upload.headers,\n body: file,\n });\n if (!resp.ok) {\n throw new Error(`upload failed: ${resp.status}`);\n }\n }\n}\n\nexport const attachmentRepository: AttachmentRepository = new AttachmentRepositoryImpl(\n attachmentRemoteDataSource\n);\n\n","import * as React from 'react';\n\nimport type { App } from '../../data/apps/types';\nimport { appsRepository } from '../../data/apps/repository';\nimport { agentRepository } from '../../data/agent/repository';\nimport type { AttachmentMeta } from '../../data/attachment/types';\n\nexport type UseStudioActionsParams = {\n userId: string | null;\n /**\n * Current app object for the active appId.\n */\n app: App | null;\n /**\n * Called when we fork and should switch to the new app.\n */\n onForkedApp?: (appId: string, opts?: { keepRenderingAppId?: string }) => void;\n /**\n * Upload function used to convert attachments.\n */\n uploadAttachments?: (params: { threadId: string; appId: string; dataUrls: string[] }) => Promise<AttachmentMeta[]>;\n};\n\nexport type UseStudioActionsResult = {\n isOwner: boolean;\n shouldForkOnEdit: boolean;\n forking: boolean;\n sending: boolean;\n error: Error | null;\n sendEdit: (params: { prompt: string; attachments?: string[] }) => Promise<void>;\n};\n\nexport function useStudioActions({\n userId,\n app,\n onForkedApp,\n uploadAttachments,\n}: UseStudioActionsParams): UseStudioActionsResult {\n const [forking, setForking] = React.useState(false);\n const [sending, setSending] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const isOwner = Boolean(userId && app?.createdBy && userId === app.createdBy);\n const shouldForkOnEdit = Boolean(userId && app && app.createdBy !== userId);\n\n const sendEdit = React.useCallback(\n async ({ prompt, attachments }: { prompt: string; attachments?: string[] }) => {\n if (!userId || !app) return;\n if (!prompt.trim()) return;\n if (sending) return;\n\n setSending(true);\n setError(null);\n try {\n let targetApp = app;\n\n if (shouldForkOnEdit) {\n setForking(true);\n const sourceAppId = app.id;\n const forked = await appsRepository.fork(app.id, {});\n targetApp = forked;\n // For fork+edit, keep rendering the original app until the edit completes on the fork.\n onForkedApp?.(forked.id, { keepRenderingAppId: sourceAppId });\n }\n setForking(false);\n\n const threadId = targetApp.threadId;\n if (!threadId) throw new Error('No thread available for this app.');\n\n let attachmentMetas: AttachmentMeta[] | undefined;\n if (attachments && attachments.length > 0 && uploadAttachments) {\n attachmentMetas = await uploadAttachments({ threadId, appId: targetApp.id, dataUrls: attachments });\n }\n\n await agentRepository.editApp({\n prompt,\n thread_id: threadId,\n app_id: targetApp.id,\n attachments: attachmentMetas && attachmentMetas.length > 0 ? attachmentMetas : undefined,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setForking(false);\n setSending(false);\n }\n },\n [app, onForkedApp, sending, shouldForkOnEdit, uploadAttachments, userId]\n );\n\n return { isOwner, shouldForkOnEdit, forking, sending, error, sendEdit };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type {\n CreateAgentAppRequest,\n EditAgentAppRequest,\n AgentCreateAppResult,\n AgentEditAppResult,\n} from './types';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\n\nexport interface AgentRemoteDataSource {\n createApp(payload: CreateAgentAppRequest): Promise<ServiceResponse<AgentCreateAppResult>>;\n editApp(payload: EditAgentAppRequest): Promise<ServiceResponse<AgentEditAppResult>>;\n}\n\nclass AgentRemoteDataSourceImpl extends BaseRemote implements AgentRemoteDataSource {\n async createApp(payload: CreateAgentAppRequest): Promise<ServiceResponse<AgentCreateAppResult>> {\n const { data } = await api.post<ServiceResponse<AgentCreateAppResult>>('/v1/agent/createApp', payload);\n return data;\n }\n\n async editApp(payload: EditAgentAppRequest): Promise<ServiceResponse<AgentEditAppResult>> {\n const { data } = await api.post<ServiceResponse<AgentEditAppResult>>('/v1/agent/editApp', payload);\n return data;\n }\n}\n\nexport const agentRemoteDataSource: AgentRemoteDataSource = new AgentRemoteDataSourceImpl();\n\n\n","import type { AgentRemoteDataSource } from './remote';\nimport { agentRemoteDataSource } from './remote';\nimport type {\n AgentCreateAppResult,\n AgentEditAppResult,\n CreateAgentAppRequest,\n EditAgentAppRequest,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface AgentRepository {\n createApp(payload: CreateAgentAppRequest): Promise<AgentCreateAppResult>;\n editApp(payload: EditAgentAppRequest): Promise<AgentEditAppResult>;\n}\n\nclass AgentRepositoryImpl extends BaseRepository implements AgentRepository {\n constructor(private readonly remote: AgentRemoteDataSource) {\n super();\n }\n\n async createApp(payload: CreateAgentAppRequest): Promise<AgentCreateAppResult> {\n const res = await this.remote.createApp(payload);\n return this.unwrapOrThrow(res);\n }\n\n async editApp(payload: EditAgentAppRequest): Promise<AgentEditAppResult> {\n const res = await this.remote.editApp(payload);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const agentRepository: AgentRepository = new AgentRepositoryImpl(agentRemoteDataSource);\n\n\n","import type { Message } from '../../data/messages/types';\n\ntype MessagePayload = { type?: string; content?: unknown; text?: unknown; prompt?: unknown; message?: unknown };\n\nexport function getLastOutcomeIndex(messages: Message[]): number {\n let idx = -1;\n for (let i = 0; i < messages.length; i += 1) {\n const payload = messages[i].payload as MessagePayload | undefined;\n if (payload?.type === 'outcome') idx = i;\n }\n return idx;\n}\n\nexport function hasNoOutcomeAfterLastHuman(messages: Message[]): boolean {\n if (!messages || messages.length === 0) return false;\n\n let lastHumanIndex = -1;\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n if (messages[i].authorType === 'human') {\n lastHumanIndex = i;\n break;\n }\n }\n if (lastHumanIndex === -1) return false;\n\n for (let i = lastHumanIndex + 1; i < messages.length; i += 1) {\n const m = messages[i];\n const payload = m.payload as MessagePayload | undefined;\n if (m.authorType === 'ai' && payload?.type === 'outcome') return false;\n }\n return true;\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { ComergeRuntimeRenderer } from '@comergehq/runtime';\n\nimport { Text } from '../../components/primitives/Text';\n\nexport type RuntimeRendererProps = {\n appKey: string;\n bundlePath: string | null;\n /**\n * Used to force a runtime remount even when bundlePath stays constant\n * (e.g. base bundle replaced in-place).\n */\n renderToken?: number;\n style?: ViewStyle;\n};\n\nexport function RuntimeRenderer({ appKey, bundlePath, renderToken, style }: RuntimeRendererProps) {\n if (!bundlePath) {\n return (\n <View style={[{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }, style]}>\n <Text variant=\"bodyMuted\">Preparing app…</Text>\n </View>\n );\n }\n\n return (\n <View style={[{ flex: 1 }, style]}>\n <ComergeRuntimeRenderer\n key={`${appKey}:${bundlePath}:${renderToken ?? 0}`}\n appKey={appKey}\n bundlePath={bundlePath}\n style={{ flex: 1 }}\n />\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Keyboard, View, useWindowDimensions } from 'react-native';\n\nimport type { App } from '../../data/apps/types';\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport { StudioBottomSheet } from '../../components/studio-sheet/StudioBottomSheet';\nimport { StudioSheetPager } from '../../components/studio-sheet/StudioSheetPager';\nimport { FloatingDraggableButton } from '../../components/floating-draggable-button/FloatingDraggableButton';\nimport { EdgeGlowFrame } from '../../components/overlays/EdgeGlowFrame';\nimport { DrawModeOverlay } from '../../components/draw/DrawModeOverlay';\nimport { AppCommentsSheet } from '../../components/comments/AppCommentsSheet';\nimport { PreviewPanel } from './PreviewPanel';\nimport { ChatPanel } from './ChatPanel';\nimport { ConfirmMergeFlow } from './ConfirmMergeFlow';\nimport type { MergeRequestSummary } from '../../components/models/types';\nimport { useTheme } from '../../theme';\n\nimport { MergeIcon } from '../../components/icons/MergeIcon';\n\nexport type StudioOverlayProps = {\n captureTargetRef: React.RefObject<View | null>;\n\n app: App | null;\n appLoading?: boolean;\n\n // Studio state\n isOwner: boolean;\n shouldForkOnEdit: boolean;\n\n // Bundle testing (glow + restore)\n isTesting: boolean;\n onRestoreBase: () => void | Promise<void>;\n\n // Merge requests\n incomingMergeRequests: MergeRequest[];\n outgoingMergeRequests: MergeRequest[];\n creatorStatsById: Record<string, import('../../data/users/types').UserStats>;\n processingMrId?: string | null;\n isBuildingMrTest?: boolean;\n testingMrId?: string | null;\n toMergeRequestSummary: (mr: MergeRequest) => MergeRequestSummary;\n onSubmitMergeRequest?: () => void | Promise<void>;\n onApprove?: (mr: MergeRequest) => void | Promise<void>;\n onReject?: (mr: MergeRequest) => void | Promise<void>;\n onTestMr?: (mr: MergeRequest) => void | Promise<void>;\n\n // Chat\n chatMessages: import('../../components/models/types').ChatMessage[];\n chatLoading?: boolean;\n chatSendDisabled?: boolean;\n chatForking?: boolean;\n chatSending?: boolean;\n chatShowTypingIndicator?: boolean;\n onSendChat: (text: string, attachments?: string[]) => void | Promise<void>;\n\n // Navigation callbacks\n onNavigateHome?: () => void;\n};\n\ntype SheetPage = 'preview' | 'chat';\n\nexport function StudioOverlay({\n captureTargetRef,\n app,\n appLoading,\n isOwner,\n shouldForkOnEdit,\n isTesting,\n onRestoreBase,\n incomingMergeRequests,\n outgoingMergeRequests,\n creatorStatsById,\n processingMrId,\n isBuildingMrTest,\n testingMrId,\n toMergeRequestSummary,\n onSubmitMergeRequest,\n onApprove,\n onReject,\n onTestMr,\n chatMessages,\n chatLoading,\n chatSendDisabled,\n chatForking,\n chatSending,\n chatShowTypingIndicator,\n onSendChat,\n onNavigateHome,\n}: StudioOverlayProps) {\n const theme = useTheme();\n const { width } = useWindowDimensions();\n\n const [sheetOpen, setSheetOpen] = React.useState(false);\n const [activePage, setActivePage] = React.useState<SheetPage>('preview');\n\n const [drawing, setDrawing] = React.useState(false);\n const [chatAttachments, setChatAttachments] = React.useState<string[]>([]);\n const [commentsAppId, setCommentsAppId] = React.useState<string | null>(null);\n const [commentsCount, setCommentsCount] = React.useState<number | null>(null);\n\n const [confirmMrId, setConfirmMrId] = React.useState<string | null>(null);\n const confirmMr = React.useMemo(\n () => (confirmMrId ? incomingMergeRequests.find((m) => m.id === confirmMrId) ?? null : null),\n [confirmMrId, incomingMergeRequests]\n );\n\n const closeSheet = React.useCallback(() => {\n setSheetOpen(false);\n Keyboard.dismiss();\n }, []);\n\n const openSheet = React.useCallback(() => setSheetOpen(true), []);\n\n const goToChat = React.useCallback(() => {\n setActivePage('chat');\n openSheet();\n }, [openSheet]);\n\n const backToPreview = React.useCallback(() => {\n Keyboard.dismiss();\n setActivePage('preview');\n }, []);\n\n const startDraw = React.useCallback(() => {\n setDrawing(true);\n closeSheet();\n }, [closeSheet]);\n\n const handleDrawCapture = React.useCallback(\n (dataUrl: string) => {\n setChatAttachments((prev) => [...prev, dataUrl]);\n setDrawing(false);\n setActivePage('chat');\n openSheet();\n },\n [openSheet]\n );\n\n const toggleSheet = React.useCallback(async () => {\n if (!sheetOpen) {\n const shouldExitTest = Boolean(testingMrId) || isTesting;\n if (shouldExitTest) {\n void Promise.resolve(onRestoreBase()).catch(() => {});\n }\n setSheetOpen(true);\n } else {\n closeSheet();\n }\n }, [closeSheet, isTesting, onRestoreBase, sheetOpen, testingMrId]);\n\n const handleTestMr = React.useCallback(\n async (mr: MergeRequest) => {\n if (!onTestMr) return;\n await onTestMr(mr);\n closeSheet();\n },\n [closeSheet, onTestMr]\n );\n\n return (\n <>\n {/* Testing glow around runtime */}\n <EdgeGlowFrame visible={isTesting} role=\"accent\" thickness={40} intensity={1} />\n\n <StudioBottomSheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <StudioSheetPager\n activePage={activePage}\n width={width}\n preview={\n <PreviewPanel\n app={app}\n loading={appLoading}\n isOwner={isOwner}\n shouldForkOnEdit={shouldForkOnEdit}\n incomingMergeRequests={incomingMergeRequests}\n outgoingMergeRequests={outgoingMergeRequests}\n creatorStatsById={creatorStatsById}\n processingMrId={processingMrId}\n isBuildingMrTest={isBuildingMrTest}\n testingMrId={testingMrId}\n toMergeRequestSummary={toMergeRequestSummary}\n onClose={closeSheet}\n onNavigateHome={onNavigateHome}\n onGoToChat={goToChat}\n onStartDraw={isOwner ? startDraw : undefined}\n onSubmitMergeRequest={onSubmitMergeRequest}\n onRequestApprove={(mr) => setConfirmMrId(mr.id)}\n onReject={onReject}\n onTestMr={handleTestMr}\n onOpenComments={() => setCommentsAppId(app?.id ?? null)}\n commentCountOverride={commentsCount ?? undefined}\n />\n }\n chat={\n <ChatPanel\n messages={chatMessages}\n showTypingIndicator={chatShowTypingIndicator}\n loading={chatLoading}\n sendDisabled={chatSendDisabled}\n forking={chatForking}\n sending={chatSending}\n autoFocusComposer={sheetOpen && activePage === 'chat'}\n shouldForkOnEdit={shouldForkOnEdit}\n attachments={chatAttachments}\n onRemoveAttachment={(idx) => setChatAttachments((prev) => prev.filter((_, i) => i !== idx))}\n onClearAttachments={() => setChatAttachments([])}\n onBack={backToPreview}\n onClose={closeSheet}\n onNavigateHome={onNavigateHome}\n onStartDraw={startDraw}\n onSend={onSendChat}\n />\n }\n />\n </StudioBottomSheet>\n\n <FloatingDraggableButton\n visible={!sheetOpen && !drawing}\n ariaLabel={sheetOpen ? 'Hide studio' : 'Show studio'}\n badgeCount={incomingMergeRequests.length}\n onPress={toggleSheet}\n isLoading={app?.status === 'editing'}\n >\n <View style={{ width: 28, height: 28, alignItems: 'center', justifyContent: 'center' }}>\n <MergeIcon width={24} height={24} color={theme.colors.floatingContent} />\n </View>\n </FloatingDraggableButton>\n\n <DrawModeOverlay\n visible={drawing}\n captureTargetRef={captureTargetRef}\n onCancel={() => setDrawing(false)}\n onCapture={handleDrawCapture}\n />\n\n <ConfirmMergeFlow\n visible={Boolean(confirmMr)}\n onOpenChange={(open) => {\n if (!open) setConfirmMrId(null);\n }}\n mergeRequest={confirmMr}\n toSummary={toMergeRequestSummary}\n onConfirm={(mr) => onApprove?.(mr)}\n onTestFirst={handleTestMr}\n />\n\n <AppCommentsSheet\n appId={commentsAppId}\n onClose={() => setCommentsAppId(null)}\n onCountChange={(count) => setCommentsCount(count)}\n onPlayApp={() => setCommentsAppId(null)}\n />\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\nimport BottomSheet, { type BottomSheetBackgroundProps, type BottomSheetProps } from '@gorhom/bottom-sheet';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { useTheme } from '../../theme';\nimport { StudioSheetBackground, type StudioSheetBackgroundProps } from './StudioSheetBackground';\nimport type { StudioSheetSnapPoints } from './types';\n\nexport type StudioBottomSheetProps = {\n /**\n * Controlled open state.\n */\n open: boolean;\n onOpenChange?: (open: boolean) => void;\n\n /**\n * Snap points for the sheet.\n */\n snapPoints?: StudioSheetSnapPoints;\n\n /**\n * Optional ref forwarding to control the BottomSheet imperatively.\n */\n sheetRef?: React.RefObject<BottomSheet | null>;\n\n /**\n * Provide a custom background renderer (e.g. BlurView).\n */\n background?: Pick<StudioSheetBackgroundProps, 'renderBackground'>;\n\n /**\n * Content inside the sheet.\n */\n children: React.ReactNode;\n\n /**\n * Additional BottomSheet props, for advanced tuning.\n * We intentionally do not expose everything as first-class props to keep SRP.\n */\n bottomSheetProps?: Omit<\n BottomSheetProps,\n | 'ref'\n | 'index'\n | 'snapPoints'\n | 'enablePanDownToClose'\n | 'backgroundComponent'\n | 'topInset'\n | 'bottomInset'\n | 'handleIndicatorStyle'\n | 'onChange'\n | 'children'\n >;\n};\n\nexport function StudioBottomSheet({\n open,\n onOpenChange,\n snapPoints = ['80%', '100%'],\n sheetRef,\n background,\n children,\n bottomSheetProps,\n}: StudioBottomSheetProps) {\n const theme = useTheme();\n const insets = useSafeAreaInsets();\n const internalSheetRef = React.useRef<BottomSheet | null>(null);\n const resolvedSheetRef = sheetRef ?? internalSheetRef;\n\n // Gorhom BottomSheet `index` is not reliably \"fully controlled\" across versions.\n // Ensure the visual sheet actually opens/closes when `open` changes (e.g. via header X button).\n React.useEffect(() => {\n const sheet = resolvedSheetRef.current;\n if (!sheet) return;\n\n if (open) {\n // Open to the highest snap point by default.\n sheet.snapToIndex(snapPoints.length - 1);\n } else {\n sheet.close();\n }\n }, [open, resolvedSheetRef, snapPoints.length]);\n\n const handleChange = React.useCallback(\n (index: number) => {\n onOpenChange?.(index >= 0);\n },\n [onOpenChange]\n );\n\n return (\n <BottomSheet\n ref={resolvedSheetRef}\n index={open ? snapPoints.length - 1 : -1}\n snapPoints={snapPoints}\n enablePanDownToClose\n keyboardBehavior=\"extend\"\n keyboardBlurBehavior=\"restore\"\n android_keyboardInputMode=\"adjustResize\"\n backgroundComponent={(props: BottomSheetBackgroundProps) => (\n <StudioSheetBackground {...props} renderBackground={background?.renderBackground} />\n )}\n topInset={insets.top}\n bottomInset={insets.bottom}\n handleIndicatorStyle={{ backgroundColor: theme.colors.handleIndicator }}\n onChange={handleChange}\n {...bottomSheetProps}\n >\n <View style={{ flex: 1, overflow: 'hidden' }}>{children}</View>\n </BottomSheet>\n );\n}\n\n\n","import * as React from 'react';\nimport { Platform, View, type ViewStyle } from 'react-native';\nimport type { BottomSheetBackgroundProps } from '@gorhom/bottom-sheet';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\n\nimport { useTheme } from '../../theme';\n\nexport type StudioSheetBackgroundProps = BottomSheetBackgroundProps & {\n /**\n * Optional override to render a custom background (e.g. BlurView).\n * If provided, it receives the computed container style.\n */\n renderBackground?: (params: { style: ViewStyle }) => React.ReactNode;\n};\n\nexport function StudioSheetBackground({\n style,\n renderBackground,\n}: StudioSheetBackgroundProps) {\n const theme = useTheme();\n const radius = Platform.OS === 'ios' ? 39 : 16;\n const fallbackBgColor = theme.scheme === 'dark' ? 'rgba(11, 8, 15, 0.85)' : 'rgba(255, 255, 255, 0.85)';\n const secondaryBgBaseColor = theme.scheme === 'dark' ? 'rgb(24, 24, 27)' : 'rgb(173, 173, 173)';\n\n const containerStyle: ViewStyle = {\n ...(style as ViewStyle),\n borderTopLeftRadius: radius,\n borderTopRightRadius: radius,\n overflow: 'hidden',\n };\n\n if (renderBackground) {\n return <>{renderBackground({ style: containerStyle })}</>;\n }\n\n return (\n <>\n <LiquidGlassView\n style={[containerStyle, !isLiquidGlassSupported && { backgroundColor: fallbackBgColor }]}\n effect=\"regular\"\n />\n {isLiquidGlassSupported && (\n <View\n style={[\n containerStyle,\n {\n backgroundColor: secondaryBgBaseColor,\n opacity: 0.4,\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n },\n ]}\n />\n )}\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { Animated, type ViewStyle } from 'react-native';\n\nimport type { StudioSheetPage } from './types';\n\nexport type StudioSheetPagerProps = {\n activePage: StudioSheetPage;\n width: number;\n preview: React.ReactNode;\n chat: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function StudioSheetPager({ activePage, width, preview, chat, style }: StudioSheetPagerProps) {\n const anim = React.useRef(new Animated.Value(activePage === 'chat' ? 1 : 0)).current;\n\n React.useEffect(() => {\n Animated.spring(anim, {\n toValue: activePage === 'chat' ? 1 : 0,\n useNativeDriver: true,\n tension: 65,\n friction: 11,\n }).start();\n }, [activePage, anim]);\n\n const previewTranslateX = anim.interpolate({ inputRange: [0, 1], outputRange: [0, -width] });\n const chatTranslateX = anim.interpolate({ inputRange: [0, 1], outputRange: [width, 0] });\n\n return (\n <Animated.View style={[{ flex: 1 }, style]}>\n <Animated.View\n style={[\n {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n transform: [{ translateX: previewTranslateX }],\n },\n ]}\n pointerEvents={activePage === 'preview' ? 'auto' : 'none'}\n >\n {preview}\n </Animated.View>\n\n <Animated.View\n style={[\n {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n transform: [{ translateX: chatTranslateX }],\n },\n ]}\n pointerEvents={activePage === 'chat' ? 'auto' : 'none'}\n >\n {chat}\n </Animated.View>\n </Animated.View>\n );\n}\n\n\n","import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport {\n PanResponder,\n Pressable,\n StyleSheet,\n Text,\n type GestureResponderEvent,\n useWindowDimensions,\n View,\n} from 'react-native';\nimport * as Haptics from 'expo-haptics';\nimport Animated, {\n Easing,\n interpolateColor,\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withRepeat,\n withSequence,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\n\nimport { DEFAULT_EDGE_PADDING, DEFAULT_OFFSET, DEFAULT_SIZE, ENTER_ROTATION_FROM_DEG, ENTER_SCALE_FROM, HIDDEN_OPACITY, PULSE_DURATION_MS } from './constants';\nimport type { FloatingDraggableButtonProps } from './types';\nimport { useTheme } from '../../theme';\n\nconst HIDDEN_OFFSET_X = 20;\n\nconst SPRING_POSITION = { damping: 12, stiffness: 100, mass: 0.8 } as const;\nconst SPRING_SCALE_IN = { damping: 10, stiffness: 200 } as const;\nconst SPRING_SCALE_OUT = { damping: 12, stiffness: 150 } as const;\nconst SPRING_ROTATION_IN = { damping: 15, stiffness: 80 } as const;\nconst SPRING_ROTATION_GRAB = { damping: 20 } as const;\nconst SPRING_SCALE_GRAB = { damping: 15, stiffness: 200 } as const;\n\nconst TIMING_OPACITY_IN = { duration: 300, easing: Easing.out(Easing.ease) } as const;\nconst TIMING_OPACITY_OUT = { duration: 250, easing: Easing.in(Easing.ease) } as const;\n\nfunction clamp(value: number, min: number, max: number) {\n 'worklet';\n return Math.max(min, Math.min(max, value));\n}\n\nfunction getHiddenTranslateX(size: number) {\n return -size - HIDDEN_OFFSET_X;\n}\n\nfunction getHiddenTranslateY(height: number) {\n return height;\n}\n\nfunction getFinalTranslateY(height: number, size: number, bottomOffset: number) {\n return height - size - bottomOffset;\n}\n\nexport function FloatingDraggableButton({\n onPress,\n size = DEFAULT_SIZE,\n disabled = false,\n ariaLabel,\n isLoading = false,\n visible = true,\n badgeCount = 0,\n offset = DEFAULT_OFFSET,\n variant = 'default',\n forceShowTrigger = 0,\n children,\n style,\n testID,\n edgePadding = DEFAULT_EDGE_PADDING,\n backgroundColor,\n}: FloatingDraggableButtonProps) {\n const theme = useTheme();\n const { width, height } = useWindowDimensions();\n const isDanger = variant === 'danger';\n\n const onPressRef = useRef(onPress);\n useEffect(() => {\n onPressRef.current = onPress;\n }, [onPress]);\n\n const fallbackBgColor = useMemo(() => {\n if (backgroundColor) return backgroundColor;\n if (isDanger) return 'rgba(239, 68, 68, 0.9)';\n return theme.scheme === 'dark' ? 'rgba(0, 0, 0, 0.6)' : 'rgba(255, 255, 255, 0.6)';\n }, [backgroundColor, isDanger, theme.scheme]);\n\n const translateX = useSharedValue(getHiddenTranslateX(size));\n const translateY = useSharedValue(getHiddenTranslateY(height));\n const scale = useSharedValue(ENTER_SCALE_FROM);\n const rotation = useSharedValue(ENTER_ROTATION_FROM_DEG);\n const opacity = useSharedValue(1);\n const borderPulse = useSharedValue(0);\n const startPos = useRef({ x: 0, y: 0 });\n const isAnimatingOut = useRef(false);\n\n const animateToHidden = useCallback(\n (options?: { onFinish?: () => void }) => {\n // Animate back to starting position (reverse of entrance)\n translateX.value = withSpring(getHiddenTranslateX(size), SPRING_POSITION);\n translateY.value = withSpring(getHiddenTranslateY(height), SPRING_POSITION);\n scale.value = withSpring(ENTER_SCALE_FROM, SPRING_SCALE_IN);\n rotation.value = withSpring(ENTER_ROTATION_FROM_DEG, SPRING_ROTATION_IN);\n\n const finish = options?.onFinish;\n if (!finish) {\n opacity.value = withTiming(HIDDEN_OPACITY, TIMING_OPACITY_OUT);\n return;\n }\n\n opacity.value = withTiming(\n HIDDEN_OPACITY as unknown as number,\n TIMING_OPACITY_OUT,\n (finished?: boolean) => {\n if (finished) runOnJS(finish)();\n }\n );\n },\n [height, opacity, rotation, scale, size, translateX, translateY]\n );\n\n const animateOut = useCallback(() => {\n if (isAnimatingOut.current) return;\n isAnimatingOut.current = true;\n\n try {\n void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);\n } catch {\n // noop\n }\n\n animateToHidden({\n onFinish: () => {\n onPressRef.current?.();\n },\n });\n }, [animateToHidden]);\n\n useEffect(() => {\n if (isLoading) {\n borderPulse.value = withRepeat(\n withSequence(\n withTiming(1, { duration: PULSE_DURATION_MS, easing: Easing.out(Easing.ease) }),\n withTiming(0, { duration: PULSE_DURATION_MS, easing: Easing.in(Easing.ease) })\n ),\n -1,\n true\n );\n } else {\n borderPulse.value = withTiming(0, { duration: 200 });\n }\n }, [borderPulse, isLoading]);\n\n const animateIn = useCallback(() => {\n isAnimatingOut.current = false;\n translateX.value = withSpring(offset.left ?? DEFAULT_OFFSET.left, SPRING_POSITION);\n const finalY = getFinalTranslateY(height, size, offset.bottom ?? DEFAULT_OFFSET.bottom);\n translateY.value = withSpring(finalY, SPRING_POSITION);\n scale.value = withSequence(\n withSpring(1.2, SPRING_SCALE_IN),\n withSpring(1, SPRING_SCALE_OUT)\n );\n rotation.value = withSpring(0, SPRING_ROTATION_IN);\n opacity.value = withTiming(1, TIMING_OPACITY_IN);\n }, [height, offset.bottom, offset.left, opacity, rotation, scale, size, translateX, translateY]);\n\n // Initial animation on mount\n useEffect(() => {\n const timer = setTimeout(() => {\n if (visible) {\n animateIn();\n }\n }, 100);\n\n return () => clearTimeout(timer);\n }, []);\n\n useEffect(() => {\n if (visible && isAnimatingOut.current) {\n animateIn();\n } else if (!visible && !isAnimatingOut.current) {\n animateToHidden();\n isAnimatingOut.current = true;\n }\n }, [visible, animateIn, animateToHidden]);\n\n useEffect(() => {\n if (forceShowTrigger > 0 && visible) {\n isAnimatingOut.current = false;\n animateIn();\n }\n }, [forceShowTrigger, visible, animateIn]);\n\n const panResponder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: () => {\n startPos.current = {\n x: translateX.value,\n y: translateY.value,\n };\n scale.value = withSpring(1.1, SPRING_SCALE_GRAB);\n rotation.value = withSpring(0, SPRING_ROTATION_GRAB);\n },\n onPanResponderMove: (_: GestureResponderEvent, gesture) => {\n const newX = startPos.current.x + gesture.dx;\n const newY = startPos.current.y + gesture.dy;\n translateX.value = clamp(newX, edgePadding, width - size - edgePadding);\n translateY.value = clamp(newY, edgePadding, height - size - edgePadding);\n },\n onPanResponderRelease: (_evt, gesture) => {\n scale.value = withSpring(1, SPRING_SCALE_GRAB);\n const distance = Math.sqrt(gesture.dx ** 2 + gesture.dy ** 2);\n if (distance < 5 && !disabled) {\n animateOut();\n }\n },\n })\n ).current;\n\n const animatedStyle = useAnimatedStyle(() => ({\n transform: [\n { translateX: translateX.value },\n { translateY: translateY.value },\n { scale: scale.value },\n { rotate: `${rotation.value}deg` },\n ],\n opacity: opacity.value,\n }));\n\n const borderAnimatedStyle = useAnimatedStyle(() => {\n const borderColor = interpolateColor(\n borderPulse.value,\n [0, 1],\n isDanger\n ? ['rgba(239,68,68,0.4)', 'rgba(239,68,68,1)']\n : theme.scheme === 'dark'\n ? ['rgba(255,255,255,0.2)', 'rgba(255,255,255,0.9)']\n : ['rgba(55,0,179,0.2)', 'rgba(55,0,179,0.9)']\n );\n return {\n borderWidth: isLoading ? 2 : 0,\n borderColor,\n borderRadius: size / 2,\n };\n });\n\n return (\n <Animated.View\n {...panResponder.panHandlers}\n testID={testID}\n style={[styles.floatingButton, { width: size, height: size, borderRadius: size / 2 }, style, animatedStyle]}\n accessibilityRole=\"button\"\n accessibilityLabel={ariaLabel}\n >\n <Animated.View style={[{ width: size, height: size, borderRadius: size / 2 }, borderAnimatedStyle]}>\n <LiquidGlassView\n style={[{ flex: 1, borderRadius: size / 2 }, !isLiquidGlassSupported && { backgroundColor: fallbackBgColor }]}\n interactive\n effect=\"clear\"\n >\n <Pressable\n onPress={() => {\n if (!disabled) animateOut();\n }}\n style={styles.buttonInner}\n android_ripple={{ color: 'rgba(255, 255, 255, 0.3)', borderless: true }}\n >\n {children ?? <View />}\n </Pressable>\n </LiquidGlassView>\n </Animated.View>\n\n {badgeCount > 0 && (\n <View style={[styles.badge, { backgroundColor: theme.colors.danger }]}>\n <Text style={[styles.badgeText, { color: theme.colors.onDanger }]}>\n {badgeCount > 99 ? '99+' : badgeCount}\n </Text>\n </View>\n )}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n floatingButton: {\n position: 'absolute',\n justifyContent: 'center',\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 3.84,\n elevation: 5,\n },\n buttonInner: {\n width: '100%',\n height: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 999,\n },\n badge: {\n position: 'absolute',\n top: -4,\n right: -4,\n minWidth: 20,\n height: 20,\n borderRadius: 10,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 5,\n },\n badgeText: {\n fontSize: 11,\n fontWeight: '700',\n },\n});\n\n\n","import type { FloatingButtonOffset } from './types';\n\nexport const DEFAULT_SIZE = 48;\nexport const DEFAULT_EDGE_PADDING = 10;\n\nexport const DEFAULT_OFFSET: Required<FloatingButtonOffset> = {\n left: 20,\n bottom: 60,\n};\n\nexport const ENTER_SCALE_FROM = 0.3;\nexport const ENTER_ROTATION_FROM_DEG = -180;\nexport const HIDDEN_OPACITY = 0.3;\n\nexport const PULSE_DURATION_MS = 900;\n\n\n","import * as React from 'react';\nimport { Animated, View, type ViewStyle } from 'react-native';\nimport { LinearGradient } from 'expo-linear-gradient';\n\nimport { useTheme } from '../../theme';\nimport { withAlpha } from '../utils/color';\n\nexport type EdgeGlowFrameProps = {\n visible: boolean;\n /**\n * Which semantic color to use for the glow.\n */\n role?: 'accent' | 'danger' | 'success' | 'warning';\n /**\n * Thickness of each edge glow in dp.\n */\n thickness?: number;\n /**\n * Optional intensity multiplier for alpha (0..1).\n */\n intensity?: number;\n style?: ViewStyle;\n};\n\nfunction baseColor(role: NonNullable<EdgeGlowFrameProps['role']>, theme: ReturnType<typeof useTheme>) {\n switch (role) {\n case 'danger':\n return theme.colors.danger;\n case 'success':\n return theme.colors.success;\n case 'warning':\n return theme.colors.warning;\n case 'accent':\n default:\n return '#A855F7';\n }\n}\n\nexport function EdgeGlowFrame({\n visible,\n role = 'accent',\n thickness = 40,\n intensity = 1,\n style,\n}: EdgeGlowFrameProps) {\n const theme = useTheme();\n const alpha = Math.max(0, Math.min(1, intensity));\n\n const anim = React.useRef(new Animated.Value(visible ? 1 : 0)).current;\n\n React.useEffect(() => {\n Animated.timing(anim, {\n toValue: visible ? 1 : 0,\n duration: 300,\n useNativeDriver: true,\n }).start();\n }, [anim, visible]);\n\n const c = baseColor(role, theme);\n const strong = withAlpha(c, 0.6 * alpha);\n const soft = withAlpha(c, 0.22 * alpha);\n\n return (\n <Animated.View pointerEvents=\"none\" style={[{ position: 'absolute', inset: 0, opacity: anim }, style]}>\n {/* Top */}\n <View style={{ position: 'absolute', top: 0, left: 0, right: 0, height: thickness }}>\n <LinearGradient\n colors={[strong, soft, 'transparent']}\n start={{ x: 0, y: 0 }}\n end={{ x: 0, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </View>\n {/* Bottom */}\n <View style={{ position: 'absolute', bottom: 0, left: 0, right: 0, height: thickness }}>\n <LinearGradient\n colors={['transparent', soft, strong]}\n start={{ x: 0, y: 0 }}\n end={{ x: 0, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </View>\n {/* Left */}\n <View style={{ position: 'absolute', top: 0, bottom: 0, left: 0, width: thickness }}>\n <LinearGradient\n colors={[strong, soft, 'transparent']}\n start={{ x: 0, y: 0 }}\n end={{ x: 1, y: 0 }}\n style={{ width: '100%', height: '100%' }}\n />\n </View>\n {/* Right */}\n <View style={{ position: 'absolute', top: 0, bottom: 0, right: 0, width: thickness }}>\n <LinearGradient\n colors={['transparent', soft, strong]}\n start={{ x: 0, y: 0 }}\n end={{ x: 1, y: 0 }}\n style={{ width: '100%', height: '100%' }}\n />\n </View>\n </Animated.View>\n );\n}\n\n\n","export function withAlpha(color: string, alpha: number): string {\n const a = Math.max(0, Math.min(1, alpha));\n const hex = color.trim();\n if (!hex.startsWith('#')) return color;\n\n const raw = hex.slice(1);\n const expanded =\n raw.length === 3\n ? raw\n .split('')\n .map((c) => c + c)\n .join('')\n : raw;\n\n if (expanded.length !== 6) return color;\n\n const r = Number.parseInt(expanded.slice(0, 2), 16);\n const g = Number.parseInt(expanded.slice(2, 4), 16);\n const b = Number.parseInt(expanded.slice(4, 6), 16);\n\n if ([r, g, b].some((n) => Number.isNaN(n))) return color;\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\n\n","import * as React from 'react';\nimport { StyleSheet, View, type ViewStyle } from 'react-native';\nimport { captureRef } from 'react-native-view-shot';\n\nimport { useTheme } from '../../theme';\nimport { EdgeGlowFrame } from '../overlays/EdgeGlowFrame';\nimport { DrawSurface } from './DrawSurface';\nimport { DrawToolbar } from './DrawToolbar';\nimport type { Stroke } from './types';\n\nexport type DrawModeOverlayProps = {\n visible: boolean;\n captureTargetRef: React.RefObject<View | null>;\n onCancel: () => void;\n onCapture: (dataUrl: string) => void;\n /**\n * Custom palette (theme-first). If omitted, uses a theme-derived palette.\n */\n palette?: string[];\n strokeWidth?: number;\n style?: ViewStyle;\n /**\n * Render icons for toolbar actions.\n */\n renderUndoIcon?: () => React.ReactNode;\n renderCancelIcon?: () => React.ReactNode;\n renderDoneIcon?: () => React.ReactNode;\n renderDragHandle?: () => React.ReactNode;\n};\n\nexport function DrawModeOverlay({\n visible,\n captureTargetRef,\n onCancel,\n onCapture,\n palette,\n strokeWidth = 4,\n style,\n renderUndoIcon,\n renderCancelIcon,\n renderDoneIcon,\n renderDragHandle,\n}: DrawModeOverlayProps) {\n const theme = useTheme();\n\n const defaultPalette = React.useMemo(\n () => [\n '#EF4444', // Red\n '#EAB308', // Yellow\n '#22C55E', // Green\n '#3B82F6', // Blue\n '#FFFFFF', // White\n '#000000', // Black\n ],\n []\n );\n\n const colors = palette && palette.length > 0 ? palette : defaultPalette;\n const [selectedColor, setSelectedColor] = React.useState(colors[0] ?? '#EF4444');\n const [strokes, setStrokes] = React.useState<Stroke[]>([]);\n const [capturing, setCapturing] = React.useState(false);\n const [hideUi, setHideUi] = React.useState(false);\n\n React.useEffect(() => {\n if (!visible) return;\n setStrokes([]);\n setSelectedColor(colors[0] ?? '#EF4444');\n setCapturing(false);\n setHideUi(false);\n }, [colors, visible]);\n\n const canUndo = strokes.length > 0;\n\n const handleUndo = React.useCallback(() => {\n setStrokes((prev) => prev.slice(0, -1));\n }, []);\n\n const handleCancel = React.useCallback(() => {\n setStrokes([]);\n onCancel();\n }, [onCancel]);\n\n const handleDone = React.useCallback(async () => {\n if (!captureTargetRef.current || capturing) return;\n try {\n setCapturing(true);\n setHideUi(true);\n await new Promise((r) => requestAnimationFrame(() => r(null)));\n await new Promise((r) => requestAnimationFrame(() => r(null)));\n\n const base64 = await captureRef(captureTargetRef, {\n format: 'png',\n quality: 0.9,\n result: 'base64',\n });\n setCapturing(false);\n setHideUi(false);\n setStrokes([]);\n onCapture(`data:image/png;base64,${base64}`);\n } catch {\n setCapturing(false);\n setHideUi(false);\n }\n }, [captureTargetRef, capturing, onCapture]);\n\n if (!visible) return null;\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.root, style]} pointerEvents=\"box-none\">\n <EdgeGlowFrame visible={!hideUi} role=\"danger\" thickness={50} intensity={1} />\n\n <DrawSurface\n color={selectedColor}\n strokeWidth={strokeWidth}\n strokes={strokes}\n onAddStroke={(stroke) => setStrokes((prev) => [...prev, stroke])}\n />\n\n <DrawToolbar\n hidden={hideUi}\n capturing={capturing}\n colors={colors}\n selectedColor={selectedColor}\n onSelectColor={setSelectedColor}\n canUndo={canUndo}\n onUndo={handleUndo}\n onCancel={handleCancel}\n onDone={() => void handleDone()}\n renderUndoIcon={renderUndoIcon}\n renderCancelIcon={renderCancelIcon}\n renderDoneIcon={renderDoneIcon}\n renderDragHandle={renderDragHandle}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n zIndex: 9999,\n },\n});\n\n\n","import * as React from 'react';\nimport { PanResponder, StyleSheet, View, type GestureResponderEvent, type PanResponderGestureState, type ViewStyle } from 'react-native';\nimport Svg, { Path } from 'react-native-svg';\n\nimport type { Point, Stroke } from './types';\nimport { pointsToSmoothPath } from './strokes';\n\nexport type DrawSurfaceProps = {\n color: string;\n strokeWidth: number;\n strokes: Stroke[];\n onAddStroke: (stroke: Stroke) => void;\n style?: ViewStyle;\n minDistance?: number;\n};\n\nexport function DrawSurface({\n color,\n strokeWidth,\n strokes,\n onAddStroke,\n style,\n minDistance = 1,\n}: DrawSurfaceProps) {\n const [renderTick, setRenderTick] = React.useState(0);\n const currentPointsRef = React.useRef<Point[]>([]);\n const rafRef = React.useRef<number | null>(null);\n\n const triggerRender = React.useCallback(() => {\n if (rafRef.current !== null) return;\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n setRenderTick((n) => n + 1);\n });\n }, []);\n\n React.useEffect(() => () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n }, []);\n\n const onStart = React.useCallback((e: GestureResponderEvent) => {\n const { locationX, locationY } = e.nativeEvent;\n currentPointsRef.current = [{ x: locationX, y: locationY }];\n triggerRender();\n }, [triggerRender]);\n\n const onMove = React.useCallback((e: GestureResponderEvent, _g: PanResponderGestureState) => {\n const { locationX, locationY } = e.nativeEvent;\n const pts = currentPointsRef.current;\n if (pts.length > 0) {\n const last = pts[pts.length - 1];\n const dx = locationX - last.x;\n const dy = locationY - last.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < minDistance) return;\n }\n currentPointsRef.current = [...pts, { x: locationX, y: locationY }];\n triggerRender();\n }, [minDistance, triggerRender]);\n\n const onEnd = React.useCallback(() => {\n const points = currentPointsRef.current;\n if (points.length > 0) {\n onAddStroke({ points, color, width: strokeWidth });\n }\n currentPointsRef.current = [];\n triggerRender();\n }, [color, onAddStroke, strokeWidth, triggerRender]);\n\n const panResponder = React.useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: onStart,\n onPanResponderMove: onMove,\n onPanResponderRelease: onEnd,\n onPanResponderTerminate: onEnd,\n }),\n [onEnd, onMove, onStart]\n );\n\n const currentPath = pointsToSmoothPath(currentPointsRef.current);\n\n // renderTick is used to force re-render when refs change\n void renderTick;\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.container, style]} {...panResponder.panHandlers}>\n <Svg style={StyleSheet.absoluteFill} width=\"100%\" height=\"100%\">\n {strokes.map((s, idx) => {\n const d = pointsToSmoothPath(s.points);\n if (!d) return null;\n return (\n <Path\n key={idx}\n d={d}\n stroke={s.color}\n strokeWidth={s.width}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n );\n })}\n {currentPath ? (\n <Path\n d={currentPath}\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n ) : null}\n </Svg>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n zIndex: 5,\n },\n});\n\n\n","import type { Point } from './types';\n\nexport function pointsToSmoothPath(points: Point[]): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M${points[0].x},${points[0].y}`;\n if (points.length === 2) return `M${points[0].x},${points[0].y} L${points[1].x},${points[1].y}`;\n\n let path = `M${points[0].x},${points[0].y}`;\n for (let i = 1; i < points.length - 1; i++) {\n const p1 = points[i];\n const p2 = points[i + 1];\n const midX = (p1.x + p2.x) / 2;\n const midY = (p1.y + p2.y) / 2;\n path += ` Q${p1.x},${p1.y} ${midX},${midY}`;\n }\n const last = points[points.length - 1];\n path += ` L${last.x},${last.y}`;\n return path;\n}\n\n\n","import * as React from 'react';\nimport {\n ActivityIndicator,\n Animated,\n PanResponder,\n Pressable,\n View,\n useWindowDimensions,\n type ViewStyle,\n} from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { Check, GripVertical, Undo2, X } from 'lucide-react-native';\n\nimport { impact } from './optionalHaptics';\nimport { DrawColorPicker } from './DrawColorPicker';\n\nexport type DrawToolbarProps = {\n colors: string[];\n selectedColor: string;\n onSelectColor: (color: string) => void;\n canUndo: boolean;\n onUndo: () => void;\n onCancel: () => void;\n onDone: () => void;\n capturing?: boolean;\n hidden?: boolean;\n renderUndoIcon?: () => React.ReactNode;\n renderCancelIcon?: () => React.ReactNode;\n renderDoneIcon?: () => React.ReactNode;\n renderDragHandle?: () => React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function DrawToolbar({\n colors,\n selectedColor,\n onSelectColor,\n canUndo,\n onUndo,\n onCancel,\n onDone,\n capturing = false,\n hidden = false,\n renderUndoIcon,\n renderCancelIcon,\n renderDoneIcon,\n renderDragHandle,\n style,\n}: DrawToolbarProps) {\n const insets = useSafeAreaInsets();\n const { width: screenWidth, height: screenHeight } = useWindowDimensions();\n\n const [expanded, setExpanded] = React.useState(false);\n\n const pos = React.useRef(new Animated.ValueXY({ x: screenWidth / 2 - 110, y: -140 })).current;\n const start = React.useRef({ x: 0, y: 0 });\n const currentPos = React.useRef({ x: 0, y: 0 });\n\n React.useEffect(() => {\n if (hidden) return;\n Animated.spring(pos.y, {\n toValue: insets.top + 60,\n useNativeDriver: true,\n damping: 12,\n stiffness: 120,\n mass: 0.8,\n }).start();\n }, [hidden, insets.top, pos.y]);\n\n React.useEffect(() => {\n const id = pos.addListener((v) => {\n currentPos.current = { x: v.x ?? 0, y: v.y ?? 0 };\n });\n return () => {\n pos.removeListener(id);\n };\n }, [pos]);\n\n const clamp = React.useCallback(\n (x: number, y: number) => {\n const minX = 10;\n const maxX = Math.max(10, screenWidth - 230);\n const minY = insets.top + 10;\n const maxY = Math.max(minY, screenHeight - 180);\n return { x: Math.max(minX, Math.min(maxX, x)), y: Math.max(minY, Math.min(maxY, y)) };\n },\n [insets.top, screenHeight, screenWidth]\n );\n\n const panResponder = React.useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => false,\n onMoveShouldSetPanResponder: (_e, g) => Math.abs(g.dx) > 5 || Math.abs(g.dy) > 5,\n onPanResponderGrant: () => {\n start.current = { ...currentPos.current };\n },\n onPanResponderMove: (_e, g) => {\n const next = clamp(start.current.x + g.dx, start.current.y + g.dy);\n pos.setValue(next);\n },\n onPanResponderRelease: () => {\n const next = clamp(currentPos.current.x, currentPos.current.y);\n Animated.spring(pos, { toValue: next, useNativeDriver: true }).start();\n },\n }),\n [clamp, pos]\n );\n\n if (hidden) return null;\n\n function CircleActionButton({\n accessibilityLabel,\n disabled,\n capturingDisabled,\n backgroundColor,\n onPress,\n children,\n }: {\n accessibilityLabel: string;\n disabled?: boolean;\n capturingDisabled?: boolean;\n backgroundColor: string;\n onPress: () => void;\n children: React.ReactNode;\n }) {\n const isDisabled = Boolean(disabled) || Boolean(capturingDisabled);\n const [pressed, setPressed] = React.useState(false);\n return (\n <View\n style={{\n width: 28,\n height: 28,\n borderRadius: 14,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor,\n opacity: isDisabled ? 0.5 : pressed ? 0.85 : 1,\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={isDisabled}\n onPress={onPress}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n style={{ width: '100%', height: '100%', alignItems: 'center', justifyContent: 'center' }}\n hitSlop={8}\n >\n {children}\n </Pressable>\n </View>\n );\n }\n\n return (\n <Animated.View\n style={[\n {\n position: 'absolute',\n zIndex: 100,\n transform: [{ translateX: pos.x }, { translateY: pos.y }],\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 8,\n elevation: 8,\n },\n style,\n ]}\n {...panResponder.panHandlers}\n >\n <View\n style={{\n backgroundColor: '#F43F5E',\n borderRadius: 16,\n padding: 12,\n minWidth: 220,\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>\n {renderDragHandle ? (\n renderDragHandle()\n ) : (\n <GripVertical size={20} color=\"rgba(255, 255, 255, 0.6)\" />\n )}\n\n <DrawColorPicker\n colors={colors}\n selected={selectedColor}\n expanded={expanded}\n onToggle={() => {\n void impact('light');\n setExpanded((v) => !v);\n }}\n onSelect={(c) => {\n void impact('light');\n onSelectColor(c);\n }}\n />\n\n <View style={{ width: 1, height: 20, backgroundColor: 'rgba(255, 255, 255, 0.3)', marginHorizontal: 4 }} />\n\n <CircleActionButton\n accessibilityLabel=\"Undo\"\n disabled={!canUndo}\n capturingDisabled={capturing}\n backgroundColor={!canUndo || capturing ? 'rgba(255, 255, 255, 0.1)' : 'rgba(255, 255, 255, 0.25)'}\n onPress={() => {\n void impact('light');\n onUndo();\n }}\n >\n {renderUndoIcon ? renderUndoIcon() : <Undo2 size={16} color={canUndo ? '#FFFFFF' : 'rgba(255,255,255,0.4)'} />}\n </CircleActionButton>\n\n <CircleActionButton\n accessibilityLabel=\"Cancel\"\n capturingDisabled={capturing}\n backgroundColor=\"rgba(255, 255, 255, 0.15)\"\n onPress={() => {\n void impact('medium');\n onCancel();\n }}\n >\n {renderCancelIcon ? renderCancelIcon() : <X size={16} color=\"#FFFFFF\" />}\n </CircleActionButton>\n\n <CircleActionButton\n accessibilityLabel=\"Done\"\n capturingDisabled={capturing}\n backgroundColor=\"rgba(255, 255, 255, 0.35)\"\n onPress={() => {\n void impact('medium');\n onDone();\n }}\n >\n {capturing ? (\n <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n ) : renderDoneIcon ? (\n renderDoneIcon()\n ) : (\n <Check size={16} color=\"#FFFFFF\" />\n )}\n </CircleActionButton>\n </View>\n </View>\n </Animated.View>\n );\n}\n\n\n","type ImpactStyle = 'light' | 'medium' | 'heavy';\n\nexport async function impact(style: ImpactStyle) {\n try {\n const Haptics = require('expo-haptics') as typeof import('expo-haptics');\n const map: Record<ImpactStyle, any> = {\n light: Haptics.ImpactFeedbackStyle.Light,\n medium: Haptics.ImpactFeedbackStyle.Medium,\n heavy: Haptics.ImpactFeedbackStyle.Heavy,\n };\n await Haptics.impactAsync(map[style]);\n } catch {}\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\n\nexport type DrawColorPickerProps = {\n colors: string[];\n selected: string;\n expanded: boolean;\n onToggle: () => void;\n onSelect: (color: string) => void;\n style?: ViewStyle;\n};\n\nexport function DrawColorPicker({\n colors,\n selected,\n expanded,\n onToggle,\n onSelect,\n style,\n}: DrawColorPickerProps) {\n useTheme();\n\n const isWhite = (c: string) => c.toUpperCase() === '#FFFFFF';\n\n const swatchStyle = (c: string, isSelected: boolean): ViewStyle => {\n const base: ViewStyle = {\n width: 28,\n height: 28,\n borderRadius: 14,\n backgroundColor: c,\n borderWidth: 2,\n borderColor: 'transparent',\n alignItems: 'center',\n justifyContent: 'center',\n };\n\n const selectedStyle: ViewStyle = isSelected\n ? {\n borderColor: '#FFFFFF',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.3,\n shadowRadius: 3,\n elevation: 4,\n }\n : {};\n\n const whiteStyle: ViewStyle = isWhite(c) ? { borderColor: 'rgba(0, 0, 0, 0.2)' } : {};\n\n return { ...base, ...selectedStyle, ...whiteStyle };\n };\n\n if (!expanded) {\n return (\n <Pressable onPress={onToggle} style={[swatchStyle(selected, true), style]} />\n );\n }\n\n return (\n <View style={[{ flexDirection: 'row', alignItems: 'center', gap: 8 }, style]}>\n {colors.map((c, idx) => (\n <Pressable\n key={`${c}-${idx}`}\n onPress={() => {\n onSelect(c);\n onToggle();\n }}\n style={swatchStyle(c, selected === c)}\n />\n ))}\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, Keyboard, Platform, Pressable, View } from 'react-native';\nimport {\n BottomSheetBackdrop,\n BottomSheetModal,\n BottomSheetScrollView,\n} from '@gorhom/bottom-sheet';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\nimport { Play } from 'lucide-react-native';\n\nimport { useTheme } from '../../theme';\nimport { withAlpha } from '../utils/color';\nimport { Text } from '../primitives/Text';\nimport { ChatComposer } from '../chat/ChatComposer';\nimport { CommentRow } from './CommentRow';\nimport { useAppComments } from './useAppComments';\nimport { useAppDetails } from './useAppDetails';\nimport { useIosKeyboardSnapFix } from './useIosKeyboardSnapFix';\n\nexport type AppCommentsSheetProps = {\n appId: string | null;\n onClose: () => void;\n onCountChange?: (count: number) => void;\n onPlayApp?: (appId: string) => void | Promise<void>;\n};\n\nexport function AppCommentsSheet({ appId, onClose, onCountChange, onPlayApp }: AppCommentsSheetProps) {\n const theme = useTheme();\n const insets = useSafeAreaInsets();\n const sheetRef = React.useRef<BottomSheetModal | null>(null);\n const snapPoints = React.useMemo(() => ['50%', '90%'], []);\n\n const { comments, loading, sending, error, create, refresh } = useAppComments(appId);\n const { app, loading: loadingApp } = useAppDetails(appId);\n const { keyboardVisible } = useIosKeyboardSnapFix(sheetRef);\n\n React.useEffect(() => {\n if (appId) {\n sheetRef.current?.present();\n void refresh();\n } else {\n sheetRef.current?.dismiss();\n }\n }, [appId, refresh]);\n\n React.useEffect(() => {\n if (!appId) return;\n onCountChange?.(comments.length);\n }, [appId, comments.length, onCountChange]);\n\n const renderBackdrop = React.useCallback(\n (props: any) => <BottomSheetBackdrop {...props} disappearsOnIndex={-1} appearsOnIndex={0} opacity={0.5} />,\n []\n );\n\n const handleChange = React.useCallback(\n (index: number) => {\n if (index === -1) onClose();\n },\n [onClose]\n );\n\n const handlePlay = React.useCallback(async () => {\n if (!appId) return;\n sheetRef.current?.dismiss();\n await onPlayApp?.(appId);\n onClose();\n }, [appId, onClose, onPlayApp]);\n\n return (\n <BottomSheetModal\n ref={sheetRef}\n index={1}\n snapPoints={snapPoints}\n enableDynamicSizing={false}\n backdropComponent={renderBackdrop}\n onChange={handleChange}\n backgroundStyle={{\n backgroundColor: theme.scheme === 'dark' ? '#0B080F' : '#FFFFFF',\n borderTopLeftRadius: Platform.OS === 'ios' ? 39 : 16,\n borderTopRightRadius: Platform.OS === 'ios' ? 39 : 16,\n }}\n handleIndicatorStyle={{ backgroundColor: theme.colors.handleIndicator }}\n keyboardBehavior=\"interactive\"\n keyboardBlurBehavior=\"restore\"\n android_keyboardInputMode=\"adjustResize\"\n topInset={insets.top}\n >\n <View style={{ flex: 1 }}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: theme.spacing.lg,\n paddingBottom: theme.spacing.sm,\n borderBottomWidth: 1,\n borderBottomColor: withAlpha(theme.colors.border, 0.1),\n }}\n >\n <Text\n numberOfLines={1}\n style={{\n flex: 1,\n marginRight: theme.spacing.sm,\n fontSize: 18,\n lineHeight: 22,\n fontWeight: theme.typography.fontWeight.bold,\n }}\n >\n {loadingApp ? 'Loading...' : app?.name || 'Comments'}\n </Text>\n\n <LiquidGlassView\n style={[\n { borderRadius: 24 },\n !isLiquidGlassSupported && { backgroundColor: theme.scheme === 'dark' ? '#18181B' : '#F6F6F6' },\n ]}\n interactive\n effect=\"clear\"\n >\n <View\n style={{\n width: 32,\n height: 32,\n borderRadius: 999,\n backgroundColor: theme.colors.primary,\n alignItems: 'center',\n justifyContent: 'center',\n opacity: appId ? 1 : 0.5,\n }}\n >\n <Pressable\n disabled={!appId}\n onPress={() => void handlePlay()}\n hitSlop={8}\n style={({ pressed }) => [\n {\n width: '100%',\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n },\n pressed ? { opacity: 0.85 } : null,\n ]}\n >\n <Play size={16} color={theme.colors.onPrimary} />\n </Pressable>\n </View>\n </LiquidGlassView>\n </View>\n\n <BottomSheetScrollView\n style={{ flex: 1 }}\n contentContainerStyle={{\n padding: theme.spacing.lg,\n paddingBottom: 100,\n flexGrow: 1,\n }}\n keyboardShouldPersistTaps=\"handled\"\n >\n {loading && comments.length === 0 ? (\n <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>\n <ActivityIndicator />\n </View>\n ) : comments.length === 0 ? (\n <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>\n <Text variant=\"bodyMuted\" style={{ textAlign: 'center' }}>\n No comments yet\n </Text>\n </View>\n ) : (\n comments.map((c, idx) => <CommentRow key={c.id} comment={c} showDivider={idx < comments.length - 1} />)\n )}\n {error ? (\n <Text variant=\"captionMuted\" style={{ marginTop: theme.spacing.lg }}>\n Failed to load comments.\n </Text>\n ) : null}\n </BottomSheetScrollView>\n\n <View\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n paddingHorizontal: theme.spacing.lg,\n paddingTop: theme.spacing.sm,\n paddingBottom: Platform.OS === 'ios' ? (keyboardVisible ? theme.spacing.lg : insets.bottom) : insets.bottom + 10,\n borderTopWidth: 1,\n borderTopColor: withAlpha(theme.colors.border, 0.1),\n backgroundColor: withAlpha(theme.colors.background, 0.8),\n }}\n >\n <ChatComposer\n placeholder=\"Write a comment...\"\n disabled={sending}\n sending={sending}\n useBottomSheetTextInput\n onSend={async (text) => {\n await create(text);\n Keyboard.dismiss();\n }}\n />\n </View>\n </View>\n </BottomSheetModal>\n );\n}\n\n\n","import * as React from 'react';\nimport {\n ActivityIndicator,\n Animated,\n Dimensions,\n Image,\n Pressable,\n ScrollView,\n View,\n type ViewStyle,\n} from 'react-native';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\nimport { Plus } from 'lucide-react-native';\n\nimport { useTheme } from '../../theme';\nimport { MultilineTextInput } from './MultilineTextInput';\nimport { IconChevronRight, IconClose } from '../icons/StudioIcons';\n\nexport type ChatComposerProps = {\n value?: string;\n onChangeValue?: (text: string) => void;\n placeholder?: string;\n disabled?: boolean;\n sending?: boolean;\n autoFocus?: boolean;\n onSend: (text: string, attachments?: string[]) => void | Promise<void>;\n attachments?: string[];\n onRemoveAttachment?: (index: number) => void;\n onAddAttachment?: () => void;\n renderAddAttachment?: () => React.ReactNode;\n renderRemoveIcon?: () => React.ReactNode;\n renderSendIcon?: () => React.ReactNode;\n useBottomSheetTextInput?: boolean;\n onLayout?: (e: { height: number }) => void;\n style?: ViewStyle;\n};\n\nconst THUMBNAIL_HEIGHT = 90;\n\nfunction AspectRatioThumbnail({\n uri,\n onRemove,\n renderRemoveIcon,\n}: {\n uri: string;\n onRemove?: () => void;\n renderRemoveIcon?: () => React.ReactNode;\n}) {\n const [aspectRatio, setAspectRatio] = React.useState(1);\n\n return (\n <View style={{ height: THUMBNAIL_HEIGHT, aspectRatio, position: 'relative' }}>\n <View style={{ flex: 1, borderRadius: 8, overflow: 'hidden' }}>\n <Image\n source={{ uri }}\n style={{ width: '100%', height: '100%' }}\n resizeMode=\"contain\"\n onLoad={(e) => {\n const { width, height } = (e as any).nativeEvent?.source ?? {};\n if (width && height) setAspectRatio(width / height);\n }}\n />\n </View>\n {onRemove ? (\n <Pressable\n style={{\n position: 'absolute',\n top: -4,\n right: -4,\n width: 24,\n height: 24,\n borderRadius: 12,\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10,\n }}\n onPress={onRemove}\n hitSlop={10}\n >\n {renderRemoveIcon ? renderRemoveIcon() : <IconClose size={12} colorToken=\"onPrimary\" />}\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nexport function ChatComposer({\n value,\n onChangeValue,\n placeholder = 'Describe the idea you want to build',\n disabled = false,\n sending = false,\n autoFocus = false,\n onSend,\n attachments = [],\n onRemoveAttachment,\n onAddAttachment,\n renderAddAttachment,\n renderRemoveIcon,\n renderSendIcon,\n useBottomSheetTextInput,\n onLayout,\n style,\n}: ChatComposerProps) {\n const theme = useTheme();\n const [internal, setInternal] = React.useState('');\n const text = value ?? internal;\n const setText = onChangeValue ?? setInternal;\n const hasAttachments = attachments.length > 0;\n const hasText = text.trim().length > 0;\n const composerMinHeight = hasAttachments ? THUMBNAIL_HEIGHT + 44 + 24 : 44;\n\n const isButtonDisabled = sending || disabled;\n const maxInputHeight = React.useMemo(() => Dimensions.get('window').height * 0.5, []);\n const shakeAnim = React.useRef(new Animated.Value(0)).current;\n const [sendPressed, setSendPressed] = React.useState(false);\n const inputRef = React.useRef<import('react-native').TextInput | null>(null);\n const prevAutoFocusRef = React.useRef(false);\n\n React.useEffect(() => {\n const shouldFocus = autoFocus && !prevAutoFocusRef.current && !disabled && !sending;\n prevAutoFocusRef.current = autoFocus;\n if (!shouldFocus) return;\n\n // Temporary workaround: Bottom sheets can take a moment to open\n const t = setTimeout(() => {\n inputRef.current?.focus();\n }, 75);\n return () => clearTimeout(t);\n }, [autoFocus, disabled, sending]);\n\n const triggerShake = React.useCallback(() => {\n shakeAnim.setValue(0);\n Animated.sequence([\n Animated.timing(shakeAnim, { toValue: 10, duration: 50, useNativeDriver: true }),\n Animated.timing(shakeAnim, { toValue: -10, duration: 50, useNativeDriver: true }),\n Animated.timing(shakeAnim, { toValue: 10, duration: 50, useNativeDriver: true }),\n Animated.timing(shakeAnim, { toValue: -10, duration: 50, useNativeDriver: true }),\n Animated.timing(shakeAnim, { toValue: 0, duration: 50, useNativeDriver: true }),\n ]).start();\n }, [shakeAnim]);\n\n const handleSend = React.useCallback(async () => {\n if (isButtonDisabled) return;\n // Require at least one character of text (attachments alone not enough)\n if (!hasText) {\n triggerShake();\n return;\n }\n const trimmed = text.trim();\n await onSend(trimmed, attachments.length > 0 ? attachments : undefined);\n setText('');\n }, [attachments, hasText, isButtonDisabled, onSend, setText, text, triggerShake]);\n\n const textareaBgColor = theme.scheme === 'dark' ? '#18181B' : '#F6F6F6';\n const placeholderTextColor = theme.scheme === 'dark' ? '#A1A1AA' : '#71717A';\n\n return (\n <View\n style={[{ paddingHorizontal: 16, paddingBottom: 12, paddingTop: 8 }, style]}\n onLayout={(e) => onLayout?.({ height: e.nativeEvent.layout.height })}\n >\n <View style={{ flexDirection: 'row', alignItems: 'flex-end', gap: 8 }}>\n <Animated.View style={{ flex: 1, transform: [{ translateX: shakeAnim }] }}>\n <LiquidGlassView\n style={[\n // LiquidGlassView doesn't reliably auto-size to children; ensure enough height for the\n // thumbnail strip when attachments are present.\n { borderRadius: 24, flex: 1, minHeight: composerMinHeight },\n !isLiquidGlassSupported && { backgroundColor: textareaBgColor },\n ]}\n interactive\n effect=\"clear\"\n >\n {hasAttachments ? (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{ gap: 8, paddingHorizontal: 12, paddingTop: 12 }}\n >\n {attachments.map((uri, index) => (\n <AspectRatioThumbnail\n key={`attachment-${index}`}\n uri={uri}\n onRemove={onRemoveAttachment ? () => onRemoveAttachment(index) : undefined}\n renderRemoveIcon={renderRemoveIcon}\n />\n ))}\n {onAddAttachment ? (\n renderAddAttachment ? (\n renderAddAttachment()\n ) : (\n <Pressable\n style={{\n height: THUMBNAIL_HEIGHT,\n aspectRatio: 0.6,\n borderRadius: 8,\n borderWidth: 2,\n borderColor: 'rgba(255, 255, 255, 0.3)',\n borderStyle: 'dashed',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n }}\n onPress={onAddAttachment}\n >\n <Plus size={24} color=\"rgba(255, 255, 255, 0.5)\" />\n </Pressable>\n )\n ) : null}\n </ScrollView>\n ) : null}\n\n <MultilineTextInput\n ref={inputRef}\n value={text}\n onChangeText={setText}\n placeholder={placeholder}\n editable={!disabled && !sending}\n useBottomSheetTextInput={useBottomSheetTextInput}\n autoFocus={autoFocus}\n placeholderTextColor={placeholderTextColor}\n scrollEnabled\n style={{\n maxHeight: maxInputHeight,\n minHeight: 44,\n color: theme.scheme === 'dark' ? '#FAFAFA' : '#09090B',\n paddingHorizontal: 16,\n paddingVertical: 12,\n lineHeight: 20,\n }}\n />\n </LiquidGlassView>\n </Animated.View>\n\n <LiquidGlassView\n style={[{ borderRadius: 100 }, !isLiquidGlassSupported && { backgroundColor: textareaBgColor }]}\n interactive\n effect=\"clear\"\n >\n <View\n style={{\n width: 44,\n height: 44,\n borderRadius: 22,\n overflow: 'hidden',\n backgroundColor: theme.colors.primary,\n opacity: isButtonDisabled ? 0.6 : sendPressed ? 0.9 : 1,\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n disabled={isButtonDisabled}\n onPress={handleSend}\n onPressIn={() => setSendPressed(true)}\n onPressOut={() => setSendPressed(false)}\n style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}\n >\n {sending ? (\n <ActivityIndicator />\n ) : renderSendIcon ? (\n renderSendIcon()\n ) : (\n <IconChevronRight size={20} colorToken=\"onPrimary\" />\n )}\n </Pressable>\n </View>\n </LiquidGlassView>\n </View>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { TextInput, type TextInputProps, type TextStyle } from 'react-native';\nimport { BottomSheetTextInput } from '@gorhom/bottom-sheet';\n\nimport { useTheme } from '../../theme';\n\nexport type MultilineTextInputProps = Omit<TextInputProps, 'style'> & {\n useBottomSheetTextInput?: boolean;\n style?: TextStyle;\n};\n\nexport const MultilineTextInput = React.forwardRef<TextInput, MultilineTextInputProps>(function MultilineTextInput(\n { useBottomSheetTextInput = false, placeholder, placeholderTextColor, style, ...props }: MultilineTextInputProps,\n ref\n) {\n const theme = useTheme();\n\n const baseStyle: TextStyle = {\n minHeight: 44,\n maxHeight: 160,\n paddingVertical: theme.spacing.md,\n paddingHorizontal: theme.spacing.lg,\n color: theme.colors.text,\n fontSize: theme.typography.fontSize.md,\n lineHeight: theme.typography.lineHeight.md,\n };\n\n const resolvedPlaceholderColor = placeholderTextColor ?? theme.colors.textSubtle;\n\n const commonProps: TextInputProps = {\n ...props,\n multiline: true,\n placeholder,\n placeholderTextColor: resolvedPlaceholderColor,\n style: [baseStyle, style],\n textAlignVertical: 'top',\n };\n\n return useBottomSheetTextInput ? (\n <BottomSheetTextInput ref={ref} {...commonProps} />\n ) : (\n <TextInput ref={ref} {...commonProps} />\n );\n});\n\n\n","import * as React from 'react';\nimport type { LucideProps } from 'lucide-react-native';\nimport {\n ArrowDown,\n ChevronLeft,\n ChevronRight,\n ChevronDown,\n Home,\n MessageSquare,\n Pencil,\n Play,\n Send,\n X,\n Check,\n} from 'lucide-react-native';\n\nimport { useTheme } from '../../theme';\n\nexport type StudioIconProps = Omit<LucideProps, 'color'> & {\n colorToken?: 'floatingContent' | 'text' | 'textMuted' | 'primary' | 'danger' | 'onPrimary' | 'onDanger';\n};\n\nfunction useResolvedIconColor(token: NonNullable<StudioIconProps['colorToken']>) {\n const theme = useTheme();\n switch (token) {\n case 'text':\n return theme.colors.text;\n case 'textMuted':\n return theme.colors.textMuted;\n case 'primary':\n return theme.colors.primary;\n case 'danger':\n return theme.colors.danger;\n case 'onPrimary':\n return theme.colors.onPrimary;\n case 'onDanger':\n return theme.colors.onDanger;\n case 'floatingContent':\n default:\n return theme.colors.floatingContent;\n }\n}\n\nfunction makeIcon(Comp: React.ComponentType<LucideProps>) {\n return function StudioIcon({ size = 20, strokeWidth = 2, colorToken = 'floatingContent', ...rest }: StudioIconProps) {\n const color = useResolvedIconColor(colorToken);\n return <Comp size={size} strokeWidth={strokeWidth} color={color} {...rest} />;\n };\n}\n\n// Header / nav\nexport const IconHome = makeIcon(Home);\nexport const IconClose = makeIcon(X);\nexport const IconBack = makeIcon(ChevronLeft);\nexport const IconChevronRight = makeIcon(ChevronRight);\nexport const IconChevronDown = makeIcon(ChevronDown);\n\n// Actions\nexport const IconChat = makeIcon(MessageSquare);\nexport const IconDraw = makeIcon(Pencil);\nexport const IconSend = makeIcon(Send);\nexport const IconPlay = makeIcon(Play);\nexport const IconArrowDown = makeIcon(ArrowDown);\nexport const IconApprove = makeIcon(Check);\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\n\nimport type { AppComment } from '../../data/comments/types';\nimport { usersRepository } from '../../data/users/repository';\nimport { useTheme } from '../../theme';\nimport { Avatar } from '../primitives/Avatar';\nimport { Text } from '../primitives/Text';\nimport { withAlpha } from '../utils/color';\nimport { formatTimeAgo } from './formatTimeAgo';\n\nexport function CommentRow({ comment, showDivider }: { comment: AppComment; showDivider: boolean }) {\n const theme = useTheme();\n const [authorName, setAuthorName] = React.useState<string | null>(null);\n const [authorAvatar, setAuthorAvatar] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const stats = await usersRepository.getStats(comment.authorId);\n if (cancelled) return;\n setAuthorName(stats.name);\n setAuthorAvatar(stats.avatar);\n } catch {\n // ignore\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [comment.authorId]);\n\n return (\n <View\n style={{\n flexDirection: 'row',\n gap: theme.spacing.md,\n paddingVertical: theme.spacing.md,\n borderBottomWidth: showDivider ? 1 : 0,\n borderBottomColor: withAlpha(theme.colors.border, 0.5),\n }}\n >\n <Avatar size={32} uri={authorAvatar} name={authorName ?? comment.authorId} style={{ marginTop: 6 }} />\n\n <View style={{ flex: 1, minWidth: 0, gap: 4 }}>\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: theme.spacing.sm }}>\n <Text style={{ fontSize: 14, lineHeight: 18, fontWeight: theme.typography.fontWeight.bold, color: theme.colors.text }}>\n {authorName ?? 'Unknown User'}\n </Text>\n <Text style={{ fontSize: 12, lineHeight: 16, color: theme.colors.textMuted }}>\n {formatTimeAgo(comment.createdAt)}\n </Text>\n </View>\n <Text style={{ fontSize: 14, lineHeight: 20, color: theme.colors.text }}>\n {comment.body ?? comment.description ?? ''}\n </Text>\n </View>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Image, View, type ImageStyle, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Text } from './Text';\nimport type { WithStyle } from './types';\n\nexport type AvatarProps = WithStyle<ViewStyle> & {\n size?: number;\n uri?: string | null;\n name?: string | null;\n /**\n * Optional override for the fallback background.\n * Prefer leaving this undefined so it uses theme.\n */\n fallbackBackgroundColor?: string;\n imageStyle?: WithStyle<ImageStyle>['style'];\n};\n\nfunction initialsFrom(name?: string | null): string {\n const trimmed = (name ?? '').trim();\n if (!trimmed) return '?';\n return trimmed[0]?.toUpperCase?.() ?? '?';\n}\n\nexport function Avatar({\n size = 32,\n uri,\n name,\n fallbackBackgroundColor,\n style,\n imageStyle,\n}: AvatarProps) {\n const theme = useTheme();\n const radius = size / 2;\n const fallbackBg = fallbackBackgroundColor ?? theme.colors.neutral;\n\n return (\n <View\n style={[\n {\n width: size,\n height: size,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: fallbackBg,\n alignItems: 'center',\n justifyContent: 'center',\n },\n style,\n ]}\n >\n {uri ? (\n <Image\n source={{ uri }}\n style={[{ width: size, height: size }, imageStyle]}\n resizeMode=\"cover\"\n />\n ) : (\n <Text variant=\"caption\" style={{ color: theme.colors.onNeutral }}>\n {initialsFrom(name)}\n </Text>\n )}\n </View>\n );\n}\n\n\n","export function formatTimeAgo(iso: string): string {\n const then = new Date(iso).getTime();\n const now = Date.now();\n const seconds = Math.max(1, Math.floor((now - then) / 1000));\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n if (years > 0) return `${years}y ago`;\n if (months > 0) return `${months}mo ago`;\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return `${seconds}s ago`;\n}\n\n\n","import * as React from 'react';\n\nimport { appCommentsRepository } from '../../data/comments/repository';\nimport type { AppComment } from '../../data/comments/types';\n\nexport type UseAppCommentsResult = {\n comments: AppComment[];\n loading: boolean;\n sending: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (text: string) => Promise<void>;\n};\n\nexport function useAppComments(appId: string | null): UseAppCommentsResult {\n const [comments, setComments] = React.useState<AppComment[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [sending, setSending] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const sortByCreatedAtAsc = React.useCallback((items: AppComment[]) => {\n return [...items].sort((a, b) => {\n const at = a.createdAt ? new Date(a.createdAt).getTime() : 0;\n const bt = b.createdAt ? new Date(b.createdAt).getTime() : 0;\n return at - bt;\n });\n }, []);\n\n const refresh = React.useCallback(async () => {\n if (!appId) {\n setComments([]);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const res = await appCommentsRepository.list(appId, { page: 1, pageSize: 50, includeDeleted: false });\n setComments(sortByCreatedAtAsc(res.items));\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n setComments([]);\n } finally {\n setLoading(false);\n }\n }, [appId, sortByCreatedAtAsc]);\n\n React.useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const create = React.useCallback(\n async (text: string) => {\n if (!appId) return;\n const trimmed = text.trim();\n if (!trimmed) return;\n setSending(true);\n setError(null);\n try {\n const newComment = await appCommentsRepository.create(appId, { body: trimmed, commentType: 'general' });\n setComments((prev) => sortByCreatedAtAsc([...prev, newComment]));\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n throw e;\n } finally {\n setSending(false);\n }\n },\n [appId, sortByCreatedAtAsc]\n );\n\n return { comments, loading, sending, error, refresh, create };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type {\n AppComment,\n AppCommentList,\n CreateAppCommentInput,\n ListAppCommentsQuery,\n UpdateAppCommentInput,\n} from './types';\n\nexport interface AppCommentsRemoteDataSource {\n list(appId: string, query?: ListAppCommentsQuery): Promise<ServiceResponse<AppCommentList>>;\n getById(appId: string, commentId: string): Promise<ServiceResponse<AppComment>>;\n create(appId: string, payload: CreateAppCommentInput): Promise<ServiceResponse<AppComment>>;\n update(\n appId: string,\n commentId: string,\n payload: UpdateAppCommentInput\n ): Promise<ServiceResponse<AppComment>>;\n remove(appId: string, commentId: string): Promise<ServiceResponse<AppComment>>;\n}\n\nclass AppCommentsRemoteDataSourceImpl extends BaseRemote implements AppCommentsRemoteDataSource {\n async list(appId: string, query?: ListAppCommentsQuery): Promise<ServiceResponse<AppCommentList>> {\n const params = query ? { ...query } : undefined;\n const { data } = await api.get<ServiceResponse<AppCommentList>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments`,\n { params }\n );\n return data;\n }\n\n async getById(appId: string, commentId: string): Promise<ServiceResponse<AppComment>> {\n const { data } = await api.get<ServiceResponse<AppComment>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments/${encodeURIComponent(commentId)}`\n );\n return data;\n }\n\n async create(appId: string, payload: CreateAppCommentInput): Promise<ServiceResponse<AppComment>> {\n const { data } = await api.post<ServiceResponse<AppComment>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments`,\n payload\n );\n return data;\n }\n\n async update(\n appId: string,\n commentId: string,\n payload: UpdateAppCommentInput\n ): Promise<ServiceResponse<AppComment>> {\n const { data } = await api.patch<ServiceResponse<AppComment>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments/${encodeURIComponent(commentId)}`,\n payload\n );\n return data;\n }\n\n async remove(appId: string, commentId: string): Promise<ServiceResponse<AppComment>> {\n const { data } = await api.delete<ServiceResponse<AppComment>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments/${encodeURIComponent(commentId)}`\n );\n return data;\n }\n}\n\nexport const appCommentsRemoteDataSource: AppCommentsRemoteDataSource = new AppCommentsRemoteDataSourceImpl();\n\n\n","import type { AppCommentsRemoteDataSource } from './remote';\nimport { appCommentsRemoteDataSource } from './remote';\nimport type {\n AppComment,\n AppCommentList,\n CreateAppCommentInput,\n ListAppCommentsQuery,\n UpdateAppCommentInput,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface AppCommentsRepository {\n list(appId: string, query?: ListAppCommentsQuery): Promise<AppCommentList>;\n getById(appId: string, commentId: string): Promise<AppComment>;\n create(appId: string, payload: CreateAppCommentInput): Promise<AppComment>;\n update(appId: string, commentId: string, payload: UpdateAppCommentInput): Promise<AppComment>;\n remove(appId: string, commentId: string): Promise<AppComment>;\n}\n\nclass AppCommentsRepositoryImpl extends BaseRepository implements AppCommentsRepository {\n constructor(private readonly remote: AppCommentsRemoteDataSource) {\n super();\n }\n\n async list(appId: string, query?: ListAppCommentsQuery): Promise<AppCommentList> {\n const res = await this.remote.list(appId, query);\n return this.unwrapOrThrow(res);\n }\n\n async getById(appId: string, commentId: string): Promise<AppComment> {\n const res = await this.remote.getById(appId, commentId);\n return this.unwrapOrThrow(res);\n }\n\n async create(appId: string, payload: CreateAppCommentInput): Promise<AppComment> {\n const res = await this.remote.create(appId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async update(appId: string, commentId: string, payload: UpdateAppCommentInput): Promise<AppComment> {\n const res = await this.remote.update(appId, commentId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async remove(appId: string, commentId: string): Promise<AppComment> {\n const res = await this.remote.remove(appId, commentId);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const appCommentsRepository: AppCommentsRepository = new AppCommentsRepositoryImpl(appCommentsRemoteDataSource);\n\n\n","import * as React from 'react';\n\nimport { appsRepository } from '../../data/apps/repository';\nimport type { App } from '../../data/apps/types';\n\nexport function useAppDetails(appId: string | null) {\n const [app, setApp] = React.useState<App | null>(null);\n const [loading, setLoading] = React.useState(false);\n\n React.useEffect(() => {\n if (!appId) {\n setApp(null);\n return;\n }\n let cancelled = false;\n setLoading(true);\n (async () => {\n try {\n const res = await appsRepository.getById(appId);\n if (!cancelled) setApp(res);\n } catch {\n if (!cancelled) setApp(null);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [appId]);\n\n return { app, loading };\n}\n\n\n","import * as React from 'react';\nimport { Keyboard, Platform } from 'react-native';\nimport type { BottomSheetModal } from '@gorhom/bottom-sheet';\n\nexport function useIosKeyboardSnapFix(sheetRef: React.RefObject<BottomSheetModal | null>) {\n const [keyboardVisible, setKeyboardVisible] = React.useState(false);\n\n React.useEffect(() => {\n if (Platform.OS !== 'ios') return;\n const show = Keyboard.addListener('keyboardWillShow', () => setKeyboardVisible(true));\n const hide = Keyboard.addListener('keyboardWillHide', () => {\n setKeyboardVisible(false);\n setTimeout(() => sheetRef.current?.snapToIndex?.(1), 10);\n });\n return () => {\n show.remove();\n hide.remove();\n };\n }, [sheetRef]);\n\n return { keyboardVisible };\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, View } from 'react-native';\n\nimport type { App } from '../../data/apps/types';\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport { PreviewPage } from '../../components/preview/PreviewPage';\nimport { Text } from '../../components/primitives/Text';\nimport { PreviewPanelHeader } from './preview-panel/PreviewPanelHeader';\nimport { PreviewHeroSection } from './preview-panel/PreviewHeroSection';\nimport { PreviewMetaSection } from './preview-panel/PreviewMetaSection';\nimport { PreviewCustomizeSection } from './preview-panel/PreviewCustomizeSection';\nimport { PreviewCollaborateSection } from './preview-panel/PreviewCollaborateSection';\nimport { usePreviewPanelData } from './preview-panel/usePreviewPanelData';\n\nexport type PreviewPanelProps = {\n app: App | null;\n loading?: boolean;\n isOwner: boolean;\n shouldForkOnEdit: boolean;\n incomingMergeRequests: MergeRequest[];\n outgoingMergeRequests: MergeRequest[];\n creatorStatsById: Record<string, import('../../data/users/types').UserStats>;\n processingMrId?: string | null;\n isBuildingMrTest?: boolean;\n testingMrId?: string | null;\n toMergeRequestSummary: (mr: MergeRequest) => import('../../components/models/types').MergeRequestSummary;\n onClose: () => void;\n onNavigateHome?: () => void;\n onGoToChat: () => void;\n onStartDraw?: () => void;\n onSubmitMergeRequest?: () => void | Promise<void>;\n onRequestApprove?: (mr: MergeRequest) => void;\n onReject?: (mr: MergeRequest) => void | Promise<void>;\n onTestMr?: (mr: MergeRequest) => void | Promise<void>;\n onOpenComments?: () => void;\n commentCountOverride?: number;\n};\n\nexport function PreviewPanel({\n app,\n loading,\n isOwner,\n shouldForkOnEdit,\n incomingMergeRequests,\n outgoingMergeRequests,\n creatorStatsById,\n processingMrId,\n isBuildingMrTest,\n testingMrId,\n toMergeRequestSummary,\n onClose,\n onNavigateHome,\n onGoToChat,\n onStartDraw,\n onSubmitMergeRequest,\n onRequestApprove,\n onReject,\n onTestMr,\n onOpenComments,\n commentCountOverride,\n}: PreviewPanelProps) {\n const { imageUrl, imageLoaded, setImageLoaded, creator, insights, stats, showProcessing, canSubmitMergeRequest } = usePreviewPanelData({\n app,\n isOwner,\n outgoingMergeRequests,\n onOpenComments,\n commentCountOverride,\n });\n\n const header = <PreviewPanelHeader isOwner={isOwner} onClose={onClose} onNavigateHome={onNavigateHome} onGoToChat={onGoToChat} />;\n\n if (loading || !app) {\n return (\n <PreviewPage header={header}>\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }}>\n <ActivityIndicator />\n <View style={{ height: 12 }} />\n <Text variant=\"bodyMuted\">Loading app…</Text>\n </View>\n </PreviewPage>\n );\n }\n\n return (\n <PreviewPage header={header}>\n <PreviewHeroSection\n appStatus={app.status}\n showProcessing={showProcessing}\n imageUrl={imageUrl}\n imageLoaded={imageLoaded}\n onImageLoad={() => setImageLoaded(true)}\n stats={{\n likeCount: stats.likeCount,\n commentCount: stats.commentCount,\n forkCount: stats.forkCount,\n isLiked: stats.isLiked,\n handleLike: stats.handleLike,\n handleOpenComments: stats.handleOpenComments,\n }}\n />\n\n <PreviewMetaSection app={app} isOwner={isOwner} creator={creator} downloadsCount={insights.downloads} />\n\n <PreviewCustomizeSection\n app={app}\n isOwner={isOwner}\n shouldForkOnEdit={shouldForkOnEdit}\n showProcessing={showProcessing}\n onGoToChat={onGoToChat}\n onStartDraw={onStartDraw}\n />\n\n <PreviewCollaborateSection\n canSubmitMergeRequest={canSubmitMergeRequest}\n incomingMergeRequests={incomingMergeRequests}\n outgoingMergeRequests={outgoingMergeRequests}\n creatorStatsById={creatorStatsById}\n processingMrId={processingMrId}\n isBuildingMrTest={isBuildingMrTest}\n testingMrId={testingMrId}\n toMergeRequestSummary={toMergeRequestSummary}\n onSubmitMergeRequest={onSubmitMergeRequest}\n onRequestApprove={onRequestApprove}\n onReject={onReject}\n onTestMr={onTestMr}\n />\n </PreviewPage>\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\nimport { BottomSheetScrollView } from '@gorhom/bottom-sheet';\n\nimport { useTheme } from '../../theme';\n\nexport type PreviewPageProps = {\n header?: React.ReactNode;\n children: React.ReactNode;\n contentStyle?: ViewStyle;\n};\n\nexport function PreviewPage({ header, children, contentStyle }: PreviewPageProps) {\n const theme = useTheme();\n\n return (\n <View style={{ flex: 1 }}>\n {header ? <View>{header}</View> : null}\n <BottomSheetScrollView\n style={{ flex: 1 }}\n contentContainerStyle={[\n {\n paddingHorizontal: theme.spacing.lg,\n paddingBottom: theme.spacing.xl,\n flexGrow: 1,\n },\n contentStyle,\n ]}\n >\n {children}\n </BottomSheetScrollView>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\n\nimport { StudioSheetHeader } from '../../../components/studio-sheet/StudioSheetHeader';\nimport { StudioSheetHeaderIconButton } from '../../../components/studio-sheet/StudioSheetHeaderIconButton';\nimport { IconChat, IconClose, IconHome } from '../../../components/icons/StudioIcons';\n\nexport type PreviewPanelHeaderProps = {\n isOwner: boolean;\n onClose: () => void;\n onNavigateHome?: () => void;\n onGoToChat: () => void;\n};\n\nexport function PreviewPanelHeader({ isOwner, onClose, onNavigateHome, onGoToChat }: PreviewPanelHeaderProps) {\n return (\n <StudioSheetHeader\n left={\n onNavigateHome ? (\n <StudioSheetHeaderIconButton onPress={onNavigateHome} accessibilityLabel=\"Home\" appearance=\"glass\" intent=\"primary\">\n <IconHome size={20} colorToken=\"onPrimary\" />\n </StudioSheetHeaderIconButton>\n ) : null\n }\n center={null}\n right={\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {isOwner ? (\n <StudioSheetHeaderIconButton\n onPress={onGoToChat}\n accessibilityLabel=\"Chat\"\n intent=\"primary\"\n appearance=\"glass\"\n style={{ marginRight: 8 }}\n >\n <IconChat size={20} colorToken=\"onPrimary\" />\n </StudioSheetHeaderIconButton>\n ) : null}\n <StudioSheetHeaderIconButton onPress={onClose} accessibilityLabel=\"Close\" appearance=\"glass\" intent=\"primary\">\n <IconClose size={20} colorToken=\"onPrimary\" />\n </StudioSheetHeaderIconButton>\n </View>\n }\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\n\nexport type StudioSheetHeaderProps = {\n left?: React.ReactNode;\n right?: React.ReactNode;\n center?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function StudioSheetHeader({ left, center, right, style }: StudioSheetHeaderProps) {\n const theme = useTheme();\n return (\n <View\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: theme.spacing.lg,\n paddingBottom: theme.spacing.sm,\n },\n style,\n ]}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>{left}</View>\n <View style={{ flex: 1, alignItems: 'center' }}>{center}</View>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>{right}</View>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\n\nimport { useTheme } from '../../theme';\n\nexport type StudioSheetHeaderIconButtonProps = {\n onPress: () => void;\n disabled?: boolean;\n children: React.ReactNode;\n style?: ViewStyle;\n accessibilityLabel?: string;\n intent?: 'neutral' | 'primary' | 'danger';\n appearance?: 'glass' | 'solid';\n};\n\nexport function StudioSheetHeaderIconButton({\n onPress,\n disabled,\n children,\n style,\n accessibilityLabel,\n intent = 'neutral',\n appearance = 'solid',\n}: StudioSheetHeaderIconButtonProps) {\n const theme = useTheme();\n const size = 44;\n const [pressed, setPressed] = React.useState(false);\n\n const solidBg =\n intent === 'danger'\n ? theme.colors.danger\n : intent === 'primary'\n ? theme.colors.primary\n : theme.colors.neutral;\n\n const glassFallbackBg = theme.scheme === 'dark' ? '#18181B' : '#F6F6F6';\n const glassInnerBg = intent === 'danger' ? theme.colors.danger : theme.colors.primary;\n\n const resolvedOpacity = disabled ? 0.6 : pressed ? 0.9 : 1;\n\n return (\n <View style={style}>\n {appearance === 'glass' ? (\n <LiquidGlassView\n style={[{ borderRadius: 100 }, !isLiquidGlassSupported && { backgroundColor: glassFallbackBg }]}\n interactive\n effect=\"clear\"\n >\n <View\n style={{\n width: size,\n height: size,\n borderRadius: 100,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: glassInnerBg,\n opacity: resolvedOpacity,\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={disabled}\n onPress={onPress}\n onPressIn={() => {\n if (!disabled) setPressed(true);\n }}\n onPressOut={() => setPressed(false)}\n hitSlop={8}\n style={{ flex: 1, alignItems: 'center', justifyContent: 'center', width: '100%' }}\n >\n {children}\n </Pressable>\n </View>\n </LiquidGlassView>\n ) : (\n <View\n style={{\n width: size,\n height: size,\n borderRadius: 100,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: solidBg,\n opacity: resolvedOpacity,\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={disabled}\n onPress={onPress}\n onPressIn={() => {\n if (!disabled) setPressed(true);\n }}\n onPressOut={() => setPressed(false)}\n hitSlop={8}\n style={{ flex: 1, alignItems: 'center', justifyContent: 'center', width: '100%' }}\n >\n {children}\n </Pressable>\n </View>\n )}\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Card } from '../primitives/Card';\n\nexport type PreviewHeroCardProps = {\n aspectRatio?: number;\n overlayTopLeft?: React.ReactNode;\n background?: React.ReactNode;\n image?: React.ReactNode;\n overlayBottom?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function PreviewHeroCard({\n aspectRatio = 4 / 3,\n overlayTopLeft,\n background,\n image,\n overlayBottom,\n style,\n}: PreviewHeroCardProps) {\n const theme = useTheme();\n const radius = 16;\n\n return (\n <Card\n variant=\"surfaceRaised\"\n padded={false}\n border={false}\n style={[\n {\n width: '100%',\n aspectRatio,\n borderRadius: radius,\n overflow: 'hidden',\n },\n style,\n ]}\n >\n <View style={{ flex: 1 }}>\n {background ? <View style={{ position: 'absolute', inset: 0 }}>{background}</View> : null}\n {image ? <View style={{ position: 'absolute', inset: 0 }}>{image}</View> : null}\n\n {overlayTopLeft ? (\n <View style={{ position: 'absolute', top: theme.spacing.sm, left: theme.spacing.sm, zIndex: 2 }}>\n {overlayTopLeft}\n </View>\n ) : null}\n\n {overlayBottom ? <View style={{ flex: 1, justifyContent: 'flex-end' }}>{overlayBottom}</View> : null}\n </View>\n </Card>\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewProps, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport type { SurfaceVariant, WithStyle } from './types';\n\nexport type SurfaceProps = ViewProps &\n WithStyle<ViewStyle> & {\n variant?: SurfaceVariant;\n border?: boolean;\n };\n\nfunction backgroundFor(variant: SurfaceVariant, theme: ReturnType<typeof useTheme>): string {\n const { colors } = theme;\n switch (variant) {\n case 'background':\n return colors.background;\n case 'surfaceRaised':\n return colors.surfaceRaised;\n case 'floating':\n return colors.floatingSurface;\n case 'surface':\n default:\n return colors.surface;\n }\n}\n\nexport function Surface({ variant = 'surface', border = false, style, ...props }: SurfaceProps) {\n const theme = useTheme();\n return (\n <View\n {...props}\n style={[\n { backgroundColor: backgroundFor(variant, theme) },\n border ? { borderWidth: 1, borderColor: theme.colors.border } : null,\n style,\n ]}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { type ViewProps, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Surface } from './Surface';\nimport type { CardVariant, WithStyle } from './types';\n\nexport type CardProps = ViewProps &\n WithStyle<ViewStyle> & {\n variant?: CardVariant;\n padded?: boolean;\n border?: boolean;\n };\n\nexport function Card({ variant = 'surface', padded = true, border = true, style, ...props }: CardProps) {\n const theme = useTheme();\n const radius = theme.radii.lg;\n const padding = padded ? theme.spacing.lg : 0;\n\n return (\n <Surface\n {...props}\n variant={variant === 'surfaceRaised' ? 'surfaceRaised' : 'surface'}\n border={border}\n style={[{ borderRadius: radius, padding }, style]}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { Animated, type ViewStyle } from 'react-native';\nimport { LinearGradient } from 'expo-linear-gradient';\n\nexport type PreviewPlaceholderProps = {\n visible: boolean;\n style?: ViewStyle;\n};\n\nexport function PreviewPlaceholder({ visible, style }: PreviewPlaceholderProps) {\n if (!visible) return null;\n\n const opacityAnim = React.useRef(new Animated.Value(0)).current;\n\n React.useEffect(() => {\n if (!visible) return;\n const animation = Animated.loop(\n Animated.sequence([\n Animated.timing(opacityAnim, { toValue: 1, duration: 1500, useNativeDriver: true }),\n Animated.timing(opacityAnim, { toValue: 2, duration: 1500, useNativeDriver: true }),\n Animated.timing(opacityAnim, { toValue: 3, duration: 1500, useNativeDriver: true }),\n Animated.timing(opacityAnim, { toValue: 0, duration: 1500, useNativeDriver: true }),\n ])\n );\n animation.start();\n return () => animation.stop();\n }, [opacityAnim, visible]);\n\n const opacity1 = opacityAnim.interpolate({ inputRange: [0, 1, 2, 3], outputRange: [1, 0, 0, 0.3] });\n const opacity2 = opacityAnim.interpolate({ inputRange: [0, 1, 2, 3], outputRange: [0, 1, 0, 0] });\n const opacity3 = opacityAnim.interpolate({ inputRange: [0, 1, 2, 3], outputRange: [0, 0, 1, 0] });\n const opacity4 = opacityAnim.interpolate({ inputRange: [0, 1, 2, 3], outputRange: [0, 0, 0, 1] });\n\n return (\n <>\n <Animated.View style={[{ position: 'absolute', inset: 0, opacity: opacity1 }, style]}>\n <LinearGradient\n colors={['rgba(98, 0, 238, 0.45)', 'rgba(168, 85, 247, 0.35)']}\n start={{ x: 0, y: 0 }}\n end={{ x: 1, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </Animated.View>\n <Animated.View style={[{ position: 'absolute', inset: 0, opacity: opacity2 }, style]}>\n <LinearGradient\n colors={['rgba(168, 85, 247, 0.45)', 'rgba(139, 92, 246, 0.35)']}\n start={{ x: 1, y: 0 }}\n end={{ x: 0, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </Animated.View>\n <Animated.View style={[{ position: 'absolute', inset: 0, opacity: opacity3 }, style]}>\n <LinearGradient\n colors={['rgba(139, 92, 246, 0.45)', 'rgba(126, 34, 206, 0.35)']}\n start={{ x: 0, y: 1 }}\n end={{ x: 1, y: 0 }}\n style={{ width: '100%', height: '100%' }}\n />\n </Animated.View>\n <Animated.View style={[{ position: 'absolute', inset: 0, opacity: opacity4 }, style]}>\n <LinearGradient\n colors={['rgba(126, 34, 206, 0.45)', 'rgba(98, 0, 238, 0.35)']}\n start={{ x: 0.5, y: 0 }}\n end={{ x: 0.5, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </Animated.View>\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { Image, type ImageStyle } from 'react-native';\n\nexport type PreviewImageProps = {\n uri?: string | null;\n onLoad?: () => void;\n style?: ImageStyle;\n};\n\nexport function PreviewImage({ uri, onLoad, style }: PreviewImageProps) {\n if (!uri) return null;\n return (\n <Image\n source={{ uri }}\n resizeMode=\"cover\"\n onLoad={onLoad}\n style={[{ width: '100%', height: '100%' }, style]}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\nimport { Heart, MessageCircle } from 'lucide-react-native';\n\nimport { useTheme } from '../../theme';\nimport { Text } from '../primitives/Text';\nimport { MergeIcon } from '../icons/MergeIcon';\n\nexport type StatsBarProps = {\n likeCount: number;\n commentCount: number;\n forkCount: number;\n isLiked?: boolean;\n onPressLike?: () => void;\n onPressComments?: () => void;\n style?: ViewStyle;\n centered?: boolean;\n fixedWidth?: number;\n};\n\nexport function StatsBar({\n likeCount,\n commentCount,\n forkCount,\n isLiked = false,\n onPressLike,\n onPressComments,\n style,\n centered = false,\n fixedWidth,\n}: StatsBarProps) {\n const theme = useTheme();\n const statsBgColor = theme.scheme === 'dark' ? 'rgba(24, 24, 27, 0.5)' : 'rgba(255, 255, 255, 0.5)';\n\n return (\n <View\n style={[\n { position: 'absolute', bottom: 12, width: '100%', paddingHorizontal: 12 },\n centered && { alignItems: 'center' },\n style,\n ]}\n >\n <LiquidGlassView\n style={[\n { borderRadius: 100, overflow: 'hidden' },\n fixedWidth ? { width: fixedWidth } : undefined,\n !isLiquidGlassSupported && { backgroundColor: statsBgColor },\n ]}\n effect=\"clear\"\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingHorizontal: 16 }}>\n <Pressable\n disabled={!onPressLike}\n onPress={onPressLike}\n hitSlop={8}\n style={{ paddingVertical: 8 }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <Heart\n size={16}\n strokeWidth={2.5}\n color={isLiked ? theme.colors.danger : '#FFFFFF'}\n fill={isLiked ? theme.colors.danger : 'transparent'}\n />\n <View style={{ width: 4 }} />\n <Text\n variant=\"caption\"\n style={{\n color: isLiked ? theme.colors.danger : '#FFFFFF',\n fontWeight: theme.typography.fontWeight.bold,\n }}\n >\n {likeCount}\n </Text>\n </View>\n </Pressable>\n\n <Pressable\n disabled={!onPressComments}\n onPress={onPressComments}\n hitSlop={8}\n style={{ paddingVertical: 8 }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <MessageCircle size={16} strokeWidth={2.5} color=\"#FFFFFF\" />\n <View style={{ width: 4 }} />\n <Text variant=\"caption\" style={{ color: '#FFFFFF', fontWeight: theme.typography.fontWeight.bold }}>\n {commentCount}\n </Text>\n </View>\n </Pressable>\n\n <View style={{ flexDirection: 'row', alignItems: 'center', paddingVertical: 8 }}>\n <View style={{ transform: [{ scaleY: -1 }] }}>\n <MergeIcon width={14} height={14} color=\"#FFFFFF\" />\n </View>\n <View style={{ width: 4 }} />\n <Text variant=\"caption\" style={{ color: '#FFFFFF', fontWeight: theme.typography.fontWeight.bold }}>\n {forkCount}\n </Text>\n </View>\n </View>\n </LiquidGlassView>\n </View>\n );\n}\n\n\n","import Svg, { Path, type SvgProps } from 'react-native-svg';\n\nexport function MergeIcon({ color = 'currentColor', width = 24, height = 24, ...props }: SvgProps) {\n return (\n <Svg viewBox=\"0 0 486 486\" width={width} height={height} {...props}>\n <Path\n d=\"M237.025 0H243.664C254.876 95.0361 275.236 175.597 304.743 241.684C334.249 307.478 367.002 357.774 403 392.572L389.722 486C361.691 458.22 338.233 429.417 319.349 399.59C300.464 369.764 284.531 335.843 271.548 297.829C258.565 259.522 246.615 214.343 235.697 162.292L237.91 161.415C228.468 214.928 217.993 261.569 206.485 301.338C194.978 341.107 179.634 375.904 160.455 405.731C141.571 435.265 115.752 462.022 83 486L96.278 392.572C124.014 369.179 147.62 336.72 167.094 295.197C186.864 253.381 202.65 206.886 214.452 155.713C226.255 104.247 233.779 52.343 237.025 0Z\"\n fill={color}\n />\n </Svg>\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\nimport {\n AlertTriangle,\n Archive,\n CheckCircle2,\n GitFork,\n GitMerge,\n Pencil,\n Sparkles,\n type LucideIcon,\n} from 'lucide-react-native';\n\nimport type { AppStatus } from '../../data/apps/types';\nimport { APP_STATUS_LABEL } from '../../data/apps/types';\nimport { Text } from '../primitives/Text';\n\nconst STATUS_BG: Record<AppStatus, string> = {\n ready: '#10B981', // emerald-500\n creating: '#3B82F6', // blue-500\n editing: '#F59E0B', // amber-500\n forking: '#8B5CF6', // violet-500\n merging: '#06B6D4', // cyan-500\n error: '#F43F5E', // rose-500\n archived: '#71717A', // zinc-500\n};\n\nconst STATUS_ICON: Record<AppStatus, LucideIcon> = {\n ready: CheckCircle2,\n creating: Sparkles,\n editing: Pencil,\n forking: GitFork,\n merging: GitMerge,\n error: AlertTriangle,\n archived: Archive,\n};\n\nexport type PreviewStatusBadgeProps = {\n status: AppStatus;\n};\n\nexport function PreviewStatusBadge({ status }: PreviewStatusBadgeProps) {\n const IconComp = STATUS_ICON[status];\n const label = APP_STATUS_LABEL[status] ?? status;\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 999,\n paddingHorizontal: 10,\n paddingVertical: 4,\n backgroundColor: STATUS_BG[status],\n }}\n >\n <IconComp size={12} color=\"#FFFFFF\" style={{ marginRight: 4 }} />\n <Text style={{ color: '#FFFFFF', fontSize: 11, lineHeight: 14 }}>{label}</Text>\n </View>\n );\n}\n\n\n","export type AppInsightsSummary = {\n totalDownloads: number;\n totalDownloadUsers: number;\n totalLikes: number;\n totalComments: number;\n totalRatings: number;\n averageRating: number | null;\n totalMergeRequests: number;\n totalForks: number;\n};\n\nexport type DownloadUserSummary = {\n userId: string;\n totalDownloads: number;\n lastDownloadAt: string | null;\n};\n\nexport type ForkEntry = {\n appId: string;\n userId: string;\n createdAt: string;\n};\n\nexport type MergeRequestEntry = {\n id: string;\n sourceAppId: string;\n createdBy: string;\n status: string;\n createdAt: string;\n};\n\nexport type LikeEntry = {\n userId: string;\n createdAt: string;\n};\n\nexport type CommentEntry = {\n id: string;\n userId: string;\n commentType: string;\n createdAt: string;\n};\n\nexport type RatingEntry = {\n userId: string;\n rating: number;\n createdAt: string;\n};\n\nexport type AppInsights = {\n downloads: {\n total: number;\n uniqueUsers: number;\n perUser: DownloadUserSummary[];\n };\n forks: {\n total: number;\n entries: ForkEntry[];\n };\n mergeRequests: {\n total: number;\n approved: number;\n merged: number;\n entries: MergeRequestEntry[];\n };\n likes: {\n total: number;\n entries: LikeEntry[];\n };\n comments: {\n total: number;\n entries: CommentEntry[];\n };\n ratings: {\n total: number;\n average: number | null;\n entries: RatingEntry[];\n };\n};\n\nexport const APP_METRIC_TYPES = [\n 'downloads',\n 'likes',\n 'comments',\n 'forks',\n 'mergeRequests',\n 'mergeRequestApprovals',\n] as const;\n\nexport type AppMetricType = (typeof APP_METRIC_TYPES)[number];\n\nexport const APP_ANALYTIC_INTERVALS = ['day', 'hour'] as const;\n\nexport type AppAnalyticsInterval = (typeof APP_ANALYTIC_INTERVALS)[number];\n\nexport type AppAnalyticsParams = {\n type: AppMetricType;\n startDate: string;\n endDate: string;\n interval?: AppAnalyticsInterval;\n};\n\nexport type AppAnalyticsPoint = {\n date: string;\n value: number;\n};\n\nexport type App = {\n id: string;\n name: string;\n description: string | null;\n appleAppStoreCategory: string | null;\n googlePlayCategory: string | null;\n pgRating: string | null;\n projectId: string;\n platform: string | null;\n isPublic: boolean;\n isLiked?: boolean;\n createdBy: string;\n status: 'ready' | 'creating' | 'editing' | 'forking' | 'merging' | 'error' | 'archived';\n statusError: string | null;\n statusChangedAt: string | null;\n headCommitId: string | null;\n forkedFromCommitId: string | null;\n forkedFromAppId: string | null;\n threadId: string | null;\n createdAt: string;\n updatedAt: string;\n insights?: AppInsightsSummary | null;\n};\n\nexport type AppStatus = App['status'];\n\nexport type ForkAppRequest = {\n name?: string;\n platform?: string;\n forkedFromCommitId?: string;\n};\n\nexport type ImportGithubAppRequest = {\n repoFullName: string;\n branch?: string;\n path?: string;\n appName?: string;\n threadId?: string;\n};\n\nexport type ImportGithubAppResponse = {\n appId: string;\n projectId: string;\n threadId: string;\n};\n\nexport type ListPublicAppsParams = {\n limit?: number;\n offset?: number;\n q?: string;\n};\n\nexport type ListAppsSummaryParams = ListPublicAppsParams & {\n projectId?: string;\n};\n\nexport type AppsSummary = {\n mine: App[];\n public: App[];\n pagination: {\n limit: number;\n offset: number;\n q: string | null;\n };\n};\n\nexport type ListLikedAppsParams = {\n limit?: number;\n offset?: number;\n};\n\nexport type LikedAppListItem = {\n likeId: string;\n appId: string;\n likedAt: string;\n app: App;\n};\n\nexport type LikedAppsList = {\n items: LikedAppListItem[];\n pageInfo: {\n limit: number;\n offset: number;\n total: number;\n hasMore: boolean;\n };\n};\n\nexport const APP_STATUS_LABEL: Record<AppStatus, string> = {\n ready: 'Ready',\n creating: 'Creating',\n editing: 'Editing',\n forking: 'Forking',\n merging: 'Merging',\n error: 'Error',\n archived: 'Archived',\n};\n\n\n","import * as React from 'react';\n\nimport type { App } from '../../../data/apps/types';\nimport { PreviewHeroCard } from '../../../components/preview/PreviewHeroCard';\nimport { PreviewPlaceholder } from '../../../components/preview/PreviewPlaceholder';\nimport { PreviewImage } from '../../../components/preview/PreviewImage';\nimport { StatsBar } from '../../../components/preview/StatsBar';\nimport { PreviewStatusBadge } from '../../../components/preview/PreviewStatusBadge';\n\nexport type PreviewHeroSectionProps = {\n appStatus: App['status'];\n showProcessing: boolean;\n imageUrl: string | null;\n imageLoaded: boolean;\n onImageLoad: () => void;\n stats: {\n likeCount: number;\n commentCount: number;\n forkCount: number;\n isLiked: boolean;\n handleLike: () => Promise<void> | void;\n handleOpenComments: () => void;\n };\n};\n\nexport function PreviewHeroSection({\n appStatus,\n showProcessing,\n imageUrl,\n imageLoaded,\n onImageLoad,\n stats,\n}: PreviewHeroSectionProps) {\n return (\n <PreviewHeroCard\n overlayTopLeft={showProcessing ? <PreviewStatusBadge status={appStatus} /> : null}\n background={<PreviewPlaceholder visible={!imageLoaded} />}\n image={<PreviewImage uri={imageUrl} onLoad={onImageLoad} />}\n overlayBottom={\n <StatsBar\n likeCount={stats.likeCount}\n commentCount={stats.commentCount}\n forkCount={stats.forkCount}\n isLiked={stats.isLiked}\n onPressLike={() => void stats.handleLike()}\n onPressComments={stats.handleOpenComments}\n centered\n fixedWidth={160}\n />\n }\n style={{ marginBottom: 16 }}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\n\nimport type { App } from '../../../data/apps/types';\nimport { PreviewMetaRow } from '../../../components/preview/PreviewMetaRow';\nimport { Text } from '../../../components/primitives/Text';\nimport { IconPlay } from '../../../components/icons/StudioIcons';\nimport { withAlpha } from '../../../components/utils/color';\nimport { useTheme } from '../../../theme';\nimport { formatCount } from './utils';\n\nexport type PreviewMetaSectionProps = {\n app: App;\n isOwner: boolean;\n creator: { name: string | null; avatar: string | null } | null;\n downloadsCount?: number;\n};\n\nexport function PreviewMetaSection({ app, isOwner, creator, downloadsCount }: PreviewMetaSectionProps) {\n const theme = useTheme();\n\n return (\n <PreviewMetaRow\n title={app.name}\n subtitle={app.description}\n avatarUri={creator?.avatar ?? null}\n creatorName={creator?.name ?? null}\n tag={\n isOwner || app.forkedFromAppId ? (\n <View style={{ paddingHorizontal: 8, paddingVertical: 2, borderRadius: 999, backgroundColor: '#3700B3' }}>\n <Text variant=\"caption\" style={{ color: '#fff', fontWeight: theme.typography.fontWeight.semibold }}>\n {app.forkedFromAppId ? 'Remix' : 'Owner'}\n </Text>\n </View>\n ) : null\n }\n rightMetric={\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 6,\n paddingVertical: 2,\n borderRadius: 6,\n backgroundColor: withAlpha(theme.colors.neutral, 0.3),\n }}\n >\n <Text\n style={{\n marginRight: 2,\n color: theme.colors.textMuted,\n fontSize: 14,\n lineHeight: 18,\n fontWeight: theme.typography.fontWeight.bold,\n }}\n >\n {formatCount(downloadsCount ?? app.insights?.totalDownloads ?? 0)}\n </Text>\n <IconPlay size={14} colorToken=\"textMuted\" fill={theme.colors.textMuted} />\n </View>\n }\n style={{ marginBottom: 16 }}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Avatar } from '../primitives/Avatar';\nimport { Text } from '../primitives/Text';\n\nexport type PreviewMetaRowProps = {\n avatarUri?: string | null;\n creatorName?: string | null;\n title: string;\n subtitle?: string | null;\n tag?: React.ReactNode;\n rightMetric?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function PreviewMetaRow({\n avatarUri,\n creatorName,\n title,\n subtitle,\n tag,\n rightMetric,\n style,\n}: PreviewMetaRowProps) {\n const theme = useTheme();\n\n return (\n <View style={[{ alignSelf: 'stretch' }, style]}>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <Avatar uri={avatarUri} name={creatorName} size={24} style={{ marginRight: theme.spacing.sm }} />\n\n <View style={{ flexDirection: 'row', alignItems: 'center', flex: 1, minWidth: 0, marginRight: theme.spacing.sm }}>\n <Text\n numberOfLines={1}\n style={{\n flexShrink: 1,\n color: theme.colors.text,\n fontSize: 16,\n lineHeight: 20,\n fontWeight: theme.typography.fontWeight.semibold,\n }}\n >\n {title}\n </Text>\n {tag ? <View style={{ marginLeft: theme.spacing.sm }}>{tag}</View> : null}\n </View>\n\n {rightMetric ? <View>{rightMetric}</View> : null}\n </View>\n\n {subtitle ? (\n <Text\n numberOfLines={2}\n style={{\n marginTop: theme.spacing.sm,\n color: theme.colors.textMuted,\n fontSize: 14,\n lineHeight: 18,\n }}\n >\n {subtitle}\n </Text>\n ) : null}\n </View>\n );\n}\n\n\n","import type { App } from '../../../data/apps/types';\n\nexport function formatCount(n: number): string {\n if (n < 10_000) return n.toLocaleString();\n if (n < 1_000_000) return `${Math.floor(n / 1_000)}k`;\n return `${Math.floor(n / 1_000_000)}m`;\n}\n\nexport function statusDescription(status: App['status'], statusError: string | null): string {\n switch (status) {\n case 'editing':\n return 'Changes are being applied';\n case 'creating':\n return 'Your app is being created';\n case 'forking':\n return 'Creating your copy';\n case 'merging':\n return 'Merging changes from contributor';\n case 'archived':\n return 'This app has been archived';\n case 'error':\n return statusError ?? 'Something went wrong';\n case 'ready':\n default:\n return '';\n }\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, View } from 'react-native';\n\nimport type { App } from '../../../data/apps/types';\nimport { Text } from '../../../components/primitives/Text';\nimport { IconChat, IconChevronRight, IconDraw } from '../../../components/icons/StudioIcons';\nimport { withAlpha } from '../../../components/utils/color';\nimport { useTheme } from '../../../theme';\nimport { PressableCardRow } from './PressableCardRow';\nimport { SectionTitle } from './SectionTitle';\nimport { statusDescription } from './utils';\n\nexport type PreviewCustomizeSectionProps = {\n app: App;\n isOwner: boolean;\n shouldForkOnEdit: boolean;\n showProcessing: boolean;\n onGoToChat: () => void;\n onStartDraw?: () => void;\n};\n\nexport function PreviewCustomizeSection({\n app,\n isOwner,\n shouldForkOnEdit,\n showProcessing,\n onGoToChat,\n onStartDraw,\n}: PreviewCustomizeSectionProps) {\n const theme = useTheme();\n\n return (\n <>\n <SectionTitle>Customize</SectionTitle>\n\n {showProcessing ? (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: theme.spacing.lg,\n borderRadius: theme.radii.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha(theme.colors.warning, 0.2),\n marginBottom: theme.spacing.sm,\n }}\n >\n <View\n style={{\n width: 40,\n height: 40,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: withAlpha(theme.colors.warning, 0.1),\n marginRight: theme.spacing.lg,\n }}\n >\n <ActivityIndicator color={theme.colors.warning} size=\"small\" />\n </View>\n <View style={{ flex: 1, minWidth: 0 }}>\n <Text style={{ color: theme.colors.text, fontSize: 16, lineHeight: 20, fontWeight: theme.typography.fontWeight.semibold }}>\n {app.status === 'error' ? 'Error' : 'Processing'}\n </Text>\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginTop: 2 }}>\n {statusDescription(app.status, app.statusError)}\n </Text>\n </View>\n </View>\n ) : null}\n\n <PressableCardRow\n accessibilityLabel={isOwner ? 'Edit app' : 'Remix app'}\n onPress={onGoToChat}\n style={{\n padding: theme.spacing.lg,\n borderRadius: theme.radii.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha(theme.colors.primary, 0.1),\n marginBottom: theme.spacing.sm,\n }}\n left={\n <View\n style={{\n width: 40,\n height: 40,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: withAlpha(theme.colors.primary, 0.1),\n marginRight: theme.spacing.lg,\n }}\n >\n <IconChat size={20} colorToken=\"primary\" />\n </View>\n }\n title={\n <Text style={{ color: theme.colors.text, fontSize: 16, lineHeight: 20, fontWeight: theme.typography.fontWeight.semibold }}>\n {isOwner ? (app.forkedFromAppId ? 'Edit your Remix' : 'Edit Your App') : 'Remix App'}\n </Text>\n }\n subtitle={\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginTop: 2 }}>\n {isOwner && app.forkedFromAppId\n ? 'Make changes to your remix with chat'\n : shouldForkOnEdit\n ? 'Chat to create your own copy and edit it'\n : 'Chat to apply changes'}\n </Text>\n }\n right={<IconChevronRight size={20} colorToken=\"textMuted\" />}\n />\n\n {isOwner && onStartDraw ? (\n <PressableCardRow\n accessibilityLabel=\"Draw changes\"\n onPress={onStartDraw}\n style={{\n padding: theme.spacing.lg,\n borderRadius: theme.radii.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha(theme.colors.danger, 0.1),\n marginBottom: theme.spacing.sm,\n }}\n left={\n <View\n style={{\n width: 40,\n height: 40,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: withAlpha(theme.colors.danger, 0.1),\n marginRight: theme.spacing.lg,\n }}\n >\n <IconDraw size={20} colorToken=\"danger\" />\n </View>\n }\n title={\n <Text style={{ color: theme.colors.text, fontSize: 16, lineHeight: 20, fontWeight: theme.typography.fontWeight.semibold }}>\n Draw Changes\n </Text>\n }\n subtitle={\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginTop: 2 }}>\n Annotate the app with drawings\n </Text>\n }\n right={<IconChevronRight size={20} colorToken=\"textMuted\" />}\n />\n ) : null}\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\n\nimport { Card } from '../../../components/primitives/Card';\n\nexport type PressableCardRowProps = {\n accessibilityLabel: string;\n onPress: () => void;\n disabled?: boolean;\n left: React.ReactNode;\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n right?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function PressableCardRow({\n accessibilityLabel,\n onPress,\n disabled,\n left,\n title,\n subtitle,\n right,\n style,\n}: PressableCardRowProps) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={disabled}\n onPress={onPress}\n style={({ pressed }) => ({ opacity: disabled ? 0.6 : pressed ? 0.85 : 1 })}\n >\n <Card padded={false} border={false} style={style}>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {left}\n <View style={{ flex: 1, minWidth: 0 }}>\n {title}\n {subtitle ? subtitle : null}\n </View>\n {right ? <View style={{ marginLeft: 16 }}>{right}</View> : null}\n </View>\n </Card>\n </Pressable>\n );\n}\n\n\n","import * as React from 'react';\n\nimport { Text } from '../../../components/primitives/Text';\nimport { useTheme } from '../../../theme';\n\nexport type SectionTitleProps = {\n children: string;\n marginTop?: number;\n};\n\nexport function SectionTitle({ children, marginTop }: SectionTitleProps) {\n const theme = useTheme();\n return (\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: 12,\n lineHeight: 16,\n textTransform: 'uppercase',\n letterSpacing: 0.8,\n marginTop: marginTop ?? theme.spacing.sm,\n marginBottom: theme.spacing.sm,\n fontWeight: theme.typography.fontWeight.bold,\n }}\n >\n {children}\n </Text>\n );\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, Alert, View } from 'react-native';\nimport { Send } from 'lucide-react-native';\n\nimport type { MergeRequest } from '../../../data/merge-requests/types';\nimport type { UserStats } from '../../../data/users/types';\nimport { MergeRequestStatusCard } from '../../../components/merge-requests/MergeRequestStatusCard';\nimport { ReviewMergeRequestCarousel } from '../../../components/merge-requests/ReviewMergeRequestCarousel';\nimport { Text } from '../../../components/primitives/Text';\nimport { withAlpha } from '../../../components/utils/color';\nimport { useTheme } from '../../../theme';\nimport { PressableCardRow } from './PressableCardRow';\nimport { SectionTitle } from './SectionTitle';\n\nimport { MergeIcon } from '../../../components/icons/MergeIcon';\n\nexport type PreviewCollaborateSectionProps = {\n canSubmitMergeRequest: boolean;\n incomingMergeRequests: MergeRequest[];\n outgoingMergeRequests: MergeRequest[];\n creatorStatsById: Record<string, UserStats>;\n processingMrId?: string | null;\n isBuildingMrTest?: boolean;\n testingMrId?: string | null;\n toMergeRequestSummary: (mr: MergeRequest) => import('../../../components/models/types').MergeRequestSummary;\n onSubmitMergeRequest?: () => void | Promise<void>;\n onRequestApprove?: (mr: MergeRequest) => void;\n onReject?: (mr: MergeRequest) => void | Promise<void>;\n onTestMr?: (mr: MergeRequest) => void | Promise<void>;\n};\n\nexport function PreviewCollaborateSection({\n canSubmitMergeRequest,\n incomingMergeRequests,\n outgoingMergeRequests,\n creatorStatsById,\n processingMrId,\n isBuildingMrTest,\n testingMrId,\n toMergeRequestSummary,\n onSubmitMergeRequest,\n onRequestApprove,\n onReject,\n onTestMr,\n}: PreviewCollaborateSectionProps) {\n const theme = useTheme();\n const [submittingMr, setSubmittingMr] = React.useState(false);\n\n const hasSection = canSubmitMergeRequest || incomingMergeRequests.length > 0 || outgoingMergeRequests.length > 0;\n if (!hasSection) return null;\n\n const showActionsSubtitle = (canSubmitMergeRequest && onSubmitMergeRequest) || (onTestMr && incomingMergeRequests.length > 0);\n\n return (\n <>\n <SectionTitle marginTop={theme.spacing.xl}>Collaborate</SectionTitle>\n\n {showActionsSubtitle ? (\n <Text\n style={{\n color: withAlpha(theme.colors.textMuted, 0.7),\n fontSize: 10,\n lineHeight: 14,\n textTransform: 'uppercase',\n letterSpacing: 0.8,\n marginBottom: theme.spacing.sm,\n fontWeight: theme.typography.fontWeight.semibold,\n }}\n >\n Actions\n </Text>\n ) : null}\n\n {canSubmitMergeRequest && onSubmitMergeRequest ? (\n <PressableCardRow\n accessibilityLabel=\"Submit merge request\"\n disabled={submittingMr}\n onPress={() => {\n Alert.alert(\n 'Submit Merge Request',\n 'Are you sure you want to submit your changes to the original app?',\n [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Submit',\n style: 'destructive',\n onPress: () => {\n setSubmittingMr(true);\n Promise.resolve(onSubmitMergeRequest())\n .catch(() => {})\n .finally(() => setSubmittingMr(false));\n },\n },\n ]\n );\n }}\n style={{\n padding: theme.spacing.lg,\n borderRadius: theme.radii.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha('#03DAC6', 0.2),\n marginBottom: theme.spacing.sm,\n }}\n left={\n <View\n style={{\n width: 40,\n height: 40,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: withAlpha('#03DAC6', 0.1),\n marginRight: theme.spacing.lg,\n }}\n >\n {submittingMr ? <ActivityIndicator color=\"#03DAC6\" size=\"small\" /> : <MergeIcon width={20} height={20} color=\"#03DAC6\" />}\n </View>\n }\n title={\n <Text style={{ color: theme.colors.text, fontSize: 16, lineHeight: 20, fontWeight: theme.typography.fontWeight.semibold }}>\n Submit your new changes\n </Text>\n }\n subtitle={\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginTop: 2 }}>\n Ask to merge this remix to the original app\n </Text>\n }\n right={<Send size={16} color=\"#03DAC6\" />}\n />\n ) : null}\n\n {onTestMr && incomingMergeRequests.length > 0 ? (\n <ReviewMergeRequestCarousel\n mergeRequests={incomingMergeRequests}\n creatorStatsById={creatorStatsById}\n processingMrId={processingMrId}\n isBuilding={Boolean(isBuildingMrTest)}\n testingMrId={testingMrId}\n onReject={(mr) => (onReject ? onReject(mr) : undefined)}\n onApprove={(mr) => onRequestApprove?.(mr)}\n onTest={(mr) => (onTestMr ? onTestMr(mr) : undefined)}\n />\n ) : null}\n\n {outgoingMergeRequests.length > 0 ? (\n <>\n <Text\n style={{\n color: withAlpha(theme.colors.textMuted, 0.7),\n fontSize: 10,\n lineHeight: 14,\n textTransform: 'uppercase',\n letterSpacing: 0.8,\n marginTop: theme.spacing.lg,\n marginBottom: theme.spacing.sm,\n fontWeight: theme.typography.fontWeight.semibold,\n }}\n >\n History\n </Text>\n {outgoingMergeRequests.map((mr) => (\n <View key={mr.id} style={{ marginBottom: theme.spacing.sm }}>\n <MergeRequestStatusCard mergeRequest={toMergeRequestSummary(mr)} />\n </View>\n ))}\n </>\n ) : null}\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { Animated, Pressable, View, type ViewStyle } from 'react-native';\nimport { Ban, Check, CheckCheck, ChevronDown } from 'lucide-react-native';\n\nimport type { MergeRequestSummary } from '../models/types';\nimport { useTheme } from '../../theme';\nimport { withAlpha } from '../utils/color';\nimport { Card } from '../primitives/Card';\nimport { MarkdownText } from '../primitives/MarkdownText';\nimport { Text } from '../primitives/Text';\nimport { formatTimeAgo } from '../utils/formatTimeAgo';\nimport { getMergeRequestStatusDisplay } from './mergeRequestStatusDisplay';\nimport { toIsoString } from './toIsoString';\nimport { useControlledExpansion } from './useControlledExpansion';\n\nexport type MergeRequestStatusCardProps = {\n mergeRequest: MergeRequestSummary;\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n headerRight?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function MergeRequestStatusCard({\n mergeRequest,\n expanded: expandedProp,\n onExpandedChange,\n headerRight,\n style,\n}: MergeRequestStatusCardProps) {\n const theme = useTheme();\n const { expanded, setExpanded } = useControlledExpansion({ expanded: expandedProp, onExpandedChange });\n const isDark = theme.scheme === 'dark';\n const textColor = isDark ? '#FFFFFF' : '#000000';\n const subTextColor = isDark ? '#A1A1AA' : '#71717A';\n const status = React.useMemo(() => getMergeRequestStatusDisplay(String(mergeRequest.status)), [mergeRequest.status]);\n\n const { StatusIcon, iconColor, bgColor, statusText } = React.useMemo(() => {\n switch (mergeRequest.status) {\n case 'approved':\n case 'merged':\n return {\n StatusIcon: CheckCheck,\n iconColor: '#10B981',\n bgColor: 'rgba(16, 185, 129, 0.1)',\n statusText: 'Edit approved by developer',\n };\n case 'rejected':\n return {\n StatusIcon: Ban,\n iconColor: '#F43F5E',\n bgColor: 'rgba(244, 63, 94, 0.1)',\n statusText: 'Edit rejected by developer',\n };\n case 'open':\n default:\n return {\n StatusIcon: Check,\n iconColor: '#FACC15',\n bgColor: 'rgba(250, 204, 21, 0.1)',\n statusText: 'Edit submitted to developer',\n };\n }\n }, [mergeRequest.status]);\n\n const updatedIso = toIsoString(mergeRequest.updatedAt ?? null) ?? toIsoString(mergeRequest.createdAt ?? null);\n const createdIso = toIsoString(mergeRequest.createdAt ?? null);\n const headerTimeAgo = updatedIso ? formatTimeAgo(updatedIso) : '';\n const createdTimeAgo = createdIso ? formatTimeAgo(createdIso) : '';\n\n const rotate = React.useRef(new Animated.Value(expanded ? 1 : 0)).current;\n React.useEffect(() => {\n Animated.timing(rotate, {\n toValue: expanded ? 1 : 0,\n duration: 200,\n useNativeDriver: true,\n }).start();\n }, [expanded, rotate]);\n\n return (\n <Pressable onPress={() => setExpanded(!expanded)} style={({ pressed }) => [{ opacity: pressed ? 0.95 : 1 }]}>\n <Card\n padded={false}\n border={false}\n style={[\n {\n padding: theme.spacing.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n } as any,\n style,\n ]}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: theme.spacing.lg }}>\n <View style={{ width: 40, height: 40, borderRadius: 999, alignItems: 'center', justifyContent: 'center', backgroundColor: bgColor }}>\n <StatusIcon size={20} color={iconColor} />\n </View>\n\n <View style={{ flex: 1, minWidth: 0 }}>\n <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }}>\n <Text\n style={{\n fontSize: 16,\n lineHeight: 20,\n fontWeight: theme.typography.fontWeight.semibold,\n color: theme.colors.text,\n flex: 1,\n }}\n numberOfLines={1}\n >\n {statusText}\n </Text>\n {headerTimeAgo ? (\n <Text style={{ fontSize: 10, lineHeight: 14, marginLeft: theme.spacing.sm, color: withAlpha(theme.colors.textMuted, 0.6) }}>\n {headerTimeAgo}\n </Text>\n ) : null}\n </View>\n\n <Text style={{ fontSize: 12, lineHeight: 16, color: theme.colors.textMuted }} numberOfLines={1}>\n {mergeRequest.title ?? 'Untitled merge request'}\n </Text>\n </View>\n\n {headerRight ? (\n <View>{headerRight}</View>\n ) : (\n <Animated.View\n style={{\n transform: [\n {\n rotate: rotate.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '180deg'] }),\n },\n ],\n }}\n >\n <ChevronDown size={20} color={withAlpha(theme.colors.textMuted, 0.4)} />\n </Animated.View>\n )}\n </View>\n\n {expanded ? (\n <View style={{ marginTop: 16, marginLeft: 56 }}>\n <Text\n style={{\n fontSize: 10,\n fontWeight: '700',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: status.color,\n marginBottom: 2,\n }}\n >\n {status.text}\n </Text>\n {createdTimeAgo ? (\n <Text\n style={{\n fontSize: 11,\n color: subTextColor,\n marginBottom: 8,\n }}\n >\n {createdTimeAgo}\n </Text>\n ) : null}\n\n <Text style={{ fontSize: 16, fontWeight: '600', color: textColor, marginBottom: 8 }}>\n {mergeRequest.title ?? 'Untitled merge request'}\n </Text>\n\n {mergeRequest.description ? <MarkdownText markdown={mergeRequest.description} variant=\"mergeRequest\" /> : null}\n </View>\n ) : null}\n </Card>\n </Pressable>\n );\n}\n\n\n","import { Platform, View, type ViewStyle } from 'react-native';\n\nimport Markdown from 'react-native-markdown-display';\n\nimport { useTheme } from '../../theme';\n\nexport type MarkdownTextVariant = 'chat' | 'mergeRequest';\n\nexport type MarkdownTextProps = {\n markdown: string;\n variant?: MarkdownTextVariant;\n /**\n * Optional override for the base text color (e.g. success/error outcomes in chat).\n */\n bodyColor?: string;\n style?: ViewStyle;\n};\n\nexport function MarkdownText({ markdown, variant = 'chat', bodyColor, style }: MarkdownTextProps) {\n const theme = useTheme();\n const isDark = theme.scheme === 'dark';\n\n const baseBodyColor = variant === 'mergeRequest' ? theme.colors.textMuted : theme.colors.text;\n const linkColor =\n variant === 'mergeRequest' ? (isDark ? theme.colors.primary : '#3700B3') : theme.colors.link;\n const linkWeight = variant === 'mergeRequest' ? theme.typography.fontWeight.semibold : undefined;\n\n const codeBgColor = isDark ? '#27272A' : '#E4E4E7';\n const codeTextColor = isDark ? '#FFFFFF' : theme.colors.text;\n\n const paragraphBottom = variant === 'mergeRequest' ? 8 : 6;\n const baseLineHeight = variant === 'mergeRequest' ? 22 : 20;\n\n return (\n <View style={style}>\n <Markdown\n style={{\n body: { color: bodyColor ?? baseBodyColor, fontSize: 14, lineHeight: baseLineHeight },\n paragraph: { marginTop: 0, marginBottom: paragraphBottom },\n link: { color: linkColor, fontWeight: linkWeight },\n code_inline: {\n backgroundColor: codeBgColor,\n color: codeTextColor,\n paddingHorizontal: variant === 'mergeRequest' ? 6 : 4,\n paddingVertical: variant === 'mergeRequest' ? 2 : 0,\n borderRadius: variant === 'mergeRequest' ? 6 : 4,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n fontSize: 13,\n },\n code_block: {\n backgroundColor: codeBgColor,\n color: codeTextColor,\n padding: variant === 'mergeRequest' ? 12 : 8,\n borderRadius: variant === 'mergeRequest' ? 8 : 6,\n marginVertical: variant === 'mergeRequest' ? 8 : 0,\n },\n fence: {\n backgroundColor: codeBgColor,\n color: codeTextColor,\n padding: variant === 'mergeRequest' ? 12 : 8,\n borderRadius: variant === 'mergeRequest' ? 8 : 6,\n marginVertical: variant === 'mergeRequest' ? 8 : 0,\n },\n }}\n >\n {markdown}\n </Markdown>\n </View>\n );\n}\n\n\n","export type MergeRequestStatusDisplay = {\n text: string;\n color: string;\n};\n\nexport function getMergeRequestStatusDisplay(status: string): MergeRequestStatusDisplay {\n switch (status) {\n case 'open':\n return { text: 'Merge request is pending approval', color: '#FACC15' };\n case 'approved':\n return { text: 'Merge approved', color: '#10B981' };\n case 'rejected':\n return { text: 'Merge request rejected', color: '#F43F5E' };\n case 'merged':\n return { text: 'Your edit was merged to the original app', color: '#10B981' };\n case 'closed':\n return { text: 'Merge closed', color: '#10B981' };\n default:\n return { text: status, color: '#898994' };\n }\n}\n\n\n","export function toIsoString(input: unknown): string | null {\n if (!input) return null;\n if (typeof input === 'string') return input;\n if (typeof input === 'number') return new Date(input).toISOString();\n if (input instanceof Date) return input.toISOString();\n return null;\n}\n\n\n","import * as React from 'react';\n\nexport function useControlledExpansion(props: { expanded?: boolean; onExpandedChange?: (expanded: boolean) => void }) {\n const [uncontrolled, setUncontrolled] = React.useState(false);\n const expanded = props.expanded ?? uncontrolled;\n const setExpanded = React.useCallback(\n (next: boolean) => {\n props.onExpandedChange?.(next);\n if (props.expanded === undefined) setUncontrolled(next);\n },\n [props]\n );\n return { expanded, setExpanded };\n}\n\n\n","import * as React from 'react';\nimport { Animated, FlatList, View, useWindowDimensions, type ViewStyle } from 'react-native';\n\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport type { UserStats } from '../../data/users/types';\nimport { useTheme } from '../../theme';\nimport { ReviewMergeRequestCard } from './ReviewMergeRequestCard';\n\nexport type ReviewMergeRequestCarouselProps = {\n mergeRequests: MergeRequest[];\n creatorStatsById: Record<string, UserStats>;\n processingMrId?: string | null;\n isBuilding?: boolean;\n testingMrId?: string | null;\n onReject: (mr: MergeRequest) => void | Promise<void>;\n onApprove: (mr: MergeRequest) => void;\n onTest: (mr: MergeRequest) => void | Promise<void>;\n style?: ViewStyle;\n};\n\ntype CardRenderItem = { mr: MergeRequest; index: number; total: number };\n\nexport function ReviewMergeRequestCarousel({\n mergeRequests,\n creatorStatsById,\n processingMrId,\n isBuilding,\n testingMrId,\n onReject,\n onApprove,\n onTest,\n style,\n}: ReviewMergeRequestCarouselProps) {\n const theme = useTheme();\n const { width } = useWindowDimensions();\n const [expanded, setExpanded] = React.useState<Record<string, boolean>>({});\n const carouselScrollX = React.useRef(new Animated.Value(0)).current;\n\n const peekAmount = 24;\n const gap = 16;\n const cardWidth = React.useMemo(() => Math.max(1, width - theme.spacing.lg * 2 - peekAmount), [peekAmount, theme.spacing.lg, width]);\n const snapInterval = cardWidth + gap;\n const dotColor = theme.scheme === 'dark' ? '#FFFFFF' : '#000000';\n\n if (mergeRequests.length === 0) return null;\n\n return (\n <View style={[{ marginHorizontal: -theme.spacing.lg }, style]}>\n <FlatList\n horizontal\n data={mergeRequests}\n keyExtractor={(mr) => mr.id}\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={{ paddingHorizontal: theme.spacing.lg, paddingVertical: theme.spacing.sm }}\n ItemSeparatorComponent={() => <View style={{ width: gap }} />}\n snapToAlignment=\"start\"\n decelerationRate=\"fast\"\n snapToInterval={snapInterval}\n disableIntervalMomentum\n style={{ paddingRight: peekAmount }}\n ListFooterComponent={<View style={{ width: peekAmount }} />}\n onScroll={Animated.event([{ nativeEvent: { contentOffset: { x: carouselScrollX } } }], {\n useNativeDriver: false,\n })}\n scrollEventThrottle={16}\n renderItem={({ item, index }) => {\n const total = mergeRequests.length;\n const creator = creatorStatsById[item.createdBy];\n const isExpanded = Boolean(expanded[item.id]);\n const isProcessing = Boolean(processingMrId && processingMrId === item.id);\n const isAnyProcessing = Boolean(processingMrId);\n const isTestingThis = Boolean(testingMrId && testingMrId === item.id);\n return (\n <View style={{ width: cardWidth }}>\n <ReviewMergeRequestCard\n mr={item}\n index={index}\n total={total}\n creator={creator}\n isExpanded={isExpanded}\n isProcessing={isProcessing}\n isAnyProcessing={isAnyProcessing}\n isBuilding={Boolean(isBuilding)}\n isTestingThis={isTestingThis}\n onToggle={() => setExpanded((prev) => ({ ...prev, [item.id]: !prev[item.id] }))}\n onReject={() => void onReject(item)}\n onApprove={() => onApprove(item)}\n onTest={() => void onTest(item)}\n />\n </View>\n );\n }}\n />\n\n {mergeRequests.length >= 1 ? (\n <View style={{ flexDirection: 'row', justifyContent: 'center', columnGap: 8, marginTop: theme.spacing.md }}>\n {mergeRequests.map((mr, index) => {\n const inputRange = [(index - 1) * snapInterval, index * snapInterval, (index + 1) * snapInterval];\n\n const scale = carouselScrollX.interpolate({\n inputRange,\n outputRange: [0.8, 1.2, 0.8],\n extrapolate: 'clamp',\n });\n\n const opacity = carouselScrollX.interpolate({\n inputRange,\n outputRange: [0.4, 1, 0.4],\n extrapolate: 'clamp',\n });\n\n return (\n <Animated.View\n key={mr.id}\n style={{\n width: 8,\n height: 8,\n borderRadius: 999,\n backgroundColor: dotColor,\n transform: [{ scale }],\n opacity,\n }}\n />\n );\n })}\n </View>\n ) : null}\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, Animated, Pressable, View } from 'react-native';\nimport { Check, ChevronDown, Play, X } from 'lucide-react-native';\n\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport type { UserStats } from '../../data/users/types';\nimport { useTheme } from '../../theme';\nimport { Avatar } from '../primitives/Avatar';\nimport { Card } from '../primitives/Card';\nimport { MarkdownText } from '../primitives/MarkdownText';\nimport { Text } from '../primitives/Text';\nimport { withAlpha } from '../utils/color';\nimport { getMergeRequestStatusDisplay } from './mergeRequestStatusDisplay';\nimport { ReviewMergeRequestActionButton } from './ReviewMergeRequestActionButton';\n\nexport type ReviewMergeRequestCardProps = {\n mr: MergeRequest;\n index: number;\n total: number;\n creator?: UserStats;\n isExpanded: boolean;\n isProcessing: boolean;\n isAnyProcessing: boolean;\n isBuilding: boolean;\n isTestingThis: boolean;\n onToggle: () => void;\n onReject: () => void;\n onApprove: () => void;\n onTest: () => void;\n};\n\nexport function ReviewMergeRequestCard({\n mr,\n index,\n total,\n creator,\n isExpanded,\n isProcessing,\n isAnyProcessing,\n isBuilding,\n isTestingThis,\n onToggle,\n onReject,\n onApprove,\n onTest,\n}: ReviewMergeRequestCardProps) {\n const theme = useTheme();\n const status = React.useMemo(() => getMergeRequestStatusDisplay(mr.status), [mr.status]);\n const canAct = mr.status === 'open';\n\n const rotate = React.useRef(new Animated.Value(isExpanded ? 1 : 0)).current;\n React.useEffect(() => {\n Animated.timing(rotate, { toValue: isExpanded ? 1 : 0, duration: 200, useNativeDriver: true }).start();\n }, [isExpanded, rotate]);\n\n const position = total > 1 ? `${index + 1}/${total}` : 'Merge request';\n\n return (\n <Pressable onPress={onToggle} style={({ pressed }) => ({ opacity: pressed ? 0.95 : 1 })}>\n <Card\n padded={false}\n style={[\n {\n padding: 16,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha('#3700B3', 0.2),\n } as any,\n ]}\n >\n {/* Collapsed header */}\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Avatar size={40} uri={creator?.avatar ?? null} name={creator?.name ?? undefined} />\n <View style={{ flex: 1, minWidth: 0 }}>\n <Text\n style={{ fontWeight: theme.typography.fontWeight.semibold, color: theme.colors.text, fontSize: 16, lineHeight: 20 }}\n numberOfLines={isExpanded ? undefined : 1}\n >\n {mr.title ?? 'Untitled merge request'}\n </Text>\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16 }} numberOfLines={1}>\n {creator?.name ?? 'Loading...'} · {position}\n </Text>\n </View>\n <Animated.View\n style={{\n transform: [{ rotate: rotate.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '180deg'] }) }],\n }}\n >\n <ChevronDown size={20} color={withAlpha(theme.colors.textMuted, 0.4)} />\n </Animated.View>\n </View>\n\n {/* Expanded content */}\n {isExpanded ? (\n <View style={{ marginTop: 16 }}>\n <Text\n style={{\n fontSize: 10,\n fontWeight: '700',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: status.color,\n marginBottom: 8,\n }}\n >\n {status.text}\n </Text>\n\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginBottom: 12 }}>\n {creator\n ? `${creator.approvedOpenedMergeRequests} approved merge${creator.approvedOpenedMergeRequests !== 1 ? 's' : ''}`\n : 'Loading stats...'}\n </Text>\n\n {mr.description ? <MarkdownText markdown={mr.description} variant=\"mergeRequest\" /> : null}\n </View>\n ) : null}\n\n {/* Separator */}\n <View style={{ height: 1, backgroundColor: withAlpha(theme.colors.borderStrong, 0.5), marginTop: 12, marginBottom: 12 }} />\n\n {/* Action buttons - always visible */}\n <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }}>\n <View style={{ flexDirection: 'row', gap: 8 }}>\n <ReviewMergeRequestActionButton\n accessibilityLabel=\"Reject\"\n backgroundColor={theme.colors.danger}\n disabled={!canAct || isAnyProcessing}\n onPress={onReject}\n iconOnly={!isExpanded}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: isExpanded ? 4 : 0 }}>\n <X size={18} color=\"#FFFFFF\" />\n {isExpanded ? (\n <Text style={{ fontSize: 13, color: '#FFFFFF', fontWeight: theme.typography.fontWeight.semibold }}>Reject</Text>\n ) : null}\n </View>\n </ReviewMergeRequestActionButton>\n\n <ReviewMergeRequestActionButton\n accessibilityLabel={!canAct ? 'Not actionable' : isProcessing ? 'Processing' : 'Approve'}\n backgroundColor=\"#16A34A\"\n disabled={!canAct || isAnyProcessing}\n onPress={onApprove}\n iconOnly={!isExpanded}\n >\n {isProcessing ? (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: isExpanded ? 4 : 0 }}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n {isExpanded ? (\n <Text style={{ fontSize: 13, color: '#FFFFFF', fontWeight: theme.typography.fontWeight.semibold }}>\n Processing\n </Text>\n ) : null}\n </View>\n ) : (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: isExpanded ? 4 : 0 }}>\n <Check size={18} color=\"#FFFFFF\" />\n {isExpanded ? (\n <Text style={{ fontSize: 13, color: '#FFFFFF', fontWeight: theme.typography.fontWeight.semibold }}>Approve</Text>\n ) : null}\n </View>\n )}\n </ReviewMergeRequestActionButton>\n </View>\n\n <ReviewMergeRequestActionButton\n accessibilityLabel=\"Test\"\n backgroundColor={theme.colors.neutral}\n disabled={isBuilding || isTestingThis}\n onPress={onTest}\n iconOnly={!isExpanded}\n >\n {isTestingThis ? (\n <ActivityIndicator size=\"small\" color=\"#888\" />\n ) : (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: isExpanded ? 4 : 0 }}>\n <Play size={14} color={theme.colors.text} />\n {isExpanded ? (\n <Text style={{ fontSize: 13, color: theme.colors.text, fontWeight: theme.typography.fontWeight.semibold }}>Test</Text>\n ) : null}\n </View>\n )}\n </ReviewMergeRequestActionButton>\n </View>\n </Card>\n </Pressable>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View } from 'react-native';\n\nexport function ReviewMergeRequestActionButton({\n accessibilityLabel,\n backgroundColor,\n disabled,\n onPress,\n children,\n iconOnly,\n}: {\n accessibilityLabel: string;\n backgroundColor: string;\n disabled?: boolean;\n onPress: () => void;\n children: React.ReactNode;\n iconOnly: boolean;\n}) {\n const [pressed, setPressed] = React.useState(false);\n const height = iconOnly ? 36 : 40;\n const width = iconOnly ? 36 : undefined;\n const paddingHorizontal = iconOnly ? 0 : 16;\n const paddingVertical = iconOnly ? 0 : 8;\n const opacity = disabled ? 0.5 : pressed ? 0.9 : 1;\n\n return (\n <View\n style={{\n width,\n minWidth: width,\n height,\n minHeight: height,\n borderRadius: 999,\n backgroundColor,\n opacity,\n paddingHorizontal,\n paddingVertical,\n justifyContent: 'center',\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={Boolean(disabled)}\n onPress={onPress}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n style={{\n height: '100%',\n width: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n hitSlop={8}\n >\n {children}\n </Pressable>\n </View>\n );\n}\n\n\n","import * as React from 'react';\n\nimport type { App } from '../../../data/apps/types';\nimport type { MergeRequest } from '../../../data/merge-requests/types';\nimport { appImagesRepository } from '../../../data/apps/images/repository';\nimport { appsRepository } from '../../../data/apps/repository';\nimport { usersRepository } from '../../../data/users/repository';\nimport { log } from '../../../core/logger';\nimport { useAppStats } from '../../hooks/useAppStats';\n\ntype InsightsSummary = { likes: number; comments: number; forks: number; downloads: number };\n\nconst LIKE_DEBUG_PREFIX = '[COMERGE_LIKE_DEBUG]';\n\nexport function usePreviewPanelData(params: {\n app: App | null;\n isOwner: boolean;\n outgoingMergeRequests: MergeRequest[];\n onOpenComments?: () => void;\n commentCountOverride?: number;\n}) {\n const { app, isOwner, outgoingMergeRequests, onOpenComments, commentCountOverride } = params;\n\n const [imageUrl, setImageUrl] = React.useState<string | null>(null);\n const [imageLoaded, setImageLoaded] = React.useState(false);\n const [insights, setInsights] = React.useState<InsightsSummary>({ likes: 0, comments: 0, forks: 0, downloads: 0 });\n const [creator, setCreator] = React.useState<{ name: string | null; avatar: string | null } | null>(null);\n\n React.useEffect(() => {\n if (!app?.id) return;\n let cancelled = false;\n (async () => {\n try {\n const res = await appImagesRepository.getSignedUrl(app.id);\n if (!cancelled) setImageUrl(res.url);\n } catch {\n if (!cancelled) setImageUrl(null);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [app?.id]);\n\n React.useEffect(() => {\n if (!app?.createdBy) return;\n let cancelled = false;\n (async () => {\n try {\n const stats = await usersRepository.getStats(app.createdBy);\n if (cancelled) return;\n setCreator({ name: stats.name, avatar: stats.avatar });\n } catch {\n if (!cancelled) setCreator(null);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [app?.createdBy]);\n\n React.useEffect(() => {\n setImageLoaded(false);\n }, [app?.id]);\n\n React.useEffect(() => {\n if (!app?.id) return;\n let cancelled = false;\n (async () => {\n try {\n const full = await appsRepository.getInsights(app.id);\n if (cancelled) return;\n log.debug(\n `${LIKE_DEBUG_PREFIX} usePreviewPanelData.getInsights appId=${app.id} insights.likes.total=${full.likes.total} app.isLiked=${String(\n app.isLiked\n )}`\n );\n setInsights({\n likes: full.likes.total,\n comments: full.comments.total,\n forks: full.forks.total,\n downloads: full.downloads.total,\n });\n } catch {\n // Leave zeros\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [app?.id]);\n\n React.useEffect(() => {\n if (!app?.id) return;\n log.debug(\n `${LIKE_DEBUG_PREFIX} usePreviewPanelData.appChanged appId=${app.id} app.isLiked=${String(app.isLiked)}`\n );\n }, [app?.id, app?.isLiked]);\n\n const stats = useAppStats({\n appId: app?.id ?? '',\n initialLikes: insights.likes,\n initialForks: insights.forks,\n initialComments: commentCountOverride ?? insights.comments,\n initialIsLiked: Boolean(app?.isLiked),\n onOpenComments,\n });\n\n const canSubmitMergeRequest = React.useMemo(() => {\n if (!isOwner) return false;\n if (!app) return false;\n if (!app.forkedFromAppId) return false;\n if (outgoingMergeRequests.some((mr) => mr.status === 'open')) return false;\n if (app.headCommitId && app.forkedFromCommitId && app.headCommitId !== app.forkedFromCommitId) return true;\n return false;\n }, [app, isOwner, outgoingMergeRequests]);\n\n const showProcessing = app ? app.status !== 'ready' : false;\n\n return {\n imageUrl,\n imageLoaded,\n setImageLoaded,\n creator,\n insights,\n stats,\n showProcessing,\n canSubmitMergeRequest,\n };\n}\n\n\n","import { api } from '../../../core/services/http';\nimport type { ServiceResponse } from '../../types';\nimport { BaseRemote } from '../../base-remote';\n\nexport type GetAppImageSignedUrlOptions = {\n variant?: string;\n redirect?: boolean;\n};\n\nexport type AppImageSignedUrlBatchResponse = {\n urls: Record<string, string | null>;\n errors?: Record<string, { message: string; statusCode: number }>;\n};\n\nexport interface AppImagesRemoteDataSource {\n getSignedUrl(\n appId: string,\n options?: GetAppImageSignedUrlOptions\n ): Promise<ServiceResponse<{ url: string; redirect: boolean }>>;\n getSignedUrlsBatch(\n appIds: string[],\n options?: Pick<GetAppImageSignedUrlOptions, 'variant'>\n ): Promise<ServiceResponse<AppImageSignedUrlBatchResponse>>;\n}\n\nclass AppImagesRemoteDataSourceImpl extends BaseRemote implements AppImagesRemoteDataSource {\n async getSignedUrl(\n appId: string,\n options?: GetAppImageSignedUrlOptions\n ): Promise<ServiceResponse<{ url: string; redirect: boolean }>> {\n const { data } = await api.get<ServiceResponse<{ url: string; redirect: boolean }>>(\n `/v1/apps/${encodeURIComponent(appId)}/image/url`,\n {\n params: {\n variant: options?.variant,\n redirect: options?.redirect ?? false,\n },\n }\n );\n return data;\n }\n\n async getSignedUrlsBatch(\n appIds: string[],\n options?: Pick<GetAppImageSignedUrlOptions, 'variant'>\n ): Promise<ServiceResponse<AppImageSignedUrlBatchResponse>> {\n const payload = {\n appIds,\n variant: options?.variant,\n };\n const { data } = await api.post<ServiceResponse<AppImageSignedUrlBatchResponse>>(\n '/v1/apps/image/url/batch',\n payload\n );\n return data;\n }\n}\n\nexport const appImagesRemoteDataSource: AppImagesRemoteDataSource = new AppImagesRemoteDataSourceImpl();\n\n\n","import type {\n AppImageSignedUrlBatchResponse,\n AppImagesRemoteDataSource,\n GetAppImageSignedUrlOptions,\n} from './remote';\nimport { appImagesRemoteDataSource } from './remote';\nimport { BaseRepository } from '../../base-repository';\n\nexport interface AppImagesRepository {\n getSignedUrl(\n appId: string,\n options?: GetAppImageSignedUrlOptions\n ): Promise<{ url: string; redirect: boolean }>;\n getSignedUrlsBatch(\n appIds: string[],\n options?: Pick<GetAppImageSignedUrlOptions, 'variant'>\n ): Promise<AppImageSignedUrlBatchResponse>;\n}\n\nclass AppImagesRepositoryImpl extends BaseRepository implements AppImagesRepository {\n constructor(private readonly remote: AppImagesRemoteDataSource) {\n super();\n }\n\n async getSignedUrl(\n appId: string,\n options?: GetAppImageSignedUrlOptions\n ): Promise<{ url: string; redirect: boolean }> {\n const res = await this.remote.getSignedUrl(appId, options);\n return this.unwrapOrThrow(res);\n }\n\n async getSignedUrlsBatch(\n appIds: string[],\n options?: Pick<GetAppImageSignedUrlOptions, 'variant'>\n ): Promise<AppImageSignedUrlBatchResponse> {\n const res = await this.remote.getSignedUrlsBatch(appIds, options);\n if (res.responseObject && !res.success) {\n return res.responseObject;\n }\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const appImagesRepository: AppImagesRepository = new AppImagesRepositoryImpl(appImagesRemoteDataSource);\n\n\n","import * as React from 'react';\nimport * as Haptics from 'expo-haptics';\n\nimport type { App } from '../../data/apps/types';\nimport { appLikesRepository } from '../../data/likes/repository';\n\nexport type UseAppStatsParams = {\n appId: string;\n initialLikes?: number;\n initialComments?: number;\n initialForks?: number;\n initialIsLiked?: boolean;\n onOpenComments?: () => void;\n};\n\nexport type AppStatsResult = {\n likeCount: number;\n commentCount: number;\n forkCount: number;\n isLiked: boolean;\n setCommentCount: (count: number) => void;\n handleLike: () => Promise<void>;\n handleOpenComments: () => void;\n};\n\nexport function useAppStats({\n appId,\n initialLikes = 0,\n initialComments = 0,\n initialForks = 0,\n initialIsLiked = false,\n onOpenComments,\n}: UseAppStatsParams): AppStatsResult {\n const [likeCount, setLikeCount] = React.useState(initialLikes);\n const [commentCount, setCommentCount] = React.useState(initialComments);\n const [forkCount, setForkCount] = React.useState(initialForks);\n const [isLiked, setIsLiked] = React.useState(initialIsLiked);\n\n const didMutateRef = React.useRef(false);\n const lastAppIdRef = React.useRef<string>('');\n React.useEffect(() => {\n if (lastAppIdRef.current === appId) return;\n lastAppIdRef.current = appId;\n didMutateRef.current = false;\n }, [appId]);\n\n React.useEffect(() => {\n if (didMutateRef.current) return;\n setLikeCount(initialLikes);\n }, [appId, initialLikes]);\n React.useEffect(() => {\n if (didMutateRef.current) return;\n setCommentCount(initialComments);\n }, [appId, initialComments]);\n React.useEffect(() => {\n if (didMutateRef.current) return;\n setForkCount(initialForks);\n }, [appId, initialForks]);\n React.useEffect(() => {\n if (didMutateRef.current) return;\n setIsLiked(initialIsLiked);\n }, [appId, initialIsLiked]);\n\n const handleLike = React.useCallback(async () => {\n if (!appId) return;\n didMutateRef.current = true;\n try {\n void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n } catch {\n }\n\n const newIsLiked = !isLiked;\n setIsLiked(newIsLiked);\n setLikeCount((prev) => Math.max(0, prev + (newIsLiked ? 1 : -1)));\n\n try {\n if (newIsLiked) {\n const res = await appLikesRepository.create(appId, {});\n if (typeof res.stats?.total === 'number') setLikeCount(Math.max(0, res.stats.total));\n } else {\n const res = await appLikesRepository.removeMine(appId);\n if (typeof res.stats?.total === 'number') setLikeCount(Math.max(0, res.stats.total));\n }\n } catch (e) {\n setIsLiked(!newIsLiked);\n setLikeCount((prev) => Math.max(0, prev + (newIsLiked ? -1 : 1)));\n }\n }, [appId, isLiked, likeCount]);\n\n const handleOpenComments = React.useCallback(() => {\n if (!appId) return;\n try {\n void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n } catch {\n }\n onOpenComments?.();\n }, [appId, onOpenComments]);\n\n return { likeCount, commentCount, forkCount, isLiked, setCommentCount, handleLike, handleOpenComments };\n}\n\nexport function getAppStatsFromApp(app: App | null): Omit<UseAppStatsParams, 'appId'> {\n return {\n initialLikes: app?.insights?.totalLikes ?? 0,\n initialComments: app?.insights?.totalComments ?? 0,\n initialForks: app?.insights?.totalForks ?? 0,\n initialIsLiked: Boolean(app?.isLiked),\n };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type {\n AppLikeList,\n AppLikeMutationResult,\n AppLikeStatsResult,\n CreateAppLikeInput,\n ListAppLikesQuery,\n} from './types';\n\nexport interface AppLikesRemoteDataSource {\n list(appId: string, query?: ListAppLikesQuery): Promise<ServiceResponse<AppLikeList>>;\n create(appId: string, payload: CreateAppLikeInput): Promise<ServiceResponse<AppLikeMutationResult>>;\n removeById(appId: string, likeId: string): Promise<ServiceResponse<AppLikeStatsResult>>;\n removeMine(appId: string): Promise<ServiceResponse<AppLikeStatsResult>>;\n}\n\nclass AppLikesRemoteDataSourceImpl extends BaseRemote implements AppLikesRemoteDataSource {\n async list(appId: string, query?: ListAppLikesQuery): Promise<ServiceResponse<AppLikeList>> {\n const params = query ? { ...query } : undefined;\n const { data } = await api.get<ServiceResponse<AppLikeList>>(\n `/v1/apps/${encodeURIComponent(appId)}/likes`,\n { params }\n );\n return data;\n }\n\n async create(\n appId: string,\n payload: CreateAppLikeInput\n ): Promise<ServiceResponse<AppLikeMutationResult>> {\n const { data } = await api.post<ServiceResponse<AppLikeMutationResult>>(\n `/v1/apps/${encodeURIComponent(appId)}/likes`,\n payload\n );\n return data;\n }\n\n async removeById(appId: string, likeId: string): Promise<ServiceResponse<AppLikeStatsResult>> {\n const { data } = await api.delete<ServiceResponse<AppLikeStatsResult>>(\n `/v1/apps/${encodeURIComponent(appId)}/likes/${encodeURIComponent(likeId)}`\n );\n return data;\n }\n\n async removeMine(appId: string): Promise<ServiceResponse<AppLikeStatsResult>> {\n const { data } = await api.delete<ServiceResponse<AppLikeStatsResult>>(\n `/v1/apps/${encodeURIComponent(appId)}/likes/me`\n );\n return data;\n }\n}\n\nexport const appLikesRemoteDataSource: AppLikesRemoteDataSource = new AppLikesRemoteDataSourceImpl();\n\n\n","import type { AppLikesRemoteDataSource } from './remote';\nimport { appLikesRemoteDataSource } from './remote';\nimport type {\n AppLikeList,\n AppLikeMutationResult,\n AppLikeStatsResult,\n CreateAppLikeInput,\n ListAppLikesQuery,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface AppLikesRepository {\n list(appId: string, query?: ListAppLikesQuery): Promise<AppLikeList>;\n create(appId: string, payload: CreateAppLikeInput): Promise<AppLikeMutationResult>;\n removeById(appId: string, likeId: string): Promise<AppLikeStatsResult>;\n removeMine(appId: string): Promise<AppLikeStatsResult>;\n}\n\nclass AppLikesRepositoryImpl extends BaseRepository implements AppLikesRepository {\n constructor(private readonly remote: AppLikesRemoteDataSource) {\n super();\n }\n\n async list(appId: string, query?: ListAppLikesQuery): Promise<AppLikeList> {\n const res = await this.remote.list(appId, query);\n return this.unwrapOrThrow(res);\n }\n\n async create(appId: string, payload: CreateAppLikeInput): Promise<AppLikeMutationResult> {\n const res = await this.remote.create(appId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async removeById(appId: string, likeId: string): Promise<AppLikeStatsResult> {\n const res = await this.remote.removeById(appId, likeId);\n return this.unwrapOrThrow(res);\n }\n\n async removeMine(appId: string): Promise<AppLikeStatsResult> {\n const res = await this.remote.removeMine(appId);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const appLikesRepository: AppLikesRepository = new AppLikesRepositoryImpl(appLikesRemoteDataSource);\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, View } from 'react-native';\n\nimport type { ChatMessageListRef } from '../../components/chat/ChatMessageList';\nimport { ChatPage } from '../../components/chat/ChatPage';\nimport { ScrollToBottomButton } from '../../components/chat/ScrollToBottomButton';\nimport { ChatHeader } from '../../components/chat/ChatHeader';\nimport { ForkNoticeBanner } from '../../components/chat/ForkNoticeBanner';\nimport { StudioSheetHeaderIconButton } from '../../components/studio-sheet/StudioSheetHeaderIconButton';\nimport { IconArrowDown, IconBack, IconClose, IconDraw, IconHome } from '../../components/icons/StudioIcons';\nimport { Text } from '../../components/primitives/Text';\nimport type { ChatMessage } from '../../components/models/types';\n\nexport type ChatPanelProps = {\n title?: string;\n autoFocusComposer?: boolean;\n messages: ChatMessage[];\n showTypingIndicator?: boolean;\n loading?: boolean;\n sendDisabled?: boolean;\n forking?: boolean;\n sending?: boolean;\n shouldForkOnEdit?: boolean;\n attachments?: string[];\n onRemoveAttachment?: (index: number) => void;\n onClearAttachments?: () => void;\n onBack: () => void;\n onClose: () => void;\n onNavigateHome?: () => void;\n onStartDraw?: () => void;\n onSend: (text: string, attachments?: string[]) => void | Promise<void>;\n};\n\nexport function ChatPanel({\n title = 'Chat',\n autoFocusComposer = false,\n messages,\n showTypingIndicator,\n loading,\n sendDisabled,\n forking = false,\n sending,\n shouldForkOnEdit,\n attachments = [],\n onRemoveAttachment,\n onClearAttachments,\n onBack,\n onClose,\n onNavigateHome,\n onStartDraw,\n onSend,\n}: ChatPanelProps) {\n const listRef = React.useRef<ChatMessageListRef | null>(null);\n const [nearBottom, setNearBottom] = React.useState(true);\n\n const handleSend = React.useCallback(\n async (text: string, composerAttachments?: string[]) => {\n const all = composerAttachments ?? attachments;\n await onSend(text, all.length > 0 ? all : undefined);\n onClearAttachments?.();\n requestAnimationFrame(() => listRef.current?.scrollToBottom({ animated: true }));\n },\n [attachments, onClearAttachments, onSend]\n );\n\n const handleScrollToBottom = React.useCallback(() => {\n listRef.current?.scrollToBottom({ animated: true });\n }, []);\n\n const header = (\n <ChatHeader\n left={\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <StudioSheetHeaderIconButton onPress={onBack} accessibilityLabel=\"Back\" style={{ marginRight: 8 }}>\n <IconBack size={20} colorToken=\"floatingContent\" />\n </StudioSheetHeaderIconButton>\n {onNavigateHome ? (\n <StudioSheetHeaderIconButton onPress={onNavigateHome} accessibilityLabel=\"Home\">\n <IconHome size={20} colorToken=\"floatingContent\" />\n </StudioSheetHeaderIconButton>\n ) : null}\n </View>\n }\n right={\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {onStartDraw ? (\n <StudioSheetHeaderIconButton onPress={onStartDraw} accessibilityLabel=\"Draw\" intent=\"danger\" style={{ marginRight: 8 }}>\n <IconDraw size={20} colorToken=\"onDanger\" />\n </StudioSheetHeaderIconButton>\n ) : null}\n <StudioSheetHeaderIconButton onPress={onClose} accessibilityLabel=\"Close\">\n <IconClose size={20} colorToken=\"floatingContent\" />\n </StudioSheetHeaderIconButton>\n </View>\n }\n center={null}\n />\n );\n\n const topBanner =\n shouldForkOnEdit ? (\n <ForkNoticeBanner\n isOwner={!shouldForkOnEdit}\n style={{ marginBottom: 12 }}\n />\n ) : null;\n\n const showMessagesLoading = (Boolean(loading) && messages.length === 0) || forking;\n if (showMessagesLoading) {\n return (\n <View style={{ flex: 1 }}>\n <View>{header}</View>\n {topBanner ? <View style={{ paddingHorizontal: 16, paddingTop: 8 }}>{topBanner}</View> : null}\n <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 24, paddingVertical: 12 }}>\n <ActivityIndicator />\n <View style={{ height: 12 }} />\n <Text variant=\"bodyMuted\">{forking ? 'Creating your copy…' : 'Loading messages…'}</Text>\n </View>\n </View>\n );\n }\n\n return (\n <ChatPage\n header={header}\n messages={messages}\n showTypingIndicator={showTypingIndicator}\n topBanner={topBanner}\n listRef={listRef}\n onNearBottomChange={setNearBottom}\n overlay={\n <ScrollToBottomButton\n visible={!nearBottom}\n onPress={handleScrollToBottom}\n style={{ bottom: 80 }}\n >\n <IconArrowDown size={20} colorToken=\"floatingContent\" />\n </ScrollToBottomButton>\n }\n composer={{\n disabled: Boolean(loading) || Boolean(sendDisabled) || Boolean(forking),\n sending: Boolean(sending),\n autoFocus: autoFocusComposer,\n onSend: handleSend,\n attachments,\n onRemoveAttachment: onRemoveAttachment,\n onAddAttachment: onStartDraw,\n useBottomSheetTextInput: true,\n }}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport type { ChatMessage } from '../models/types';\nimport { useTheme } from '../../theme';\nimport { ChatMessageList, type ChatMessageListProps, type ChatMessageListRef } from './ChatMessageList';\nimport { ChatComposer, type ChatComposerProps } from './ChatComposer';\n\nexport type ChatPageProps = {\n header?: React.ReactNode;\n messages: ChatMessage[];\n showTypingIndicator?: boolean;\n renderMessageContent?: ChatMessageListProps['renderMessageContent'];\n topBanner?: React.ReactNode;\n composer: Omit<ChatComposerProps, 'attachments'> & {\n attachments?: ChatComposerProps['attachments'];\n };\n /**\n * Optional overlay (e.g. ScrollToBottomButton).\n */\n overlay?: React.ReactNode;\n style?: ViewStyle;\n onNearBottomChange?: ChatMessageListProps['onNearBottomChange'];\n listRef?: React.RefObject<ChatMessageListRef | null>;\n};\n\nexport function ChatPage({\n header,\n messages,\n showTypingIndicator,\n renderMessageContent,\n topBanner,\n composer,\n overlay,\n style,\n onNearBottomChange,\n listRef,\n}: ChatPageProps) {\n const theme = useTheme();\n const [composerHeight, setComposerHeight] = React.useState(0);\n return (\n <View style={[{ flex: 1 }, style]}>\n {header ? <View>{header}</View> : null}\n {topBanner ? (\n <View style={{ paddingHorizontal: theme.spacing.lg, paddingTop: theme.spacing.sm }}>\n {topBanner}\n </View>\n ) : null}\n <View style={{ flex: 1 }}>\n <ChatMessageList\n ref={listRef}\n messages={messages}\n showTypingIndicator={showTypingIndicator}\n renderMessageContent={renderMessageContent}\n onNearBottomChange={onNearBottomChange}\n contentStyle={{ paddingBottom: theme.spacing.xl + composerHeight }}\n />\n {overlay}\n </View>\n <ChatComposer\n {...composer}\n attachments={composer.attachments ?? []}\n onLayout={({ height }) => setComposerHeight(height)}\n />\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type NativeScrollEvent, type NativeSyntheticEvent, type ViewStyle } from 'react-native';\nimport { BottomSheetFlatList } from '@gorhom/bottom-sheet';\n\nimport type { ChatMessage } from '../models/types';\nimport { useTheme } from '../../theme';\nimport { ChatMessageBubble, type ChatMessageBubbleProps } from './ChatMessageBubble';\nimport { TypingIndicator } from './TypingIndicator';\n\nexport type ChatMessageListRef = {\n scrollToBottom: (options?: { animated?: boolean }) => void;\n};\n\nexport type ChatMessageListProps = {\n messages: ChatMessage[];\n showTypingIndicator?: boolean;\n renderMessageContent?: ChatMessageBubbleProps['renderContent'];\n contentStyle?: ViewStyle;\n /**\n * Called when the user is near the bottom of the list.\n */\n onNearBottomChange?: (nearBottom: boolean) => void;\n /**\n * Distance threshold from bottom (in dp) that counts as \"near bottom\".\n */\n nearBottomThreshold?: number;\n};\n\nexport const ChatMessageList = React.forwardRef<ChatMessageListRef, ChatMessageListProps>(\n (\n {\n messages,\n showTypingIndicator = false,\n renderMessageContent,\n contentStyle,\n onNearBottomChange,\n nearBottomThreshold = 200,\n },\n ref\n ) => {\n const theme = useTheme();\n const listRef = React.useRef<React.ElementRef<typeof BottomSheetFlatList<ChatMessage>>>(null);\n const nearBottomRef = React.useRef(true);\n const initialScrollDoneRef = React.useRef(false);\n const lastMessageIdRef = React.useRef<string | null>(null);\n\n const scrollToBottom = React.useCallback((options?: { animated?: boolean }) => {\n const animated = options?.animated ?? true;\n // Scroll to visual bottom (latest messages) in a normal (non-inverted) list.\n listRef.current?.scrollToEnd({ animated });\n }, []);\n\n React.useImperativeHandle(ref, () => ({ scrollToBottom }), [scrollToBottom]);\n\n const handleScroll = React.useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const { contentOffset, contentSize, layoutMeasurement } = e.nativeEvent;\n const distanceFromBottom = Math.max(contentSize.height - (contentOffset.y + layoutMeasurement.height), 0);\n const isNear = distanceFromBottom <= nearBottomThreshold;\n\n if (nearBottomRef.current !== isNear) {\n nearBottomRef.current = isNear;\n onNearBottomChange?.(isNear);\n }\n },\n [nearBottomThreshold, onNearBottomChange]\n );\n\n // On first load, start at the bottom\n React.useEffect(() => {\n if (initialScrollDoneRef.current) return;\n if (messages.length === 0) return;\n\n initialScrollDoneRef.current = true;\n lastMessageIdRef.current = messages[messages.length - 1]?.id ?? null;\n const id = requestAnimationFrame(() => scrollToBottom({ animated: false }));\n return () => cancelAnimationFrame(id);\n }, [messages, scrollToBottom]);\n\n // When new messages arrive, keep the user pinned to the bottom only if they already were near it.\n React.useEffect(() => {\n if (!initialScrollDoneRef.current) return;\n const lastId = messages.length > 0 ? messages[messages.length - 1]!.id : null;\n const prevLastId = lastMessageIdRef.current;\n lastMessageIdRef.current = lastId;\n if (!lastId || lastId === prevLastId) return;\n if (!nearBottomRef.current) return;\n\n const id = requestAnimationFrame(() => scrollToBottom({ animated: true }));\n return () => cancelAnimationFrame(id);\n }, [messages, scrollToBottom]);\n\n // When typing indicator appears, keep the user at bottom if they already were.\n React.useEffect(() => {\n if (showTypingIndicator && nearBottomRef.current) {\n const id = requestAnimationFrame(() => scrollToBottom({ animated: true }));\n return () => cancelAnimationFrame(id);\n }\n return undefined;\n }, [showTypingIndicator, scrollToBottom]);\n\n return (\n <BottomSheetFlatList\n ref={listRef}\n data={messages}\n keyExtractor={(m: ChatMessage) => m.id}\n onScroll={handleScroll}\n scrollEventThrottle={16}\n showsVerticalScrollIndicator={false}\n contentContainerStyle={[\n {\n paddingHorizontal: theme.spacing.lg,\n paddingTop: theme.spacing.sm,\n paddingBottom: theme.spacing.xl,\n },\n contentStyle,\n ]}\n renderItem={({ item, index }: { item: ChatMessage; index: number }) => (\n <View style={{ marginTop: index === 0 ? 0 : theme.spacing.sm }}>\n <ChatMessageBubble message={item} renderContent={renderMessageContent} />\n </View>\n )}\n ListFooterComponent={\n showTypingIndicator ? (\n <View style={{ marginTop: theme.spacing.sm, alignSelf: 'flex-start', paddingHorizontal: theme.spacing.lg }}>\n <TypingIndicator />\n </View>\n ) : null\n }\n maintainVisibleContentPosition={{ minIndexForVisible: 0, autoscrollToTopThreshold: nearBottomThreshold }}\n />\n );\n }\n);\nChatMessageList.displayName = 'ChatMessageList';\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\nimport { CheckCheck, GitMerge } from 'lucide-react-native';\n\nimport type { ChatMessage } from '../models/types';\nimport { useTheme } from '../../theme';\nimport { MarkdownText } from '../primitives/MarkdownText';\nimport { Surface } from '../primitives/Surface';\n\nexport type ChatMessageBubbleProps = {\n message: ChatMessage;\n /**\n * Optional custom renderer for message content (e.g. markdown).\n */\n renderContent?: (message: ChatMessage) => React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function ChatMessageBubble({ message, renderContent, style }: ChatMessageBubbleProps) {\n const theme = useTheme();\n const metaEvent = message.meta?.event ?? null;\n const metaStatus = message.meta?.status ?? null;\n\n const isMergeApproved = metaEvent === 'merge_request.approved';\n const isMergeRejected = metaEvent === 'merge_request.rejected';\n const isMergeCompleted = metaEvent === 'merge.completed';\n\n const isHuman = message.author === 'human' || isMergeApproved || isMergeRejected;\n\n const align: ViewStyle = { alignSelf: isHuman ? 'flex-end' : 'flex-start' };\n const bubbleVariant = isHuman ? 'surface' : 'surfaceRaised';\n const cornerStyle: ViewStyle = isHuman ? { borderTopRightRadius: 0 } : { borderTopLeftRadius: 0 };\n\n const bodyColor =\n metaStatus === 'success' ? theme.colors.success : metaStatus === 'error' ? theme.colors.danger : undefined;\n\n return (\n <View style={[align, style]}>\n <Surface\n variant={bubbleVariant}\n style={[\n {\n maxWidth: '85%',\n borderRadius: theme.radii.lg,\n paddingHorizontal: theme.spacing.lg,\n paddingVertical: theme.spacing.md,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n cornerStyle,\n ]}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {isMergeCompleted ? (\n <CheckCheck size={16} color={theme.colors.success} style={{ marginRight: theme.spacing.sm }} />\n ) : null}\n {isMergeApproved ? (\n <GitMerge size={16} color={theme.colors.text} style={{ marginRight: theme.spacing.sm }} />\n ) : null}\n <View style={{ flexShrink: 1, minWidth: 0 }}>\n {renderContent ? renderContent(message) : <MarkdownText markdown={message.content} variant=\"chat\" bodyColor={bodyColor} />}\n </View>\n </View>\n </Surface>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Animated, View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\n\nexport type TypingIndicatorProps = {\n style?: ViewStyle;\n};\n\nexport function TypingIndicator({ style }: TypingIndicatorProps) {\n const theme = useTheme();\n const dotColor = theme.colors.textSubtle;\n const anims = React.useMemo(\n () => [new Animated.Value(0.3), new Animated.Value(0.3), new Animated.Value(0.3)],\n []\n );\n\n React.useEffect(() => {\n const loops: Animated.CompositeAnimation[] = [];\n anims.forEach((a, idx) => {\n const seq = Animated.sequence([\n Animated.timing(a, { toValue: 1, duration: 420, useNativeDriver: true, delay: idx * 140 }),\n Animated.timing(a, { toValue: 0.3, duration: 420, useNativeDriver: true }),\n ]);\n const loop = Animated.loop(seq);\n loops.push(loop);\n loop.start();\n });\n return () => {\n loops.forEach((l) => l.stop());\n };\n }, [anims]);\n\n return (\n <View style={[{ flexDirection: 'row', alignItems: 'center' }, style]}>\n {anims.map((a, i) => (\n <Animated.View\n key={i}\n style={{\n width: 8,\n height: 8,\n borderRadius: 4,\n marginHorizontal: 3,\n backgroundColor: dotColor,\n opacity: a,\n transform: [{ translateY: Animated.multiply(Animated.subtract(a, 0.3), 2) }],\n }}\n />\n ))}\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';\n\nimport { useTheme } from '../../theme';\nimport { withAlpha } from '../utils/color';\n\nexport type ScrollToBottomButtonProps = {\n visible: boolean;\n onPress: () => void;\n children: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function ScrollToBottomButton({ visible, onPress, children, style }: ScrollToBottomButtonProps) {\n const theme = useTheme();\n const progress = useSharedValue(visible ? 1 : 0);\n const [pressed, setPressed] = React.useState(false);\n\n React.useEffect(() => {\n progress.value = withTiming(visible ? 1 : 0, { duration: 200, easing: Easing.out(Easing.ease) });\n }, [progress, visible]);\n\n const animStyle = useAnimatedStyle(() => ({\n opacity: progress.value,\n transform: [{ translateY: (1 - progress.value) * 20 }],\n }));\n\n const bg = theme.scheme === 'dark' ? 'rgba(39,39,42,0.9)' : 'rgba(244,244,245,0.95)';\n const border = theme.scheme === 'dark' ? withAlpha('#FFFFFF', 0.12) : withAlpha('#000000', 0.08);\n\n return (\n <Animated.View\n pointerEvents={visible ? 'auto' : 'none'}\n style={[\n {\n position: 'absolute',\n left: 0,\n right: 0,\n alignItems: 'center',\n },\n style,\n animStyle,\n ]}\n >\n <View\n style={{\n width: 44,\n height: 44,\n borderRadius: 22,\n backgroundColor: bg,\n borderWidth: 1,\n borderColor: border,\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n opacity: pressed ? 0.85 : 1,\n }}\n >\n <Pressable\n onPress={onPress}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n hitSlop={10}\n style={{ width: '100%', height: '100%', alignItems: 'center', justifyContent: 'center' }}\n >\n {children}\n </Pressable>\n </View>\n </Animated.View>\n );\n}\n\n\n","import * as React from 'react';\nimport { StyleSheet, View, type ViewStyle } from 'react-native';\n\nimport { StudioSheetHeader } from '../studio-sheet/StudioSheetHeader';\n\nexport type ChatHeaderProps = {\n left?: React.ReactNode;\n right?: React.ReactNode;\n center?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function ChatHeader({ left, right, center, style }: ChatHeaderProps) {\n const flattenedStyle = StyleSheet.flatten([\n {\n paddingTop: 0,\n } satisfies ViewStyle,\n style,\n ]);\n\n return (\n <StudioSheetHeader\n left={left}\n right={right}\n center={center}\n style={flattenedStyle}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Card } from '../primitives/Card';\nimport { Text } from '../primitives/Text';\n\nexport type ForkNoticeBannerProps = {\n isOwner?: boolean;\n title?: string;\n description?: string | null;\n style?: ViewStyle;\n};\n\nexport function ForkNoticeBanner({ isOwner = true, title, description, style }: ForkNoticeBannerProps) {\n const theme = useTheme();\n const resolvedTitle = title ?? (isOwner ? 'Remixed app' : 'Remix app');\n const resolvedDescription =\n description ??\n (isOwner\n ? 'Any changes you make will be a remix of the original app. You can view the edited version in the Remix tab in your apps page.'\n : 'Once you make edits, this remixed version will appear on your Remixed apps page.');\n\n return (\n <Card\n variant=\"surfaceRaised\"\n padded={false}\n border\n style={[\n {\n width: '100%',\n paddingHorizontal: theme.spacing.lg,\n paddingTop: 14,\n paddingBottom: 8,\n },\n style,\n ]}\n >\n <View style={{ minWidth: 0 }}>\n <Text\n style={{\n color: '#22C55E', // green-500\n fontSize: 14,\n lineHeight: 18,\n fontWeight: theme.typography.fontWeight.medium,\n marginBottom: 4,\n }}\n >\n {resolvedTitle}\n </Text>\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: 14,\n lineHeight: 20,\n paddingBottom: 6,\n }}\n >\n {resolvedDescription}\n </Text>\n </View>\n </Card>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View } from 'react-native';\n\nimport type { MergeRequestSummary } from '../models/types';\nimport { Modal } from '../primitives/Modal';\nimport { Text } from '../primitives/Text';\nimport { useTheme } from '../../theme';\n\nexport type ConfirmMergeRequestDialogProps = {\n visible: boolean;\n onOpenChange: (open: boolean) => void;\n mergeRequest: MergeRequestSummary | null;\n approveDisabled?: boolean;\n /**\n * disables the \"Test edits first\" button and changes its label to \"Preparing…\".\n */\n isBuilding?: boolean;\n onConfirm: () => void | Promise<void>;\n onTestFirst: (mr: MergeRequestSummary) => void | Promise<void>;\n};\n\nexport function ConfirmMergeRequestDialog({\n visible,\n onOpenChange,\n mergeRequest,\n approveDisabled,\n isBuilding,\n onConfirm,\n onTestFirst,\n}: ConfirmMergeRequestDialogProps) {\n const theme = useTheme();\n\n const close = React.useCallback(() => onOpenChange(false), [onOpenChange]);\n\n const canConfirm = Boolean(mergeRequest) && !approveDisabled;\n\n const handleConfirm = React.useCallback(() => {\n if (!mergeRequest) return;\n onOpenChange(false);\n void onConfirm();\n }, [mergeRequest, onConfirm, onOpenChange]);\n\n const handleTestFirst = React.useCallback(() => {\n if (!mergeRequest) return;\n onOpenChange(false);\n void onTestFirst(mergeRequest);\n }, [mergeRequest, onOpenChange, onTestFirst]);\n\n const fullWidthButtonBase = {\n height: 40,\n borderRadius: 999,\n alignItems: 'center' as const,\n justifyContent: 'center' as const,\n alignSelf: 'stretch' as const,\n };\n\n return (\n <Modal\n visible={visible}\n onRequestClose={close}\n contentStyle={{\n borderRadius: theme.radii.sm,\n padding: 24,\n backgroundColor: theme.colors.background,\n }}\n >\n <View>\n <Text\n style={{\n color: theme.colors.text,\n fontSize: 18,\n lineHeight: 24,\n fontWeight: theme.typography.fontWeight.semibold,\n }}\n >\n Are you sure you want to approve this merge request?\n </Text>\n </View>\n\n <View style={{ marginTop: 16 }}>\n {/* Primary */}\n <View\n style={[\n fullWidthButtonBase,\n {\n backgroundColor: theme.colors.primary,\n opacity: canConfirm ? 1 : 0.5,\n },\n ]}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Approve Merge\"\n disabled={!canConfirm}\n onPress={handleConfirm}\n style={[fullWidthButtonBase, { flex: 1 }]}\n >\n <Text style={{ textAlign: 'center', color: theme.colors.onPrimary }}>\n Approve Merge\n </Text>\n </Pressable>\n </View>\n\n {/* Test first (outline) */}\n <View style={{ height: 8 }} />\n <View\n style={[\n fullWidthButtonBase,\n {\n backgroundColor: theme.colors.background,\n borderWidth: 1,\n borderColor: theme.colors.border,\n opacity: isBuilding || !mergeRequest ? 0.5 : 1,\n },\n ]}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={isBuilding ? 'Preparing…' : 'Test edits first'}\n disabled={isBuilding || !mergeRequest}\n onPress={handleTestFirst}\n style={[fullWidthButtonBase, { flex: 1 }]}\n >\n <Text style={{ textAlign: 'center', color: theme.colors.text }}>\n {isBuilding ? 'Preparing…' : 'Test edits first'}\n </Text>\n </Pressable>\n </View>\n\n {/* Cancel (outline) */}\n <View style={{ height: 8 }} />\n <View\n style={[\n fullWidthButtonBase,\n {\n backgroundColor: theme.colors.background,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n ]}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Cancel\"\n onPress={close}\n style={[fullWidthButtonBase, { flex: 1 }]}\n >\n <Text style={{ textAlign: 'center', color: theme.colors.text }}>Cancel</Text>\n </Pressable>\n </View>\n </View>\n </Modal>\n );\n}\n\n\n","import * as React from 'react';\nimport {\n Modal as RNModal,\n Pressable,\n View,\n type ViewStyle,\n} from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Card } from './Card';\n\nexport type ModalProps = {\n visible: boolean;\n onRequestClose: () => void;\n children: React.ReactNode;\n /**\n * When true, tapping the backdrop closes the modal.\n */\n dismissOnBackdropPress?: boolean;\n contentStyle?: ViewStyle;\n};\n\nexport function Modal({\n visible,\n onRequestClose,\n dismissOnBackdropPress = true,\n children,\n contentStyle,\n}: ModalProps) {\n const theme = useTheme();\n\n return (\n <RNModal\n visible={visible}\n transparent\n animationType=\"fade\"\n onRequestClose={onRequestClose}\n >\n <View style={{ flex: 1, backgroundColor: theme.colors.backdrop, justifyContent: 'center', padding: theme.spacing.lg }}>\n <Pressable\n accessibilityRole=\"button\"\n onPress={dismissOnBackdropPress ? onRequestClose : undefined}\n style={{ position: 'absolute', inset: 0 }}\n />\n <Card variant=\"surfaceRaised\" padded style={[{ borderRadius: theme.radii.xl }, contentStyle]}>\n {children}\n </Card>\n </View>\n </RNModal>\n );\n}\n\n\n","import * as React from 'react';\n\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport { ConfirmMergeRequestDialog } from '../../components/dialogs/ConfirmMergeRequestDialog';\nimport type { MergeRequestSummary } from '../../components/models/types';\n\nexport type ConfirmMergeFlowProps = {\n visible: boolean;\n onOpenChange: (open: boolean) => void;\n mergeRequest: MergeRequest | null;\n toSummary: (mr: MergeRequest) => MergeRequestSummary;\n /**\n * Disable the primary \"Approve Merge\" action (e.g. while submitting).\n */\n approveDisabled?: boolean;\n /**\n * Whether the system is building/preparing a test bundle.\n * Disables the \"Test edits first\" action and shows \"Preparing…\".\n */\n isBuilding?: boolean;\n onConfirm: (mr: MergeRequest) => void | Promise<void>;\n onTestFirst: (mr: MergeRequest) => void | Promise<void>;\n};\n\nexport function ConfirmMergeFlow({\n visible,\n onOpenChange,\n mergeRequest,\n toSummary,\n approveDisabled,\n isBuilding,\n onConfirm,\n onTestFirst,\n}: ConfirmMergeFlowProps) {\n return (\n <ConfirmMergeRequestDialog\n visible={visible}\n onOpenChange={onOpenChange}\n mergeRequest={mergeRequest ? toSummary(mergeRequest) : null}\n approveDisabled={approveDisabled}\n isBuilding={isBuilding}\n onConfirm={() => {\n if (!mergeRequest) return;\n return onConfirm(mergeRequest);\n }}\n onTestFirst={(mrSummary) => {\n if (!mergeRequest) return;\n void mrSummary;\n return onTestFirst(mergeRequest);\n }}\n />\n );\n}\n\n\n"],"mappings":"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","names":["React","View","jsx","React","axios","axios","React","React","canRequestLatest","React","React","React","View","jsx","View","React","Keyboard","View","useWindowDimensions","React","View","View","Fragment","jsx","View","jsx","View","React","jsx","jsxs","useCallback","useEffect","useMemo","useRef","Text","View","Animated","LiquidGlassView","isLiquidGlassSupported","jsx","jsxs","useRef","useEffect","useMemo","useCallback","Animated","LiquidGlassView","isLiquidGlassSupported","View","Text","React","Animated","View","jsx","jsxs","Animated","View","React","StyleSheet","View","React","PanResponder","StyleSheet","View","jsx","jsxs","PanResponder","View","StyleSheet","styles","React","Animated","PanResponder","Pressable","View","useWindowDimensions","useSafeAreaInsets","Haptics","Pressable","View","jsx","Pressable","View","jsx","jsxs","useSafeAreaInsets","useWindowDimensions","Animated","clamp","PanResponder","View","Pressable","jsx","jsxs","View","StyleSheet","styles","React","ActivityIndicator","Keyboard","Platform","Pressable","View","useSafeAreaInsets","LiquidGlassView","isLiquidGlassSupported","Play","React","ActivityIndicator","Animated","Pressable","View","LiquidGlassView","isLiquidGlassSupported","React","jsx","MultilineTextInput","X","Check","jsx","X","Check","jsx","jsxs","View","Pressable","Animated","LiquidGlassView","isLiquidGlassSupported","ActivityIndicator","React","View","Image","View","jsx","View","Image","jsx","jsxs","View","React","React","React","Platform","jsx","jsxs","useSafeAreaInsets","Platform","View","LiquidGlassView","isLiquidGlassSupported","Pressable","Play","ActivityIndicator","Keyboard","ActivityIndicator","View","View","BottomSheetScrollView","jsx","jsxs","View","BottomSheetScrollView","View","View","jsx","jsxs","View","React","Pressable","View","LiquidGlassView","isLiquidGlassSupported","jsx","View","LiquidGlassView","isLiquidGlassSupported","Pressable","jsx","jsxs","View","View","View","jsx","View","jsx","jsx","jsxs","View","React","Animated","LinearGradient","Fragment","jsx","jsxs","Image","jsx","Pressable","View","LiquidGlassView","isLiquidGlassSupported","Svg","Path","jsx","jsx","jsxs","View","LiquidGlassView","isLiquidGlassSupported","Pressable","View","Pencil","jsx","jsxs","Pencil","View","jsx","View","View","jsx","jsxs","View","jsx","jsxs","View","ActivityIndicator","View","Pressable","View","jsx","jsxs","Pressable","View","jsx","Fragment","jsx","jsxs","View","ActivityIndicator","React","ActivityIndicator","View","Send","React","Animated","Pressable","View","Check","ChevronDown","Platform","View","jsx","View","Platform","React","jsx","jsxs","Check","Animated","Pressable","View","ChevronDown","React","Animated","View","useWindowDimensions","React","ActivityIndicator","Animated","Pressable","View","Check","ChevronDown","Play","X","React","Pressable","View","jsx","jsx","jsxs","Animated","Pressable","View","ChevronDown","X","ActivityIndicator","Check","Play","jsx","jsxs","useWindowDimensions","Animated","View","Fragment","jsx","jsxs","View","ActivityIndicator","Send","React","React","Haptics","stats","jsx","jsxs","View","ActivityIndicator","React","ActivityIndicator","View","React","View","React","View","View","CheckCheck","GitMerge","jsx","jsxs","View","CheckCheck","GitMerge","React","Animated","View","jsx","Animated","View","jsx","View","jsx","jsxs","View","React","Pressable","View","Animated","Easing","useAnimatedStyle","useSharedValue","withTiming","jsx","useSharedValue","withTiming","Easing","useAnimatedStyle","Animated","View","Pressable","StyleSheet","jsx","StyleSheet","View","jsx","jsxs","View","jsx","jsxs","View","ActivityIndicator","React","Pressable","View","Pressable","View","jsx","jsxs","View","Pressable","jsx","jsxs","View","Pressable","jsx","Fragment","jsx","jsxs","useWindowDimensions","Keyboard","View","jsx","jsxs","View"]}
|
|
1
|
+
{"version":3,"sources":["../src/studio/ComergeStudio.tsx","../src/studio/bootstrap/StudioBootstrap.tsx","../src/components/primitives/Text.tsx","../src/theme/useTheme.ts","../src/theme/tokens.ts","../src/studio/bootstrap/useStudioBootstrap.ts","../src/core/services/http/public.ts","../src/core/services/http/baseUrl.ts","../src/core/services/supabase/client.ts","../src/core/services/supabase/auth.ts","../src/data/base-repository.ts","../src/data/base-remote.ts","../src/data/public/studio-config/remote.ts","../src/data/public/studio-config/repository.ts","../src/studio/hooks/useApp.ts","../src/core/services/http/index.ts","../src/core/logger.ts","../src/data/apps/remote.ts","../src/data/apps/repository.ts","../src/studio/hooks/useThreadMessages.ts","../src/data/messages/remote.ts","../src/data/messages/repository.ts","../src/studio/hooks/useBundleManager.ts","../src/data/apps/bundles/remote.ts","../src/data/apps/bundles/repository.ts","../src/studio/hooks/useMergeRequests.ts","../src/data/merge-requests/remote.ts","../src/data/merge-requests/repository.ts","../src/data/users/remote.ts","../src/data/users/repository.ts","../src/studio/hooks/useAttachmentUpload.ts","../src/data/attachment/remote.ts","../src/data/attachment/repository.ts","../src/studio/hooks/useStudioActions.ts","../src/data/agent/remote.ts","../src/data/agent/repository.ts","../src/studio/lib/chat.ts","../src/studio/ui/RuntimeRenderer.tsx","../src/studio/ui/StudioOverlay.tsx","../src/components/studio-sheet/StudioBottomSheet.tsx","../src/components/studio-sheet/StudioSheetBackground.tsx","../src/components/studio-sheet/StudioSheetPager.tsx","../src/components/floating-draggable-button/FloatingDraggableButton.tsx","../src/components/floating-draggable-button/constants.ts","../src/components/overlays/EdgeGlowFrame.tsx","../src/components/utils/color.ts","../src/components/draw/DrawModeOverlay.tsx","../src/components/draw/DrawSurface.tsx","../src/components/draw/strokes.ts","../src/components/draw/DrawToolbar.tsx","../src/components/draw/optionalHaptics.ts","../src/components/draw/DrawColorPicker.tsx","../src/components/comments/AppCommentsSheet.tsx","../src/components/chat/ChatComposer.tsx","../src/components/chat/MultilineTextInput.tsx","../src/components/icons/StudioIcons.tsx","../src/components/comments/CommentRow.tsx","../src/components/primitives/Avatar.tsx","../src/components/utils/formatTimeAgo.ts","../src/components/comments/useAppComments.ts","../src/data/comments/remote.ts","../src/data/comments/repository.ts","../src/components/comments/useAppDetails.ts","../src/components/comments/useIosKeyboardSnapFix.ts","../src/studio/ui/PreviewPanel.tsx","../src/components/preview/PreviewPage.tsx","../src/studio/ui/preview-panel/PreviewPanelHeader.tsx","../src/components/studio-sheet/StudioSheetHeader.tsx","../src/components/studio-sheet/StudioSheetHeaderIconButton.tsx","../src/components/preview/PreviewHeroCard.tsx","../src/components/primitives/Surface.tsx","../src/components/primitives/Card.tsx","../src/components/preview/PreviewPlaceholder.tsx","../src/components/preview/PreviewImage.tsx","../src/components/preview/StatsBar.tsx","../src/components/icons/MergeIcon.tsx","../src/components/preview/PreviewStatusBadge.tsx","../src/data/apps/types.ts","../src/studio/ui/preview-panel/PreviewHeroSection.tsx","../src/studio/ui/preview-panel/PreviewMetaSection.tsx","../src/components/preview/PreviewMetaRow.tsx","../src/studio/ui/preview-panel/utils.ts","../src/studio/ui/preview-panel/PreviewCustomizeSection.tsx","../src/studio/ui/preview-panel/PressableCardRow.tsx","../src/studio/ui/preview-panel/SectionTitle.tsx","../src/studio/ui/preview-panel/PreviewCollaborateSection.tsx","../src/components/merge-requests/MergeRequestStatusCard.tsx","../src/components/primitives/MarkdownText.tsx","../src/components/merge-requests/mergeRequestStatusDisplay.ts","../src/components/merge-requests/toIsoString.ts","../src/components/merge-requests/useControlledExpansion.ts","../src/components/merge-requests/ReviewMergeRequestCarousel.tsx","../src/components/merge-requests/ReviewMergeRequestCard.tsx","../src/components/merge-requests/ReviewMergeRequestActionButton.tsx","../src/studio/ui/preview-panel/usePreviewPanelData.ts","../src/data/apps/images/remote.ts","../src/data/apps/images/repository.ts","../src/studio/hooks/useAppStats.ts","../src/data/likes/remote.ts","../src/data/likes/repository.ts","../src/studio/ui/ChatPanel.tsx","../src/components/chat/ChatPage.tsx","../src/components/chat/ChatMessageList.tsx","../src/components/chat/ChatMessageBubble.tsx","../src/components/chat/TypingIndicator.tsx","../src/components/chat/ScrollToBottomButton.tsx","../src/components/chat/ChatHeader.tsx","../src/components/chat/ForkNoticeBanner.tsx","../src/components/dialogs/ConfirmMergeRequestDialog.tsx","../src/components/primitives/Modal.tsx","../src/studio/ui/ConfirmMergeFlow.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Platform as RNPlatform, View, type ViewStyle } from 'react-native';\nimport { BottomSheetModalProvider } from '@gorhom/bottom-sheet';\n\nimport type { Platform as BundlePlatform } from '../data/apps/bundles/types';\nimport { StudioBootstrap } from './bootstrap/StudioBootstrap';\nimport { useApp } from './hooks/useApp';\nimport { useThreadMessages } from './hooks/useThreadMessages';\nimport { useBundleManager } from './hooks/useBundleManager';\nimport { useMergeRequests } from './hooks/useMergeRequests';\nimport { useAttachmentUpload } from './hooks/useAttachmentUpload';\nimport { useStudioActions } from './hooks/useStudioActions';\nimport { hasNoOutcomeAfterLastHuman } from './lib/chat';\nimport { RuntimeRenderer } from './ui/RuntimeRenderer';\nimport { StudioOverlay } from './ui/StudioOverlay';\n\nexport type ComergeStudioProps = {\n appId: string;\n apiKey: string;\n appKey?: string;\n onNavigateHome?: () => void;\n style?: ViewStyle;\n};\n\nexport function ComergeStudio({\n appId,\n apiKey,\n appKey = 'MicroMain',\n onNavigateHome,\n style,\n}: ComergeStudioProps) {\n const [activeAppId, setActiveAppId] = React.useState(appId);\n const [runtimeAppId, setRuntimeAppId] = React.useState(appId);\n const [pendingRuntimeTargetAppId, setPendingRuntimeTargetAppId] = React.useState<string | null>(null);\n const platform = React.useMemo<BundlePlatform>(() => (RNPlatform.OS === 'ios' ? 'ios' : 'android'), []);\n\n React.useEffect(() => {\n setActiveAppId(appId);\n setRuntimeAppId(appId);\n setPendingRuntimeTargetAppId(null);\n }, [appId]);\n\n const captureTargetRef = React.useRef<View | null>(null);\n\n return (\n <StudioBootstrap apiKey={apiKey}>\n {({ userId }) => (\n <BottomSheetModalProvider>\n <ComergeStudioInner\n userId={userId}\n activeAppId={activeAppId}\n setActiveAppId={setActiveAppId}\n runtimeAppId={runtimeAppId}\n setRuntimeAppId={setRuntimeAppId}\n pendingRuntimeTargetAppId={pendingRuntimeTargetAppId}\n setPendingRuntimeTargetAppId={setPendingRuntimeTargetAppId}\n appKey={appKey}\n platform={platform}\n onNavigateHome={onNavigateHome}\n captureTargetRef={captureTargetRef}\n style={style}\n />\n </BottomSheetModalProvider>\n )}\n </StudioBootstrap>\n );\n}\n\ntype InnerProps = {\n userId: string;\n activeAppId: string;\n setActiveAppId: (id: string) => void;\n runtimeAppId: string;\n setRuntimeAppId: (id: string) => void;\n pendingRuntimeTargetAppId: string | null;\n setPendingRuntimeTargetAppId: (id: string | null) => void;\n appKey: string;\n platform: BundlePlatform;\n onNavigateHome?: () => void;\n captureTargetRef: React.RefObject<View | null>;\n style?: ViewStyle;\n};\n\nfunction ComergeStudioInner({\n userId,\n activeAppId,\n setActiveAppId,\n runtimeAppId,\n setRuntimeAppId,\n pendingRuntimeTargetAppId,\n setPendingRuntimeTargetAppId,\n appKey,\n platform,\n onNavigateHome,\n captureTargetRef,\n style,\n}: InnerProps) {\n const { app, loading: appLoading } = useApp(activeAppId);\n const { app: runtimeAppFromHook } = useApp(runtimeAppId, { enabled: runtimeAppId !== activeAppId });\n const runtimeApp = runtimeAppId === activeAppId ? app : runtimeAppFromHook;\n\n // When we fork+edit, we keep rendering the original app until the forked app completes the edit.\n // We unlock the runtime switch once we observe the forked app go editing -> ready.\n const sawEditingOnPendingTargetRef = React.useRef(false);\n React.useEffect(() => {\n sawEditingOnPendingTargetRef.current = false;\n }, [pendingRuntimeTargetAppId]);\n\n React.useEffect(() => {\n if (!pendingRuntimeTargetAppId) return;\n if (activeAppId !== pendingRuntimeTargetAppId) return;\n if (app?.status === 'editing') {\n sawEditingOnPendingTargetRef.current = true;\n }\n if (sawEditingOnPendingTargetRef.current && app?.status === 'ready') {\n setRuntimeAppId(pendingRuntimeTargetAppId);\n setPendingRuntimeTargetAppId(null);\n sawEditingOnPendingTargetRef.current = false;\n }\n }, [activeAppId, app?.status, app?.id, pendingRuntimeTargetAppId, setPendingRuntimeTargetAppId, setRuntimeAppId]);\n\n const bundle = useBundleManager({\n base: { appId: runtimeAppId, commitId: runtimeApp?.headCommitId ?? undefined },\n platform,\n canRequestLatest: runtimeApp?.status === 'ready',\n });\n\n const threadId = app?.threadId ?? '';\n const thread = useThreadMessages(threadId);\n\n const mergeRequests = useMergeRequests({ appId: activeAppId });\n const hasOpenOutgoingMr = React.useMemo(() => {\n return mergeRequests.lists.outgoing.some((mr) => mr.status === 'open');\n }, [mergeRequests.lists.outgoing]);\n\n const incomingReviewMrs = React.useMemo(() => {\n if (!userId) return mergeRequests.lists.incoming;\n return mergeRequests.lists.incoming.filter((mr) => mr.createdBy !== userId);\n }, [mergeRequests.lists.incoming, userId]);\n\n const uploader = useAttachmentUpload();\n\n const actions = useStudioActions({\n userId,\n app,\n onForkedApp: (id, opts) => {\n setActiveAppId(id);\n const keepRenderingAppId = opts?.keepRenderingAppId;\n if (keepRenderingAppId) {\n setRuntimeAppId(keepRenderingAppId);\n setPendingRuntimeTargetAppId(id);\n } else {\n setRuntimeAppId(id);\n setPendingRuntimeTargetAppId(null);\n }\n },\n uploadAttachments: uploader.uploadBase64Images,\n });\n\n const chatSendDisabled = hasNoOutcomeAfterLastHuman(thread.raw);\n\n const [processingMrId, setProcessingMrId] = React.useState<string | null>(null);\n const [testingMrId, setTestingMrId] = React.useState<string | null>(null);\n\n // Show typing dots when the last message isn't an outcome (agent still working).\n const chatShowTypingIndicator = React.useMemo(() => {\n if (!thread.raw || thread.raw.length === 0) return false;\n const last = thread.raw[thread.raw.length - 1];\n const payloadType = typeof (last.payload as any)?.type === 'string' ? String((last.payload as any).type) : undefined;\n return payloadType !== 'outcome';\n }, [thread.raw]);\n\n return (\n <View style={[{ flex: 1 }, style]}>\n <View ref={captureTargetRef} style={{ flex: 1 }} collapsable={false}>\n <RuntimeRenderer appKey={appKey} bundlePath={bundle.bundlePath} renderToken={bundle.renderToken} />\n\n <StudioOverlay\n captureTargetRef={captureTargetRef}\n app={app}\n appLoading={appLoading}\n isOwner={actions.isOwner}\n shouldForkOnEdit={actions.shouldForkOnEdit}\n isTesting={bundle.isTesting}\n onRestoreBase={async () => {\n setTestingMrId(null);\n await bundle.restoreBase();\n }}\n incomingMergeRequests={incomingReviewMrs}\n outgoingMergeRequests={mergeRequests.lists.outgoing}\n creatorStatsById={mergeRequests.creatorStatsById}\n processingMrId={processingMrId}\n isBuildingMrTest={bundle.loading}\n testingMrId={testingMrId}\n toMergeRequestSummary={mergeRequests.toSummary}\n onSubmitMergeRequest={\n app?.forkedFromAppId && actions.isOwner && !hasOpenOutgoingMr\n ? async () => {\n await mergeRequests.actions.openMergeRequest(activeAppId);\n }\n : undefined\n }\n onApprove={async (mr) => {\n if (processingMrId) return;\n setProcessingMrId(mr.id);\n try {\n await mergeRequests.actions.approve(mr.id);\n } finally {\n setProcessingMrId(null);\n }\n }}\n onReject={async (mr) => {\n if (processingMrId) return;\n setProcessingMrId(mr.id);\n try {\n await mergeRequests.actions.reject(mr.id);\n } finally {\n setProcessingMrId(null);\n }\n }}\n onTestMr={async (mr) => {\n setTestingMrId(mr.id);\n await bundle.loadTest({ appId: mr.sourceAppId, commitId: mr.sourceTipCommitId ?? mr.sourceCommitId });\n }}\n chatMessages={thread.messages}\n chatLoading={thread.loading}\n chatSendDisabled={chatSendDisabled}\n chatForking={actions.forking}\n chatSending={actions.sending}\n chatShowTypingIndicator={chatShowTypingIndicator}\n onSendChat={(text, attachments) => actions.sendEdit({ prompt: text, attachments })}\n onNavigateHome={onNavigateHome}\n />\n </View>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\n\nimport { Text } from '../../components/primitives/Text';\nimport { useStudioBootstrap, type UseStudioBootstrapOptions } from './useStudioBootstrap';\n\nexport type StudioBootstrapProps = UseStudioBootstrapOptions & {\n children: React.ReactNode | ((params: { userId: string }) => React.ReactNode);\n /**\n * Optional custom loading UI.\n */\n fallback?: React.ReactNode;\n /**\n * Optional custom error UI. If not provided, a minimal message is shown.\n */\n renderError?: (error: Error) => React.ReactNode;\n};\n\nexport function StudioBootstrap({ children, fallback, renderError, apiKey }: StudioBootstrapProps) {\n const { ready, error, userId } = useStudioBootstrap({ apiKey });\n\n if (error) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }}>\n {renderError ? renderError(error) : <Text variant=\"bodyMuted\">{error.message}</Text>}\n </View>\n );\n }\n\n if (!ready) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }}>\n {fallback ?? <Text variant=\"bodyMuted\">Loading…</Text>}\n </View>\n );\n }\n\n if (typeof children === 'function') {\n return <>{children({ userId: userId ?? '' })}</>;\n }\n\n return <>{children}</>;\n}\n\n\n","import * as React from 'react';\nimport { Text as RNText, type TextProps as RNTextProps, type TextStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport type { TextAlign, TextVariant, WithStyle } from './types';\n\nexport type TextProps = RNTextProps &\n WithStyle<TextStyle> & {\n variant?: TextVariant;\n align?: TextAlign;\n /**\n * Optional explicit color override. Prefer `variant` + theme.\n * Use sparingly for semantic emphasis.\n */\n color?: string;\n };\n\nfunction getVariantStyle(variant: TextVariant, theme: ReturnType<typeof useTheme>): TextStyle {\n const { colors, typography } = theme;\n switch (variant) {\n case 'title':\n return {\n color: colors.text,\n fontSize: typography.fontSize.xl,\n lineHeight: typography.lineHeight.xl,\n fontWeight: typography.fontWeight.semibold,\n };\n case 'caption':\n return {\n color: colors.text,\n fontSize: typography.fontSize.xs,\n lineHeight: typography.lineHeight.xs,\n fontWeight: typography.fontWeight.medium,\n };\n case 'captionMuted':\n return {\n color: colors.textSubtle,\n fontSize: typography.fontSize.xs,\n lineHeight: typography.lineHeight.xs,\n fontWeight: typography.fontWeight.medium,\n };\n case 'bodyMuted':\n return {\n color: colors.textMuted,\n fontSize: typography.fontSize.md,\n lineHeight: typography.lineHeight.md,\n fontWeight: typography.fontWeight.regular,\n };\n case 'body':\n default:\n return {\n color: colors.text,\n fontSize: typography.fontSize.md,\n lineHeight: typography.lineHeight.md,\n fontWeight: typography.fontWeight.regular,\n };\n }\n}\n\nexport function Text({\n variant = 'body',\n align,\n color,\n style,\n ...props\n}: TextProps) {\n const theme = useTheme();\n const base = getVariantStyle(variant, theme);\n\n return (\n <RNText\n {...props}\n style={[\n base,\n align ? { textAlign: align } : null,\n color ? { color } : null,\n style,\n ]}\n />\n );\n}\n\n\n","import { useColorScheme } from 'react-native';\n\nimport { themes } from './tokens';\nimport type { Theme, ThemeScheme } from './types';\n\nexport function useTheme(): Theme {\n const scheme = (useColorScheme() ?? 'light') as ThemeScheme;\n return themes[scheme] ?? themes.light;\n}\n\n\n","import type { Theme } from './types';\n\nexport const lightTheme = {\n scheme: 'light',\n colors: {\n text: '#09090B',\n textMuted: '#898994',\n textSubtle: 'rgba(137, 137, 148, 0.70)',\n\n background: '#FFFFFF',\n surface: '#F6F6F6',\n surfaceRaised: '#FFFFFF',\n\n border: '#E4E4E7',\n borderStrong: '#D4D4D8',\n\n primary: '#6200EE',\n onPrimary: '#FFFFFF',\n\n neutral: '#ECECEE',\n onNeutral: '#09090B',\n\n danger: '#F43F5E',\n onDanger: '#FFFFFF',\n dangerSubtle: 'rgba(244, 63, 94, 0.12)',\n\n success: '#10B981',\n onSuccess: '#FFFFFF',\n successSubtle: 'rgba(16, 185, 129, 0.12)',\n\n warning: '#FACC15',\n onWarning: '#09090B',\n warningSubtle: 'rgba(250, 204, 21, 0.14)',\n\n link: '#6200EE',\n\n backdrop: 'rgba(0, 0, 0, 0.35)',\n\n handleIndicator: '#71717A',\n\n floatingSurface: 'rgba(255, 255, 255, 0.6)',\n floatingContent: '#000000',\n\n accentRingFrom: 'rgba(98, 0, 238, 0.20)',\n accentRingTo: 'rgba(98, 0, 238, 0.90)',\n dangerRingFrom: 'rgba(244, 63, 94, 0.35)',\n dangerRingTo: 'rgba(244, 63, 94, 1.0)',\n },\n spacing: { xs: 4, sm: 8, md: 12, lg: 16, xl: 24 },\n radii: { sm: 8, md: 12, lg: 16, xl: 24, pill: 999 },\n typography: {\n fontSize: { xs: 12, sm: 13, md: 15, lg: 17, xl: 20 },\n lineHeight: { xs: 16, sm: 18, md: 20, lg: 22, xl: 26 },\n fontWeight: { regular: '400', medium: '500', semibold: '600', bold: '700' },\n },\n} as const satisfies Theme;\n\nexport const darkTheme = {\n scheme: 'dark',\n colors: {\n text: '#FFFFFF',\n textMuted: '#A1A1AA',\n textSubtle: 'rgba(161, 161, 170, 0.70)',\n\n background: '#0B080F',\n surface: '#18181B',\n surfaceRaised: '#0B080F',\n\n border: '#404049',\n borderStrong: '#52525B',\n\n primary: '#6200EE',\n onPrimary: '#FFFFFF',\n\n neutral: '#0B080F',\n onNeutral: '#FFFFFF',\n\n danger: '#F43F5E',\n onDanger: '#FFFFFF',\n dangerSubtle: 'rgba(244, 63, 94, 0.18)',\n\n success: '#10B981',\n onSuccess: '#0B080F',\n successSubtle: 'rgba(16, 185, 129, 0.16)',\n\n warning: '#FBBF24',\n onWarning: '#0B080F',\n warningSubtle: 'rgba(251, 191, 36, 0.18)',\n\n link: '#6200EE',\n\n backdrop: 'rgba(0, 0, 0, 0.55)',\n\n handleIndicator: '#A1A1AA',\n\n floatingSurface: 'rgba(0, 0, 0, 0.6)',\n floatingContent: '#FFFFFF',\n\n accentRingFrom: 'rgba(98, 0, 238, 0.20)',\n accentRingTo: 'rgba(98, 0, 238, 0.90)',\n dangerRingFrom: 'rgba(244, 63, 94, 0.35)',\n dangerRingTo: 'rgba(244, 63, 94, 1.0)',\n },\n spacing: { xs: 4, sm: 8, md: 12, lg: 16, xl: 24 },\n radii: { sm: 8, md: 12, lg: 16, xl: 24, pill: 999 },\n typography: {\n fontSize: { xs: 12, sm: 13, md: 15, lg: 17, xl: 20 },\n lineHeight: { xs: 16, sm: 18, md: 20, lg: 22, xl: 26 },\n fontWeight: { regular: '400', medium: '500', semibold: '600', bold: '700' },\n },\n} as const satisfies Theme;\n\nexport const themes = {\n light: lightTheme,\n dark: darkTheme,\n} as const;\n\n\n","import * as React from 'react';\n\nimport { setClientApiKey } from '../../core/services/http/public';\nimport { ensureAuthenticatedSession, ensureAnonymousSession } from '../../core/services/supabase/auth';\nimport { isSupabaseClientInjected, setSupabaseConfig } from '../../core/services/supabase/client';\nimport { studioConfigRepository } from '../../data/public/studio-config/repository';\n\nexport type UseStudioBootstrapOptions = {\n apiKey: string;\n};\n\nexport type StudioBootstrapState = {\n ready: boolean;\n userId: string | null;\n error: Error | null;\n};\n\nexport function useStudioBootstrap(options: UseStudioBootstrapOptions): StudioBootstrapState {\n const [state, setState] = React.useState<StudioBootstrapState>({\n ready: false,\n userId: null,\n error: null,\n });\n\n React.useEffect(() => {\n let cancelled = false;\n\n (async () => {\n try {\n setClientApiKey(options.apiKey);\n const requireAuth = isSupabaseClientInjected();\n if (!requireAuth) {\n const cfg = await studioConfigRepository.get();\n setSupabaseConfig(cfg);\n }\n const { user } = requireAuth ? await ensureAuthenticatedSession() : await ensureAnonymousSession();\n\n if (cancelled) return;\n setState({ ready: true, userId: user.id, error: null });\n } catch (e) {\n if (cancelled) return;\n const err = e instanceof Error ? e : new Error(String(e));\n setState({ ready: false, userId: null, error: err });\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [options.apiKey]);\n\n return state;\n}\n\n\n","import axios from \"axios\";\n\nimport { BASE_URL } from \"./baseUrl\";\n\nconst CLIENT_KEY_HEADER = \"x-comerge-api-key\";\nlet clientApiKey: string | null = null;\n\nexport const publicApi = axios.create({\n\tbaseURL: BASE_URL,\n\ttimeout: 30_000,\n\theaders: {\n\t\tAccept: \"application/json\",\n\t\t\"Content-Type\": \"application/json\",\n\t},\n});\n\nexport function setClientApiKey(apiKey: string) {\n\tconst trimmed = apiKey?.trim?.() ?? \"\";\n\tif (!trimmed) {\n\t\tthrow new Error(\"comerge-studio: apiKey is required\");\n\t}\n\tclientApiKey = trimmed;\n\tpublicApi.defaults.headers.common[CLIENT_KEY_HEADER] = trimmed;\n}\n\npublicApi.interceptors.request.use((config) => {\n\tif (!clientApiKey) return config;\n\tconfig.headers = config.headers ?? {};\n\t(config.headers as any)[CLIENT_KEY_HEADER] = clientApiKey;\n\treturn config;\n});\n\n\n","export const BASE_URL = \"http://192.168.8.175:8080\";\n\n\n","import { createClient, type SupabaseClient } from '@supabase/supabase-js';\n\nlet clientSingleton: SupabaseClient | null = null;\nlet injectedClient: SupabaseClient | null = null;\nlet hasInjectedClient = false;\nlet runtimeConfig: { url: string; anonKey: string } | null = null;\n\nexport function setSupabaseClient(client: SupabaseClient) {\n injectedClient = client;\n clientSingleton = client;\n hasInjectedClient = true;\n}\n\nexport function isSupabaseClientInjected(): boolean {\n return hasInjectedClient;\n}\n\nexport function setSupabaseConfig(config: { url: string; anonKey: string }) {\n runtimeConfig = config;\n}\n\nexport function getSupabaseClient(): SupabaseClient {\n if (clientSingleton) return clientSingleton;\n if (injectedClient) return injectedClient;\n\n if (!runtimeConfig?.url) {\n throw new Error('comerge-studio: Supabase config not initialized (missing url).');\n }\n if (!runtimeConfig?.anonKey) {\n throw new Error('comerge-studio: Supabase config not initialized (missing anonKey).');\n }\n\n clientSingleton = createClient(runtimeConfig.url, runtimeConfig.anonKey, {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: false,\n },\n });\n\n return clientSingleton;\n}\n\n","import type { User } from '@supabase/supabase-js';\n\nimport { getSupabaseClient } from './client';\n\nexport type EnsureAnonymousSessionResult = {\n user: User;\n isNew: boolean;\n};\n\nexport type EnsureAuthenticatedSessionResult = {\n user: User;\n};\n\nexport async function ensureAuthenticatedSession(): Promise<EnsureAuthenticatedSessionResult> {\n const supabase = getSupabaseClient();\n const { data, error } = await supabase.auth.getSession();\n if (error) throw error;\n const user = data.session?.user ?? null;\n if (!user) {\n throw new Error('comerge-studio: no authenticated Supabase session found.');\n }\n return { user };\n}\n\nexport async function ensureAnonymousSession(): Promise<EnsureAnonymousSessionResult> {\n const supabase = getSupabaseClient();\n\n const { data: sessionData, error: sessionError } = await supabase.auth.getSession();\n if (sessionError) throw sessionError;\n\n const existingUser = sessionData.session?.user ?? null;\n if (existingUser) return { user: existingUser, isNew: false };\n\n const { data, error } = await supabase.auth.signInAnonymously();\n if (error) throw error;\n if (!data.user) throw new Error('comerge-studio: anonymous sign-in returned no user');\n\n return { user: data.user, isNew: true };\n}\n\n\n","import type { ServiceResponse } from './types';\n\nexport abstract class BaseRepository {\n protected unwrapOrThrow<T>(res: ServiceResponse<T>): T {\n if (res.success && res.responseObject) return res.responseObject;\n const msg = res.message || 'Request failed';\n throw new Error(msg);\n }\n}\n\n\n","export abstract class BaseRemote {}\n\n\n","import { publicApi } from \"../../../core/services/http/public\";\nimport type { ServiceResponse } from \"../../types\";\nimport { BaseRemote } from \"../../base-remote\";\nimport type { StudioConfig } from \"./types\";\n\nexport interface StudioConfigRemoteDataSource {\n\tget(): Promise<ServiceResponse<StudioConfig>>;\n}\n\nclass StudioConfigRemoteDataSourceImpl extends BaseRemote implements StudioConfigRemoteDataSource {\n\tasync get(): Promise<ServiceResponse<StudioConfig>> {\n\t\tconst { data } = await publicApi.get<ServiceResponse<StudioConfig>>(\"/v1/public/studio-config\");\n\t\treturn data;\n\t}\n}\n\nexport const studioConfigRemoteDataSource: StudioConfigRemoteDataSource = new StudioConfigRemoteDataSourceImpl();\n\n\n","import { BaseRepository } from \"../../base-repository\";\nimport type { StudioConfig } from \"./types\";\nimport type { StudioConfigRemoteDataSource } from \"./remote\";\nimport { studioConfigRemoteDataSource } from \"./remote\";\n\nexport interface StudioConfigRepository {\n\tget(): Promise<StudioConfig>;\n}\n\nclass StudioConfigRepositoryImpl extends BaseRepository implements StudioConfigRepository {\n\tconstructor(private readonly remote: StudioConfigRemoteDataSource) {\n\t\tsuper();\n\t}\n\n\tasync get(): Promise<StudioConfig> {\n\t\tconst res = await this.remote.get();\n\t\treturn this.unwrapOrThrow(res);\n\t}\n}\n\nexport const studioConfigRepository: StudioConfigRepository = new StudioConfigRepositoryImpl(studioConfigRemoteDataSource);\n\n\n","import * as React from 'react';\n\nimport type { App } from '../../data/apps/types';\nimport { appsRepository } from '../../data/apps/repository';\n\nexport type UseAppResult = {\n app: App | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n};\n\nexport type UseAppOptions = {\n /**\n * When false, this hook won't fetch or subscribe.\n * Useful to avoid duplicate Supabase channel subscriptions for the same app id.\n */\n enabled?: boolean;\n};\n\nexport function useApp(appId: string, options?: UseAppOptions): UseAppResult {\n const enabled = options?.enabled ?? true;\n const [app, setApp] = React.useState<App | null>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const mergeApp = React.useCallback((prev: App | null, next: App): App => {\n // Realtime (Supabase) rows don't include \"viewer-specific\" fields like `isLiked`,\n // and may omit derived fields like `insights`. Preserve those from the last REST fetch.\n const merged: App = {\n ...(prev ?? ({} as App)),\n ...next,\n isLiked: next.isLiked ?? prev?.isLiked,\n insights: next.insights ?? prev?.insights,\n };\n return merged;\n }, []);\n\n const fetchOnce = React.useCallback(async () => {\n if (!enabled) return;\n if (!appId) return;\n setLoading(true);\n setError(null);\n try {\n const next = await appsRepository.getById(appId);\n setApp((prev) => mergeApp(prev, next));\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n setApp(null);\n } finally {\n setLoading(false);\n }\n }, [appId, enabled]);\n\n React.useEffect(() => {\n if (!enabled) return;\n void fetchOnce();\n }, [enabled, fetchOnce]);\n\n React.useEffect(() => {\n if (!enabled) return;\n if (!appId) return;\n const unsubscribe = appsRepository.subscribeApp(appId, {\n onInsert: (a) => {\n console.log('[useApp] onInsert', a);\n setApp((prev) => mergeApp(prev, a));\n },\n onUpdate: (a) => {\n console.log('[useApp] onUpdate', a);\n setApp((prev) => mergeApp(prev, a));\n },\n onDelete: () => {\n console.log('[useApp] onDelete');\n setApp(null);\n },\n });\n return unsubscribe;\n }, [appId, enabled, mergeApp]);\n\n return { app, loading, error, refetch: fetchOnce };\n}\n\n\n","import axios, {\n AxiosError,\n AxiosInstance,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\nimport { getSupabaseClient } from '../supabase';\nimport { log } from '../../logger';\nimport { BASE_URL } from './baseUrl';\n\ndeclare module 'axios' {\n export interface AxiosRequestConfig {\n _retried?: boolean;\n }\n}\n\nexport const createApiClient = (baseURL: string): AxiosInstance => {\n const apiClient = axios.create({\n baseURL,\n timeout: 3 * 60 * 1000,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\n const maskAuthHeader = (headers: unknown) => {\n if (!headers || typeof headers !== 'object') return headers;\n const copy: Record<string, unknown> = { ...(headers as any) };\n const auth = (copy.Authorization ?? copy.authorization) as unknown;\n if (typeof auth === 'string' && auth.startsWith('Bearer ')) {\n copy.Authorization = 'Bearer [REDACTED]';\n }\n return copy;\n };\n\n apiClient.interceptors.request.use(\n async (config: InternalAxiosRequestConfig) => {\n try {\n const supabase = getSupabaseClient();\n const { data } = await supabase.auth.getSession();\n const accessToken = data.session?.access_token;\n if (accessToken) {\n config.headers = config.headers ?? {};\n (config.headers).Authorization = `Bearer ${accessToken}`;\n }\n } catch (err) {\n log.warn('Failed to attach auth token to request', err);\n }\n\n log.debug('Request:', {\n url: config.url,\n method: config.method,\n headers: maskAuthHeader(config.headers),\n data: config.data,\n });\n return config;\n },\n (error: AxiosError) => {\n log.error('Request Error:', error);\n return Promise.reject(error);\n }\n );\n\n apiClient.interceptors.response.use(\n (response: AxiosResponse) => {\n log.debug('Response:', {\n url: response.config?.url,\n status: response.status,\n headers: response.headers,\n data: response.data,\n });\n return response;\n },\n async (error: AxiosError) => {\n const originalRequest = error.config as\n | (InternalAxiosRequestConfig & { _retried?: boolean })\n | undefined;\n log.error('Response Error:', {\n message: error.message,\n code: error.code,\n url: originalRequest?.url,\n method: originalRequest?.method,\n requestHeaders: maskAuthHeader(originalRequest?.headers),\n requestData: originalRequest?.data,\n status: error.response?.status,\n statusText: (error.response as any)?.statusText,\n responseHeaders: error.response?.headers,\n responseData: error.response?.data,\n });\n\n if (!originalRequest) {\n return Promise.reject(error);\n }\n\n const authHeader = (originalRequest.headers as any)?.Authorization as string | undefined;\n const hasBearerToken = Boolean(authHeader && authHeader.startsWith('Bearer '));\n\n if (error.response?.status === 401 && hasBearerToken && !originalRequest._retried) {\n originalRequest._retried = true;\n try {\n const supabase = getSupabaseClient();\n const { data, error: refreshError } = await supabase.auth.refreshSession();\n if (refreshError) throw refreshError;\n const newToken = data.session?.access_token;\n if (newToken && originalRequest.headers) {\n (originalRequest.headers as any).Authorization = `Bearer ${newToken}`;\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n return apiClient(originalRequest);\n } catch (refreshErr) {\n log.warn('Token refresh failed', refreshErr);\n return Promise.reject(refreshErr);\n }\n }\n\n return Promise.reject(error);\n }\n );\n\n return apiClient;\n};\n\nexport const api = createApiClient(BASE_URL);\n\nexport default createApiClient;\n\n\n","import { logger, consoleTransport } from 'react-native-logs';\n\nexport type StudioLogger = {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n extend: (extension: string) => Pick<StudioLogger, 'debug' | 'info' | 'warn' | 'error'>;\n enable: (extension?: string) => boolean;\n disable: (extension?: string) => boolean;\n getExtensions: () => string[];\n setSeverity: (level: string) => string;\n getSeverity: () => string;\n patchConsole: () => void;\n};\n\nexport const log: StudioLogger = logger.createLogger({\n levels: {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n },\n severity: \"debug\",\n transport: consoleTransport,\n transportOptions: {\n colors: {\n info: \"blueBright\",\n warn: \"yellowBright\",\n error: \"redBright\",\n },\n },\n async: true,\n dateFormat: \"time\",\n printLevel: true,\n printDate: true,\n fixedExtLvlLength: false,\n enabled: true,\n }\n) as unknown as StudioLogger;\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type {\n App,\n AppAnalyticsParams,\n AppAnalyticsPoint,\n AppInsights,\n AppsSummary,\n ForkAppRequest,\n ImportGithubAppRequest,\n ImportGithubAppResponse,\n ListAppsSummaryParams,\n ListLikedAppsParams,\n ListPublicAppsParams,\n LikedAppsList,\n} from './types';\n\nexport interface AppsRemoteDataSource {\n list(projectId?: string): Promise<ServiceResponse<App[]>>;\n listPublicOthers(params?: ListPublicAppsParams): Promise<ServiceResponse<App[]>>;\n listSummary(params?: ListAppsSummaryParams): Promise<ServiceResponse<AppsSummary>>;\n listLiked(params?: ListLikedAppsParams): Promise<ServiceResponse<LikedAppsList>>;\n getById(appId: string): Promise<ServiceResponse<App>>;\n fork(appId: string, payload: ForkAppRequest): Promise<ServiceResponse<App>>;\n getInsights(appId: string): Promise<ServiceResponse<AppInsights>>;\n getAnalytics(appId: string, params: AppAnalyticsParams): Promise<ServiceResponse<AppAnalyticsPoint[]>>;\n importFromGithub(payload: ImportGithubAppRequest): Promise<ServiceResponse<ImportGithubAppResponse>>;\n}\n\nclass AppsRemoteDataSourceImpl extends BaseRemote implements AppsRemoteDataSource {\n async list(projectId?: string): Promise<ServiceResponse<App[]>> {\n const params = projectId ? { projectId } : undefined;\n const { data } = await api.get<ServiceResponse<App[]>>('/v1/apps', { params });\n return data;\n }\n\n async listPublicOthers(params?: ListPublicAppsParams): Promise<ServiceResponse<App[]>> {\n const query = params ? { ...params } : undefined;\n const { data } = await api.get<ServiceResponse<App[]>>('/v1/apps/public', { params: query });\n return data;\n }\n\n async listSummary(params?: ListAppsSummaryParams): Promise<ServiceResponse<AppsSummary>> {\n const query = params ? { ...params } : undefined;\n const { data } = await api.get<ServiceResponse<AppsSummary>>('/v1/apps/summary', {\n params: query,\n });\n return data;\n }\n\n async listLiked(params?: ListLikedAppsParams): Promise<ServiceResponse<LikedAppsList>> {\n const query = params ? { ...params } : undefined;\n const { data } = await api.get<ServiceResponse<LikedAppsList>>('/v1/apps/likes/mine', {\n params: query,\n });\n return data;\n }\n\n async getById(appId: string): Promise<ServiceResponse<App>> {\n const { data } = await api.get<ServiceResponse<App>>(`/v1/apps/${encodeURIComponent(appId)}`);\n return data;\n }\n\n async fork(appId: string, payload: ForkAppRequest): Promise<ServiceResponse<App>> {\n const { data } = await api.post<ServiceResponse<App>>(`/v1/apps/${encodeURIComponent(appId)}/fork`, payload);\n return data;\n }\n\n async importFromGithub(payload: ImportGithubAppRequest): Promise<ServiceResponse<ImportGithubAppResponse>> {\n const { data } = await api.post<ServiceResponse<ImportGithubAppResponse>>('/v1/apps/import/github', payload);\n return data;\n }\n\n async getInsights(appId: string): Promise<ServiceResponse<AppInsights>> {\n const { data } = await api.get<ServiceResponse<AppInsights>>(\n `/v1/apps/${encodeURIComponent(appId)}/insights`,\n );\n return data;\n }\n\n async getAnalytics(\n appId: string,\n params: AppAnalyticsParams,\n ): Promise<ServiceResponse<AppAnalyticsPoint[]>> {\n const query = { ...params };\n const { data } = await api.get<ServiceResponse<AppAnalyticsPoint[]>>(\n `/v1/apps/${encodeURIComponent(appId)}/analytics`,\n { params: query },\n );\n return data;\n }\n}\n\nexport const appsRemoteDataSource: AppsRemoteDataSource = new AppsRemoteDataSourceImpl();\n\n\n","import type {\n App,\n AppAnalyticsParams,\n AppAnalyticsPoint,\n AppInsights,\n AppsSummary,\n ForkAppRequest,\n ImportGithubAppRequest,\n ImportGithubAppResponse,\n ListAppsSummaryParams,\n ListLikedAppsParams,\n ListPublicAppsParams,\n LikedAppsList,\n} from './types';\nimport { appsRemoteDataSource } from './remote';\nimport type { AppsRemoteDataSource } from './remote';\nimport { BaseRepository } from '../../data/base-repository';\nimport { getSupabaseClient } from '../../core/services/supabase';\n\ntype DbAppRow = {\n id: string;\n name: string;\n description: string | null;\n apple_app_store_category: string | null;\n google_play_category: string | null;\n pg_rating: string | null;\n project_id: string;\n platform: string | null;\n is_public: boolean;\n created_by: string;\n status: App['status'];\n status_error: string | null;\n status_changed_at: string | null;\n head_commit_id: string | null;\n forked_from_commit_id: string | null;\n forked_from_app_id: string | null;\n thread_id: string | null;\n created_at: string;\n updated_at: string;\n};\n\ntype AppSubscriptionHandlers = {\n onInsert?: (app: App) => void;\n onUpdate?: (app: App) => void;\n onDelete?: (app: App) => void;\n};\n\nfunction mapDbAppRow(row: DbAppRow): App {\n return {\n id: row.id,\n name: row.name,\n description: row.description,\n appleAppStoreCategory: row.apple_app_store_category,\n googlePlayCategory: row.google_play_category,\n pgRating: row.pg_rating,\n projectId: row.project_id,\n platform: row.platform,\n isPublic: row.is_public,\n createdBy: row.created_by,\n status: row.status,\n statusError: row.status_error,\n statusChangedAt: row.status_changed_at,\n headCommitId: row.head_commit_id,\n forkedFromCommitId: row.forked_from_commit_id,\n forkedFromAppId: row.forked_from_app_id,\n threadId: row.thread_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n insights: null,\n };\n}\n\nexport interface AppsRepository {\n list(projectId?: string): Promise<App[]>;\n listPublicOthers(params?: ListPublicAppsParams): Promise<App[]>;\n getSummary(params?: ListAppsSummaryParams): Promise<AppsSummary>;\n listLiked(params?: ListLikedAppsParams): Promise<LikedAppsList>;\n getById(appId: string): Promise<App>;\n fork(appId: string, payload: ForkAppRequest): Promise<App>;\n getInsights(appId: string): Promise<AppInsights>;\n getAnalytics(appId: string, params: AppAnalyticsParams): Promise<AppAnalyticsPoint[]>;\n subscribeCreatedApps(userId: string, handlers: AppSubscriptionHandlers): () => void;\n subscribeApp(appId: string, handlers: AppSubscriptionHandlers): () => void;\n importFromGithub(payload: ImportGithubAppRequest): Promise<ImportGithubAppResponse>;\n}\n\nclass AppsRepositoryImpl extends BaseRepository implements AppsRepository {\n constructor(private readonly remote: AppsRemoteDataSource) {\n super();\n }\n\n async list(projectId?: string): Promise<App[]> {\n const res = await this.remote.list(projectId);\n return this.unwrapOrThrow(res);\n }\n\n async listPublicOthers(params?: ListPublicAppsParams): Promise<App[]> {\n const res = await this.remote.listPublicOthers(params);\n return this.unwrapOrThrow(res);\n }\n\n async getSummary(params?: ListAppsSummaryParams): Promise<AppsSummary> {\n const res = await this.remote.listSummary(params);\n return this.unwrapOrThrow(res);\n }\n\n async listLiked(params?: ListLikedAppsParams): Promise<LikedAppsList> {\n const res = await this.remote.listLiked(params);\n return this.unwrapOrThrow(res);\n }\n\n async getById(appId: string): Promise<App> {\n const res = await this.remote.getById(appId);\n return this.unwrapOrThrow(res);\n }\n\n async fork(appId: string, payload: ForkAppRequest): Promise<App> {\n const res = await this.remote.fork(appId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async getInsights(appId: string): Promise<AppInsights> {\n const res = await this.remote.getInsights(appId);\n return this.unwrapOrThrow(res);\n }\n\n async getAnalytics(appId: string, params: AppAnalyticsParams): Promise<AppAnalyticsPoint[]> {\n const res = await this.remote.getAnalytics(appId, params);\n return this.unwrapOrThrow(res);\n }\n\n async importFromGithub(payload: ImportGithubAppRequest): Promise<ImportGithubAppResponse> {\n const res = await this.remote.importFromGithub(payload);\n return this.unwrapOrThrow(res);\n }\n\n subscribeCreatedApps(userId: string, handlers: AppSubscriptionHandlers): () => void {\n if (!userId) return () => {};\n return this.subscribeToAppChannel(`apps:createdBy:${userId}`, `created_by=eq.${userId}`, handlers);\n }\n\n subscribeApp(appId: string, handlers: AppSubscriptionHandlers): () => void {\n if (!appId) return () => {};\n return this.subscribeToAppChannel(`apps:id:${appId}`, `id=eq.${appId}`, handlers);\n }\n\n private subscribeToAppChannel(channelKey: string, filter: string, handlers: AppSubscriptionHandlers): () => void {\n const supabase = getSupabaseClient();\n const channel = supabase\n .channel(channelKey)\n .on(\n 'postgres_changes',\n { event: 'INSERT', schema: 'public', table: 'app', filter },\n (payload) => {\n console.log('[subscribeToAppChannel] onInsert', payload);\n handlers.onInsert?.(mapDbAppRow(payload.new as DbAppRow));\n }\n )\n .on(\n 'postgres_changes',\n { event: 'UPDATE', schema: 'public', table: 'app', filter },\n (payload) => {\n console.log('[subscribeToAppChannel] onUpdate', payload);\n handlers.onUpdate?.(mapDbAppRow(payload.new as DbAppRow));\n }\n )\n .on(\n 'postgres_changes',\n { event: 'DELETE', schema: 'public', table: 'app', filter },\n (payload) => {\n console.log('[subscribeToAppChannel] onDelete', payload);\n handlers.onDelete?.(mapDbAppRow(payload.old as DbAppRow));\n }\n )\n .subscribe();\n\n return () => {\n supabase.removeChannel(channel);\n };\n }\n}\n\nexport const appsRepository: AppsRepository = new AppsRepositoryImpl(appsRemoteDataSource);\n\n\n","import * as React from 'react';\n\nimport type { Message } from '../../data/messages/types';\nimport { messagesRepository } from '../../data/messages/repository';\nimport type { ChatMessage } from '../../components/models/types';\n\nexport type UseThreadMessagesResult = {\n raw: Message[];\n messages: ChatMessage[];\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n};\n\nfunction extractMeta(payload: unknown): ChatMessage['meta'] {\n const meta = (payload as any)?.meta;\n if (!meta || typeof meta !== 'object') return null;\n const obj = meta as Record<string, unknown>;\n return {\n kind: typeof obj.kind === 'string' ? obj.kind : undefined,\n event: typeof obj.event === 'string' ? obj.event : undefined,\n status: typeof obj.status === 'string' ? (obj.status as any) : undefined,\n mergeRequestId: typeof obj.mergeRequestId === 'string' ? obj.mergeRequestId : undefined,\n sourceAppId: typeof obj.sourceAppId === 'string' ? obj.sourceAppId : undefined,\n targetAppId: typeof obj.targetAppId === 'string' ? obj.targetAppId : undefined,\n appId: typeof obj.appId === 'string' ? obj.appId : undefined,\n threadId: typeof obj.threadId === 'string' ? obj.threadId : undefined,\n };\n}\n\nfunction mapMessageToChatMessage(m: Message): ChatMessage {\n const kind = typeof (m.payload as any)?.type === 'string' ? String((m.payload as any).type) : null;\n return {\n id: m.id,\n author: m.authorType === 'ai' ? 'assistant' : 'human',\n content: typeof m.payload?.content === 'string' ? m.payload.content : '',\n createdAt: m.createdAt,\n kind,\n meta: extractMeta(m.payload),\n };\n}\n\nexport function useThreadMessages(threadId: string): UseThreadMessagesResult {\n const [raw, setRaw] = React.useState<Message[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const refetch = React.useCallback(async () => {\n if (!threadId) {\n setRaw([]);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const list = await messagesRepository.list(threadId);\n setRaw(list);\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n setRaw([]);\n } finally {\n setLoading(false);\n }\n }, [threadId]);\n\n React.useEffect(() => {\n void refetch();\n }, [refetch]);\n\n React.useEffect(() => {\n if (!threadId) return;\n const unsubscribe = messagesRepository.subscribeThread(threadId, {\n onInsert: (m) => setRaw((prev) => [...prev, m]),\n onUpdate: (m) => setRaw((prev) => prev.map((x) => (x.id === m.id ? m : x))),\n onDelete: (m) => setRaw((prev) => prev.filter((x) => x.id !== m.id)),\n });\n return unsubscribe;\n }, [threadId]);\n\n const messages = React.useMemo(() => raw.map(mapMessageToChatMessage), [raw]);\n\n return { raw, messages, loading, error, refetch };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport type { Message } from './types';\nimport { BaseRemote } from '../base-remote';\n\nexport interface MessagesRemoteDataSource {\n list(threadId: string): Promise<ServiceResponse<Message[]>>;\n}\n\nclass MessagesRemoteDataSourceImpl extends BaseRemote implements MessagesRemoteDataSource {\n async list(threadId: string): Promise<ServiceResponse<Message[]>> {\n const { data } = await api.get<ServiceResponse<Message[]>>(\n `/v1/threads/${encodeURIComponent(threadId)}/messages`\n );\n return data;\n }\n}\n\nexport const messagesRemoteDataSource: MessagesRemoteDataSource = new MessagesRemoteDataSourceImpl();\n\n\n","import type { MessagesRemoteDataSource } from './remote';\nimport { messagesRemoteDataSource } from './remote';\nimport type { Message } from './types';\nimport { BaseRepository } from '../../data/base-repository';\nimport { getSupabaseClient } from '../../core/services/supabase';\n\ntype DbMessageRow = {\n id: string;\n app_id: string;\n thread_id: string;\n commit_id: string | null;\n parent_message_id: string | null;\n author_type: 'human' | 'ai' | 'system';\n user_id: string | null;\n payload: Record<string, unknown>;\n reference_id: string | null;\n created_at: string;\n updated_at: string;\n};\n\nfunction mapDbRowToMessage(row: DbMessageRow): Message {\n return {\n id: row.id,\n appId: row.app_id,\n threadId: row.thread_id,\n commitId: row.commit_id,\n parentMessageId: row.parent_message_id,\n authorType: row.author_type === 'system' ? 'ai' : row.author_type,\n userId: row.user_id,\n payload: row.payload,\n referenceId: row.reference_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nexport interface MessagesRepository {\n list(threadId: string): Promise<Message[]>;\n subscribeThread(\n threadId: string,\n handlers: {\n onInsert?: (m: Message) => void;\n onUpdate?: (m: Message) => void;\n onDelete?: (m: Message) => void;\n }\n ): () => void;\n}\n\nclass MessagesRepositoryImpl extends BaseRepository implements MessagesRepository {\n constructor(private readonly remote: MessagesRemoteDataSource) {\n super();\n }\n\n async list(threadId: string): Promise<Message[]> {\n const res = await this.remote.list(threadId);\n return this.unwrapOrThrow(res);\n }\n\n subscribeThread(\n threadId: string,\n handlers: {\n onInsert?: (m: Message) => void;\n onUpdate?: (m: Message) => void;\n onDelete?: (m: Message) => void;\n }\n ): () => void {\n const supabase = getSupabaseClient();\n const channel = supabase\n .channel(`messages:thread:${threadId}`)\n .on(\n 'postgres_changes',\n { event: 'INSERT', schema: 'public', table: 'message', filter: `thread_id=eq.${threadId}` },\n (payload) => {\n const row = payload.new as DbMessageRow;\n handlers.onInsert?.(mapDbRowToMessage(row));\n }\n )\n .on(\n 'postgres_changes',\n { event: 'UPDATE', schema: 'public', table: 'message', filter: `thread_id=eq.${threadId}` },\n (payload) => {\n const row = payload.new as DbMessageRow;\n handlers.onUpdate?.(mapDbRowToMessage(row));\n }\n )\n .on(\n 'postgres_changes',\n { event: 'DELETE', schema: 'public', table: 'message', filter: `thread_id=eq.${threadId}` },\n (payload) => {\n const row = payload.old as DbMessageRow;\n handlers.onDelete?.(mapDbRowToMessage(row));\n }\n )\n .subscribe();\n\n return () => {\n supabase.removeChannel(channel);\n };\n }\n}\n\nexport const messagesRepository: MessagesRepository = new MessagesRepositoryImpl(messagesRemoteDataSource);\n\n\n","import * as React from 'react';\nimport * as FileSystem from 'expo-file-system/legacy';\n\nimport type { Platform as BundlePlatform, Bundle } from '../../data/apps/bundles/types';\nimport { bundlesRepository } from '../../data/apps/bundles/repository';\n\ntype BundleSource = {\n appId: string;\n commitId?: string | null;\n};\n\nexport type UseBundleManagerParams = {\n base: BundleSource;\n platform: BundlePlatform;\n /**\n * When false, we will NOT initiate/build/download the latest base bundle.\n * We'll keep rendering whatever base bundle we already have (or hydrate from disk).\n *\n * Test bundles (merge request previews) are NOT gated by this.\n */\n canRequestLatest?: boolean;\n};\n\nexport type BundleLoadState = {\n bundlePath: string | null;\n /**\n * Monotonic token to force runtime remount when the bundle file path stays the same\n * (e.g. base bundle is replaced in-place).\n */\n renderToken: number;\n loading: boolean;\n statusLabel: string | null;\n error: string | null;\n /**\n * True when showing a temporary/testing bundle (e.g. merge request preview).\n */\n isTesting: boolean;\n};\n\nexport type UseBundleManagerResult = BundleLoadState & {\n loadBase: () => Promise<void>;\n loadTest: (src: BundleSource) => Promise<void>;\n restoreBase: () => Promise<void>;\n};\n\nfunction safeName(s: string) {\n return s.replace(/[^a-zA-Z0-9._-]/g, '_');\n}\n\nfunction bundlesCacheDir(): string {\n if (!FileSystem.cacheDirectory) {\n throw new Error('expo-file-system cacheDirectory is not available.');\n }\n return `${FileSystem.cacheDirectory}comerge/bundles/`;\n}\n\nasync function ensureDir(path: string) {\n const info = await FileSystem.getInfoAsync(path);\n if (info.exists) return;\n await FileSystem.makeDirectoryAsync(path, { intermediates: true });\n}\n\nfunction baseBundleKey(appId: string, platform: BundlePlatform): string {\n return `base:${appId}:${platform}`;\n}\n\nfunction testBundleKey(appId: string, commitId: string | null | undefined, platform: BundlePlatform, bundleId: string): string {\n return `test:${appId}:${commitId ?? 'head'}:${platform}:${bundleId}`;\n}\n\nfunction toBundleFileUri(key: string): string {\n const dir = bundlesCacheDir();\n return `${dir}${safeName(key)}.jsbundle`;\n}\n\nfunction toBundleMetaFileUri(key: string): string {\n const dir = bundlesCacheDir();\n return `${dir}${safeName(key)}.meta.json`;\n}\n\ntype BaseBundleMeta = {\n fingerprint: string;\n bundleId: string;\n checksumSha256: string | null;\n size: number | null;\n updatedAt: string;\n};\n\nasync function readJsonFile<T>(fileUri: string): Promise<T | null> {\n try {\n const info = await FileSystem.getInfoAsync(fileUri);\n if (!info.exists) return null;\n const raw = await (FileSystem as any).readAsStringAsync(fileUri);\n if (!raw || !String(raw).trim()) return null;\n return JSON.parse(String(raw)) as T;\n } catch {\n return null;\n }\n}\n\nasync function writeJsonFile(fileUri: string, value: unknown): Promise<void> {\n try {\n await (FileSystem as any).writeAsStringAsync(fileUri, JSON.stringify(value));\n } catch {\n \n }\n}\n\nasync function getExistingNonEmptyFileUri(fileUri: string): Promise<string | null> {\n try {\n const info = await FileSystem.getInfoAsync(fileUri);\n if (info.exists && info.size && info.size > 0) return fileUri;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function downloadIfMissing(url: string, fileUri: string): Promise<string> {\n const existing = await getExistingNonEmptyFileUri(fileUri);\n if (existing) return existing;\n const res = await FileSystem.downloadAsync(url, fileUri);\n return res.uri;\n}\n\nasync function deleteFileIfExists(fileUri: string) {\n try {\n const info = await FileSystem.getInfoAsync(fileUri);\n if (!info.exists) return;\n await FileSystem.deleteAsync(fileUri).catch(() => {});\n } catch {\n \n }\n}\n\nasync function safeReplaceFileFromUrl(url: string, targetUri: string, tmpKey: string): Promise<string> {\n const tmpUri = toBundleFileUri(`tmp:${tmpKey}:${Date.now()}`);\n try {\n await FileSystem.downloadAsync(url, tmpUri);\n const tmpOk = await getExistingNonEmptyFileUri(tmpUri);\n if (!tmpOk) {\n throw new Error('Downloaded bundle is empty.');\n }\n\n await deleteFileIfExists(targetUri);\n await FileSystem.moveAsync({ from: tmpUri, to: targetUri });\n\n const finalOk = await getExistingNonEmptyFileUri(targetUri);\n if (!finalOk) throw new Error('Bundle replacement failed.');\n return targetUri;\n } finally {\n await deleteFileIfExists(tmpUri);\n }\n}\n\nasync function pollBundle(appId: string, bundleId: string, opts: { timeoutMs: number; intervalMs: number }): Promise<Bundle> {\n const start = Date.now();\n while (true) {\n const bundle = await bundlesRepository.getById(appId, bundleId);\n if (bundle.status === 'succeeded' || bundle.status === 'failed') return bundle;\n if (Date.now() - start > opts.timeoutMs) {\n throw new Error('Bundle build timed out.');\n }\n await new Promise((r) => setTimeout(r, opts.intervalMs));\n }\n}\n\nasync function resolveBundlePath(\n src: BundleSource,\n platform: BundlePlatform,\n mode: 'base' | 'test'\n): Promise<{ bundlePath: string; label: string; bundle: Bundle }> {\n const { appId, commitId } = src;\n const dir = bundlesCacheDir();\n await ensureDir(dir);\n\n const initiate = await bundlesRepository.initiate(appId, {\n platform,\n commitId: commitId ?? undefined,\n idempotencyKey: `${appId}:${commitId ?? 'head'}:${platform}`,\n });\n\n const finalBundle =\n initiate.status === 'succeeded' || initiate.status === 'failed'\n ? initiate\n : await pollBundle(appId, initiate.id, { timeoutMs: 3 * 60 * 1000, intervalMs: 1200 });\n\n if (finalBundle.status === 'failed') {\n throw new Error('Bundle build failed.');\n }\n\n const signed = await bundlesRepository.getSignedDownloadUrl(appId, finalBundle.id, { redirect: false });\n const bundlePath =\n mode === 'base'\n ? await safeReplaceFileFromUrl(\n signed.url,\n toBundleFileUri(baseBundleKey(appId, platform)),\n `${appId}:${commitId ?? 'head'}:${platform}:${finalBundle.id}`\n )\n : await downloadIfMissing(signed.url, toBundleFileUri(testBundleKey(appId, commitId, platform, finalBundle.id)));\n return { bundlePath, label: 'Ready', bundle: finalBundle };\n}\n\nexport function useBundleManager({\n base,\n platform,\n canRequestLatest = true,\n}: UseBundleManagerParams): UseBundleManagerResult {\n const [bundlePath, setBundlePath] = React.useState<string | null>(null);\n const [renderToken, setRenderToken] = React.useState(0);\n const [loading, setLoading] = React.useState(false);\n const [statusLabel, setStatusLabel] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [isTesting, setIsTesting] = React.useState(false);\n\n const baseRef = React.useRef(base);\n baseRef.current = base;\n\n // Monotonic operation ids to prevent stale async loads from overwriting newer ones.\n const baseOpIdRef = React.useRef(0);\n const testOpIdRef = React.useRef(0);\n const activeLoadModeRef = React.useRef<'base' | 'test' | null>(null);\n\n const canRequestLatestRef = React.useRef<boolean>(canRequestLatest);\n React.useEffect(() => {\n canRequestLatestRef.current = canRequestLatest;\n if (!canRequestLatest) {\n // Stop any in-flight base load from updating UI while the app is not ready.\n baseOpIdRef.current += 1;\n if (activeLoadModeRef.current === 'base') {\n setLoading(false);\n setStatusLabel(null);\n activeLoadModeRef.current = null;\n }\n }\n }, [canRequestLatest]);\n // Track the most recently successfully loaded base bundle so we can instantly exit test mode.\n const lastBaseBundlePathRef = React.useRef<string | null>(null);\n const lastBaseFingerprintRef = React.useRef<string | null>(null);\n // Only used to suppress an unnecessary remount on cold start when the network bundle matches the disk bundle.\n const initialHydratedBaseFromDiskRef = React.useRef(false);\n const hasCompletedFirstNetworkBaseLoadRef = React.useRef(false);\n\n const hydrateBaseFromDisk = React.useCallback(\n async (appId: string, reason: 'initial' | 'fallback') => {\n try {\n const dir = bundlesCacheDir();\n await ensureDir(dir);\n const key = baseBundleKey(appId, platform);\n const uri = toBundleFileUri(key);\n const existing = await getExistingNonEmptyFileUri(uri);\n if (existing) {\n lastBaseBundlePathRef.current = existing;\n setBundlePath(existing);\n const meta = await readJsonFile<BaseBundleMeta>(toBundleMetaFileUri(key));\n if (meta?.fingerprint) {\n lastBaseFingerprintRef.current = meta.fingerprint;\n }\n if (reason === 'initial') {\n initialHydratedBaseFromDiskRef.current = true;\n hasCompletedFirstNetworkBaseLoadRef.current = false;\n }\n }\n } catch {\n \n }\n },\n [platform]\n );\n\n // On cold reopen, try to load the last base bundle from disk as early as possible.\n React.useEffect(() => {\n if (!base.appId) return;\n initialHydratedBaseFromDiskRef.current = false;\n hasCompletedFirstNetworkBaseLoadRef.current = false;\n void hydrateBaseFromDisk(base.appId, 'initial');\n }, [base.appId, platform, hydrateBaseFromDisk]);\n\n const activateCachedBase = React.useCallback(\n async (appId: string) => {\n setIsTesting(false);\n setStatusLabel(null);\n setError(null);\n const cachedBase = lastBaseBundlePathRef.current;\n if (cachedBase) {\n setBundlePath(cachedBase);\n } else {\n await hydrateBaseFromDisk(appId, 'fallback');\n }\n },\n [hydrateBaseFromDisk]\n );\n\n const load = React.useCallback(async (src: BundleSource, mode: 'base' | 'test') => {\n if (!src.appId) return;\n\n const canRequestLatest = canRequestLatestRef.current;\n if (mode === 'base' && !canRequestLatest) {\n await activateCachedBase(src.appId);\n return;\n }\n\n const opId = mode === 'base' ? ++baseOpIdRef.current : ++testOpIdRef.current;\n activeLoadModeRef.current = mode;\n setLoading(true);\n setError(null);\n setStatusLabel(mode === 'test' ? 'Loading test bundle…' : 'Loading latest build…');\n\n if (mode === 'base') {\n void activateCachedBase(src.appId);\n }\n\n try {\n const { bundlePath: path, bundle } = await resolveBundlePath(src, platform, mode);\n if (mode === 'base' && opId !== baseOpIdRef.current) return;\n if (mode === 'test' && opId !== testOpIdRef.current) return;\n setBundlePath(path);\n const fingerprint = bundle.checksumSha256 ?? `id:${bundle.id}`;\n\n // If we started by rendering a base bundle from disk and the network \"latest\" bundle is the same,\n // avoid a pointless remount (no visual flicker) ONLY for that first refresh.\n const shouldSkipInitialBaseRemount =\n mode === 'base' &&\n initialHydratedBaseFromDiskRef.current &&\n !hasCompletedFirstNetworkBaseLoadRef.current &&\n Boolean(lastBaseFingerprintRef.current) &&\n lastBaseFingerprintRef.current === fingerprint;\n\n if (!shouldSkipInitialBaseRemount) {\n setRenderToken((t) => t + 1);\n }\n\n if (mode === 'base') {\n lastBaseBundlePathRef.current = path;\n lastBaseFingerprintRef.current = fingerprint;\n hasCompletedFirstNetworkBaseLoadRef.current = true;\n initialHydratedBaseFromDiskRef.current = false;\n void writeJsonFile(toBundleMetaFileUri(baseBundleKey(src.appId, platform)), {\n fingerprint,\n bundleId: bundle.id,\n checksumSha256: bundle.checksumSha256 ?? null,\n size: bundle.size ?? null,\n updatedAt: new Date().toISOString(),\n } satisfies BaseBundleMeta);\n setIsTesting(false);\n } else {\n setIsTesting(true);\n }\n setStatusLabel(null);\n } catch (e) {\n if (mode === 'base' && opId !== baseOpIdRef.current) return;\n if (mode === 'test' && opId !== testOpIdRef.current) return;\n const msg = e instanceof Error ? e.message : String(e);\n setError(msg);\n setStatusLabel(null);\n } finally {\n if (mode === 'base' && opId !== baseOpIdRef.current) return;\n if (mode === 'test' && opId !== testOpIdRef.current) return;\n setLoading(false);\n if (activeLoadModeRef.current === mode) activeLoadModeRef.current = null;\n }\n }, [activateCachedBase, platform]);\n\n const loadBase = React.useCallback(async () => {\n await load(baseRef.current, 'base');\n }, [load]);\n\n const loadTest = React.useCallback(async (src: BundleSource) => {\n await load(src, 'test');\n }, [load]);\n\n const restoreBase = React.useCallback(async () => {\n const src = baseRef.current;\n if (!src.appId) return;\n await activateCachedBase(src.appId);\n if (canRequestLatestRef.current) {\n await load(src, 'base');\n }\n }, [activateCachedBase, load]);\n\n React.useEffect(() => {\n if (!canRequestLatest) return;\n void loadBase();\n }, [base.appId, base.commitId, platform, canRequestLatest, loadBase]);\n\n return { bundlePath, renderToken, loading, statusLabel, error, isTesting, loadBase, loadTest, restoreBase };\n}\n\n\n","import { api } from '../../../core/services/http';\nimport type { ServiceResponse } from '../../types';\nimport { BaseRemote } from '../../base-remote';\nimport type { Bundle, InitiateBundleRequest } from './types';\n\nexport interface BundlesRemoteDataSource {\n initiate(appId: string, payload: InitiateBundleRequest): Promise<ServiceResponse<Bundle>>;\n getById(appId: string, bundleId: string): Promise<ServiceResponse<Bundle>>;\n getSignedDownloadUrl(\n appId: string,\n bundleId: string,\n options?: { redirect?: boolean }\n ): Promise<ServiceResponse<{ url: string; redirect: boolean }>>;\n}\n\nclass BundlesRemoteDataSourceImpl extends BaseRemote implements BundlesRemoteDataSource {\n async initiate(appId: string, payload: InitiateBundleRequest): Promise<ServiceResponse<Bundle>> {\n const { data } = await api.post<ServiceResponse<Bundle>>(\n `/v1/apps/${encodeURIComponent(appId)}/bundles`,\n payload\n );\n return data;\n }\n\n async getById(appId: string, bundleId: string): Promise<ServiceResponse<Bundle>> {\n const { data } = await api.get<ServiceResponse<Bundle>>(\n `/v1/apps/${encodeURIComponent(appId)}/bundles/${encodeURIComponent(bundleId)}`\n );\n return data;\n }\n\n async getSignedDownloadUrl(\n appId: string,\n bundleId: string,\n options?: { redirect?: boolean }\n ): Promise<ServiceResponse<{ url: string; redirect: boolean }>> {\n const { data } = await api.get<ServiceResponse<{ url: string; redirect: boolean }>>(\n `/v1/apps/${encodeURIComponent(appId)}/bundles/${encodeURIComponent(bundleId)}/download`,\n { params: { redirect: options?.redirect ?? false } }\n );\n return data;\n }\n}\n\nexport const bundlesRemoteDataSource: BundlesRemoteDataSource = new BundlesRemoteDataSourceImpl();\n\n\n","import type { BundlesRemoteDataSource } from './remote';\nimport { bundlesRemoteDataSource } from './remote';\nimport type { Bundle, InitiateBundleRequest } from './types';\nimport { BaseRepository } from '../../base-repository';\n\nexport interface BundlesRepository {\n initiate(appId: string, payload: InitiateBundleRequest): Promise<Bundle>;\n getById(appId: string, bundleId: string): Promise<Bundle>;\n getSignedDownloadUrl(appId: string, bundleId: string, options?: { redirect?: boolean }): Promise<{ url: string; redirect: boolean }>;\n}\n\nclass BundlesRepositoryImpl extends BaseRepository implements BundlesRepository {\n constructor(private readonly remote: BundlesRemoteDataSource) {\n super();\n }\n\n async initiate(appId: string, payload: InitiateBundleRequest): Promise<Bundle> {\n const res = await this.remote.initiate(appId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async getById(appId: string, bundleId: string): Promise<Bundle> {\n const res = await this.remote.getById(appId, bundleId);\n return this.unwrapOrThrow(res);\n }\n\n async getSignedDownloadUrl(appId: string, bundleId: string, options?: { redirect?: boolean }): Promise<{ url: string; redirect: boolean }> {\n const res = await this.remote.getSignedDownloadUrl(appId, bundleId, options);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const bundlesRepository: BundlesRepository = new BundlesRepositoryImpl(bundlesRemoteDataSource);\n\n\n","import * as React from 'react';\n\nimport type { MergeRequest, MergeRequestStatus } from '../../data/merge-requests/types';\nimport { mergeRequestsRepository } from '../../data/merge-requests/repository';\nimport type { MergeRequestSummary } from '../../components/models/types';\nimport { usersRepository } from '../../data/users/repository';\nimport type { UserStats } from '../../data/users/types';\n\nexport type MergeRequestLists = {\n /**\n * Merge requests targeting the current app (for owners/reviewers).\n */\n incoming: MergeRequest[];\n /**\n * Merge requests created from the current app (for contributors).\n */\n outgoing: MergeRequest[];\n};\n\nexport type MergeRequestActions = {\n refresh: () => Promise<void>;\n openMergeRequest: (sourceAppId: string) => Promise<MergeRequest>;\n approve: (mrId: string) => Promise<MergeRequest>;\n reject: (mrId: string) => Promise<MergeRequest>;\n};\n\nexport type UseMergeRequestsResult = {\n loading: boolean;\n error: Error | null;\n lists: MergeRequestLists;\n actions: MergeRequestActions;\n toSummary: (mr: MergeRequest) => MergeRequestSummary;\n byId: Record<string, MergeRequest>;\n creatorStatsById: Record<string, UserStats>;\n};\n\nconst incomingStatuses: MergeRequestStatus[] = ['open', 'approved'];\nconst outgoingStatuses: MergeRequestStatus[] = ['open', 'approved', 'rejected', 'merged', 'closed'];\n\nfunction toUiStatus(status: MergeRequestStatus): MergeRequestSummary['status'] {\n switch (status) {\n case 'open':\n case 'approved':\n case 'rejected':\n case 'merged':\n return status;\n case 'closed':\n default:\n return 'rejected';\n }\n}\n\nexport function useMergeRequests(params: { appId: string }): UseMergeRequestsResult {\n const { appId } = params;\n const [incoming, setIncoming] = React.useState<MergeRequest[]>([]);\n const [outgoing, setOutgoing] = React.useState<MergeRequest[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n const [creatorStatsById, setCreatorStatsById] = React.useState<Record<string, UserStats>>({});\n\n const pollUntilMerged = React.useCallback(async (mrId: string) => {\n const startedAt = Date.now();\n const timeoutMs = 2 * 60 * 1000;\n for (;;) {\n const mr = await mergeRequestsRepository.getById(mrId);\n if (mr.status === 'merged') return mr;\n if (Date.now() - startedAt > timeoutMs) return mr;\n await new Promise((r) => setTimeout(r, 1500));\n }\n }, []);\n\n const refresh = React.useCallback(async () => {\n if (!appId) {\n setIncoming([]);\n setOutgoing([]);\n setCreatorStatsById({});\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const [inc, out] = await Promise.all([\n mergeRequestsRepository.listByStatuses({ targetAppId: appId, statuses: incomingStatuses }).then((x) => {\n return (Object.values(x).flat() as MergeRequest[]).filter(Boolean);\n }),\n mergeRequestsRepository.listByStatuses({ sourceAppId: appId, statuses: outgoingStatuses }).then((x) => {\n return (Object.values(x).flat() as MergeRequest[]).filter(Boolean);\n }),\n ]);\n setIncoming(inc);\n setOutgoing(out);\n\n const ids = Array.from(new Set([...inc, ...out].map((m) => m.createdBy).filter(Boolean)));\n if (ids.length === 0) {\n setCreatorStatsById({});\n } else {\n try {\n const map = await usersRepository.getStatsBatch(ids);\n setCreatorStatsById(map);\n } catch {\n // Keep whatever we already have.\n }\n }\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n setIncoming([]);\n setOutgoing([]);\n setCreatorStatsById({});\n } finally {\n setLoading(false);\n }\n }, [appId]);\n\n React.useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const openMergeRequest = React.useCallback(async (sourceAppId: string) => {\n const mr = await mergeRequestsRepository.open({ sourceAppId });\n await refresh();\n return mr;\n }, [refresh]);\n\n const approve = React.useCallback(async (mrId: string) => {\n const mr = await mergeRequestsRepository.update(mrId, { status: 'approved' });\n await refresh();\n const merged = await pollUntilMerged(mrId);\n await refresh();\n return merged ?? mr;\n }, [pollUntilMerged, refresh]);\n\n const reject = React.useCallback(async (mrId: string) => {\n const mr = await mergeRequestsRepository.update(mrId, { status: 'rejected' });\n await refresh();\n return mr;\n }, [refresh]);\n\n const toSummary = React.useCallback((mr: MergeRequest): MergeRequestSummary => {\n const stats = creatorStatsById[mr.createdBy];\n return {\n id: mr.id,\n title: mr.title ?? undefined,\n description: mr.description ?? undefined,\n status: toUiStatus(mr.status),\n creator: {\n id: mr.createdBy,\n name: stats?.name ?? undefined,\n avatarUri: stats?.avatar ?? undefined,\n },\n createdAt: mr.createdAt,\n updatedAt: mr.updatedAt,\n };\n }, [creatorStatsById]);\n\n const byId = React.useMemo(() => {\n const all = [...incoming, ...outgoing];\n const map: Record<string, MergeRequest> = {};\n for (const mr of all) map[mr.id] = mr;\n return map;\n }, [incoming, outgoing]);\n\n return {\n loading,\n error,\n lists: { incoming, outgoing },\n actions: { refresh, openMergeRequest, approve, reject },\n toSummary,\n byId,\n creatorStatsById,\n };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type {\n MergeRequest,\n MergeRequestStatus,\n MergeRequestsByStatus,\n OpenMergeRequestRequest,\n UpdateMergeRequestRequest,\n} from './types';\n\nexport interface MergeRequestsRemoteDataSource {\n list(params: { sourceAppId?: string; targetAppId?: string; status?: MergeRequestStatus }): Promise<ServiceResponse<MergeRequest[]>>;\n listByStatuses(params: {\n sourceAppId?: string;\n targetAppId?: string;\n statuses: MergeRequestStatus[];\n }): Promise<ServiceResponse<MergeRequestsByStatus | MergeRequest[]>>;\n open(payload: OpenMergeRequestRequest): Promise<ServiceResponse<MergeRequest>>;\n getById(mrId: string): Promise<ServiceResponse<MergeRequest>>;\n update(mrId: string, payload: UpdateMergeRequestRequest): Promise<ServiceResponse<MergeRequest>>;\n}\n\nclass MergeRequestsRemoteDataSourceImpl extends BaseRemote implements MergeRequestsRemoteDataSource {\n async list(params: { sourceAppId?: string; targetAppId?: string; status?: MergeRequestStatus }): Promise<ServiceResponse<MergeRequest[]>> {\n const query: Record<string, string> = {};\n if (params.sourceAppId) query.sourceAppId = params.sourceAppId;\n if (params.targetAppId) query.targetAppId = params.targetAppId;\n if (params.status) query.status = params.status;\n const { data } = await api.get<ServiceResponse<MergeRequest[]>>('/v1/merge-requests', { params: query });\n return data;\n }\n\n async listByStatuses(params: {\n sourceAppId?: string;\n targetAppId?: string;\n statuses: MergeRequestStatus[];\n }): Promise<ServiceResponse<MergeRequestsByStatus | MergeRequest[]>> {\n const query: Record<string, string | string[]> = {};\n if (params.sourceAppId) query.sourceAppId = params.sourceAppId;\n if (params.targetAppId) query.targetAppId = params.targetAppId;\n query.status = params.statuses;\n const { data } = await api.get<ServiceResponse<MergeRequestsByStatus | MergeRequest[]>>(\n '/v1/merge-requests',\n {\n params: query,\n paramsSerializer: {\n indexes: null,\n },\n }\n );\n return data;\n }\n\n async open(payload: OpenMergeRequestRequest): Promise<ServiceResponse<MergeRequest>> {\n const { data } = await api.post<ServiceResponse<MergeRequest>>('/v1/merge-requests', payload);\n return data;\n }\n\n async getById(mrId: string): Promise<ServiceResponse<MergeRequest>> {\n const { data } = await api.get<ServiceResponse<MergeRequest>>(`/v1/merge-requests/${encodeURIComponent(mrId)}`);\n return data;\n }\n\n async update(mrId: string, payload: UpdateMergeRequestRequest): Promise<ServiceResponse<MergeRequest>> {\n const { data } = await api.patch<ServiceResponse<MergeRequest>>(\n `/v1/merge-requests/${encodeURIComponent(mrId)}`,\n payload\n );\n return data;\n }\n}\n\nexport const mergeRequestsRemoteDataSource: MergeRequestsRemoteDataSource = new MergeRequestsRemoteDataSourceImpl();\n\n\n","import type { MergeRequestsRemoteDataSource } from './remote';\nimport { mergeRequestsRemoteDataSource } from './remote';\nimport type {\n MergeRequest,\n MergeRequestStatus,\n MergeRequestsByStatus,\n OpenMergeRequestRequest,\n UpdateMergeRequestRequest,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface MergeRequestsRepository {\n list(params: { sourceAppId?: string; targetAppId?: string; status?: MergeRequestStatus }): Promise<MergeRequest[]>;\n listByStatuses(params: {\n sourceAppId?: string;\n targetAppId?: string;\n statuses: MergeRequestStatus[];\n }): Promise<MergeRequestsByStatus>;\n open(payload: OpenMergeRequestRequest): Promise<MergeRequest>;\n getById(mrId: string): Promise<MergeRequest>;\n update(mrId: string, payload: UpdateMergeRequestRequest): Promise<MergeRequest>;\n}\n\nclass MergeRequestsRepositoryImpl extends BaseRepository implements MergeRequestsRepository {\n constructor(private readonly remote: MergeRequestsRemoteDataSource) {\n super();\n }\n\n async list(params: { sourceAppId?: string; targetAppId?: string; status?: MergeRequestStatus }): Promise<MergeRequest[]> {\n const res = await this.remote.list(params);\n return this.unwrapOrThrow(res);\n }\n\n async listByStatuses(params: {\n sourceAppId?: string;\n targetAppId?: string;\n statuses: MergeRequestStatus[];\n }): Promise<MergeRequestsByStatus> {\n if (!params.statuses || params.statuses.length === 0) return {};\n const res = await this.remote.listByStatuses(params);\n const payload = this.unwrapOrThrow(res);\n if (Array.isArray(payload)) {\n return { [params.statuses[0]]: payload };\n }\n return payload;\n }\n\n async open(payload: OpenMergeRequestRequest): Promise<MergeRequest> {\n const res = await this.remote.open(payload);\n return this.unwrapOrThrow(res);\n }\n\n async getById(mrId: string): Promise<MergeRequest> {\n const res = await this.remote.getById(mrId);\n return this.unwrapOrThrow(res);\n }\n\n async update(mrId: string, payload: UpdateMergeRequestRequest): Promise<MergeRequest> {\n const res = await this.remote.update(mrId, payload);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const mergeRequestsRepository: MergeRequestsRepository = new MergeRequestsRepositoryImpl(mergeRequestsRemoteDataSource);\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type { UserStats, UserStatsBatchResponse } from './types';\n\nexport interface UsersRemoteDataSource {\n getStats(userId: string): Promise<ServiceResponse<UserStats>>;\n getStatsBatch(userIds: string[]): Promise<ServiceResponse<UserStatsBatchResponse>>;\n}\n\nclass UsersRemoteDataSourceImpl extends BaseRemote implements UsersRemoteDataSource {\n async getStats(userId: string): Promise<ServiceResponse<UserStats>> {\n const { data } = await api.get<ServiceResponse<UserStats>>(\n `/v1/users/${encodeURIComponent(userId)}/stats`\n );\n return data;\n }\n\n async getStatsBatch(userIds: string[]): Promise<ServiceResponse<UserStatsBatchResponse>> {\n const { data } = await api.post<ServiceResponse<UserStatsBatchResponse>>(\n '/v1/users/stats/batch',\n { userIds }\n );\n return data;\n }\n}\n\nexport const usersRemoteDataSource: UsersRemoteDataSource = new UsersRemoteDataSourceImpl();\n\n\n\n","import type { UsersRemoteDataSource } from './remote';\nimport { usersRemoteDataSource } from './remote';\nimport type { UserStats, UserStatsBatchResponse } from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface UsersRepository {\n getStats(userId: string): Promise<UserStats>;\n getStatsBatch(userIds: string[]): Promise<Record<string, UserStats>>;\n}\n\nclass UsersRepositoryImpl extends BaseRepository implements UsersRepository {\n constructor(private readonly remote: UsersRemoteDataSource) {\n super();\n }\n\n async getStats(userId: string): Promise<UserStats> {\n const res = await this.remote.getStats(userId);\n return this.unwrapOrThrow(res);\n }\n\n async getStatsBatch(userIds: string[]): Promise<Record<string, UserStats>> {\n if (userIds.length === 0) return {};\n const res = await this.remote.getStatsBatch(userIds);\n if (res.responseObject && !res.success) {\n return this.extractStats(res.responseObject);\n }\n const payload = this.unwrapOrThrow(res);\n return this.extractStats(payload);\n }\n\n private extractStats(payload: UserStatsBatchResponse): Record<string, UserStats> {\n const result: Record<string, UserStats> = {};\n Object.entries(payload.stats).forEach(([userId, stats]) => {\n if (stats) {\n result[userId] = stats;\n }\n });\n return result;\n }\n}\n\nexport const usersRepository: UsersRepository = new UsersRepositoryImpl(usersRemoteDataSource);\n\n\n\n","import * as React from 'react';\n\nimport { attachmentRepository } from '../../data/attachment/repository';\nimport type { AttachmentMeta } from '../../data/attachment/types';\n\nexport type UploadBase64AttachmentsParams = {\n threadId: string;\n appId: string;\n dataUrls: string[];\n};\n\nexport type UseAttachmentUploadResult = {\n uploadBase64Images: (params: UploadBase64AttachmentsParams) => Promise<AttachmentMeta[]>;\n uploading: boolean;\n error: Error | null;\n};\n\nexport function useAttachmentUpload(): UseAttachmentUploadResult {\n const [uploading, setUploading] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const uploadBase64Images = React.useCallback(async ({ threadId, appId, dataUrls }: UploadBase64AttachmentsParams) => {\n if (!threadId || !appId) return [];\n if (!dataUrls || dataUrls.length === 0) return [];\n\n setUploading(true);\n setError(null);\n try {\n const blobs = await Promise.all(\n dataUrls.map(async (dataUrl, idx) => {\n const normalized = dataUrl.startsWith('data:') ? dataUrl : `data:image/png;base64,${dataUrl}`;\n const resp = await fetch(normalized);\n const blob = await resp.blob();\n return { blob, idx };\n })\n );\n\n const files = blobs.map(({ blob }, idx) => ({\n name: `attachment-${Date.now()}-${idx}.png`,\n size: blob.size,\n mimeType: blob.type || 'image/png',\n }));\n\n const presign = await attachmentRepository.presign({ threadId, appId, files });\n await Promise.all(presign.uploads.map((u, index) => attachmentRepository.upload(u, blobs[index].blob)));\n return presign.uploads.map((u) => u.attachment);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setUploading(false);\n }\n }, []);\n\n return { uploadBase64Images, uploading, error };\n}\n\n\n","import { api } from '../../core/services/http';\nimport { BaseRemote } from '../base-remote';\nimport type { ServiceResponse } from '../types';\nimport type {\n PresignAttachmentsRequest,\n PresignAttachmentsResponse,\n} from './types';\n\nexport interface AttachmentRemoteDataSource {\n presign(\n payload: PresignAttachmentsRequest\n ): Promise<ServiceResponse<PresignAttachmentsResponse>>;\n}\n\nclass AttachmentRemoteDataSourceImpl\n extends BaseRemote\n implements AttachmentRemoteDataSource\n{\n async presign(\n payload: PresignAttachmentsRequest\n ): Promise<ServiceResponse<PresignAttachmentsResponse>> {\n const { data } = await api.post<ServiceResponse<PresignAttachmentsResponse>>(\n '/v1/attachments/presign',\n payload\n );\n return data;\n }\n}\n\nexport const attachmentRemoteDataSource: AttachmentRemoteDataSource =\n new AttachmentRemoteDataSourceImpl();\n\n","import type { AttachmentRemoteDataSource } from './remote';\nimport { attachmentRemoteDataSource } from './remote';\nimport type {\n PresignAttachmentsRequest,\n PresignAttachmentsResponse,\n PresignedUpload,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface AttachmentRepository {\n presign(payload: PresignAttachmentsRequest): Promise<PresignAttachmentsResponse>;\n upload(upload: PresignedUpload, file: Blob | File): Promise<void>;\n}\n\nclass AttachmentRepositoryImpl extends BaseRepository implements AttachmentRepository {\n constructor(private readonly remote: AttachmentRemoteDataSource) {\n super();\n }\n\n async presign(payload: PresignAttachmentsRequest): Promise<PresignAttachmentsResponse> {\n const res = await this.remote.presign(payload);\n return this.unwrapOrThrow(res);\n }\n\n async upload(upload: PresignedUpload, file: Blob | File): Promise<void> {\n const resp = await fetch(upload.uploadUrl, {\n method: 'PUT',\n headers: upload.headers,\n body: file,\n });\n if (!resp.ok) {\n throw new Error(`upload failed: ${resp.status}`);\n }\n }\n}\n\nexport const attachmentRepository: AttachmentRepository = new AttachmentRepositoryImpl(\n attachmentRemoteDataSource\n);\n\n","import * as React from 'react';\n\nimport type { App } from '../../data/apps/types';\nimport { appsRepository } from '../../data/apps/repository';\nimport { agentRepository } from '../../data/agent/repository';\nimport type { AttachmentMeta } from '../../data/attachment/types';\n\nexport type UseStudioActionsParams = {\n userId: string | null;\n /**\n * Current app object for the active appId.\n */\n app: App | null;\n /**\n * Called when we fork and should switch to the new app.\n */\n onForkedApp?: (appId: string, opts?: { keepRenderingAppId?: string }) => void;\n /**\n * Upload function used to convert attachments.\n */\n uploadAttachments?: (params: { threadId: string; appId: string; dataUrls: string[] }) => Promise<AttachmentMeta[]>;\n};\n\nexport type UseStudioActionsResult = {\n isOwner: boolean;\n shouldForkOnEdit: boolean;\n forking: boolean;\n sending: boolean;\n error: Error | null;\n sendEdit: (params: { prompt: string; attachments?: string[] }) => Promise<void>;\n};\n\nexport function useStudioActions({\n userId,\n app,\n onForkedApp,\n uploadAttachments,\n}: UseStudioActionsParams): UseStudioActionsResult {\n const [forking, setForking] = React.useState(false);\n const [sending, setSending] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const isOwner = Boolean(userId && app?.createdBy && userId === app.createdBy);\n const shouldForkOnEdit = Boolean(userId && app && app.createdBy !== userId);\n\n const sendEdit = React.useCallback(\n async ({ prompt, attachments }: { prompt: string; attachments?: string[] }) => {\n if (!userId || !app) return;\n if (!prompt.trim()) return;\n if (sending) return;\n\n setSending(true);\n setError(null);\n try {\n let targetApp = app;\n\n if (shouldForkOnEdit) {\n setForking(true);\n const sourceAppId = app.id;\n const forked = await appsRepository.fork(app.id, {});\n targetApp = forked;\n // For fork+edit, keep rendering the original app until the edit completes on the fork.\n onForkedApp?.(forked.id, { keepRenderingAppId: sourceAppId });\n }\n setForking(false);\n\n const threadId = targetApp.threadId;\n if (!threadId) throw new Error('No thread available for this app.');\n\n let attachmentMetas: AttachmentMeta[] | undefined;\n if (attachments && attachments.length > 0 && uploadAttachments) {\n attachmentMetas = await uploadAttachments({ threadId, appId: targetApp.id, dataUrls: attachments });\n }\n\n await agentRepository.editApp({\n prompt,\n thread_id: threadId,\n app_id: targetApp.id,\n attachments: attachmentMetas && attachmentMetas.length > 0 ? attachmentMetas : undefined,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n throw err;\n } finally {\n setForking(false);\n setSending(false);\n }\n },\n [app, onForkedApp, sending, shouldForkOnEdit, uploadAttachments, userId]\n );\n\n return { isOwner, shouldForkOnEdit, forking, sending, error, sendEdit };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type {\n CreateAgentAppRequest,\n EditAgentAppRequest,\n AgentCreateAppResult,\n AgentEditAppResult,\n} from './types';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\n\nexport interface AgentRemoteDataSource {\n createApp(payload: CreateAgentAppRequest): Promise<ServiceResponse<AgentCreateAppResult>>;\n editApp(payload: EditAgentAppRequest): Promise<ServiceResponse<AgentEditAppResult>>;\n}\n\nclass AgentRemoteDataSourceImpl extends BaseRemote implements AgentRemoteDataSource {\n async createApp(payload: CreateAgentAppRequest): Promise<ServiceResponse<AgentCreateAppResult>> {\n const { data } = await api.post<ServiceResponse<AgentCreateAppResult>>('/v1/agent/createApp', payload);\n return data;\n }\n\n async editApp(payload: EditAgentAppRequest): Promise<ServiceResponse<AgentEditAppResult>> {\n const { data } = await api.post<ServiceResponse<AgentEditAppResult>>('/v1/agent/editApp', payload);\n return data;\n }\n}\n\nexport const agentRemoteDataSource: AgentRemoteDataSource = new AgentRemoteDataSourceImpl();\n\n\n","import type { AgentRemoteDataSource } from './remote';\nimport { agentRemoteDataSource } from './remote';\nimport type {\n AgentCreateAppResult,\n AgentEditAppResult,\n CreateAgentAppRequest,\n EditAgentAppRequest,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface AgentRepository {\n createApp(payload: CreateAgentAppRequest): Promise<AgentCreateAppResult>;\n editApp(payload: EditAgentAppRequest): Promise<AgentEditAppResult>;\n}\n\nclass AgentRepositoryImpl extends BaseRepository implements AgentRepository {\n constructor(private readonly remote: AgentRemoteDataSource) {\n super();\n }\n\n async createApp(payload: CreateAgentAppRequest): Promise<AgentCreateAppResult> {\n const res = await this.remote.createApp(payload);\n return this.unwrapOrThrow(res);\n }\n\n async editApp(payload: EditAgentAppRequest): Promise<AgentEditAppResult> {\n const res = await this.remote.editApp(payload);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const agentRepository: AgentRepository = new AgentRepositoryImpl(agentRemoteDataSource);\n\n\n","import type { Message } from '../../data/messages/types';\n\ntype MessagePayload = { type?: string; content?: unknown; text?: unknown; prompt?: unknown; message?: unknown };\n\nexport function getLastOutcomeIndex(messages: Message[]): number {\n let idx = -1;\n for (let i = 0; i < messages.length; i += 1) {\n const payload = messages[i].payload as MessagePayload | undefined;\n if (payload?.type === 'outcome') idx = i;\n }\n return idx;\n}\n\nexport function hasNoOutcomeAfterLastHuman(messages: Message[]): boolean {\n if (!messages || messages.length === 0) return false;\n\n let lastHumanIndex = -1;\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n if (messages[i].authorType === 'human') {\n lastHumanIndex = i;\n break;\n }\n }\n if (lastHumanIndex === -1) return false;\n\n for (let i = lastHumanIndex + 1; i < messages.length; i += 1) {\n const m = messages[i];\n const payload = m.payload as MessagePayload | undefined;\n if (m.authorType === 'ai' && payload?.type === 'outcome') return false;\n }\n return true;\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { ComergeRuntimeRenderer } from '@comergehq/runtime';\n\nimport { Text } from '../../components/primitives/Text';\n\nexport type RuntimeRendererProps = {\n appKey: string;\n bundlePath: string | null;\n /**\n * Used to force a runtime remount even when bundlePath stays constant\n * (e.g. base bundle replaced in-place).\n */\n renderToken?: number;\n style?: ViewStyle;\n};\n\nexport function RuntimeRenderer({ appKey, bundlePath, renderToken, style }: RuntimeRendererProps) {\n if (!bundlePath) {\n return (\n <View style={[{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }, style]}>\n <Text variant=\"bodyMuted\">Preparing app…</Text>\n </View>\n );\n }\n\n return (\n <View style={[{ flex: 1 }, style]}>\n <ComergeRuntimeRenderer\n key={`${appKey}:${bundlePath}:${renderToken ?? 0}`}\n appKey={appKey}\n bundlePath={bundlePath}\n style={{ flex: 1 }}\n />\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Keyboard, View, useWindowDimensions } from 'react-native';\n\nimport type { App } from '../../data/apps/types';\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport { StudioBottomSheet } from '../../components/studio-sheet/StudioBottomSheet';\nimport { StudioSheetPager } from '../../components/studio-sheet/StudioSheetPager';\nimport { FloatingDraggableButton } from '../../components/floating-draggable-button/FloatingDraggableButton';\nimport { EdgeGlowFrame } from '../../components/overlays/EdgeGlowFrame';\nimport { DrawModeOverlay } from '../../components/draw/DrawModeOverlay';\nimport { AppCommentsSheet } from '../../components/comments/AppCommentsSheet';\nimport { PreviewPanel } from './PreviewPanel';\nimport { ChatPanel } from './ChatPanel';\nimport { ConfirmMergeFlow } from './ConfirmMergeFlow';\nimport type { MergeRequestSummary } from '../../components/models/types';\nimport { useTheme } from '../../theme';\n\nimport { MergeIcon } from '../../components/icons/MergeIcon';\n\nexport type StudioOverlayProps = {\n captureTargetRef: React.RefObject<View | null>;\n\n app: App | null;\n appLoading?: boolean;\n\n // Studio state\n isOwner: boolean;\n shouldForkOnEdit: boolean;\n\n // Bundle testing (glow + restore)\n isTesting: boolean;\n onRestoreBase: () => void | Promise<void>;\n\n // Merge requests\n incomingMergeRequests: MergeRequest[];\n outgoingMergeRequests: MergeRequest[];\n creatorStatsById: Record<string, import('../../data/users/types').UserStats>;\n processingMrId?: string | null;\n isBuildingMrTest?: boolean;\n testingMrId?: string | null;\n toMergeRequestSummary: (mr: MergeRequest) => MergeRequestSummary;\n onSubmitMergeRequest?: () => void | Promise<void>;\n onApprove?: (mr: MergeRequest) => void | Promise<void>;\n onReject?: (mr: MergeRequest) => void | Promise<void>;\n onTestMr?: (mr: MergeRequest) => void | Promise<void>;\n\n // Chat\n chatMessages: import('../../components/models/types').ChatMessage[];\n chatLoading?: boolean;\n chatSendDisabled?: boolean;\n chatForking?: boolean;\n chatSending?: boolean;\n chatShowTypingIndicator?: boolean;\n onSendChat: (text: string, attachments?: string[]) => void | Promise<void>;\n\n // Navigation callbacks\n onNavigateHome?: () => void;\n};\n\ntype SheetPage = 'preview' | 'chat';\n\nexport function StudioOverlay({\n captureTargetRef,\n app,\n appLoading,\n isOwner,\n shouldForkOnEdit,\n isTesting,\n onRestoreBase,\n incomingMergeRequests,\n outgoingMergeRequests,\n creatorStatsById,\n processingMrId,\n isBuildingMrTest,\n testingMrId,\n toMergeRequestSummary,\n onSubmitMergeRequest,\n onApprove,\n onReject,\n onTestMr,\n chatMessages,\n chatLoading,\n chatSendDisabled,\n chatForking,\n chatSending,\n chatShowTypingIndicator,\n onSendChat,\n onNavigateHome,\n}: StudioOverlayProps) {\n const theme = useTheme();\n const { width } = useWindowDimensions();\n\n const [sheetOpen, setSheetOpen] = React.useState(false);\n const [activePage, setActivePage] = React.useState<SheetPage>('preview');\n\n const [drawing, setDrawing] = React.useState(false);\n const [chatAttachments, setChatAttachments] = React.useState<string[]>([]);\n const [commentsAppId, setCommentsAppId] = React.useState<string | null>(null);\n const [commentsCount, setCommentsCount] = React.useState<number | null>(null);\n\n const [confirmMrId, setConfirmMrId] = React.useState<string | null>(null);\n const confirmMr = React.useMemo(\n () => (confirmMrId ? incomingMergeRequests.find((m) => m.id === confirmMrId) ?? null : null),\n [confirmMrId, incomingMergeRequests]\n );\n\n const closeSheet = React.useCallback(() => {\n setSheetOpen(false);\n Keyboard.dismiss();\n }, []);\n\n const openSheet = React.useCallback(() => setSheetOpen(true), []);\n\n const goToChat = React.useCallback(() => {\n setActivePage('chat');\n openSheet();\n }, [openSheet]);\n\n const backToPreview = React.useCallback(() => {\n Keyboard.dismiss();\n setActivePage('preview');\n }, []);\n\n const startDraw = React.useCallback(() => {\n setDrawing(true);\n closeSheet();\n }, [closeSheet]);\n\n const handleDrawCapture = React.useCallback(\n (dataUrl: string) => {\n setChatAttachments((prev) => [...prev, dataUrl]);\n setDrawing(false);\n setActivePage('chat');\n openSheet();\n },\n [openSheet]\n );\n\n const toggleSheet = React.useCallback(async () => {\n if (!sheetOpen) {\n const shouldExitTest = Boolean(testingMrId) || isTesting;\n if (shouldExitTest) {\n void Promise.resolve(onRestoreBase()).catch(() => {});\n }\n setSheetOpen(true);\n } else {\n closeSheet();\n }\n }, [closeSheet, isTesting, onRestoreBase, sheetOpen, testingMrId]);\n\n const handleTestMr = React.useCallback(\n async (mr: MergeRequest) => {\n if (!onTestMr) return;\n await onTestMr(mr);\n closeSheet();\n },\n [closeSheet, onTestMr]\n );\n\n return (\n <>\n {/* Testing glow around runtime */}\n <EdgeGlowFrame visible={isTesting} role=\"accent\" thickness={40} intensity={1} />\n\n <StudioBottomSheet open={sheetOpen} onOpenChange={setSheetOpen}>\n <StudioSheetPager\n activePage={activePage}\n width={width}\n preview={\n <PreviewPanel\n app={app}\n loading={appLoading}\n isOwner={isOwner}\n shouldForkOnEdit={shouldForkOnEdit}\n incomingMergeRequests={incomingMergeRequests}\n outgoingMergeRequests={outgoingMergeRequests}\n creatorStatsById={creatorStatsById}\n processingMrId={processingMrId}\n isBuildingMrTest={isBuildingMrTest}\n testingMrId={testingMrId}\n toMergeRequestSummary={toMergeRequestSummary}\n onClose={closeSheet}\n onNavigateHome={onNavigateHome}\n onGoToChat={goToChat}\n onStartDraw={isOwner ? startDraw : undefined}\n onSubmitMergeRequest={onSubmitMergeRequest}\n onRequestApprove={(mr) => setConfirmMrId(mr.id)}\n onReject={onReject}\n onTestMr={handleTestMr}\n onOpenComments={() => setCommentsAppId(app?.id ?? null)}\n commentCountOverride={commentsCount ?? undefined}\n />\n }\n chat={\n <ChatPanel\n messages={chatMessages}\n showTypingIndicator={chatShowTypingIndicator}\n loading={chatLoading}\n sendDisabled={chatSendDisabled}\n forking={chatForking}\n sending={chatSending}\n autoFocusComposer={sheetOpen && activePage === 'chat'}\n shouldForkOnEdit={shouldForkOnEdit}\n attachments={chatAttachments}\n onRemoveAttachment={(idx) => setChatAttachments((prev) => prev.filter((_, i) => i !== idx))}\n onClearAttachments={() => setChatAttachments([])}\n onBack={backToPreview}\n onClose={closeSheet}\n onNavigateHome={onNavigateHome}\n onStartDraw={startDraw}\n onSend={onSendChat}\n />\n }\n />\n </StudioBottomSheet>\n\n <FloatingDraggableButton\n visible={!sheetOpen && !drawing}\n ariaLabel={sheetOpen ? 'Hide studio' : 'Show studio'}\n badgeCount={incomingMergeRequests.length}\n onPress={toggleSheet}\n isLoading={app?.status === 'editing'}\n >\n <View style={{ width: 28, height: 28, alignItems: 'center', justifyContent: 'center' }}>\n <MergeIcon width={24} height={24} color={theme.colors.floatingContent} />\n </View>\n </FloatingDraggableButton>\n\n <DrawModeOverlay\n visible={drawing}\n captureTargetRef={captureTargetRef}\n onCancel={() => setDrawing(false)}\n onCapture={handleDrawCapture}\n />\n\n <ConfirmMergeFlow\n visible={Boolean(confirmMr)}\n onOpenChange={(open) => {\n if (!open) setConfirmMrId(null);\n }}\n mergeRequest={confirmMr}\n toSummary={toMergeRequestSummary}\n onConfirm={(mr) => onApprove?.(mr)}\n onTestFirst={handleTestMr}\n />\n\n <AppCommentsSheet\n appId={commentsAppId}\n onClose={() => setCommentsAppId(null)}\n onCountChange={(count) => setCommentsCount(count)}\n onPlayApp={() => setCommentsAppId(null)}\n />\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\nimport BottomSheet, { type BottomSheetBackgroundProps, type BottomSheetProps } from '@gorhom/bottom-sheet';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { useTheme } from '../../theme';\nimport { StudioSheetBackground, type StudioSheetBackgroundProps } from './StudioSheetBackground';\nimport type { StudioSheetSnapPoints } from './types';\n\nexport type StudioBottomSheetProps = {\n /**\n * Controlled open state.\n */\n open: boolean;\n onOpenChange?: (open: boolean) => void;\n\n /**\n * Snap points for the sheet.\n */\n snapPoints?: StudioSheetSnapPoints;\n\n /**\n * Optional ref forwarding to control the BottomSheet imperatively.\n */\n sheetRef?: React.RefObject<BottomSheet | null>;\n\n /**\n * Provide a custom background renderer (e.g. BlurView).\n */\n background?: Pick<StudioSheetBackgroundProps, 'renderBackground'>;\n\n /**\n * Content inside the sheet.\n */\n children: React.ReactNode;\n\n /**\n * Additional BottomSheet props, for advanced tuning.\n * We intentionally do not expose everything as first-class props to keep SRP.\n */\n bottomSheetProps?: Omit<\n BottomSheetProps,\n | 'ref'\n | 'index'\n | 'snapPoints'\n | 'enablePanDownToClose'\n | 'backgroundComponent'\n | 'topInset'\n | 'bottomInset'\n | 'handleIndicatorStyle'\n | 'onChange'\n | 'children'\n >;\n};\n\nexport function StudioBottomSheet({\n open,\n onOpenChange,\n snapPoints = ['80%', '100%'],\n sheetRef,\n background,\n children,\n bottomSheetProps,\n}: StudioBottomSheetProps) {\n const theme = useTheme();\n const insets = useSafeAreaInsets();\n const internalSheetRef = React.useRef<BottomSheet | null>(null);\n const resolvedSheetRef = sheetRef ?? internalSheetRef;\n\n // Gorhom BottomSheet `index` is not reliably \"fully controlled\" across versions.\n // Ensure the visual sheet actually opens/closes when `open` changes (e.g. via header X button).\n React.useEffect(() => {\n const sheet = resolvedSheetRef.current;\n if (!sheet) return;\n\n if (open) {\n // Open to the highest snap point by default.\n sheet.snapToIndex(snapPoints.length - 1);\n } else {\n sheet.close();\n }\n }, [open, resolvedSheetRef, snapPoints.length]);\n\n const handleChange = React.useCallback(\n (index: number) => {\n onOpenChange?.(index >= 0);\n },\n [onOpenChange]\n );\n\n return (\n <BottomSheet\n ref={resolvedSheetRef}\n index={open ? snapPoints.length - 1 : -1}\n snapPoints={snapPoints}\n enablePanDownToClose\n keyboardBehavior=\"extend\"\n keyboardBlurBehavior=\"restore\"\n android_keyboardInputMode=\"adjustResize\"\n backgroundComponent={(props: BottomSheetBackgroundProps) => (\n <StudioSheetBackground {...props} renderBackground={background?.renderBackground} />\n )}\n topInset={insets.top}\n bottomInset={insets.bottom}\n handleIndicatorStyle={{ backgroundColor: theme.colors.handleIndicator }}\n onChange={handleChange}\n {...bottomSheetProps}\n >\n <View style={{ flex: 1, overflow: 'hidden' }}>{children}</View>\n </BottomSheet>\n );\n}\n\n\n","import * as React from 'react';\nimport { Platform, View, type ViewStyle } from 'react-native';\nimport type { BottomSheetBackgroundProps } from '@gorhom/bottom-sheet';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\n\nimport { useTheme } from '../../theme';\n\nexport type StudioSheetBackgroundProps = BottomSheetBackgroundProps & {\n /**\n * Optional override to render a custom background (e.g. BlurView).\n * If provided, it receives the computed container style.\n */\n renderBackground?: (params: { style: ViewStyle }) => React.ReactNode;\n};\n\nexport function StudioSheetBackground({\n style,\n renderBackground,\n}: StudioSheetBackgroundProps) {\n const theme = useTheme();\n const radius = Platform.OS === 'ios' ? 39 : 16;\n const fallbackBgColor = theme.scheme === 'dark' ? 'rgba(11, 8, 15, 0.85)' : 'rgba(255, 255, 255, 0.85)';\n const secondaryBgBaseColor = theme.scheme === 'dark' ? 'rgb(24, 24, 27)' : 'rgb(173, 173, 173)';\n\n const containerStyle: ViewStyle = {\n ...(style as ViewStyle),\n borderTopLeftRadius: radius,\n borderTopRightRadius: radius,\n overflow: 'hidden',\n };\n\n if (renderBackground) {\n return <>{renderBackground({ style: containerStyle })}</>;\n }\n\n return (\n <>\n <LiquidGlassView\n style={[containerStyle, !isLiquidGlassSupported && { backgroundColor: fallbackBgColor }]}\n effect=\"regular\"\n />\n {isLiquidGlassSupported && (\n <View\n style={[\n containerStyle,\n {\n backgroundColor: secondaryBgBaseColor,\n opacity: 0.4,\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n },\n ]}\n />\n )}\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { Animated, type ViewStyle } from 'react-native';\n\nimport type { StudioSheetPage } from './types';\n\nexport type StudioSheetPagerProps = {\n activePage: StudioSheetPage;\n width: number;\n preview: React.ReactNode;\n chat: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function StudioSheetPager({ activePage, width, preview, chat, style }: StudioSheetPagerProps) {\n const anim = React.useRef(new Animated.Value(activePage === 'chat' ? 1 : 0)).current;\n\n React.useEffect(() => {\n Animated.spring(anim, {\n toValue: activePage === 'chat' ? 1 : 0,\n useNativeDriver: true,\n tension: 65,\n friction: 11,\n }).start();\n }, [activePage, anim]);\n\n const previewTranslateX = anim.interpolate({ inputRange: [0, 1], outputRange: [0, -width] });\n const chatTranslateX = anim.interpolate({ inputRange: [0, 1], outputRange: [width, 0] });\n\n return (\n <Animated.View style={[{ flex: 1 }, style]}>\n <Animated.View\n style={[\n {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n transform: [{ translateX: previewTranslateX }],\n },\n ]}\n pointerEvents={activePage === 'preview' ? 'auto' : 'none'}\n >\n {preview}\n </Animated.View>\n\n <Animated.View\n style={[\n {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n transform: [{ translateX: chatTranslateX }],\n },\n ]}\n pointerEvents={activePage === 'chat' ? 'auto' : 'none'}\n >\n {chat}\n </Animated.View>\n </Animated.View>\n );\n}\n\n\n","import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport {\n PanResponder,\n Pressable,\n StyleSheet,\n Text,\n type GestureResponderEvent,\n useWindowDimensions,\n View,\n} from 'react-native';\nimport * as Haptics from 'expo-haptics';\nimport Animated, {\n Easing,\n interpolateColor,\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withRepeat,\n withSequence,\n withSpring,\n withTiming,\n} from 'react-native-reanimated';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\n\nimport { DEFAULT_EDGE_PADDING, DEFAULT_OFFSET, DEFAULT_SIZE, ENTER_ROTATION_FROM_DEG, ENTER_SCALE_FROM, HIDDEN_OPACITY, PULSE_DURATION_MS } from './constants';\nimport type { FloatingDraggableButtonProps } from './types';\nimport { useTheme } from '../../theme';\n\nconst HIDDEN_OFFSET_X = 20;\n\nconst SPRING_POSITION = { damping: 12, stiffness: 100, mass: 0.8 } as const;\nconst SPRING_SCALE_IN = { damping: 10, stiffness: 200 } as const;\nconst SPRING_SCALE_OUT = { damping: 12, stiffness: 150 } as const;\nconst SPRING_ROTATION_IN = { damping: 15, stiffness: 80 } as const;\nconst SPRING_ROTATION_GRAB = { damping: 20 } as const;\nconst SPRING_SCALE_GRAB = { damping: 15, stiffness: 200 } as const;\n\nconst TIMING_OPACITY_IN = { duration: 300, easing: Easing.out(Easing.ease) } as const;\nconst TIMING_OPACITY_OUT = { duration: 250, easing: Easing.in(Easing.ease) } as const;\n\nfunction clamp(value: number, min: number, max: number) {\n 'worklet';\n return Math.max(min, Math.min(max, value));\n}\n\nfunction getHiddenTranslateX(size: number) {\n return -size - HIDDEN_OFFSET_X;\n}\n\nfunction getHiddenTranslateY(height: number) {\n return height;\n}\n\nfunction getFinalTranslateY(height: number, size: number, bottomOffset: number) {\n return height - size - bottomOffset;\n}\n\nexport function FloatingDraggableButton({\n onPress,\n size = DEFAULT_SIZE,\n disabled = false,\n ariaLabel,\n isLoading = false,\n visible = true,\n badgeCount = 0,\n offset = DEFAULT_OFFSET,\n variant = 'default',\n forceShowTrigger = 0,\n children,\n style,\n testID,\n edgePadding = DEFAULT_EDGE_PADDING,\n backgroundColor,\n}: FloatingDraggableButtonProps) {\n const theme = useTheme();\n const { width, height } = useWindowDimensions();\n const isDanger = variant === 'danger';\n\n const onPressRef = useRef(onPress);\n useEffect(() => {\n onPressRef.current = onPress;\n }, [onPress]);\n\n const fallbackBgColor = useMemo(() => {\n if (backgroundColor) return backgroundColor;\n if (isDanger) return 'rgba(239, 68, 68, 0.9)';\n return theme.scheme === 'dark' ? 'rgba(0, 0, 0, 0.6)' : 'rgba(255, 255, 255, 0.6)';\n }, [backgroundColor, isDanger, theme.scheme]);\n\n const translateX = useSharedValue(getHiddenTranslateX(size));\n const translateY = useSharedValue(getHiddenTranslateY(height));\n const scale = useSharedValue(ENTER_SCALE_FROM);\n const rotation = useSharedValue(ENTER_ROTATION_FROM_DEG);\n const opacity = useSharedValue(1);\n const borderPulse = useSharedValue(0);\n const startPos = useRef({ x: 0, y: 0 });\n const isAnimatingOut = useRef(false);\n\n const animateToHidden = useCallback(\n (options?: { onFinish?: () => void }) => {\n // Animate back to starting position (reverse of entrance)\n translateX.value = withSpring(getHiddenTranslateX(size), SPRING_POSITION);\n translateY.value = withSpring(getHiddenTranslateY(height), SPRING_POSITION);\n scale.value = withSpring(ENTER_SCALE_FROM, SPRING_SCALE_IN);\n rotation.value = withSpring(ENTER_ROTATION_FROM_DEG, SPRING_ROTATION_IN);\n\n const finish = options?.onFinish;\n if (!finish) {\n opacity.value = withTiming(HIDDEN_OPACITY, TIMING_OPACITY_OUT);\n return;\n }\n\n opacity.value = withTiming(\n HIDDEN_OPACITY as unknown as number,\n TIMING_OPACITY_OUT,\n (finished?: boolean) => {\n if (finished) runOnJS(finish)();\n }\n );\n },\n [height, opacity, rotation, scale, size, translateX, translateY]\n );\n\n const animateOut = useCallback(() => {\n if (isAnimatingOut.current) return;\n isAnimatingOut.current = true;\n\n try {\n void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);\n } catch {\n // noop\n }\n\n animateToHidden({\n onFinish: () => {\n onPressRef.current?.();\n },\n });\n }, [animateToHidden]);\n\n useEffect(() => {\n if (isLoading) {\n borderPulse.value = withRepeat(\n withSequence(\n withTiming(1, { duration: PULSE_DURATION_MS, easing: Easing.out(Easing.ease) }),\n withTiming(0, { duration: PULSE_DURATION_MS, easing: Easing.in(Easing.ease) })\n ),\n -1,\n true\n );\n } else {\n borderPulse.value = withTiming(0, { duration: 200 });\n }\n }, [borderPulse, isLoading]);\n\n const animateIn = useCallback(() => {\n isAnimatingOut.current = false;\n translateX.value = withSpring(offset.left ?? DEFAULT_OFFSET.left, SPRING_POSITION);\n const finalY = getFinalTranslateY(height, size, offset.bottom ?? DEFAULT_OFFSET.bottom);\n translateY.value = withSpring(finalY, SPRING_POSITION);\n scale.value = withSequence(\n withSpring(1.2, SPRING_SCALE_IN),\n withSpring(1, SPRING_SCALE_OUT)\n );\n rotation.value = withSpring(0, SPRING_ROTATION_IN);\n opacity.value = withTiming(1, TIMING_OPACITY_IN);\n }, [height, offset.bottom, offset.left, opacity, rotation, scale, size, translateX, translateY]);\n\n // Initial animation on mount\n useEffect(() => {\n const timer = setTimeout(() => {\n if (visible) {\n animateIn();\n }\n }, 100);\n\n return () => clearTimeout(timer);\n }, []);\n\n useEffect(() => {\n if (visible && isAnimatingOut.current) {\n animateIn();\n } else if (!visible && !isAnimatingOut.current) {\n animateToHidden();\n isAnimatingOut.current = true;\n }\n }, [visible, animateIn, animateToHidden]);\n\n useEffect(() => {\n if (forceShowTrigger > 0 && visible) {\n isAnimatingOut.current = false;\n animateIn();\n }\n }, [forceShowTrigger, visible, animateIn]);\n\n const panResponder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: () => {\n startPos.current = {\n x: translateX.value,\n y: translateY.value,\n };\n scale.value = withSpring(1.1, SPRING_SCALE_GRAB);\n rotation.value = withSpring(0, SPRING_ROTATION_GRAB);\n },\n onPanResponderMove: (_: GestureResponderEvent, gesture) => {\n const newX = startPos.current.x + gesture.dx;\n const newY = startPos.current.y + gesture.dy;\n translateX.value = clamp(newX, edgePadding, width - size - edgePadding);\n translateY.value = clamp(newY, edgePadding, height - size - edgePadding);\n },\n onPanResponderRelease: (_evt, gesture) => {\n scale.value = withSpring(1, SPRING_SCALE_GRAB);\n const distance = Math.sqrt(gesture.dx ** 2 + gesture.dy ** 2);\n if (distance < 5 && !disabled) {\n animateOut();\n }\n },\n })\n ).current;\n\n const animatedStyle = useAnimatedStyle(() => ({\n transform: [\n { translateX: translateX.value },\n { translateY: translateY.value },\n { scale: scale.value },\n { rotate: `${rotation.value}deg` },\n ],\n opacity: opacity.value,\n }));\n\n const borderAnimatedStyle = useAnimatedStyle(() => {\n const borderColor = interpolateColor(\n borderPulse.value,\n [0, 1],\n isDanger\n ? ['rgba(239,68,68,0.4)', 'rgba(239,68,68,1)']\n : theme.scheme === 'dark'\n ? ['rgba(255,255,255,0.2)', 'rgba(255,255,255,0.9)']\n : ['rgba(55,0,179,0.2)', 'rgba(55,0,179,0.9)']\n );\n return {\n borderWidth: isLoading ? 2 : 0,\n borderColor,\n borderRadius: size / 2,\n };\n });\n\n return (\n <Animated.View\n {...panResponder.panHandlers}\n testID={testID}\n style={[styles.floatingButton, { width: size, height: size, borderRadius: size / 2 }, style, animatedStyle]}\n accessibilityRole=\"button\"\n accessibilityLabel={ariaLabel}\n >\n <Animated.View style={[{ width: size, height: size, borderRadius: size / 2 }, borderAnimatedStyle]}>\n <LiquidGlassView\n style={[{ flex: 1, borderRadius: size / 2 }, !isLiquidGlassSupported && { backgroundColor: fallbackBgColor }]}\n interactive\n effect=\"clear\"\n >\n <Pressable\n onPress={() => {\n if (!disabled) animateOut();\n }}\n style={styles.buttonInner}\n android_ripple={{ color: 'rgba(255, 255, 255, 0.3)', borderless: true }}\n >\n {children ?? <View />}\n </Pressable>\n </LiquidGlassView>\n </Animated.View>\n\n {badgeCount > 0 && (\n <View style={[styles.badge, { backgroundColor: theme.colors.danger }]}>\n <Text style={[styles.badgeText, { color: theme.colors.onDanger }]}>\n {badgeCount > 99 ? '99+' : badgeCount}\n </Text>\n </View>\n )}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n floatingButton: {\n position: 'absolute',\n justifyContent: 'center',\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 3.84,\n elevation: 5,\n },\n buttonInner: {\n width: '100%',\n height: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 999,\n },\n badge: {\n position: 'absolute',\n top: -4,\n right: -4,\n minWidth: 20,\n height: 20,\n borderRadius: 10,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 5,\n },\n badgeText: {\n fontSize: 11,\n fontWeight: '700',\n },\n});\n\n\n","import type { FloatingButtonOffset } from './types';\n\nexport const DEFAULT_SIZE = 48;\nexport const DEFAULT_EDGE_PADDING = 10;\n\nexport const DEFAULT_OFFSET: Required<FloatingButtonOffset> = {\n left: 20,\n bottom: 60,\n};\n\nexport const ENTER_SCALE_FROM = 0.3;\nexport const ENTER_ROTATION_FROM_DEG = -180;\nexport const HIDDEN_OPACITY = 0.3;\n\nexport const PULSE_DURATION_MS = 900;\n\n\n","import * as React from 'react';\nimport { Animated, View, type ViewStyle } from 'react-native';\nimport { LinearGradient } from 'expo-linear-gradient';\n\nimport { useTheme } from '../../theme';\nimport { withAlpha } from '../utils/color';\n\nexport type EdgeGlowFrameProps = {\n visible: boolean;\n /**\n * Which semantic color to use for the glow.\n */\n role?: 'accent' | 'danger' | 'success' | 'warning';\n /**\n * Thickness of each edge glow in dp.\n */\n thickness?: number;\n /**\n * Optional intensity multiplier for alpha (0..1).\n */\n intensity?: number;\n style?: ViewStyle;\n};\n\nfunction baseColor(role: NonNullable<EdgeGlowFrameProps['role']>, theme: ReturnType<typeof useTheme>) {\n switch (role) {\n case 'danger':\n return theme.colors.danger;\n case 'success':\n return theme.colors.success;\n case 'warning':\n return theme.colors.warning;\n case 'accent':\n default:\n return '#A855F7';\n }\n}\n\nexport function EdgeGlowFrame({\n visible,\n role = 'accent',\n thickness = 40,\n intensity = 1,\n style,\n}: EdgeGlowFrameProps) {\n const theme = useTheme();\n const alpha = Math.max(0, Math.min(1, intensity));\n\n const anim = React.useRef(new Animated.Value(visible ? 1 : 0)).current;\n\n React.useEffect(() => {\n Animated.timing(anim, {\n toValue: visible ? 1 : 0,\n duration: 300,\n useNativeDriver: true,\n }).start();\n }, [anim, visible]);\n\n const c = baseColor(role, theme);\n const strong = withAlpha(c, 0.6 * alpha);\n const soft = withAlpha(c, 0.22 * alpha);\n\n return (\n <Animated.View pointerEvents=\"none\" style={[{ position: 'absolute', inset: 0, opacity: anim }, style]}>\n {/* Top */}\n <View style={{ position: 'absolute', top: 0, left: 0, right: 0, height: thickness }}>\n <LinearGradient\n colors={[strong, soft, 'transparent']}\n start={{ x: 0, y: 0 }}\n end={{ x: 0, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </View>\n {/* Bottom */}\n <View style={{ position: 'absolute', bottom: 0, left: 0, right: 0, height: thickness }}>\n <LinearGradient\n colors={['transparent', soft, strong]}\n start={{ x: 0, y: 0 }}\n end={{ x: 0, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </View>\n {/* Left */}\n <View style={{ position: 'absolute', top: 0, bottom: 0, left: 0, width: thickness }}>\n <LinearGradient\n colors={[strong, soft, 'transparent']}\n start={{ x: 0, y: 0 }}\n end={{ x: 1, y: 0 }}\n style={{ width: '100%', height: '100%' }}\n />\n </View>\n {/* Right */}\n <View style={{ position: 'absolute', top: 0, bottom: 0, right: 0, width: thickness }}>\n <LinearGradient\n colors={['transparent', soft, strong]}\n start={{ x: 0, y: 0 }}\n end={{ x: 1, y: 0 }}\n style={{ width: '100%', height: '100%' }}\n />\n </View>\n </Animated.View>\n );\n}\n\n\n","export function withAlpha(color: string, alpha: number): string {\n const a = Math.max(0, Math.min(1, alpha));\n const hex = color.trim();\n if (!hex.startsWith('#')) return color;\n\n const raw = hex.slice(1);\n const expanded =\n raw.length === 3\n ? raw\n .split('')\n .map((c) => c + c)\n .join('')\n : raw;\n\n if (expanded.length !== 6) return color;\n\n const r = Number.parseInt(expanded.slice(0, 2), 16);\n const g = Number.parseInt(expanded.slice(2, 4), 16);\n const b = Number.parseInt(expanded.slice(4, 6), 16);\n\n if ([r, g, b].some((n) => Number.isNaN(n))) return color;\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\n\n","import * as React from 'react';\nimport { StyleSheet, View, type ViewStyle } from 'react-native';\nimport { captureRef } from 'react-native-view-shot';\n\nimport { useTheme } from '../../theme';\nimport { EdgeGlowFrame } from '../overlays/EdgeGlowFrame';\nimport { DrawSurface } from './DrawSurface';\nimport { DrawToolbar } from './DrawToolbar';\nimport type { Stroke } from './types';\n\nexport type DrawModeOverlayProps = {\n visible: boolean;\n captureTargetRef: React.RefObject<View | null>;\n onCancel: () => void;\n onCapture: (dataUrl: string) => void;\n /**\n * Custom palette (theme-first). If omitted, uses a theme-derived palette.\n */\n palette?: string[];\n strokeWidth?: number;\n style?: ViewStyle;\n /**\n * Render icons for toolbar actions.\n */\n renderUndoIcon?: () => React.ReactNode;\n renderCancelIcon?: () => React.ReactNode;\n renderDoneIcon?: () => React.ReactNode;\n renderDragHandle?: () => React.ReactNode;\n};\n\nexport function DrawModeOverlay({\n visible,\n captureTargetRef,\n onCancel,\n onCapture,\n palette,\n strokeWidth = 4,\n style,\n renderUndoIcon,\n renderCancelIcon,\n renderDoneIcon,\n renderDragHandle,\n}: DrawModeOverlayProps) {\n const theme = useTheme();\n\n const defaultPalette = React.useMemo(\n () => [\n '#EF4444', // Red\n '#EAB308', // Yellow\n '#22C55E', // Green\n '#3B82F6', // Blue\n '#FFFFFF', // White\n '#000000', // Black\n ],\n []\n );\n\n const colors = palette && palette.length > 0 ? palette : defaultPalette;\n const [selectedColor, setSelectedColor] = React.useState(colors[0] ?? '#EF4444');\n const [strokes, setStrokes] = React.useState<Stroke[]>([]);\n const [capturing, setCapturing] = React.useState(false);\n const [hideUi, setHideUi] = React.useState(false);\n\n React.useEffect(() => {\n if (!visible) return;\n setStrokes([]);\n setSelectedColor(colors[0] ?? '#EF4444');\n setCapturing(false);\n setHideUi(false);\n }, [colors, visible]);\n\n const canUndo = strokes.length > 0;\n\n const handleUndo = React.useCallback(() => {\n setStrokes((prev) => prev.slice(0, -1));\n }, []);\n\n const handleCancel = React.useCallback(() => {\n setStrokes([]);\n onCancel();\n }, [onCancel]);\n\n const handleDone = React.useCallback(async () => {\n if (!captureTargetRef.current || capturing) return;\n try {\n setCapturing(true);\n setHideUi(true);\n await new Promise((r) => requestAnimationFrame(() => r(null)));\n await new Promise((r) => requestAnimationFrame(() => r(null)));\n\n const base64 = await captureRef(captureTargetRef, {\n format: 'png',\n quality: 0.9,\n result: 'base64',\n });\n setCapturing(false);\n setHideUi(false);\n setStrokes([]);\n onCapture(`data:image/png;base64,${base64}`);\n } catch {\n setCapturing(false);\n setHideUi(false);\n }\n }, [captureTargetRef, capturing, onCapture]);\n\n if (!visible) return null;\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.root, style]} pointerEvents=\"box-none\">\n <EdgeGlowFrame visible={!hideUi} role=\"danger\" thickness={50} intensity={1} />\n\n <DrawSurface\n color={selectedColor}\n strokeWidth={strokeWidth}\n strokes={strokes}\n onAddStroke={(stroke) => setStrokes((prev) => [...prev, stroke])}\n />\n\n <DrawToolbar\n hidden={hideUi}\n capturing={capturing}\n colors={colors}\n selectedColor={selectedColor}\n onSelectColor={setSelectedColor}\n canUndo={canUndo}\n onUndo={handleUndo}\n onCancel={handleCancel}\n onDone={() => void handleDone()}\n renderUndoIcon={renderUndoIcon}\n renderCancelIcon={renderCancelIcon}\n renderDoneIcon={renderDoneIcon}\n renderDragHandle={renderDragHandle}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n zIndex: 9999,\n },\n});\n\n\n","import * as React from 'react';\nimport { PanResponder, StyleSheet, View, type GestureResponderEvent, type PanResponderGestureState, type ViewStyle } from 'react-native';\nimport Svg, { Path } from 'react-native-svg';\n\nimport type { Point, Stroke } from './types';\nimport { pointsToSmoothPath } from './strokes';\n\nexport type DrawSurfaceProps = {\n color: string;\n strokeWidth: number;\n strokes: Stroke[];\n onAddStroke: (stroke: Stroke) => void;\n style?: ViewStyle;\n minDistance?: number;\n};\n\nexport function DrawSurface({\n color,\n strokeWidth,\n strokes,\n onAddStroke,\n style,\n minDistance = 1,\n}: DrawSurfaceProps) {\n const [renderTick, setRenderTick] = React.useState(0);\n const currentPointsRef = React.useRef<Point[]>([]);\n const rafRef = React.useRef<number | null>(null);\n\n const triggerRender = React.useCallback(() => {\n if (rafRef.current !== null) return;\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n setRenderTick((n) => n + 1);\n });\n }, []);\n\n React.useEffect(() => () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n }, []);\n\n const onStart = React.useCallback((e: GestureResponderEvent) => {\n const { locationX, locationY } = e.nativeEvent;\n currentPointsRef.current = [{ x: locationX, y: locationY }];\n triggerRender();\n }, [triggerRender]);\n\n const onMove = React.useCallback((e: GestureResponderEvent, _g: PanResponderGestureState) => {\n const { locationX, locationY } = e.nativeEvent;\n const pts = currentPointsRef.current;\n if (pts.length > 0) {\n const last = pts[pts.length - 1];\n const dx = locationX - last.x;\n const dy = locationY - last.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < minDistance) return;\n }\n currentPointsRef.current = [...pts, { x: locationX, y: locationY }];\n triggerRender();\n }, [minDistance, triggerRender]);\n\n const onEnd = React.useCallback(() => {\n const points = currentPointsRef.current;\n if (points.length > 0) {\n onAddStroke({ points, color, width: strokeWidth });\n }\n currentPointsRef.current = [];\n triggerRender();\n }, [color, onAddStroke, strokeWidth, triggerRender]);\n\n const panResponder = React.useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: onStart,\n onPanResponderMove: onMove,\n onPanResponderRelease: onEnd,\n onPanResponderTerminate: onEnd,\n }),\n [onEnd, onMove, onStart]\n );\n\n const currentPath = pointsToSmoothPath(currentPointsRef.current);\n\n // renderTick is used to force re-render when refs change\n void renderTick;\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.container, style]} {...panResponder.panHandlers}>\n <Svg style={StyleSheet.absoluteFill} width=\"100%\" height=\"100%\">\n {strokes.map((s, idx) => {\n const d = pointsToSmoothPath(s.points);\n if (!d) return null;\n return (\n <Path\n key={idx}\n d={d}\n stroke={s.color}\n strokeWidth={s.width}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n );\n })}\n {currentPath ? (\n <Path\n d={currentPath}\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n ) : null}\n </Svg>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n zIndex: 5,\n },\n});\n\n\n","import type { Point } from './types';\n\nexport function pointsToSmoothPath(points: Point[]): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M${points[0].x},${points[0].y}`;\n if (points.length === 2) return `M${points[0].x},${points[0].y} L${points[1].x},${points[1].y}`;\n\n let path = `M${points[0].x},${points[0].y}`;\n for (let i = 1; i < points.length - 1; i++) {\n const p1 = points[i];\n const p2 = points[i + 1];\n const midX = (p1.x + p2.x) / 2;\n const midY = (p1.y + p2.y) / 2;\n path += ` Q${p1.x},${p1.y} ${midX},${midY}`;\n }\n const last = points[points.length - 1];\n path += ` L${last.x},${last.y}`;\n return path;\n}\n\n\n","import * as React from 'react';\nimport {\n ActivityIndicator,\n Animated,\n PanResponder,\n Pressable,\n View,\n useWindowDimensions,\n type ViewStyle,\n} from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { Check, GripVertical, Undo2, X } from 'lucide-react-native';\n\nimport { impact } from './optionalHaptics';\nimport { DrawColorPicker } from './DrawColorPicker';\n\nexport type DrawToolbarProps = {\n colors: string[];\n selectedColor: string;\n onSelectColor: (color: string) => void;\n canUndo: boolean;\n onUndo: () => void;\n onCancel: () => void;\n onDone: () => void;\n capturing?: boolean;\n hidden?: boolean;\n renderUndoIcon?: () => React.ReactNode;\n renderCancelIcon?: () => React.ReactNode;\n renderDoneIcon?: () => React.ReactNode;\n renderDragHandle?: () => React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function DrawToolbar({\n colors,\n selectedColor,\n onSelectColor,\n canUndo,\n onUndo,\n onCancel,\n onDone,\n capturing = false,\n hidden = false,\n renderUndoIcon,\n renderCancelIcon,\n renderDoneIcon,\n renderDragHandle,\n style,\n}: DrawToolbarProps) {\n const insets = useSafeAreaInsets();\n const { width: screenWidth, height: screenHeight } = useWindowDimensions();\n\n const [expanded, setExpanded] = React.useState(false);\n\n const pos = React.useRef(new Animated.ValueXY({ x: screenWidth / 2 - 110, y: -140 })).current;\n const start = React.useRef({ x: 0, y: 0 });\n const currentPos = React.useRef({ x: 0, y: 0 });\n\n React.useEffect(() => {\n if (hidden) return;\n Animated.spring(pos.y, {\n toValue: insets.top + 60,\n useNativeDriver: true,\n damping: 12,\n stiffness: 120,\n mass: 0.8,\n }).start();\n }, [hidden, insets.top, pos.y]);\n\n React.useEffect(() => {\n const id = pos.addListener((v) => {\n currentPos.current = { x: v.x ?? 0, y: v.y ?? 0 };\n });\n return () => {\n pos.removeListener(id);\n };\n }, [pos]);\n\n const clamp = React.useCallback(\n (x: number, y: number) => {\n const minX = 10;\n const maxX = Math.max(10, screenWidth - 230);\n const minY = insets.top + 10;\n const maxY = Math.max(minY, screenHeight - 180);\n return { x: Math.max(minX, Math.min(maxX, x)), y: Math.max(minY, Math.min(maxY, y)) };\n },\n [insets.top, screenHeight, screenWidth]\n );\n\n const panResponder = React.useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => false,\n onMoveShouldSetPanResponder: (_e, g) => Math.abs(g.dx) > 5 || Math.abs(g.dy) > 5,\n onPanResponderGrant: () => {\n start.current = { ...currentPos.current };\n },\n onPanResponderMove: (_e, g) => {\n const next = clamp(start.current.x + g.dx, start.current.y + g.dy);\n pos.setValue(next);\n },\n onPanResponderRelease: () => {\n const next = clamp(currentPos.current.x, currentPos.current.y);\n Animated.spring(pos, { toValue: next, useNativeDriver: true }).start();\n },\n }),\n [clamp, pos]\n );\n\n if (hidden) return null;\n\n function CircleActionButton({\n accessibilityLabel,\n disabled,\n capturingDisabled,\n backgroundColor,\n onPress,\n children,\n }: {\n accessibilityLabel: string;\n disabled?: boolean;\n capturingDisabled?: boolean;\n backgroundColor: string;\n onPress: () => void;\n children: React.ReactNode;\n }) {\n const isDisabled = Boolean(disabled) || Boolean(capturingDisabled);\n const [pressed, setPressed] = React.useState(false);\n return (\n <View\n style={{\n width: 28,\n height: 28,\n borderRadius: 14,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor,\n opacity: isDisabled ? 0.5 : pressed ? 0.85 : 1,\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={isDisabled}\n onPress={onPress}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n style={{ width: '100%', height: '100%', alignItems: 'center', justifyContent: 'center' }}\n hitSlop={8}\n >\n {children}\n </Pressable>\n </View>\n );\n }\n\n return (\n <Animated.View\n style={[\n {\n position: 'absolute',\n zIndex: 100,\n transform: [{ translateX: pos.x }, { translateY: pos.y }],\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 8,\n elevation: 8,\n },\n style,\n ]}\n {...panResponder.panHandlers}\n >\n <View\n style={{\n backgroundColor: '#F43F5E',\n borderRadius: 16,\n padding: 12,\n minWidth: 220,\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>\n {renderDragHandle ? (\n renderDragHandle()\n ) : (\n <GripVertical size={20} color=\"rgba(255, 255, 255, 0.6)\" />\n )}\n\n <DrawColorPicker\n colors={colors}\n selected={selectedColor}\n expanded={expanded}\n onToggle={() => {\n void impact('light');\n setExpanded((v) => !v);\n }}\n onSelect={(c) => {\n void impact('light');\n onSelectColor(c);\n }}\n />\n\n <View style={{ width: 1, height: 20, backgroundColor: 'rgba(255, 255, 255, 0.3)', marginHorizontal: 4 }} />\n\n <CircleActionButton\n accessibilityLabel=\"Undo\"\n disabled={!canUndo}\n capturingDisabled={capturing}\n backgroundColor={!canUndo || capturing ? 'rgba(255, 255, 255, 0.1)' : 'rgba(255, 255, 255, 0.25)'}\n onPress={() => {\n void impact('light');\n onUndo();\n }}\n >\n {renderUndoIcon ? renderUndoIcon() : <Undo2 size={16} color={canUndo ? '#FFFFFF' : 'rgba(255,255,255,0.4)'} />}\n </CircleActionButton>\n\n <CircleActionButton\n accessibilityLabel=\"Cancel\"\n capturingDisabled={capturing}\n backgroundColor=\"rgba(255, 255, 255, 0.15)\"\n onPress={() => {\n void impact('medium');\n onCancel();\n }}\n >\n {renderCancelIcon ? renderCancelIcon() : <X size={16} color=\"#FFFFFF\" />}\n </CircleActionButton>\n\n <CircleActionButton\n accessibilityLabel=\"Done\"\n capturingDisabled={capturing}\n backgroundColor=\"rgba(255, 255, 255, 0.35)\"\n onPress={() => {\n void impact('medium');\n onDone();\n }}\n >\n {capturing ? (\n <ActivityIndicator color=\"#FFFFFF\" size=\"small\" />\n ) : renderDoneIcon ? (\n renderDoneIcon()\n ) : (\n <Check size={16} color=\"#FFFFFF\" />\n )}\n </CircleActionButton>\n </View>\n </View>\n </Animated.View>\n );\n}\n\n\n","type ImpactStyle = 'light' | 'medium' | 'heavy';\n\nexport async function impact(style: ImpactStyle) {\n try {\n const Haptics = require('expo-haptics') as typeof import('expo-haptics');\n const map: Record<ImpactStyle, any> = {\n light: Haptics.ImpactFeedbackStyle.Light,\n medium: Haptics.ImpactFeedbackStyle.Medium,\n heavy: Haptics.ImpactFeedbackStyle.Heavy,\n };\n await Haptics.impactAsync(map[style]);\n } catch {}\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\n\nexport type DrawColorPickerProps = {\n colors: string[];\n selected: string;\n expanded: boolean;\n onToggle: () => void;\n onSelect: (color: string) => void;\n style?: ViewStyle;\n};\n\nexport function DrawColorPicker({\n colors,\n selected,\n expanded,\n onToggle,\n onSelect,\n style,\n}: DrawColorPickerProps) {\n useTheme();\n\n const isWhite = (c: string) => c.toUpperCase() === '#FFFFFF';\n\n const swatchStyle = (c: string, isSelected: boolean): ViewStyle => {\n const base: ViewStyle = {\n width: 28,\n height: 28,\n borderRadius: 14,\n backgroundColor: c,\n borderWidth: 2,\n borderColor: 'transparent',\n alignItems: 'center',\n justifyContent: 'center',\n };\n\n const selectedStyle: ViewStyle = isSelected\n ? {\n borderColor: '#FFFFFF',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.3,\n shadowRadius: 3,\n elevation: 4,\n }\n : {};\n\n const whiteStyle: ViewStyle = isWhite(c) ? { borderColor: 'rgba(0, 0, 0, 0.2)' } : {};\n\n return { ...base, ...selectedStyle, ...whiteStyle };\n };\n\n if (!expanded) {\n return (\n <Pressable onPress={onToggle} style={[swatchStyle(selected, true), style]} />\n );\n }\n\n return (\n <View style={[{ flexDirection: 'row', alignItems: 'center', gap: 8 }, style]}>\n {colors.map((c, idx) => (\n <Pressable\n key={`${c}-${idx}`}\n onPress={() => {\n onSelect(c);\n onToggle();\n }}\n style={swatchStyle(c, selected === c)}\n />\n ))}\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, Keyboard, Platform, Pressable, View } from 'react-native';\nimport {\n BottomSheetBackdrop,\n BottomSheetModal,\n BottomSheetScrollView,\n} from '@gorhom/bottom-sheet';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\nimport { Play } from 'lucide-react-native';\n\nimport { useTheme } from '../../theme';\nimport { withAlpha } from '../utils/color';\nimport { Text } from '../primitives/Text';\nimport { ChatComposer } from '../chat/ChatComposer';\nimport { CommentRow } from './CommentRow';\nimport { useAppComments } from './useAppComments';\nimport { useAppDetails } from './useAppDetails';\nimport { useIosKeyboardSnapFix } from './useIosKeyboardSnapFix';\n\nexport type AppCommentsSheetProps = {\n appId: string | null;\n onClose: () => void;\n onCountChange?: (count: number) => void;\n onPlayApp?: (appId: string) => void | Promise<void>;\n};\n\nexport function AppCommentsSheet({ appId, onClose, onCountChange, onPlayApp }: AppCommentsSheetProps) {\n const theme = useTheme();\n const insets = useSafeAreaInsets();\n const sheetRef = React.useRef<BottomSheetModal | null>(null);\n const snapPoints = React.useMemo(() => ['50%', '90%'], []);\n\n const { comments, loading, sending, error, create, refresh } = useAppComments(appId);\n const { app, loading: loadingApp } = useAppDetails(appId);\n const { keyboardVisible } = useIosKeyboardSnapFix(sheetRef);\n\n React.useEffect(() => {\n if (appId) {\n sheetRef.current?.present();\n void refresh();\n } else {\n sheetRef.current?.dismiss();\n }\n }, [appId, refresh]);\n\n React.useEffect(() => {\n if (!appId) return;\n onCountChange?.(comments.length);\n }, [appId, comments.length, onCountChange]);\n\n const renderBackdrop = React.useCallback(\n (props: any) => <BottomSheetBackdrop {...props} disappearsOnIndex={-1} appearsOnIndex={0} opacity={0.5} />,\n []\n );\n\n const handleChange = React.useCallback(\n (index: number) => {\n if (index === -1) onClose();\n },\n [onClose]\n );\n\n const handlePlay = React.useCallback(async () => {\n if (!appId) return;\n sheetRef.current?.dismiss();\n await onPlayApp?.(appId);\n onClose();\n }, [appId, onClose, onPlayApp]);\n\n return (\n <BottomSheetModal\n ref={sheetRef}\n index={1}\n snapPoints={snapPoints}\n enableDynamicSizing={false}\n backdropComponent={renderBackdrop}\n onChange={handleChange}\n backgroundStyle={{\n backgroundColor: theme.scheme === 'dark' ? '#0B080F' : '#FFFFFF',\n borderTopLeftRadius: Platform.OS === 'ios' ? 39 : 16,\n borderTopRightRadius: Platform.OS === 'ios' ? 39 : 16,\n }}\n handleIndicatorStyle={{ backgroundColor: theme.colors.handleIndicator }}\n keyboardBehavior=\"interactive\"\n keyboardBlurBehavior=\"restore\"\n android_keyboardInputMode=\"adjustResize\"\n topInset={insets.top}\n >\n <View style={{ flex: 1 }}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: theme.spacing.lg,\n paddingBottom: theme.spacing.sm,\n borderBottomWidth: 1,\n borderBottomColor: withAlpha(theme.colors.border, 0.1),\n }}\n >\n <Text\n numberOfLines={1}\n style={{\n flex: 1,\n marginRight: theme.spacing.sm,\n fontSize: 18,\n lineHeight: 22,\n fontWeight: theme.typography.fontWeight.bold,\n }}\n >\n {loadingApp ? 'Loading...' : app?.name || 'Comments'}\n </Text>\n\n <LiquidGlassView\n style={[\n { borderRadius: 24 },\n !isLiquidGlassSupported && { backgroundColor: theme.scheme === 'dark' ? '#18181B' : '#F6F6F6' },\n ]}\n interactive\n effect=\"clear\"\n >\n <View\n style={{\n width: 32,\n height: 32,\n borderRadius: 999,\n backgroundColor: theme.colors.primary,\n alignItems: 'center',\n justifyContent: 'center',\n opacity: appId ? 1 : 0.5,\n }}\n >\n <Pressable\n disabled={!appId}\n onPress={() => void handlePlay()}\n hitSlop={8}\n style={({ pressed }) => [\n {\n width: '100%',\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n },\n pressed ? { opacity: 0.85 } : null,\n ]}\n >\n <Play size={16} color={theme.colors.onPrimary} />\n </Pressable>\n </View>\n </LiquidGlassView>\n </View>\n\n <BottomSheetScrollView\n style={{ flex: 1 }}\n contentContainerStyle={{\n padding: theme.spacing.lg,\n paddingBottom: 100,\n flexGrow: 1,\n }}\n keyboardShouldPersistTaps=\"handled\"\n >\n {loading && comments.length === 0 ? (\n <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>\n <ActivityIndicator />\n </View>\n ) : comments.length === 0 ? (\n <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>\n <Text variant=\"bodyMuted\" style={{ textAlign: 'center' }}>\n No comments yet\n </Text>\n </View>\n ) : (\n comments.map((c, idx) => <CommentRow key={c.id} comment={c} showDivider={idx < comments.length - 1} />)\n )}\n {error ? (\n <Text variant=\"captionMuted\" style={{ marginTop: theme.spacing.lg }}>\n Failed to load comments.\n </Text>\n ) : null}\n </BottomSheetScrollView>\n\n <View\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n paddingHorizontal: theme.spacing.lg,\n paddingTop: theme.spacing.sm,\n paddingBottom: Platform.OS === 'ios' ? (keyboardVisible ? theme.spacing.lg : insets.bottom) : insets.bottom + 10,\n borderTopWidth: 1,\n borderTopColor: withAlpha(theme.colors.border, 0.1),\n backgroundColor: withAlpha(theme.colors.background, 0.8),\n }}\n >\n <ChatComposer\n placeholder=\"Write a comment...\"\n disabled={sending}\n sending={sending}\n useBottomSheetTextInput\n onSend={async (text) => {\n await create(text);\n Keyboard.dismiss();\n }}\n />\n </View>\n </View>\n </BottomSheetModal>\n );\n}\n\n\n","import * as React from 'react';\nimport {\n ActivityIndicator,\n Animated,\n Dimensions,\n Image,\n Pressable,\n ScrollView,\n View,\n type ViewStyle,\n} from 'react-native';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\nimport { Plus } from 'lucide-react-native';\n\nimport { useTheme } from '../../theme';\nimport { MultilineTextInput } from './MultilineTextInput';\nimport { IconChevronRight, IconClose } from '../icons/StudioIcons';\n\nexport type ChatComposerProps = {\n value?: string;\n onChangeValue?: (text: string) => void;\n placeholder?: string;\n disabled?: boolean;\n sending?: boolean;\n autoFocus?: boolean;\n onSend: (text: string, attachments?: string[]) => void | Promise<void>;\n attachments?: string[];\n onRemoveAttachment?: (index: number) => void;\n onAddAttachment?: () => void;\n renderAddAttachment?: () => React.ReactNode;\n renderRemoveIcon?: () => React.ReactNode;\n renderSendIcon?: () => React.ReactNode;\n useBottomSheetTextInput?: boolean;\n onLayout?: (e: { height: number }) => void;\n style?: ViewStyle;\n};\n\nconst THUMBNAIL_HEIGHT = 90;\n\nfunction AspectRatioThumbnail({\n uri,\n onRemove,\n renderRemoveIcon,\n}: {\n uri: string;\n onRemove?: () => void;\n renderRemoveIcon?: () => React.ReactNode;\n}) {\n const [aspectRatio, setAspectRatio] = React.useState(1);\n\n return (\n <View style={{ height: THUMBNAIL_HEIGHT, aspectRatio, position: 'relative' }}>\n <View style={{ flex: 1, borderRadius: 8, overflow: 'hidden' }}>\n <Image\n source={{ uri }}\n style={{ width: '100%', height: '100%' }}\n resizeMode=\"contain\"\n onLoad={(e) => {\n const { width, height } = (e as any).nativeEvent?.source ?? {};\n if (width && height) setAspectRatio(width / height);\n }}\n />\n </View>\n {onRemove ? (\n <Pressable\n style={{\n position: 'absolute',\n top: -4,\n right: -4,\n width: 24,\n height: 24,\n borderRadius: 12,\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10,\n }}\n onPress={onRemove}\n hitSlop={10}\n >\n {renderRemoveIcon ? renderRemoveIcon() : <IconClose size={12} colorToken=\"onPrimary\" />}\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nexport function ChatComposer({\n value,\n onChangeValue,\n placeholder = 'Describe the idea you want to build',\n disabled = false,\n sending = false,\n autoFocus = false,\n onSend,\n attachments = [],\n onRemoveAttachment,\n onAddAttachment,\n renderAddAttachment,\n renderRemoveIcon,\n renderSendIcon,\n useBottomSheetTextInput,\n onLayout,\n style,\n}: ChatComposerProps) {\n const theme = useTheme();\n const [internal, setInternal] = React.useState('');\n const text = value ?? internal;\n const setText = onChangeValue ?? setInternal;\n const hasAttachments = attachments.length > 0;\n const hasText = text.trim().length > 0;\n const composerMinHeight = hasAttachments ? THUMBNAIL_HEIGHT + 44 + 24 : 44;\n\n const isButtonDisabled = sending || disabled;\n const maxInputHeight = React.useMemo(() => Dimensions.get('window').height * 0.5, []);\n const shakeAnim = React.useRef(new Animated.Value(0)).current;\n const [sendPressed, setSendPressed] = React.useState(false);\n const inputRef = React.useRef<import('react-native').TextInput | null>(null);\n const prevAutoFocusRef = React.useRef(false);\n\n React.useEffect(() => {\n const shouldFocus = autoFocus && !prevAutoFocusRef.current && !disabled && !sending;\n prevAutoFocusRef.current = autoFocus;\n if (!shouldFocus) return;\n\n // Temporary workaround: Bottom sheets can take a moment to open\n const t = setTimeout(() => {\n inputRef.current?.focus();\n }, 75);\n return () => clearTimeout(t);\n }, [autoFocus, disabled, sending]);\n\n const triggerShake = React.useCallback(() => {\n shakeAnim.setValue(0);\n Animated.sequence([\n Animated.timing(shakeAnim, { toValue: 10, duration: 50, useNativeDriver: true }),\n Animated.timing(shakeAnim, { toValue: -10, duration: 50, useNativeDriver: true }),\n Animated.timing(shakeAnim, { toValue: 10, duration: 50, useNativeDriver: true }),\n Animated.timing(shakeAnim, { toValue: -10, duration: 50, useNativeDriver: true }),\n Animated.timing(shakeAnim, { toValue: 0, duration: 50, useNativeDriver: true }),\n ]).start();\n }, [shakeAnim]);\n\n const handleSend = React.useCallback(async () => {\n if (isButtonDisabled) return;\n // Require at least one character of text (attachments alone not enough)\n if (!hasText) {\n triggerShake();\n return;\n }\n const trimmed = text.trim();\n await onSend(trimmed, attachments.length > 0 ? attachments : undefined);\n setText('');\n }, [attachments, hasText, isButtonDisabled, onSend, setText, text, triggerShake]);\n\n const textareaBgColor = theme.scheme === 'dark' ? '#18181B' : '#F6F6F6';\n const placeholderTextColor = theme.scheme === 'dark' ? '#A1A1AA' : '#71717A';\n\n return (\n <View\n style={[{ paddingHorizontal: 16, paddingBottom: 12, paddingTop: 8 }, style]}\n onLayout={(e) => onLayout?.({ height: e.nativeEvent.layout.height })}\n >\n <View style={{ flexDirection: 'row', alignItems: 'flex-end', gap: 8 }}>\n <Animated.View style={{ flex: 1, transform: [{ translateX: shakeAnim }] }}>\n <LiquidGlassView\n style={[\n // LiquidGlassView doesn't reliably auto-size to children; ensure enough height for the\n // thumbnail strip when attachments are present.\n { borderRadius: 24, flex: 1, minHeight: composerMinHeight },\n !isLiquidGlassSupported && { backgroundColor: textareaBgColor },\n ]}\n interactive\n effect=\"clear\"\n >\n {hasAttachments ? (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{ gap: 8, paddingHorizontal: 12, paddingTop: 12 }}\n >\n {attachments.map((uri, index) => (\n <AspectRatioThumbnail\n key={`attachment-${index}`}\n uri={uri}\n onRemove={onRemoveAttachment ? () => onRemoveAttachment(index) : undefined}\n renderRemoveIcon={renderRemoveIcon}\n />\n ))}\n {onAddAttachment ? (\n renderAddAttachment ? (\n renderAddAttachment()\n ) : (\n <Pressable\n style={{\n height: THUMBNAIL_HEIGHT,\n aspectRatio: 0.6,\n borderRadius: 8,\n borderWidth: 2,\n borderColor: 'rgba(255, 255, 255, 0.3)',\n borderStyle: 'dashed',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n }}\n onPress={onAddAttachment}\n >\n <Plus size={24} color=\"rgba(255, 255, 255, 0.5)\" />\n </Pressable>\n )\n ) : null}\n </ScrollView>\n ) : null}\n\n <MultilineTextInput\n ref={inputRef}\n value={text}\n onChangeText={setText}\n placeholder={placeholder}\n editable={!disabled && !sending}\n useBottomSheetTextInput={useBottomSheetTextInput}\n autoFocus={autoFocus}\n placeholderTextColor={placeholderTextColor}\n scrollEnabled\n style={{\n maxHeight: maxInputHeight,\n minHeight: 44,\n color: theme.scheme === 'dark' ? '#FAFAFA' : '#09090B',\n paddingHorizontal: 16,\n paddingVertical: 12,\n lineHeight: 20,\n }}\n />\n </LiquidGlassView>\n </Animated.View>\n\n <LiquidGlassView\n style={[{ borderRadius: 100 }, !isLiquidGlassSupported && { backgroundColor: textareaBgColor }]}\n interactive\n effect=\"clear\"\n >\n <View\n style={{\n width: 44,\n height: 44,\n borderRadius: 22,\n overflow: 'hidden',\n backgroundColor: theme.colors.primary,\n opacity: isButtonDisabled ? 0.6 : sendPressed ? 0.9 : 1,\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n disabled={isButtonDisabled}\n onPress={handleSend}\n onPressIn={() => setSendPressed(true)}\n onPressOut={() => setSendPressed(false)}\n style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}\n >\n {sending ? (\n <ActivityIndicator />\n ) : renderSendIcon ? (\n renderSendIcon()\n ) : (\n <IconChevronRight size={20} colorToken=\"onPrimary\" />\n )}\n </Pressable>\n </View>\n </LiquidGlassView>\n </View>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { TextInput, type TextInputProps, type TextStyle } from 'react-native';\nimport { BottomSheetTextInput } from '@gorhom/bottom-sheet';\n\nimport { useTheme } from '../../theme';\n\nexport type MultilineTextInputProps = Omit<TextInputProps, 'style'> & {\n useBottomSheetTextInput?: boolean;\n style?: TextStyle;\n};\n\nexport const MultilineTextInput = React.forwardRef<TextInput, MultilineTextInputProps>(function MultilineTextInput(\n { useBottomSheetTextInput = false, placeholder, placeholderTextColor, style, ...props }: MultilineTextInputProps,\n ref\n) {\n const theme = useTheme();\n\n const baseStyle: TextStyle = {\n minHeight: 44,\n maxHeight: 160,\n paddingVertical: theme.spacing.md,\n paddingHorizontal: theme.spacing.lg,\n color: theme.colors.text,\n fontSize: theme.typography.fontSize.md,\n lineHeight: theme.typography.lineHeight.md,\n };\n\n const resolvedPlaceholderColor = placeholderTextColor ?? theme.colors.textSubtle;\n\n const commonProps: TextInputProps = {\n ...props,\n multiline: true,\n placeholder,\n placeholderTextColor: resolvedPlaceholderColor,\n style: [baseStyle, style],\n textAlignVertical: 'top',\n };\n\n return useBottomSheetTextInput ? (\n <BottomSheetTextInput ref={ref} {...commonProps} />\n ) : (\n <TextInput ref={ref} {...commonProps} />\n );\n});\n\n\n","import * as React from 'react';\nimport type { LucideProps } from 'lucide-react-native';\nimport {\n ArrowDown,\n ChevronLeft,\n ChevronRight,\n ChevronDown,\n Home,\n MessageSquare,\n Pencil,\n Play,\n Send,\n X,\n Check,\n} from 'lucide-react-native';\n\nimport { useTheme } from '../../theme';\n\nexport type StudioIconProps = Omit<LucideProps, 'color'> & {\n colorToken?: 'floatingContent' | 'text' | 'textMuted' | 'primary' | 'danger' | 'onPrimary' | 'onDanger';\n};\n\nfunction useResolvedIconColor(token: NonNullable<StudioIconProps['colorToken']>) {\n const theme = useTheme();\n switch (token) {\n case 'text':\n return theme.colors.text;\n case 'textMuted':\n return theme.colors.textMuted;\n case 'primary':\n return theme.colors.primary;\n case 'danger':\n return theme.colors.danger;\n case 'onPrimary':\n return theme.colors.onPrimary;\n case 'onDanger':\n return theme.colors.onDanger;\n case 'floatingContent':\n default:\n return theme.colors.floatingContent;\n }\n}\n\nfunction makeIcon(Comp: React.ComponentType<LucideProps>) {\n return function StudioIcon({ size = 20, strokeWidth = 2, colorToken = 'floatingContent', ...rest }: StudioIconProps) {\n const color = useResolvedIconColor(colorToken);\n return <Comp size={size} strokeWidth={strokeWidth} color={color} {...rest} />;\n };\n}\n\n// Header / nav\nexport const IconHome = makeIcon(Home);\nexport const IconClose = makeIcon(X);\nexport const IconBack = makeIcon(ChevronLeft);\nexport const IconChevronRight = makeIcon(ChevronRight);\nexport const IconChevronDown = makeIcon(ChevronDown);\n\n// Actions\nexport const IconChat = makeIcon(MessageSquare);\nexport const IconDraw = makeIcon(Pencil);\nexport const IconSend = makeIcon(Send);\nexport const IconPlay = makeIcon(Play);\nexport const IconArrowDown = makeIcon(ArrowDown);\nexport const IconApprove = makeIcon(Check);\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\n\nimport type { AppComment } from '../../data/comments/types';\nimport { usersRepository } from '../../data/users/repository';\nimport { useTheme } from '../../theme';\nimport { Avatar } from '../primitives/Avatar';\nimport { Text } from '../primitives/Text';\nimport { withAlpha } from '../utils/color';\nimport { formatTimeAgo } from './formatTimeAgo';\n\nexport function CommentRow({ comment, showDivider }: { comment: AppComment; showDivider: boolean }) {\n const theme = useTheme();\n const [authorName, setAuthorName] = React.useState<string | null>(null);\n const [authorAvatar, setAuthorAvatar] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const stats = await usersRepository.getStats(comment.authorId);\n if (cancelled) return;\n setAuthorName(stats.name);\n setAuthorAvatar(stats.avatar);\n } catch {\n // ignore\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [comment.authorId]);\n\n return (\n <View\n style={{\n flexDirection: 'row',\n gap: theme.spacing.md,\n paddingVertical: theme.spacing.md,\n borderBottomWidth: showDivider ? 1 : 0,\n borderBottomColor: withAlpha(theme.colors.border, 0.5),\n }}\n >\n <Avatar size={32} uri={authorAvatar} name={authorName ?? comment.authorId} style={{ marginTop: 6 }} />\n\n <View style={{ flex: 1, minWidth: 0, gap: 4 }}>\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: theme.spacing.sm }}>\n <Text style={{ fontSize: 14, lineHeight: 18, fontWeight: theme.typography.fontWeight.bold, color: theme.colors.text }}>\n {authorName ?? 'Unknown User'}\n </Text>\n <Text style={{ fontSize: 12, lineHeight: 16, color: theme.colors.textMuted }}>\n {formatTimeAgo(comment.createdAt)}\n </Text>\n </View>\n <Text style={{ fontSize: 14, lineHeight: 20, color: theme.colors.text }}>\n {comment.body ?? comment.description ?? ''}\n </Text>\n </View>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Image, View, type ImageStyle, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Text } from './Text';\nimport type { WithStyle } from './types';\n\nexport type AvatarProps = WithStyle<ViewStyle> & {\n size?: number;\n uri?: string | null;\n name?: string | null;\n /**\n * Optional override for the fallback background.\n * Prefer leaving this undefined so it uses theme.\n */\n fallbackBackgroundColor?: string;\n imageStyle?: WithStyle<ImageStyle>['style'];\n};\n\nfunction initialsFrom(name?: string | null): string {\n const trimmed = (name ?? '').trim();\n if (!trimmed) return '?';\n return trimmed[0]?.toUpperCase?.() ?? '?';\n}\n\nexport function Avatar({\n size = 32,\n uri,\n name,\n fallbackBackgroundColor,\n style,\n imageStyle,\n}: AvatarProps) {\n const theme = useTheme();\n const radius = size / 2;\n const fallbackBg = fallbackBackgroundColor ?? theme.colors.neutral;\n\n return (\n <View\n style={[\n {\n width: size,\n height: size,\n borderRadius: radius,\n overflow: 'hidden',\n backgroundColor: fallbackBg,\n alignItems: 'center',\n justifyContent: 'center',\n },\n style,\n ]}\n >\n {uri ? (\n <Image\n source={{ uri }}\n style={[{ width: size, height: size }, imageStyle]}\n resizeMode=\"cover\"\n />\n ) : (\n <Text variant=\"caption\" style={{ color: theme.colors.onNeutral }}>\n {initialsFrom(name)}\n </Text>\n )}\n </View>\n );\n}\n\n\n","export function formatTimeAgo(iso: string): string {\n const then = new Date(iso).getTime();\n const now = Date.now();\n const seconds = Math.max(1, Math.floor((now - then) / 1000));\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n if (years > 0) return `${years}y ago`;\n if (months > 0) return `${months}mo ago`;\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return `${seconds}s ago`;\n}\n\n\n","import * as React from 'react';\n\nimport { appCommentsRepository } from '../../data/comments/repository';\nimport type { AppComment } from '../../data/comments/types';\n\nexport type UseAppCommentsResult = {\n comments: AppComment[];\n loading: boolean;\n sending: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (text: string) => Promise<void>;\n};\n\nexport function useAppComments(appId: string | null): UseAppCommentsResult {\n const [comments, setComments] = React.useState<AppComment[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [sending, setSending] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const sortByCreatedAtAsc = React.useCallback((items: AppComment[]) => {\n return [...items].sort((a, b) => {\n const at = a.createdAt ? new Date(a.createdAt).getTime() : 0;\n const bt = b.createdAt ? new Date(b.createdAt).getTime() : 0;\n return at - bt;\n });\n }, []);\n\n const refresh = React.useCallback(async () => {\n if (!appId) {\n setComments([]);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const res = await appCommentsRepository.list(appId, { page: 1, pageSize: 50, includeDeleted: false });\n setComments(sortByCreatedAtAsc(res.items));\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n setComments([]);\n } finally {\n setLoading(false);\n }\n }, [appId, sortByCreatedAtAsc]);\n\n React.useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const create = React.useCallback(\n async (text: string) => {\n if (!appId) return;\n const trimmed = text.trim();\n if (!trimmed) return;\n setSending(true);\n setError(null);\n try {\n const newComment = await appCommentsRepository.create(appId, { body: trimmed, commentType: 'general' });\n setComments((prev) => sortByCreatedAtAsc([...prev, newComment]));\n } catch (e) {\n setError(e instanceof Error ? e : new Error(String(e)));\n throw e;\n } finally {\n setSending(false);\n }\n },\n [appId, sortByCreatedAtAsc]\n );\n\n return { comments, loading, sending, error, refresh, create };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type {\n AppComment,\n AppCommentList,\n CreateAppCommentInput,\n ListAppCommentsQuery,\n UpdateAppCommentInput,\n} from './types';\n\nexport interface AppCommentsRemoteDataSource {\n list(appId: string, query?: ListAppCommentsQuery): Promise<ServiceResponse<AppCommentList>>;\n getById(appId: string, commentId: string): Promise<ServiceResponse<AppComment>>;\n create(appId: string, payload: CreateAppCommentInput): Promise<ServiceResponse<AppComment>>;\n update(\n appId: string,\n commentId: string,\n payload: UpdateAppCommentInput\n ): Promise<ServiceResponse<AppComment>>;\n remove(appId: string, commentId: string): Promise<ServiceResponse<AppComment>>;\n}\n\nclass AppCommentsRemoteDataSourceImpl extends BaseRemote implements AppCommentsRemoteDataSource {\n async list(appId: string, query?: ListAppCommentsQuery): Promise<ServiceResponse<AppCommentList>> {\n const params = query ? { ...query } : undefined;\n const { data } = await api.get<ServiceResponse<AppCommentList>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments`,\n { params }\n );\n return data;\n }\n\n async getById(appId: string, commentId: string): Promise<ServiceResponse<AppComment>> {\n const { data } = await api.get<ServiceResponse<AppComment>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments/${encodeURIComponent(commentId)}`\n );\n return data;\n }\n\n async create(appId: string, payload: CreateAppCommentInput): Promise<ServiceResponse<AppComment>> {\n const { data } = await api.post<ServiceResponse<AppComment>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments`,\n payload\n );\n return data;\n }\n\n async update(\n appId: string,\n commentId: string,\n payload: UpdateAppCommentInput\n ): Promise<ServiceResponse<AppComment>> {\n const { data } = await api.patch<ServiceResponse<AppComment>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments/${encodeURIComponent(commentId)}`,\n payload\n );\n return data;\n }\n\n async remove(appId: string, commentId: string): Promise<ServiceResponse<AppComment>> {\n const { data } = await api.delete<ServiceResponse<AppComment>>(\n `/v1/apps/${encodeURIComponent(appId)}/comments/${encodeURIComponent(commentId)}`\n );\n return data;\n }\n}\n\nexport const appCommentsRemoteDataSource: AppCommentsRemoteDataSource = new AppCommentsRemoteDataSourceImpl();\n\n\n","import type { AppCommentsRemoteDataSource } from './remote';\nimport { appCommentsRemoteDataSource } from './remote';\nimport type {\n AppComment,\n AppCommentList,\n CreateAppCommentInput,\n ListAppCommentsQuery,\n UpdateAppCommentInput,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface AppCommentsRepository {\n list(appId: string, query?: ListAppCommentsQuery): Promise<AppCommentList>;\n getById(appId: string, commentId: string): Promise<AppComment>;\n create(appId: string, payload: CreateAppCommentInput): Promise<AppComment>;\n update(appId: string, commentId: string, payload: UpdateAppCommentInput): Promise<AppComment>;\n remove(appId: string, commentId: string): Promise<AppComment>;\n}\n\nclass AppCommentsRepositoryImpl extends BaseRepository implements AppCommentsRepository {\n constructor(private readonly remote: AppCommentsRemoteDataSource) {\n super();\n }\n\n async list(appId: string, query?: ListAppCommentsQuery): Promise<AppCommentList> {\n const res = await this.remote.list(appId, query);\n return this.unwrapOrThrow(res);\n }\n\n async getById(appId: string, commentId: string): Promise<AppComment> {\n const res = await this.remote.getById(appId, commentId);\n return this.unwrapOrThrow(res);\n }\n\n async create(appId: string, payload: CreateAppCommentInput): Promise<AppComment> {\n const res = await this.remote.create(appId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async update(appId: string, commentId: string, payload: UpdateAppCommentInput): Promise<AppComment> {\n const res = await this.remote.update(appId, commentId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async remove(appId: string, commentId: string): Promise<AppComment> {\n const res = await this.remote.remove(appId, commentId);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const appCommentsRepository: AppCommentsRepository = new AppCommentsRepositoryImpl(appCommentsRemoteDataSource);\n\n\n","import * as React from 'react';\n\nimport { appsRepository } from '../../data/apps/repository';\nimport type { App } from '../../data/apps/types';\n\nexport function useAppDetails(appId: string | null) {\n const [app, setApp] = React.useState<App | null>(null);\n const [loading, setLoading] = React.useState(false);\n\n React.useEffect(() => {\n if (!appId) {\n setApp(null);\n return;\n }\n let cancelled = false;\n setLoading(true);\n (async () => {\n try {\n const res = await appsRepository.getById(appId);\n if (!cancelled) setApp(res);\n } catch {\n if (!cancelled) setApp(null);\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [appId]);\n\n return { app, loading };\n}\n\n\n","import * as React from 'react';\nimport { Keyboard, Platform } from 'react-native';\nimport type { BottomSheetModal } from '@gorhom/bottom-sheet';\n\nexport function useIosKeyboardSnapFix(sheetRef: React.RefObject<BottomSheetModal | null>) {\n const [keyboardVisible, setKeyboardVisible] = React.useState(false);\n\n React.useEffect(() => {\n if (Platform.OS !== 'ios') return;\n const show = Keyboard.addListener('keyboardWillShow', () => setKeyboardVisible(true));\n const hide = Keyboard.addListener('keyboardWillHide', () => {\n setKeyboardVisible(false);\n setTimeout(() => sheetRef.current?.snapToIndex?.(1), 10);\n });\n return () => {\n show.remove();\n hide.remove();\n };\n }, [sheetRef]);\n\n return { keyboardVisible };\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, View } from 'react-native';\n\nimport type { App } from '../../data/apps/types';\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport { PreviewPage } from '../../components/preview/PreviewPage';\nimport { Text } from '../../components/primitives/Text';\nimport { PreviewPanelHeader } from './preview-panel/PreviewPanelHeader';\nimport { PreviewHeroSection } from './preview-panel/PreviewHeroSection';\nimport { PreviewMetaSection } from './preview-panel/PreviewMetaSection';\nimport { PreviewCustomizeSection } from './preview-panel/PreviewCustomizeSection';\nimport { PreviewCollaborateSection } from './preview-panel/PreviewCollaborateSection';\nimport { usePreviewPanelData } from './preview-panel/usePreviewPanelData';\n\nexport type PreviewPanelProps = {\n app: App | null;\n loading?: boolean;\n isOwner: boolean;\n shouldForkOnEdit: boolean;\n incomingMergeRequests: MergeRequest[];\n outgoingMergeRequests: MergeRequest[];\n creatorStatsById: Record<string, import('../../data/users/types').UserStats>;\n processingMrId?: string | null;\n isBuildingMrTest?: boolean;\n testingMrId?: string | null;\n toMergeRequestSummary: (mr: MergeRequest) => import('../../components/models/types').MergeRequestSummary;\n onClose: () => void;\n onNavigateHome?: () => void;\n onGoToChat: () => void;\n onStartDraw?: () => void;\n onSubmitMergeRequest?: () => void | Promise<void>;\n onRequestApprove?: (mr: MergeRequest) => void;\n onReject?: (mr: MergeRequest) => void | Promise<void>;\n onTestMr?: (mr: MergeRequest) => void | Promise<void>;\n onOpenComments?: () => void;\n commentCountOverride?: number;\n};\n\nexport function PreviewPanel({\n app,\n loading,\n isOwner,\n shouldForkOnEdit,\n incomingMergeRequests,\n outgoingMergeRequests,\n creatorStatsById,\n processingMrId,\n isBuildingMrTest,\n testingMrId,\n toMergeRequestSummary,\n onClose,\n onNavigateHome,\n onGoToChat,\n onStartDraw,\n onSubmitMergeRequest,\n onRequestApprove,\n onReject,\n onTestMr,\n onOpenComments,\n commentCountOverride,\n}: PreviewPanelProps) {\n const { imageUrl, imageLoaded, setImageLoaded, creator, insights, stats, showProcessing, canSubmitMergeRequest } = usePreviewPanelData({\n app,\n isOwner,\n outgoingMergeRequests,\n onOpenComments,\n commentCountOverride,\n });\n\n const header = <PreviewPanelHeader isOwner={isOwner} onClose={onClose} onNavigateHome={onNavigateHome} onGoToChat={onGoToChat} />;\n\n if (loading || !app) {\n return (\n <PreviewPage header={header}>\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 }}>\n <ActivityIndicator />\n <View style={{ height: 12 }} />\n <Text variant=\"bodyMuted\">Loading app…</Text>\n </View>\n </PreviewPage>\n );\n }\n\n return (\n <PreviewPage header={header}>\n <PreviewHeroSection\n appStatus={app.status}\n showProcessing={showProcessing}\n imageUrl={imageUrl}\n imageLoaded={imageLoaded}\n onImageLoad={() => setImageLoaded(true)}\n stats={{\n likeCount: stats.likeCount,\n commentCount: stats.commentCount,\n forkCount: stats.forkCount,\n isLiked: stats.isLiked,\n handleLike: stats.handleLike,\n handleOpenComments: stats.handleOpenComments,\n }}\n />\n\n <PreviewMetaSection app={app} isOwner={isOwner} creator={creator} downloadsCount={insights.downloads} />\n\n <PreviewCustomizeSection\n app={app}\n isOwner={isOwner}\n shouldForkOnEdit={shouldForkOnEdit}\n showProcessing={showProcessing}\n onGoToChat={onGoToChat}\n onStartDraw={onStartDraw}\n />\n\n <PreviewCollaborateSection\n canSubmitMergeRequest={canSubmitMergeRequest}\n incomingMergeRequests={incomingMergeRequests}\n outgoingMergeRequests={outgoingMergeRequests}\n creatorStatsById={creatorStatsById}\n processingMrId={processingMrId}\n isBuildingMrTest={isBuildingMrTest}\n testingMrId={testingMrId}\n toMergeRequestSummary={toMergeRequestSummary}\n onSubmitMergeRequest={onSubmitMergeRequest}\n onRequestApprove={onRequestApprove}\n onReject={onReject}\n onTestMr={onTestMr}\n />\n </PreviewPage>\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\nimport { BottomSheetScrollView } from '@gorhom/bottom-sheet';\n\nimport { useTheme } from '../../theme';\n\nexport type PreviewPageProps = {\n header?: React.ReactNode;\n children: React.ReactNode;\n contentStyle?: ViewStyle;\n};\n\nexport function PreviewPage({ header, children, contentStyle }: PreviewPageProps) {\n const theme = useTheme();\n\n return (\n <View style={{ flex: 1 }}>\n {header ? <View>{header}</View> : null}\n <BottomSheetScrollView\n style={{ flex: 1 }}\n contentContainerStyle={[\n {\n paddingHorizontal: theme.spacing.lg,\n paddingBottom: theme.spacing.xl,\n flexGrow: 1,\n },\n contentStyle,\n ]}\n >\n {children}\n </BottomSheetScrollView>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\n\nimport { StudioSheetHeader } from '../../../components/studio-sheet/StudioSheetHeader';\nimport { StudioSheetHeaderIconButton } from '../../../components/studio-sheet/StudioSheetHeaderIconButton';\nimport { IconChat, IconClose, IconHome } from '../../../components/icons/StudioIcons';\n\nexport type PreviewPanelHeaderProps = {\n isOwner: boolean;\n onClose: () => void;\n onNavigateHome?: () => void;\n onGoToChat: () => void;\n};\n\nexport function PreviewPanelHeader({ isOwner, onClose, onNavigateHome, onGoToChat }: PreviewPanelHeaderProps) {\n return (\n <StudioSheetHeader\n left={\n onNavigateHome ? (\n <StudioSheetHeaderIconButton onPress={onNavigateHome} accessibilityLabel=\"Home\" appearance=\"glass\" intent=\"primary\">\n <IconHome size={20} colorToken=\"onPrimary\" />\n </StudioSheetHeaderIconButton>\n ) : null\n }\n center={null}\n right={\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {isOwner ? (\n <StudioSheetHeaderIconButton\n onPress={onGoToChat}\n accessibilityLabel=\"Chat\"\n intent=\"primary\"\n appearance=\"glass\"\n style={{ marginRight: 8 }}\n >\n <IconChat size={20} colorToken=\"onPrimary\" />\n </StudioSheetHeaderIconButton>\n ) : null}\n <StudioSheetHeaderIconButton onPress={onClose} accessibilityLabel=\"Close\" appearance=\"glass\" intent=\"primary\">\n <IconClose size={20} colorToken=\"onPrimary\" />\n </StudioSheetHeaderIconButton>\n </View>\n }\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\n\nexport type StudioSheetHeaderProps = {\n left?: React.ReactNode;\n right?: React.ReactNode;\n center?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function StudioSheetHeader({ left, center, right, style }: StudioSheetHeaderProps) {\n const theme = useTheme();\n return (\n <View\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: theme.spacing.lg,\n paddingBottom: theme.spacing.sm,\n },\n style,\n ]}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>{left}</View>\n <View style={{ flex: 1, alignItems: 'center' }}>{center}</View>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>{right}</View>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\n\nimport { useTheme } from '../../theme';\n\nexport type StudioSheetHeaderIconButtonProps = {\n onPress: () => void;\n disabled?: boolean;\n children: React.ReactNode;\n style?: ViewStyle;\n accessibilityLabel?: string;\n intent?: 'neutral' | 'primary' | 'danger';\n appearance?: 'glass' | 'solid';\n};\n\nexport function StudioSheetHeaderIconButton({\n onPress,\n disabled,\n children,\n style,\n accessibilityLabel,\n intent = 'neutral',\n appearance = 'solid',\n}: StudioSheetHeaderIconButtonProps) {\n const theme = useTheme();\n const size = 44;\n const [pressed, setPressed] = React.useState(false);\n\n const solidBg =\n intent === 'danger'\n ? theme.colors.danger\n : intent === 'primary'\n ? theme.colors.primary\n : theme.colors.neutral;\n\n const glassFallbackBg = theme.scheme === 'dark' ? '#18181B' : '#F6F6F6';\n const glassInnerBg = intent === 'danger' ? theme.colors.danger : theme.colors.primary;\n\n const resolvedOpacity = disabled ? 0.6 : pressed ? 0.9 : 1;\n\n return (\n <View style={style}>\n {appearance === 'glass' ? (\n <LiquidGlassView\n style={[{ borderRadius: 100 }, !isLiquidGlassSupported && { backgroundColor: glassFallbackBg }]}\n interactive\n effect=\"clear\"\n >\n <View\n style={{\n width: size,\n height: size,\n borderRadius: 100,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: glassInnerBg,\n opacity: resolvedOpacity,\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={disabled}\n onPress={onPress}\n onPressIn={() => {\n if (!disabled) setPressed(true);\n }}\n onPressOut={() => setPressed(false)}\n hitSlop={8}\n style={{ flex: 1, alignItems: 'center', justifyContent: 'center', width: '100%' }}\n >\n {children}\n </Pressable>\n </View>\n </LiquidGlassView>\n ) : (\n <View\n style={{\n width: size,\n height: size,\n borderRadius: 100,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: solidBg,\n opacity: resolvedOpacity,\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={disabled}\n onPress={onPress}\n onPressIn={() => {\n if (!disabled) setPressed(true);\n }}\n onPressOut={() => setPressed(false)}\n hitSlop={8}\n style={{ flex: 1, alignItems: 'center', justifyContent: 'center', width: '100%' }}\n >\n {children}\n </Pressable>\n </View>\n )}\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Card } from '../primitives/Card';\n\nexport type PreviewHeroCardProps = {\n aspectRatio?: number;\n overlayTopLeft?: React.ReactNode;\n background?: React.ReactNode;\n image?: React.ReactNode;\n overlayBottom?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function PreviewHeroCard({\n aspectRatio = 4 / 3,\n overlayTopLeft,\n background,\n image,\n overlayBottom,\n style,\n}: PreviewHeroCardProps) {\n const theme = useTheme();\n const radius = 16;\n\n return (\n <Card\n variant=\"surfaceRaised\"\n padded={false}\n border={false}\n style={[\n {\n width: '100%',\n aspectRatio,\n borderRadius: radius,\n overflow: 'hidden',\n },\n style,\n ]}\n >\n <View style={{ flex: 1 }}>\n {background ? <View style={{ position: 'absolute', inset: 0 }}>{background}</View> : null}\n {image ? <View style={{ position: 'absolute', inset: 0 }}>{image}</View> : null}\n\n {overlayTopLeft ? (\n <View style={{ position: 'absolute', top: theme.spacing.sm, left: theme.spacing.sm, zIndex: 2 }}>\n {overlayTopLeft}\n </View>\n ) : null}\n\n {overlayBottom ? <View style={{ flex: 1, justifyContent: 'flex-end' }}>{overlayBottom}</View> : null}\n </View>\n </Card>\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewProps, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport type { SurfaceVariant, WithStyle } from './types';\n\nexport type SurfaceProps = ViewProps &\n WithStyle<ViewStyle> & {\n variant?: SurfaceVariant;\n border?: boolean;\n };\n\nfunction backgroundFor(variant: SurfaceVariant, theme: ReturnType<typeof useTheme>): string {\n const { colors } = theme;\n switch (variant) {\n case 'background':\n return colors.background;\n case 'surfaceRaised':\n return colors.surfaceRaised;\n case 'floating':\n return colors.floatingSurface;\n case 'surface':\n default:\n return colors.surface;\n }\n}\n\nexport function Surface({ variant = 'surface', border = false, style, ...props }: SurfaceProps) {\n const theme = useTheme();\n return (\n <View\n {...props}\n style={[\n { backgroundColor: backgroundFor(variant, theme) },\n border ? { borderWidth: 1, borderColor: theme.colors.border } : null,\n style,\n ]}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { type ViewProps, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Surface } from './Surface';\nimport type { CardVariant, WithStyle } from './types';\n\nexport type CardProps = ViewProps &\n WithStyle<ViewStyle> & {\n variant?: CardVariant;\n padded?: boolean;\n border?: boolean;\n };\n\nexport function Card({ variant = 'surface', padded = true, border = true, style, ...props }: CardProps) {\n const theme = useTheme();\n const radius = theme.radii.lg;\n const padding = padded ? theme.spacing.lg : 0;\n\n return (\n <Surface\n {...props}\n variant={variant === 'surfaceRaised' ? 'surfaceRaised' : 'surface'}\n border={border}\n style={[{ borderRadius: radius, padding }, style]}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { Animated, type ViewStyle } from 'react-native';\nimport { LinearGradient } from 'expo-linear-gradient';\n\nexport type PreviewPlaceholderProps = {\n visible: boolean;\n style?: ViewStyle;\n};\n\nexport function PreviewPlaceholder({ visible, style }: PreviewPlaceholderProps) {\n if (!visible) return null;\n\n const opacityAnim = React.useRef(new Animated.Value(0)).current;\n\n React.useEffect(() => {\n if (!visible) return;\n const animation = Animated.loop(\n Animated.sequence([\n Animated.timing(opacityAnim, { toValue: 1, duration: 1500, useNativeDriver: true }),\n Animated.timing(opacityAnim, { toValue: 2, duration: 1500, useNativeDriver: true }),\n Animated.timing(opacityAnim, { toValue: 3, duration: 1500, useNativeDriver: true }),\n Animated.timing(opacityAnim, { toValue: 0, duration: 1500, useNativeDriver: true }),\n ])\n );\n animation.start();\n return () => animation.stop();\n }, [opacityAnim, visible]);\n\n const opacity1 = opacityAnim.interpolate({ inputRange: [0, 1, 2, 3], outputRange: [1, 0, 0, 0.3] });\n const opacity2 = opacityAnim.interpolate({ inputRange: [0, 1, 2, 3], outputRange: [0, 1, 0, 0] });\n const opacity3 = opacityAnim.interpolate({ inputRange: [0, 1, 2, 3], outputRange: [0, 0, 1, 0] });\n const opacity4 = opacityAnim.interpolate({ inputRange: [0, 1, 2, 3], outputRange: [0, 0, 0, 1] });\n\n return (\n <>\n <Animated.View style={[{ position: 'absolute', inset: 0, opacity: opacity1 }, style]}>\n <LinearGradient\n colors={['rgba(98, 0, 238, 0.45)', 'rgba(168, 85, 247, 0.35)']}\n start={{ x: 0, y: 0 }}\n end={{ x: 1, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </Animated.View>\n <Animated.View style={[{ position: 'absolute', inset: 0, opacity: opacity2 }, style]}>\n <LinearGradient\n colors={['rgba(168, 85, 247, 0.45)', 'rgba(139, 92, 246, 0.35)']}\n start={{ x: 1, y: 0 }}\n end={{ x: 0, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </Animated.View>\n <Animated.View style={[{ position: 'absolute', inset: 0, opacity: opacity3 }, style]}>\n <LinearGradient\n colors={['rgba(139, 92, 246, 0.45)', 'rgba(126, 34, 206, 0.35)']}\n start={{ x: 0, y: 1 }}\n end={{ x: 1, y: 0 }}\n style={{ width: '100%', height: '100%' }}\n />\n </Animated.View>\n <Animated.View style={[{ position: 'absolute', inset: 0, opacity: opacity4 }, style]}>\n <LinearGradient\n colors={['rgba(126, 34, 206, 0.45)', 'rgba(98, 0, 238, 0.35)']}\n start={{ x: 0.5, y: 0 }}\n end={{ x: 0.5, y: 1 }}\n style={{ width: '100%', height: '100%' }}\n />\n </Animated.View>\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { Image, type ImageStyle } from 'react-native';\n\nexport type PreviewImageProps = {\n uri?: string | null;\n onLoad?: () => void;\n style?: ImageStyle;\n};\n\nexport function PreviewImage({ uri, onLoad, style }: PreviewImageProps) {\n if (!uri) return null;\n return (\n <Image\n source={{ uri }}\n resizeMode=\"cover\"\n onLoad={onLoad}\n style={[{ width: '100%', height: '100%' }, style]}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\nimport { LiquidGlassView, isLiquidGlassSupported } from '@callstack/liquid-glass';\nimport { Heart, MessageCircle } from 'lucide-react-native';\n\nimport { useTheme } from '../../theme';\nimport { Text } from '../primitives/Text';\nimport { MergeIcon } from '../icons/MergeIcon';\n\nexport type StatsBarProps = {\n likeCount: number;\n commentCount: number;\n forkCount: number;\n isLiked?: boolean;\n onPressLike?: () => void;\n onPressComments?: () => void;\n style?: ViewStyle;\n centered?: boolean;\n fixedWidth?: number;\n};\n\nexport function StatsBar({\n likeCount,\n commentCount,\n forkCount,\n isLiked = false,\n onPressLike,\n onPressComments,\n style,\n centered = false,\n fixedWidth,\n}: StatsBarProps) {\n const theme = useTheme();\n const statsBgColor = theme.scheme === 'dark' ? 'rgba(24, 24, 27, 0.5)' : 'rgba(255, 255, 255, 0.5)';\n\n return (\n <View\n style={[\n { position: 'absolute', bottom: 12, width: '100%', paddingHorizontal: 12 },\n centered && { alignItems: 'center' },\n style,\n ]}\n >\n <LiquidGlassView\n style={[\n { borderRadius: 100, overflow: 'hidden' },\n fixedWidth ? { width: fixedWidth } : undefined,\n !isLiquidGlassSupported && { backgroundColor: statsBgColor },\n ]}\n effect=\"clear\"\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingHorizontal: 16 }}>\n <Pressable\n disabled={!onPressLike}\n onPress={onPressLike}\n hitSlop={8}\n style={{ paddingVertical: 8 }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <Heart\n size={16}\n strokeWidth={2.5}\n color={isLiked ? theme.colors.danger : '#FFFFFF'}\n fill={isLiked ? theme.colors.danger : 'transparent'}\n />\n <View style={{ width: 4 }} />\n <Text\n variant=\"caption\"\n style={{\n color: isLiked ? theme.colors.danger : '#FFFFFF',\n fontWeight: theme.typography.fontWeight.bold,\n }}\n >\n {likeCount}\n </Text>\n </View>\n </Pressable>\n\n <Pressable\n disabled={!onPressComments}\n onPress={onPressComments}\n hitSlop={8}\n style={{ paddingVertical: 8 }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <MessageCircle size={16} strokeWidth={2.5} color=\"#FFFFFF\" />\n <View style={{ width: 4 }} />\n <Text variant=\"caption\" style={{ color: '#FFFFFF', fontWeight: theme.typography.fontWeight.bold }}>\n {commentCount}\n </Text>\n </View>\n </Pressable>\n\n <View style={{ flexDirection: 'row', alignItems: 'center', paddingVertical: 8 }}>\n <View style={{ transform: [{ scaleY: -1 }] }}>\n <MergeIcon width={14} height={14} color=\"#FFFFFF\" />\n </View>\n <View style={{ width: 4 }} />\n <Text variant=\"caption\" style={{ color: '#FFFFFF', fontWeight: theme.typography.fontWeight.bold }}>\n {forkCount}\n </Text>\n </View>\n </View>\n </LiquidGlassView>\n </View>\n );\n}\n\n\n","import Svg, { Path, type SvgProps } from 'react-native-svg';\n\nexport function MergeIcon({ color = 'currentColor', width = 24, height = 24, ...props }: SvgProps) {\n return (\n <Svg viewBox=\"0 0 486 486\" width={width} height={height} {...props}>\n <Path\n d=\"M237.025 0H243.664C254.876 95.0361 275.236 175.597 304.743 241.684C334.249 307.478 367.002 357.774 403 392.572L389.722 486C361.691 458.22 338.233 429.417 319.349 399.59C300.464 369.764 284.531 335.843 271.548 297.829C258.565 259.522 246.615 214.343 235.697 162.292L237.91 161.415C228.468 214.928 217.993 261.569 206.485 301.338C194.978 341.107 179.634 375.904 160.455 405.731C141.571 435.265 115.752 462.022 83 486L96.278 392.572C124.014 369.179 147.62 336.72 167.094 295.197C186.864 253.381 202.65 206.886 214.452 155.713C226.255 104.247 233.779 52.343 237.025 0Z\"\n fill={color}\n />\n </Svg>\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\nimport {\n AlertTriangle,\n Archive,\n CheckCircle2,\n GitFork,\n GitMerge,\n Pencil,\n Sparkles,\n type LucideIcon,\n} from 'lucide-react-native';\n\nimport type { AppStatus } from '../../data/apps/types';\nimport { APP_STATUS_LABEL } from '../../data/apps/types';\nimport { Text } from '../primitives/Text';\n\nconst STATUS_BG: Record<AppStatus, string> = {\n ready: '#10B981', // emerald-500\n creating: '#3B82F6', // blue-500\n editing: '#F59E0B', // amber-500\n forking: '#8B5CF6', // violet-500\n merging: '#06B6D4', // cyan-500\n error: '#F43F5E', // rose-500\n archived: '#71717A', // zinc-500\n};\n\nconst STATUS_ICON: Record<AppStatus, LucideIcon> = {\n ready: CheckCircle2,\n creating: Sparkles,\n editing: Pencil,\n forking: GitFork,\n merging: GitMerge,\n error: AlertTriangle,\n archived: Archive,\n};\n\nexport type PreviewStatusBadgeProps = {\n status: AppStatus;\n};\n\nexport function PreviewStatusBadge({ status }: PreviewStatusBadgeProps) {\n const IconComp = STATUS_ICON[status];\n const label = APP_STATUS_LABEL[status] ?? status;\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 999,\n paddingHorizontal: 10,\n paddingVertical: 4,\n backgroundColor: STATUS_BG[status],\n }}\n >\n <IconComp size={12} color=\"#FFFFFF\" style={{ marginRight: 4 }} />\n <Text style={{ color: '#FFFFFF', fontSize: 11, lineHeight: 14 }}>{label}</Text>\n </View>\n );\n}\n\n\n","export type AppInsightsSummary = {\n totalDownloads: number;\n totalDownloadUsers: number;\n totalLikes: number;\n totalComments: number;\n totalRatings: number;\n averageRating: number | null;\n totalMergeRequests: number;\n totalForks: number;\n};\n\nexport type DownloadUserSummary = {\n userId: string;\n totalDownloads: number;\n lastDownloadAt: string | null;\n};\n\nexport type ForkEntry = {\n appId: string;\n userId: string;\n createdAt: string;\n};\n\nexport type MergeRequestEntry = {\n id: string;\n sourceAppId: string;\n createdBy: string;\n status: string;\n createdAt: string;\n};\n\nexport type LikeEntry = {\n userId: string;\n createdAt: string;\n};\n\nexport type CommentEntry = {\n id: string;\n userId: string;\n commentType: string;\n createdAt: string;\n};\n\nexport type RatingEntry = {\n userId: string;\n rating: number;\n createdAt: string;\n};\n\nexport type AppInsights = {\n downloads: {\n total: number;\n uniqueUsers: number;\n perUser: DownloadUserSummary[];\n };\n forks: {\n total: number;\n entries: ForkEntry[];\n };\n mergeRequests: {\n total: number;\n approved: number;\n merged: number;\n entries: MergeRequestEntry[];\n };\n likes: {\n total: number;\n entries: LikeEntry[];\n };\n comments: {\n total: number;\n entries: CommentEntry[];\n };\n ratings: {\n total: number;\n average: number | null;\n entries: RatingEntry[];\n };\n};\n\nexport const APP_METRIC_TYPES = [\n 'downloads',\n 'likes',\n 'comments',\n 'forks',\n 'mergeRequests',\n 'mergeRequestApprovals',\n] as const;\n\nexport type AppMetricType = (typeof APP_METRIC_TYPES)[number];\n\nexport const APP_ANALYTIC_INTERVALS = ['day', 'hour'] as const;\n\nexport type AppAnalyticsInterval = (typeof APP_ANALYTIC_INTERVALS)[number];\n\nexport type AppAnalyticsParams = {\n type: AppMetricType;\n startDate: string;\n endDate: string;\n interval?: AppAnalyticsInterval;\n};\n\nexport type AppAnalyticsPoint = {\n date: string;\n value: number;\n};\n\nexport type App = {\n id: string;\n name: string;\n description: string | null;\n appleAppStoreCategory: string | null;\n googlePlayCategory: string | null;\n pgRating: string | null;\n projectId: string;\n platform: string | null;\n isPublic: boolean;\n isLiked?: boolean;\n createdBy: string;\n status: 'ready' | 'creating' | 'editing' | 'forking' | 'merging' | 'error' | 'archived';\n statusError: string | null;\n statusChangedAt: string | null;\n headCommitId: string | null;\n forkedFromCommitId: string | null;\n forkedFromAppId: string | null;\n threadId: string | null;\n createdAt: string;\n updatedAt: string;\n insights?: AppInsightsSummary | null;\n};\n\nexport type AppStatus = App['status'];\n\nexport type ForkAppRequest = {\n name?: string;\n platform?: string;\n forkedFromCommitId?: string;\n};\n\nexport type ImportGithubAppRequest = {\n repoFullName: string;\n branch?: string;\n path?: string;\n appName?: string;\n threadId?: string;\n};\n\nexport type ImportGithubAppResponse = {\n appId: string;\n projectId: string;\n threadId: string;\n};\n\nexport type ListPublicAppsParams = {\n limit?: number;\n offset?: number;\n q?: string;\n};\n\nexport type ListAppsSummaryParams = ListPublicAppsParams & {\n projectId?: string;\n};\n\nexport type AppsSummary = {\n mine: App[];\n public: App[];\n pagination: {\n limit: number;\n offset: number;\n q: string | null;\n };\n};\n\nexport type ListLikedAppsParams = {\n limit?: number;\n offset?: number;\n};\n\nexport type LikedAppListItem = {\n likeId: string;\n appId: string;\n likedAt: string;\n app: App;\n};\n\nexport type LikedAppsList = {\n items: LikedAppListItem[];\n pageInfo: {\n limit: number;\n offset: number;\n total: number;\n hasMore: boolean;\n };\n};\n\nexport const APP_STATUS_LABEL: Record<AppStatus, string> = {\n ready: 'Ready',\n creating: 'Creating',\n editing: 'Editing',\n forking: 'Forking',\n merging: 'Merging',\n error: 'Error',\n archived: 'Archived',\n};\n\n\n","import * as React from 'react';\n\nimport type { App } from '../../../data/apps/types';\nimport { PreviewHeroCard } from '../../../components/preview/PreviewHeroCard';\nimport { PreviewPlaceholder } from '../../../components/preview/PreviewPlaceholder';\nimport { PreviewImage } from '../../../components/preview/PreviewImage';\nimport { StatsBar } from '../../../components/preview/StatsBar';\nimport { PreviewStatusBadge } from '../../../components/preview/PreviewStatusBadge';\n\nexport type PreviewHeroSectionProps = {\n appStatus: App['status'];\n showProcessing: boolean;\n imageUrl: string | null;\n imageLoaded: boolean;\n onImageLoad: () => void;\n stats: {\n likeCount: number;\n commentCount: number;\n forkCount: number;\n isLiked: boolean;\n handleLike: () => Promise<void> | void;\n handleOpenComments: () => void;\n };\n};\n\nexport function PreviewHeroSection({\n appStatus,\n showProcessing,\n imageUrl,\n imageLoaded,\n onImageLoad,\n stats,\n}: PreviewHeroSectionProps) {\n return (\n <PreviewHeroCard\n overlayTopLeft={showProcessing ? <PreviewStatusBadge status={appStatus} /> : null}\n background={<PreviewPlaceholder visible={!imageLoaded} />}\n image={<PreviewImage uri={imageUrl} onLoad={onImageLoad} />}\n overlayBottom={\n <StatsBar\n likeCount={stats.likeCount}\n commentCount={stats.commentCount}\n forkCount={stats.forkCount}\n isLiked={stats.isLiked}\n onPressLike={() => void stats.handleLike()}\n onPressComments={stats.handleOpenComments}\n centered\n fixedWidth={160}\n />\n }\n style={{ marginBottom: 16 }}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View } from 'react-native';\n\nimport type { App } from '../../../data/apps/types';\nimport { PreviewMetaRow } from '../../../components/preview/PreviewMetaRow';\nimport { Text } from '../../../components/primitives/Text';\nimport { IconPlay } from '../../../components/icons/StudioIcons';\nimport { withAlpha } from '../../../components/utils/color';\nimport { useTheme } from '../../../theme';\nimport { formatCount } from './utils';\n\nexport type PreviewMetaSectionProps = {\n app: App;\n isOwner: boolean;\n creator: { name: string | null; avatar: string | null } | null;\n downloadsCount?: number;\n};\n\nexport function PreviewMetaSection({ app, isOwner, creator, downloadsCount }: PreviewMetaSectionProps) {\n const theme = useTheme();\n\n return (\n <PreviewMetaRow\n title={app.name}\n subtitle={app.description}\n avatarUri={creator?.avatar ?? null}\n creatorName={creator?.name ?? null}\n tag={\n isOwner || app.forkedFromAppId ? (\n <View style={{ paddingHorizontal: 8, paddingVertical: 2, borderRadius: 999, backgroundColor: '#3700B3' }}>\n <Text variant=\"caption\" style={{ color: '#fff', fontWeight: theme.typography.fontWeight.semibold }}>\n {app.forkedFromAppId ? 'Remix' : 'Owner'}\n </Text>\n </View>\n ) : null\n }\n rightMetric={\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 6,\n paddingVertical: 2,\n borderRadius: 6,\n backgroundColor: withAlpha(theme.colors.neutral, 0.3),\n }}\n >\n <Text\n style={{\n marginRight: 2,\n color: theme.colors.textMuted,\n fontSize: 14,\n lineHeight: 18,\n fontWeight: theme.typography.fontWeight.bold,\n }}\n >\n {formatCount(downloadsCount ?? app.insights?.totalDownloads ?? 0)}\n </Text>\n <IconPlay size={14} colorToken=\"textMuted\" fill={theme.colors.textMuted} />\n </View>\n }\n style={{ marginBottom: 16 }}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Avatar } from '../primitives/Avatar';\nimport { Text } from '../primitives/Text';\n\nexport type PreviewMetaRowProps = {\n avatarUri?: string | null;\n creatorName?: string | null;\n title: string;\n subtitle?: string | null;\n tag?: React.ReactNode;\n rightMetric?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function PreviewMetaRow({\n avatarUri,\n creatorName,\n title,\n subtitle,\n tag,\n rightMetric,\n style,\n}: PreviewMetaRowProps) {\n const theme = useTheme();\n\n return (\n <View style={[{ alignSelf: 'stretch' }, style]}>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <Avatar uri={avatarUri} name={creatorName} size={24} style={{ marginRight: theme.spacing.sm }} />\n\n <View style={{ flexDirection: 'row', alignItems: 'center', flex: 1, minWidth: 0, marginRight: theme.spacing.sm }}>\n <Text\n numberOfLines={1}\n style={{\n flexShrink: 1,\n color: theme.colors.text,\n fontSize: 16,\n lineHeight: 20,\n fontWeight: theme.typography.fontWeight.semibold,\n }}\n >\n {title}\n </Text>\n {tag ? <View style={{ marginLeft: theme.spacing.sm }}>{tag}</View> : null}\n </View>\n\n {rightMetric ? <View>{rightMetric}</View> : null}\n </View>\n\n {subtitle ? (\n <Text\n numberOfLines={2}\n style={{\n marginTop: theme.spacing.sm,\n color: theme.colors.textMuted,\n fontSize: 14,\n lineHeight: 18,\n }}\n >\n {subtitle}\n </Text>\n ) : null}\n </View>\n );\n}\n\n\n","import type { App } from '../../../data/apps/types';\n\nexport function formatCount(n: number): string {\n if (n < 10_000) return n.toLocaleString();\n if (n < 1_000_000) return `${Math.floor(n / 1_000)}k`;\n return `${Math.floor(n / 1_000_000)}m`;\n}\n\nexport function statusDescription(status: App['status'], statusError: string | null): string {\n switch (status) {\n case 'editing':\n return 'Changes are being applied';\n case 'creating':\n return 'Your app is being created';\n case 'forking':\n return 'Creating your copy';\n case 'merging':\n return 'Merging changes from contributor';\n case 'archived':\n return 'This app has been archived';\n case 'error':\n return statusError ?? 'Something went wrong';\n case 'ready':\n default:\n return '';\n }\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, View } from 'react-native';\n\nimport type { App } from '../../../data/apps/types';\nimport { Text } from '../../../components/primitives/Text';\nimport { IconChat, IconChevronRight, IconDraw } from '../../../components/icons/StudioIcons';\nimport { withAlpha } from '../../../components/utils/color';\nimport { useTheme } from '../../../theme';\nimport { PressableCardRow } from './PressableCardRow';\nimport { SectionTitle } from './SectionTitle';\nimport { statusDescription } from './utils';\n\nexport type PreviewCustomizeSectionProps = {\n app: App;\n isOwner: boolean;\n shouldForkOnEdit: boolean;\n showProcessing: boolean;\n onGoToChat: () => void;\n onStartDraw?: () => void;\n};\n\nexport function PreviewCustomizeSection({\n app,\n isOwner,\n shouldForkOnEdit,\n showProcessing,\n onGoToChat,\n onStartDraw,\n}: PreviewCustomizeSectionProps) {\n const theme = useTheme();\n\n return (\n <>\n <SectionTitle>Customize</SectionTitle>\n\n {showProcessing ? (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: theme.spacing.lg,\n borderRadius: theme.radii.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha(theme.colors.warning, 0.2),\n marginBottom: theme.spacing.sm,\n }}\n >\n <View\n style={{\n width: 40,\n height: 40,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: withAlpha(theme.colors.warning, 0.1),\n marginRight: theme.spacing.lg,\n }}\n >\n <ActivityIndicator color={theme.colors.warning} size=\"small\" />\n </View>\n <View style={{ flex: 1, minWidth: 0 }}>\n <Text style={{ color: theme.colors.text, fontSize: 16, lineHeight: 20, fontWeight: theme.typography.fontWeight.semibold }}>\n {app.status === 'error' ? 'Error' : 'Processing'}\n </Text>\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginTop: 2 }}>\n {statusDescription(app.status, app.statusError)}\n </Text>\n </View>\n </View>\n ) : null}\n\n <PressableCardRow\n accessibilityLabel={isOwner ? 'Edit app' : 'Remix app'}\n onPress={onGoToChat}\n style={{\n padding: theme.spacing.lg,\n borderRadius: theme.radii.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha(theme.colors.primary, 0.1),\n marginBottom: theme.spacing.sm,\n }}\n left={\n <View\n style={{\n width: 40,\n height: 40,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: withAlpha(theme.colors.primary, 0.1),\n marginRight: theme.spacing.lg,\n }}\n >\n <IconChat size={20} colorToken=\"primary\" />\n </View>\n }\n title={\n <Text style={{ color: theme.colors.text, fontSize: 16, lineHeight: 20, fontWeight: theme.typography.fontWeight.semibold }}>\n {isOwner ? (app.forkedFromAppId ? 'Edit your Remix' : 'Edit Your App') : 'Remix App'}\n </Text>\n }\n subtitle={\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginTop: 2 }}>\n {isOwner && app.forkedFromAppId\n ? 'Make changes to your remix with chat'\n : shouldForkOnEdit\n ? 'Chat to create your own copy and edit it'\n : 'Chat to apply changes'}\n </Text>\n }\n right={<IconChevronRight size={20} colorToken=\"textMuted\" />}\n />\n\n {isOwner && onStartDraw ? (\n <PressableCardRow\n accessibilityLabel=\"Draw changes\"\n onPress={onStartDraw}\n style={{\n padding: theme.spacing.lg,\n borderRadius: theme.radii.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha(theme.colors.danger, 0.1),\n marginBottom: theme.spacing.sm,\n }}\n left={\n <View\n style={{\n width: 40,\n height: 40,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: withAlpha(theme.colors.danger, 0.1),\n marginRight: theme.spacing.lg,\n }}\n >\n <IconDraw size={20} colorToken=\"danger\" />\n </View>\n }\n title={\n <Text style={{ color: theme.colors.text, fontSize: 16, lineHeight: 20, fontWeight: theme.typography.fontWeight.semibold }}>\n Draw Changes\n </Text>\n }\n subtitle={\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginTop: 2 }}>\n Annotate the app with drawings\n </Text>\n }\n right={<IconChevronRight size={20} colorToken=\"textMuted\" />}\n />\n ) : null}\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\n\nimport { Card } from '../../../components/primitives/Card';\n\nexport type PressableCardRowProps = {\n accessibilityLabel: string;\n onPress: () => void;\n disabled?: boolean;\n left: React.ReactNode;\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n right?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function PressableCardRow({\n accessibilityLabel,\n onPress,\n disabled,\n left,\n title,\n subtitle,\n right,\n style,\n}: PressableCardRowProps) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={disabled}\n onPress={onPress}\n style={({ pressed }) => ({ opacity: disabled ? 0.6 : pressed ? 0.85 : 1 })}\n >\n <Card padded={false} border={false} style={style}>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {left}\n <View style={{ flex: 1, minWidth: 0 }}>\n {title}\n {subtitle ? subtitle : null}\n </View>\n {right ? <View style={{ marginLeft: 16 }}>{right}</View> : null}\n </View>\n </Card>\n </Pressable>\n );\n}\n\n\n","import * as React from 'react';\n\nimport { Text } from '../../../components/primitives/Text';\nimport { useTheme } from '../../../theme';\n\nexport type SectionTitleProps = {\n children: string;\n marginTop?: number;\n};\n\nexport function SectionTitle({ children, marginTop }: SectionTitleProps) {\n const theme = useTheme();\n return (\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: 12,\n lineHeight: 16,\n textTransform: 'uppercase',\n letterSpacing: 0.8,\n marginTop: marginTop ?? theme.spacing.sm,\n marginBottom: theme.spacing.sm,\n fontWeight: theme.typography.fontWeight.bold,\n }}\n >\n {children}\n </Text>\n );\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, Alert, View } from 'react-native';\nimport { Send } from 'lucide-react-native';\n\nimport type { MergeRequest } from '../../../data/merge-requests/types';\nimport type { UserStats } from '../../../data/users/types';\nimport { MergeRequestStatusCard } from '../../../components/merge-requests/MergeRequestStatusCard';\nimport { ReviewMergeRequestCarousel } from '../../../components/merge-requests/ReviewMergeRequestCarousel';\nimport { Text } from '../../../components/primitives/Text';\nimport { withAlpha } from '../../../components/utils/color';\nimport { useTheme } from '../../../theme';\nimport { PressableCardRow } from './PressableCardRow';\nimport { SectionTitle } from './SectionTitle';\n\nimport { MergeIcon } from '../../../components/icons/MergeIcon';\n\nexport type PreviewCollaborateSectionProps = {\n canSubmitMergeRequest: boolean;\n incomingMergeRequests: MergeRequest[];\n outgoingMergeRequests: MergeRequest[];\n creatorStatsById: Record<string, UserStats>;\n processingMrId?: string | null;\n isBuildingMrTest?: boolean;\n testingMrId?: string | null;\n toMergeRequestSummary: (mr: MergeRequest) => import('../../../components/models/types').MergeRequestSummary;\n onSubmitMergeRequest?: () => void | Promise<void>;\n onRequestApprove?: (mr: MergeRequest) => void;\n onReject?: (mr: MergeRequest) => void | Promise<void>;\n onTestMr?: (mr: MergeRequest) => void | Promise<void>;\n};\n\nexport function PreviewCollaborateSection({\n canSubmitMergeRequest,\n incomingMergeRequests,\n outgoingMergeRequests,\n creatorStatsById,\n processingMrId,\n isBuildingMrTest,\n testingMrId,\n toMergeRequestSummary,\n onSubmitMergeRequest,\n onRequestApprove,\n onReject,\n onTestMr,\n}: PreviewCollaborateSectionProps) {\n const theme = useTheme();\n const [submittingMr, setSubmittingMr] = React.useState(false);\n\n const hasSection = canSubmitMergeRequest || incomingMergeRequests.length > 0 || outgoingMergeRequests.length > 0;\n if (!hasSection) return null;\n\n const showActionsSubtitle = (canSubmitMergeRequest && onSubmitMergeRequest) || (onTestMr && incomingMergeRequests.length > 0);\n\n return (\n <>\n <SectionTitle marginTop={theme.spacing.xl}>Collaborate</SectionTitle>\n\n {showActionsSubtitle ? (\n <Text\n style={{\n color: withAlpha(theme.colors.textMuted, 0.7),\n fontSize: 10,\n lineHeight: 14,\n textTransform: 'uppercase',\n letterSpacing: 0.8,\n marginBottom: theme.spacing.sm,\n fontWeight: theme.typography.fontWeight.semibold,\n }}\n >\n Actions\n </Text>\n ) : null}\n\n {canSubmitMergeRequest && onSubmitMergeRequest ? (\n <PressableCardRow\n accessibilityLabel=\"Submit merge request\"\n disabled={submittingMr}\n onPress={() => {\n Alert.alert(\n 'Submit Merge Request',\n 'Are you sure you want to submit your changes to the original app?',\n [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Submit',\n style: 'destructive',\n onPress: () => {\n setSubmittingMr(true);\n Promise.resolve(onSubmitMergeRequest())\n .catch(() => {})\n .finally(() => setSubmittingMr(false));\n },\n },\n ]\n );\n }}\n style={{\n padding: theme.spacing.lg,\n borderRadius: theme.radii.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha('#03DAC6', 0.2),\n marginBottom: theme.spacing.sm,\n }}\n left={\n <View\n style={{\n width: 40,\n height: 40,\n borderRadius: 999,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: withAlpha('#03DAC6', 0.1),\n marginRight: theme.spacing.lg,\n }}\n >\n {submittingMr ? <ActivityIndicator color=\"#03DAC6\" size=\"small\" /> : <MergeIcon width={20} height={20} color=\"#03DAC6\" />}\n </View>\n }\n title={\n <Text style={{ color: theme.colors.text, fontSize: 16, lineHeight: 20, fontWeight: theme.typography.fontWeight.semibold }}>\n Submit your new changes\n </Text>\n }\n subtitle={\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginTop: 2 }}>\n Ask to merge this remix to the original app\n </Text>\n }\n right={<Send size={16} color=\"#03DAC6\" />}\n />\n ) : null}\n\n {onTestMr && incomingMergeRequests.length > 0 ? (\n <ReviewMergeRequestCarousel\n mergeRequests={incomingMergeRequests}\n creatorStatsById={creatorStatsById}\n processingMrId={processingMrId}\n isBuilding={Boolean(isBuildingMrTest)}\n testingMrId={testingMrId}\n onReject={(mr) => (onReject ? onReject(mr) : undefined)}\n onApprove={(mr) => onRequestApprove?.(mr)}\n onTest={(mr) => (onTestMr ? onTestMr(mr) : undefined)}\n />\n ) : null}\n\n {outgoingMergeRequests.length > 0 ? (\n <>\n <Text\n style={{\n color: withAlpha(theme.colors.textMuted, 0.7),\n fontSize: 10,\n lineHeight: 14,\n textTransform: 'uppercase',\n letterSpacing: 0.8,\n marginTop: theme.spacing.lg,\n marginBottom: theme.spacing.sm,\n fontWeight: theme.typography.fontWeight.semibold,\n }}\n >\n History\n </Text>\n {outgoingMergeRequests.map((mr) => (\n <View key={mr.id} style={{ marginBottom: theme.spacing.sm }}>\n <MergeRequestStatusCard mergeRequest={toMergeRequestSummary(mr)} />\n </View>\n ))}\n </>\n ) : null}\n </>\n );\n}\n\n\n","import * as React from 'react';\nimport { Animated, Pressable, View, type ViewStyle } from 'react-native';\nimport { Ban, Check, CheckCheck, ChevronDown } from 'lucide-react-native';\n\nimport type { MergeRequestSummary } from '../models/types';\nimport { useTheme } from '../../theme';\nimport { withAlpha } from '../utils/color';\nimport { Card } from '../primitives/Card';\nimport { MarkdownText } from '../primitives/MarkdownText';\nimport { Text } from '../primitives/Text';\nimport { formatTimeAgo } from '../utils/formatTimeAgo';\nimport { getMergeRequestStatusDisplay } from './mergeRequestStatusDisplay';\nimport { toIsoString } from './toIsoString';\nimport { useControlledExpansion } from './useControlledExpansion';\n\nexport type MergeRequestStatusCardProps = {\n mergeRequest: MergeRequestSummary;\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n headerRight?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function MergeRequestStatusCard({\n mergeRequest,\n expanded: expandedProp,\n onExpandedChange,\n headerRight,\n style,\n}: MergeRequestStatusCardProps) {\n const theme = useTheme();\n const { expanded, setExpanded } = useControlledExpansion({ expanded: expandedProp, onExpandedChange });\n const isDark = theme.scheme === 'dark';\n const textColor = isDark ? '#FFFFFF' : '#000000';\n const subTextColor = isDark ? '#A1A1AA' : '#71717A';\n const status = React.useMemo(() => getMergeRequestStatusDisplay(String(mergeRequest.status)), [mergeRequest.status]);\n\n const { StatusIcon, iconColor, bgColor, statusText } = React.useMemo(() => {\n switch (mergeRequest.status) {\n case 'approved':\n case 'merged':\n return {\n StatusIcon: CheckCheck,\n iconColor: '#10B981',\n bgColor: 'rgba(16, 185, 129, 0.1)',\n statusText: 'Edit approved by developer',\n };\n case 'rejected':\n return {\n StatusIcon: Ban,\n iconColor: '#F43F5E',\n bgColor: 'rgba(244, 63, 94, 0.1)',\n statusText: 'Edit rejected by developer',\n };\n case 'open':\n default:\n return {\n StatusIcon: Check,\n iconColor: '#FACC15',\n bgColor: 'rgba(250, 204, 21, 0.1)',\n statusText: 'Edit submitted to developer',\n };\n }\n }, [mergeRequest.status]);\n\n const updatedIso = toIsoString(mergeRequest.updatedAt ?? null) ?? toIsoString(mergeRequest.createdAt ?? null);\n const createdIso = toIsoString(mergeRequest.createdAt ?? null);\n const headerTimeAgo = updatedIso ? formatTimeAgo(updatedIso) : '';\n const createdTimeAgo = createdIso ? formatTimeAgo(createdIso) : '';\n\n const rotate = React.useRef(new Animated.Value(expanded ? 1 : 0)).current;\n React.useEffect(() => {\n Animated.timing(rotate, {\n toValue: expanded ? 1 : 0,\n duration: 200,\n useNativeDriver: true,\n }).start();\n }, [expanded, rotate]);\n\n return (\n <Pressable onPress={() => setExpanded(!expanded)} style={({ pressed }) => [{ opacity: pressed ? 0.95 : 1 }]}>\n <Card\n padded={false}\n border={false}\n style={[\n {\n padding: theme.spacing.lg,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n } as any,\n style,\n ]}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: theme.spacing.lg }}>\n <View style={{ width: 40, height: 40, borderRadius: 999, alignItems: 'center', justifyContent: 'center', backgroundColor: bgColor }}>\n <StatusIcon size={20} color={iconColor} />\n </View>\n\n <View style={{ flex: 1, minWidth: 0 }}>\n <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }}>\n <Text\n style={{\n fontSize: 16,\n lineHeight: 20,\n fontWeight: theme.typography.fontWeight.semibold,\n color: theme.colors.text,\n flex: 1,\n }}\n numberOfLines={1}\n >\n {statusText}\n </Text>\n {headerTimeAgo ? (\n <Text style={{ fontSize: 10, lineHeight: 14, marginLeft: theme.spacing.sm, color: withAlpha(theme.colors.textMuted, 0.6) }}>\n {headerTimeAgo}\n </Text>\n ) : null}\n </View>\n\n <Text style={{ fontSize: 12, lineHeight: 16, color: theme.colors.textMuted }} numberOfLines={1}>\n {mergeRequest.title ?? 'Untitled merge request'}\n </Text>\n </View>\n\n {headerRight ? (\n <View>{headerRight}</View>\n ) : (\n <Animated.View\n style={{\n transform: [\n {\n rotate: rotate.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '180deg'] }),\n },\n ],\n }}\n >\n <ChevronDown size={20} color={withAlpha(theme.colors.textMuted, 0.4)} />\n </Animated.View>\n )}\n </View>\n\n {expanded ? (\n <View style={{ marginTop: 16, marginLeft: 56 }}>\n <Text\n style={{\n fontSize: 10,\n fontWeight: '700',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: status.color,\n marginBottom: 2,\n }}\n >\n {status.text}\n </Text>\n {createdTimeAgo ? (\n <Text\n style={{\n fontSize: 11,\n color: subTextColor,\n marginBottom: 8,\n }}\n >\n {createdTimeAgo}\n </Text>\n ) : null}\n\n <Text style={{ fontSize: 16, fontWeight: '600', color: textColor, marginBottom: 8 }}>\n {mergeRequest.title ?? 'Untitled merge request'}\n </Text>\n\n {mergeRequest.description ? <MarkdownText markdown={mergeRequest.description} variant=\"mergeRequest\" /> : null}\n </View>\n ) : null}\n </Card>\n </Pressable>\n );\n}\n\n\n","import { Platform, View, type ViewStyle } from 'react-native';\n\nimport Markdown from 'react-native-markdown-display';\n\nimport { useTheme } from '../../theme';\n\nexport type MarkdownTextVariant = 'chat' | 'mergeRequest';\n\nexport type MarkdownTextProps = {\n markdown: string;\n variant?: MarkdownTextVariant;\n /**\n * Optional override for the base text color (e.g. success/error outcomes in chat).\n */\n bodyColor?: string;\n style?: ViewStyle;\n};\n\nexport function MarkdownText({ markdown, variant = 'chat', bodyColor, style }: MarkdownTextProps) {\n const theme = useTheme();\n const isDark = theme.scheme === 'dark';\n\n const baseBodyColor = variant === 'mergeRequest' ? theme.colors.textMuted : theme.colors.text;\n const linkColor =\n variant === 'mergeRequest' ? (isDark ? theme.colors.primary : '#3700B3') : theme.colors.link;\n const linkWeight = variant === 'mergeRequest' ? theme.typography.fontWeight.semibold : undefined;\n\n const codeBgColor = isDark ? '#27272A' : '#E4E4E7';\n const codeTextColor = isDark ? '#FFFFFF' : theme.colors.text;\n\n const paragraphBottom = variant === 'mergeRequest' ? 8 : 6;\n const baseLineHeight = variant === 'mergeRequest' ? 22 : 20;\n\n return (\n <View style={style}>\n <Markdown\n style={{\n body: { color: bodyColor ?? baseBodyColor, fontSize: 14, lineHeight: baseLineHeight },\n paragraph: { marginTop: 0, marginBottom: paragraphBottom },\n link: { color: linkColor, fontWeight: linkWeight },\n code_inline: {\n backgroundColor: codeBgColor,\n color: codeTextColor,\n paddingHorizontal: variant === 'mergeRequest' ? 6 : 4,\n paddingVertical: variant === 'mergeRequest' ? 2 : 0,\n borderRadius: variant === 'mergeRequest' ? 6 : 4,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n fontSize: 13,\n },\n code_block: {\n backgroundColor: codeBgColor,\n color: codeTextColor,\n padding: variant === 'mergeRequest' ? 12 : 8,\n borderRadius: variant === 'mergeRequest' ? 8 : 6,\n marginVertical: variant === 'mergeRequest' ? 8 : 0,\n },\n fence: {\n backgroundColor: codeBgColor,\n color: codeTextColor,\n padding: variant === 'mergeRequest' ? 12 : 8,\n borderRadius: variant === 'mergeRequest' ? 8 : 6,\n marginVertical: variant === 'mergeRequest' ? 8 : 0,\n },\n }}\n >\n {markdown}\n </Markdown>\n </View>\n );\n}\n\n\n","export type MergeRequestStatusDisplay = {\n text: string;\n color: string;\n};\n\nexport function getMergeRequestStatusDisplay(status: string): MergeRequestStatusDisplay {\n switch (status) {\n case 'open':\n return { text: 'Merge request is pending approval', color: '#FACC15' };\n case 'approved':\n return { text: 'Merge approved', color: '#10B981' };\n case 'rejected':\n return { text: 'Merge request rejected', color: '#F43F5E' };\n case 'merged':\n return { text: 'Your edit was merged to the original app', color: '#10B981' };\n case 'closed':\n return { text: 'Merge closed', color: '#10B981' };\n default:\n return { text: status, color: '#898994' };\n }\n}\n\n\n","export function toIsoString(input: unknown): string | null {\n if (!input) return null;\n if (typeof input === 'string') return input;\n if (typeof input === 'number') return new Date(input).toISOString();\n if (input instanceof Date) return input.toISOString();\n return null;\n}\n\n\n","import * as React from 'react';\n\nexport function useControlledExpansion(props: { expanded?: boolean; onExpandedChange?: (expanded: boolean) => void }) {\n const [uncontrolled, setUncontrolled] = React.useState(false);\n const expanded = props.expanded ?? uncontrolled;\n const setExpanded = React.useCallback(\n (next: boolean) => {\n props.onExpandedChange?.(next);\n if (props.expanded === undefined) setUncontrolled(next);\n },\n [props]\n );\n return { expanded, setExpanded };\n}\n\n\n","import * as React from 'react';\nimport { Animated, FlatList, View, useWindowDimensions, type ViewStyle } from 'react-native';\n\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport type { UserStats } from '../../data/users/types';\nimport { useTheme } from '../../theme';\nimport { ReviewMergeRequestCard } from './ReviewMergeRequestCard';\n\nexport type ReviewMergeRequestCarouselProps = {\n mergeRequests: MergeRequest[];\n creatorStatsById: Record<string, UserStats>;\n processingMrId?: string | null;\n isBuilding?: boolean;\n testingMrId?: string | null;\n onReject: (mr: MergeRequest) => void | Promise<void>;\n onApprove: (mr: MergeRequest) => void;\n onTest: (mr: MergeRequest) => void | Promise<void>;\n style?: ViewStyle;\n};\n\ntype CardRenderItem = { mr: MergeRequest; index: number; total: number };\n\nexport function ReviewMergeRequestCarousel({\n mergeRequests,\n creatorStatsById,\n processingMrId,\n isBuilding,\n testingMrId,\n onReject,\n onApprove,\n onTest,\n style,\n}: ReviewMergeRequestCarouselProps) {\n const theme = useTheme();\n const { width } = useWindowDimensions();\n const [expanded, setExpanded] = React.useState<Record<string, boolean>>({});\n const carouselScrollX = React.useRef(new Animated.Value(0)).current;\n\n const peekAmount = 24;\n const gap = 16;\n const cardWidth = React.useMemo(() => Math.max(1, width - theme.spacing.lg * 2 - peekAmount), [peekAmount, theme.spacing.lg, width]);\n const snapInterval = cardWidth + gap;\n const dotColor = theme.scheme === 'dark' ? '#FFFFFF' : '#000000';\n\n if (mergeRequests.length === 0) return null;\n\n return (\n <View style={[{ marginHorizontal: -theme.spacing.lg }, style]}>\n <FlatList\n horizontal\n data={mergeRequests}\n keyExtractor={(mr) => mr.id}\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={{ paddingHorizontal: theme.spacing.lg, paddingVertical: theme.spacing.sm }}\n ItemSeparatorComponent={() => <View style={{ width: gap }} />}\n snapToAlignment=\"start\"\n decelerationRate=\"fast\"\n snapToInterval={snapInterval}\n disableIntervalMomentum\n style={{ paddingRight: peekAmount }}\n ListFooterComponent={<View style={{ width: peekAmount }} />}\n onScroll={Animated.event([{ nativeEvent: { contentOffset: { x: carouselScrollX } } }], {\n useNativeDriver: false,\n })}\n scrollEventThrottle={16}\n renderItem={({ item, index }) => {\n const total = mergeRequests.length;\n const creator = creatorStatsById[item.createdBy];\n const isExpanded = Boolean(expanded[item.id]);\n const isProcessing = Boolean(processingMrId && processingMrId === item.id);\n const isAnyProcessing = Boolean(processingMrId);\n const isTestingThis = Boolean(testingMrId && testingMrId === item.id);\n return (\n <View style={{ width: cardWidth }}>\n <ReviewMergeRequestCard\n mr={item}\n index={index}\n total={total}\n creator={creator}\n isExpanded={isExpanded}\n isProcessing={isProcessing}\n isAnyProcessing={isAnyProcessing}\n isBuilding={Boolean(isBuilding)}\n isTestingThis={isTestingThis}\n onToggle={() => setExpanded((prev) => ({ ...prev, [item.id]: !prev[item.id] }))}\n onReject={() => void onReject(item)}\n onApprove={() => onApprove(item)}\n onTest={() => void onTest(item)}\n />\n </View>\n );\n }}\n />\n\n {mergeRequests.length >= 1 ? (\n <View style={{ flexDirection: 'row', justifyContent: 'center', columnGap: 8, marginTop: theme.spacing.md }}>\n {mergeRequests.map((mr, index) => {\n const inputRange = [(index - 1) * snapInterval, index * snapInterval, (index + 1) * snapInterval];\n\n const scale = carouselScrollX.interpolate({\n inputRange,\n outputRange: [0.8, 1.2, 0.8],\n extrapolate: 'clamp',\n });\n\n const opacity = carouselScrollX.interpolate({\n inputRange,\n outputRange: [0.4, 1, 0.4],\n extrapolate: 'clamp',\n });\n\n return (\n <Animated.View\n key={mr.id}\n style={{\n width: 8,\n height: 8,\n borderRadius: 999,\n backgroundColor: dotColor,\n transform: [{ scale }],\n opacity,\n }}\n />\n );\n })}\n </View>\n ) : null}\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, Animated, Pressable, View } from 'react-native';\nimport { Check, ChevronDown, Play, X } from 'lucide-react-native';\n\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport type { UserStats } from '../../data/users/types';\nimport { useTheme } from '../../theme';\nimport { Avatar } from '../primitives/Avatar';\nimport { Card } from '../primitives/Card';\nimport { MarkdownText } from '../primitives/MarkdownText';\nimport { Text } from '../primitives/Text';\nimport { withAlpha } from '../utils/color';\nimport { getMergeRequestStatusDisplay } from './mergeRequestStatusDisplay';\nimport { ReviewMergeRequestActionButton } from './ReviewMergeRequestActionButton';\n\nexport type ReviewMergeRequestCardProps = {\n mr: MergeRequest;\n index: number;\n total: number;\n creator?: UserStats;\n isExpanded: boolean;\n isProcessing: boolean;\n isAnyProcessing: boolean;\n isBuilding: boolean;\n isTestingThis: boolean;\n onToggle: () => void;\n onReject: () => void;\n onApprove: () => void;\n onTest: () => void;\n};\n\nexport function ReviewMergeRequestCard({\n mr,\n index,\n total,\n creator,\n isExpanded,\n isProcessing,\n isAnyProcessing,\n isBuilding,\n isTestingThis,\n onToggle,\n onReject,\n onApprove,\n onTest,\n}: ReviewMergeRequestCardProps) {\n const theme = useTheme();\n const status = React.useMemo(() => getMergeRequestStatusDisplay(mr.status), [mr.status]);\n const canAct = mr.status === 'open';\n\n const rotate = React.useRef(new Animated.Value(isExpanded ? 1 : 0)).current;\n React.useEffect(() => {\n Animated.timing(rotate, { toValue: isExpanded ? 1 : 0, duration: 200, useNativeDriver: true }).start();\n }, [isExpanded, rotate]);\n\n const position = total > 1 ? `${index + 1}/${total}` : 'Merge request';\n\n return (\n <Pressable onPress={onToggle} style={({ pressed }) => ({ opacity: pressed ? 0.95 : 1 })}>\n <Card\n padded={false}\n style={[\n {\n padding: 16,\n backgroundColor: withAlpha(theme.colors.surfaceRaised, 0.5),\n borderWidth: 1,\n borderColor: withAlpha('#3700B3', 0.2),\n } as any,\n ]}\n >\n {/* Collapsed header */}\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Avatar size={40} uri={creator?.avatar ?? null} name={creator?.name ?? undefined} />\n <View style={{ flex: 1, minWidth: 0 }}>\n <Text\n style={{ fontWeight: theme.typography.fontWeight.semibold, color: theme.colors.text, fontSize: 16, lineHeight: 20 }}\n numberOfLines={isExpanded ? undefined : 1}\n >\n {mr.title ?? 'Untitled merge request'}\n </Text>\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16 }} numberOfLines={1}>\n {creator?.name ?? 'Loading...'} · {position}\n </Text>\n </View>\n <Animated.View\n style={{\n transform: [{ rotate: rotate.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '180deg'] }) }],\n }}\n >\n <ChevronDown size={20} color={withAlpha(theme.colors.textMuted, 0.4)} />\n </Animated.View>\n </View>\n\n {/* Expanded content */}\n {isExpanded ? (\n <View style={{ marginTop: 16 }}>\n <Text\n style={{\n fontSize: 10,\n fontWeight: '700',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: status.color,\n marginBottom: 8,\n }}\n >\n {status.text}\n </Text>\n\n <Text style={{ color: theme.colors.textMuted, fontSize: 12, lineHeight: 16, marginBottom: 12 }}>\n {creator\n ? `${creator.approvedOpenedMergeRequests} approved merge${creator.approvedOpenedMergeRequests !== 1 ? 's' : ''}`\n : 'Loading stats...'}\n </Text>\n\n {mr.description ? <MarkdownText markdown={mr.description} variant=\"mergeRequest\" /> : null}\n </View>\n ) : null}\n\n {/* Separator */}\n <View style={{ height: 1, backgroundColor: withAlpha(theme.colors.borderStrong, 0.5), marginTop: 12, marginBottom: 12 }} />\n\n {/* Action buttons - always visible */}\n <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }}>\n <View style={{ flexDirection: 'row', gap: 8 }}>\n <ReviewMergeRequestActionButton\n accessibilityLabel=\"Reject\"\n backgroundColor={theme.colors.danger}\n disabled={!canAct || isAnyProcessing}\n onPress={onReject}\n iconOnly={!isExpanded}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: isExpanded ? 4 : 0 }}>\n <X size={18} color=\"#FFFFFF\" />\n {isExpanded ? (\n <Text style={{ fontSize: 13, color: '#FFFFFF', fontWeight: theme.typography.fontWeight.semibold }}>Reject</Text>\n ) : null}\n </View>\n </ReviewMergeRequestActionButton>\n\n <ReviewMergeRequestActionButton\n accessibilityLabel={!canAct ? 'Not actionable' : isProcessing ? 'Processing' : 'Approve'}\n backgroundColor=\"#16A34A\"\n disabled={!canAct || isAnyProcessing}\n onPress={onApprove}\n iconOnly={!isExpanded}\n >\n {isProcessing ? (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: isExpanded ? 4 : 0 }}>\n <ActivityIndicator size=\"small\" color=\"#FFFFFF\" />\n {isExpanded ? (\n <Text style={{ fontSize: 13, color: '#FFFFFF', fontWeight: theme.typography.fontWeight.semibold }}>\n Processing\n </Text>\n ) : null}\n </View>\n ) : (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: isExpanded ? 4 : 0 }}>\n <Check size={18} color=\"#FFFFFF\" />\n {isExpanded ? (\n <Text style={{ fontSize: 13, color: '#FFFFFF', fontWeight: theme.typography.fontWeight.semibold }}>Approve</Text>\n ) : null}\n </View>\n )}\n </ReviewMergeRequestActionButton>\n </View>\n\n <ReviewMergeRequestActionButton\n accessibilityLabel=\"Test\"\n backgroundColor={theme.colors.neutral}\n disabled={isBuilding || isTestingThis}\n onPress={onTest}\n iconOnly={!isExpanded}\n >\n {isTestingThis ? (\n <ActivityIndicator size=\"small\" color=\"#888\" />\n ) : (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: isExpanded ? 4 : 0 }}>\n <Play size={14} color={theme.colors.text} />\n {isExpanded ? (\n <Text style={{ fontSize: 13, color: theme.colors.text, fontWeight: theme.typography.fontWeight.semibold }}>Test</Text>\n ) : null}\n </View>\n )}\n </ReviewMergeRequestActionButton>\n </View>\n </Card>\n </Pressable>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View } from 'react-native';\n\nexport function ReviewMergeRequestActionButton({\n accessibilityLabel,\n backgroundColor,\n disabled,\n onPress,\n children,\n iconOnly,\n}: {\n accessibilityLabel: string;\n backgroundColor: string;\n disabled?: boolean;\n onPress: () => void;\n children: React.ReactNode;\n iconOnly: boolean;\n}) {\n const [pressed, setPressed] = React.useState(false);\n const height = iconOnly ? 36 : 40;\n const width = iconOnly ? 36 : undefined;\n const paddingHorizontal = iconOnly ? 0 : 16;\n const paddingVertical = iconOnly ? 0 : 8;\n const opacity = disabled ? 0.5 : pressed ? 0.9 : 1;\n\n return (\n <View\n style={{\n width,\n minWidth: width,\n height,\n minHeight: height,\n borderRadius: 999,\n backgroundColor,\n opacity,\n paddingHorizontal,\n paddingVertical,\n justifyContent: 'center',\n }}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n disabled={Boolean(disabled)}\n onPress={onPress}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n style={{\n height: '100%',\n width: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n hitSlop={8}\n >\n {children}\n </Pressable>\n </View>\n );\n}\n\n\n","import * as React from 'react';\n\nimport type { App } from '../../../data/apps/types';\nimport type { MergeRequest } from '../../../data/merge-requests/types';\nimport { appImagesRepository } from '../../../data/apps/images/repository';\nimport { appsRepository } from '../../../data/apps/repository';\nimport { usersRepository } from '../../../data/users/repository';\nimport { log } from '../../../core/logger';\nimport { useAppStats } from '../../hooks/useAppStats';\n\ntype InsightsSummary = { likes: number; comments: number; forks: number; downloads: number };\n\nconst LIKE_DEBUG_PREFIX = '[COMERGE_LIKE_DEBUG]';\n\nexport function usePreviewPanelData(params: {\n app: App | null;\n isOwner: boolean;\n outgoingMergeRequests: MergeRequest[];\n onOpenComments?: () => void;\n commentCountOverride?: number;\n}) {\n const { app, isOwner, outgoingMergeRequests, onOpenComments, commentCountOverride } = params;\n\n const [imageUrl, setImageUrl] = React.useState<string | null>(null);\n const [imageLoaded, setImageLoaded] = React.useState(false);\n const [insights, setInsights] = React.useState<InsightsSummary>({ likes: 0, comments: 0, forks: 0, downloads: 0 });\n const [creator, setCreator] = React.useState<{ name: string | null; avatar: string | null } | null>(null);\n\n React.useEffect(() => {\n if (!app?.id) return;\n let cancelled = false;\n (async () => {\n try {\n const res = await appImagesRepository.getSignedUrl(app.id);\n if (!cancelled) setImageUrl(res.url);\n } catch {\n if (!cancelled) setImageUrl(null);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [app?.id]);\n\n React.useEffect(() => {\n if (!app?.createdBy) return;\n let cancelled = false;\n (async () => {\n try {\n const stats = await usersRepository.getStats(app.createdBy);\n if (cancelled) return;\n setCreator({ name: stats.name, avatar: stats.avatar });\n } catch {\n if (!cancelled) setCreator(null);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [app?.createdBy]);\n\n React.useEffect(() => {\n setImageLoaded(false);\n }, [app?.id]);\n\n React.useEffect(() => {\n if (!app?.id) return;\n let cancelled = false;\n (async () => {\n try {\n const full = await appsRepository.getInsights(app.id);\n if (cancelled) return;\n log.debug(\n `${LIKE_DEBUG_PREFIX} usePreviewPanelData.getInsights appId=${app.id} insights.likes.total=${full.likes.total} app.isLiked=${String(\n app.isLiked\n )}`\n );\n setInsights({\n likes: full.likes.total,\n comments: full.comments.total,\n forks: full.forks.total,\n downloads: full.downloads.total,\n });\n } catch {\n // Leave zeros\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [app?.id]);\n\n React.useEffect(() => {\n if (!app?.id) return;\n log.debug(\n `${LIKE_DEBUG_PREFIX} usePreviewPanelData.appChanged appId=${app.id} app.isLiked=${String(app.isLiked)}`\n );\n }, [app?.id, app?.isLiked]);\n\n const stats = useAppStats({\n appId: app?.id ?? '',\n initialLikes: insights.likes,\n initialForks: insights.forks,\n initialComments: commentCountOverride ?? insights.comments,\n initialIsLiked: Boolean(app?.isLiked),\n onOpenComments,\n });\n\n const canSubmitMergeRequest = React.useMemo(() => {\n if (!isOwner) return false;\n if (!app) return false;\n if (!app.forkedFromAppId) return false;\n if (outgoingMergeRequests.some((mr) => mr.status === 'open')) return false;\n if (app.headCommitId && app.forkedFromCommitId && app.headCommitId !== app.forkedFromCommitId) return true;\n return false;\n }, [app, isOwner, outgoingMergeRequests]);\n\n const showProcessing = app ? app.status !== 'ready' : false;\n\n return {\n imageUrl,\n imageLoaded,\n setImageLoaded,\n creator,\n insights,\n stats,\n showProcessing,\n canSubmitMergeRequest,\n };\n}\n\n\n","import { api } from '../../../core/services/http';\nimport type { ServiceResponse } from '../../types';\nimport { BaseRemote } from '../../base-remote';\n\nexport type GetAppImageSignedUrlOptions = {\n variant?: string;\n redirect?: boolean;\n};\n\nexport type AppImageSignedUrlBatchResponse = {\n urls: Record<string, string | null>;\n errors?: Record<string, { message: string; statusCode: number }>;\n};\n\nexport interface AppImagesRemoteDataSource {\n getSignedUrl(\n appId: string,\n options?: GetAppImageSignedUrlOptions\n ): Promise<ServiceResponse<{ url: string; redirect: boolean }>>;\n getSignedUrlsBatch(\n appIds: string[],\n options?: Pick<GetAppImageSignedUrlOptions, 'variant'>\n ): Promise<ServiceResponse<AppImageSignedUrlBatchResponse>>;\n}\n\nclass AppImagesRemoteDataSourceImpl extends BaseRemote implements AppImagesRemoteDataSource {\n async getSignedUrl(\n appId: string,\n options?: GetAppImageSignedUrlOptions\n ): Promise<ServiceResponse<{ url: string; redirect: boolean }>> {\n const { data } = await api.get<ServiceResponse<{ url: string; redirect: boolean }>>(\n `/v1/apps/${encodeURIComponent(appId)}/image/url`,\n {\n params: {\n variant: options?.variant,\n redirect: options?.redirect ?? false,\n },\n }\n );\n return data;\n }\n\n async getSignedUrlsBatch(\n appIds: string[],\n options?: Pick<GetAppImageSignedUrlOptions, 'variant'>\n ): Promise<ServiceResponse<AppImageSignedUrlBatchResponse>> {\n const payload = {\n appIds,\n variant: options?.variant,\n };\n const { data } = await api.post<ServiceResponse<AppImageSignedUrlBatchResponse>>(\n '/v1/apps/image/url/batch',\n payload\n );\n return data;\n }\n}\n\nexport const appImagesRemoteDataSource: AppImagesRemoteDataSource = new AppImagesRemoteDataSourceImpl();\n\n\n","import type {\n AppImageSignedUrlBatchResponse,\n AppImagesRemoteDataSource,\n GetAppImageSignedUrlOptions,\n} from './remote';\nimport { appImagesRemoteDataSource } from './remote';\nimport { BaseRepository } from '../../base-repository';\n\nexport interface AppImagesRepository {\n getSignedUrl(\n appId: string,\n options?: GetAppImageSignedUrlOptions\n ): Promise<{ url: string; redirect: boolean }>;\n getSignedUrlsBatch(\n appIds: string[],\n options?: Pick<GetAppImageSignedUrlOptions, 'variant'>\n ): Promise<AppImageSignedUrlBatchResponse>;\n}\n\nclass AppImagesRepositoryImpl extends BaseRepository implements AppImagesRepository {\n constructor(private readonly remote: AppImagesRemoteDataSource) {\n super();\n }\n\n async getSignedUrl(\n appId: string,\n options?: GetAppImageSignedUrlOptions\n ): Promise<{ url: string; redirect: boolean }> {\n const res = await this.remote.getSignedUrl(appId, options);\n return this.unwrapOrThrow(res);\n }\n\n async getSignedUrlsBatch(\n appIds: string[],\n options?: Pick<GetAppImageSignedUrlOptions, 'variant'>\n ): Promise<AppImageSignedUrlBatchResponse> {\n const res = await this.remote.getSignedUrlsBatch(appIds, options);\n if (res.responseObject && !res.success) {\n return res.responseObject;\n }\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const appImagesRepository: AppImagesRepository = new AppImagesRepositoryImpl(appImagesRemoteDataSource);\n\n\n","import * as React from 'react';\nimport * as Haptics from 'expo-haptics';\n\nimport type { App } from '../../data/apps/types';\nimport { appLikesRepository } from '../../data/likes/repository';\n\nexport type UseAppStatsParams = {\n appId: string;\n initialLikes?: number;\n initialComments?: number;\n initialForks?: number;\n initialIsLiked?: boolean;\n onOpenComments?: () => void;\n};\n\nexport type AppStatsResult = {\n likeCount: number;\n commentCount: number;\n forkCount: number;\n isLiked: boolean;\n setCommentCount: (count: number) => void;\n handleLike: () => Promise<void>;\n handleOpenComments: () => void;\n};\n\nexport function useAppStats({\n appId,\n initialLikes = 0,\n initialComments = 0,\n initialForks = 0,\n initialIsLiked = false,\n onOpenComments,\n}: UseAppStatsParams): AppStatsResult {\n const [likeCount, setLikeCount] = React.useState(initialLikes);\n const [commentCount, setCommentCount] = React.useState(initialComments);\n const [forkCount, setForkCount] = React.useState(initialForks);\n const [isLiked, setIsLiked] = React.useState(initialIsLiked);\n\n const didMutateRef = React.useRef(false);\n const lastAppIdRef = React.useRef<string>('');\n React.useEffect(() => {\n if (lastAppIdRef.current === appId) return;\n lastAppIdRef.current = appId;\n didMutateRef.current = false;\n }, [appId]);\n\n React.useEffect(() => {\n if (didMutateRef.current) return;\n setLikeCount(initialLikes);\n }, [appId, initialLikes]);\n React.useEffect(() => {\n if (didMutateRef.current) return;\n setCommentCount(initialComments);\n }, [appId, initialComments]);\n React.useEffect(() => {\n if (didMutateRef.current) return;\n setForkCount(initialForks);\n }, [appId, initialForks]);\n React.useEffect(() => {\n if (didMutateRef.current) return;\n setIsLiked(initialIsLiked);\n }, [appId, initialIsLiked]);\n\n const handleLike = React.useCallback(async () => {\n if (!appId) return;\n didMutateRef.current = true;\n try {\n void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n } catch {\n }\n\n const newIsLiked = !isLiked;\n setIsLiked(newIsLiked);\n setLikeCount((prev) => Math.max(0, prev + (newIsLiked ? 1 : -1)));\n\n try {\n if (newIsLiked) {\n const res = await appLikesRepository.create(appId, {});\n if (typeof res.stats?.total === 'number') setLikeCount(Math.max(0, res.stats.total));\n } else {\n const res = await appLikesRepository.removeMine(appId);\n if (typeof res.stats?.total === 'number') setLikeCount(Math.max(0, res.stats.total));\n }\n } catch (e) {\n setIsLiked(!newIsLiked);\n setLikeCount((prev) => Math.max(0, prev + (newIsLiked ? -1 : 1)));\n }\n }, [appId, isLiked, likeCount]);\n\n const handleOpenComments = React.useCallback(() => {\n if (!appId) return;\n try {\n void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n } catch {\n }\n onOpenComments?.();\n }, [appId, onOpenComments]);\n\n return { likeCount, commentCount, forkCount, isLiked, setCommentCount, handleLike, handleOpenComments };\n}\n\nexport function getAppStatsFromApp(app: App | null): Omit<UseAppStatsParams, 'appId'> {\n return {\n initialLikes: app?.insights?.totalLikes ?? 0,\n initialComments: app?.insights?.totalComments ?? 0,\n initialForks: app?.insights?.totalForks ?? 0,\n initialIsLiked: Boolean(app?.isLiked),\n };\n}\n\n\n","import { api } from '../../core/services/http';\nimport type { ServiceResponse } from '../types';\nimport { BaseRemote } from '../base-remote';\nimport type {\n AppLikeList,\n AppLikeMutationResult,\n AppLikeStatsResult,\n CreateAppLikeInput,\n ListAppLikesQuery,\n} from './types';\n\nexport interface AppLikesRemoteDataSource {\n list(appId: string, query?: ListAppLikesQuery): Promise<ServiceResponse<AppLikeList>>;\n create(appId: string, payload: CreateAppLikeInput): Promise<ServiceResponse<AppLikeMutationResult>>;\n removeById(appId: string, likeId: string): Promise<ServiceResponse<AppLikeStatsResult>>;\n removeMine(appId: string): Promise<ServiceResponse<AppLikeStatsResult>>;\n}\n\nclass AppLikesRemoteDataSourceImpl extends BaseRemote implements AppLikesRemoteDataSource {\n async list(appId: string, query?: ListAppLikesQuery): Promise<ServiceResponse<AppLikeList>> {\n const params = query ? { ...query } : undefined;\n const { data } = await api.get<ServiceResponse<AppLikeList>>(\n `/v1/apps/${encodeURIComponent(appId)}/likes`,\n { params }\n );\n return data;\n }\n\n async create(\n appId: string,\n payload: CreateAppLikeInput\n ): Promise<ServiceResponse<AppLikeMutationResult>> {\n const { data } = await api.post<ServiceResponse<AppLikeMutationResult>>(\n `/v1/apps/${encodeURIComponent(appId)}/likes`,\n payload\n );\n return data;\n }\n\n async removeById(appId: string, likeId: string): Promise<ServiceResponse<AppLikeStatsResult>> {\n const { data } = await api.delete<ServiceResponse<AppLikeStatsResult>>(\n `/v1/apps/${encodeURIComponent(appId)}/likes/${encodeURIComponent(likeId)}`\n );\n return data;\n }\n\n async removeMine(appId: string): Promise<ServiceResponse<AppLikeStatsResult>> {\n const { data } = await api.delete<ServiceResponse<AppLikeStatsResult>>(\n `/v1/apps/${encodeURIComponent(appId)}/likes/me`\n );\n return data;\n }\n}\n\nexport const appLikesRemoteDataSource: AppLikesRemoteDataSource = new AppLikesRemoteDataSourceImpl();\n\n\n","import type { AppLikesRemoteDataSource } from './remote';\nimport { appLikesRemoteDataSource } from './remote';\nimport type {\n AppLikeList,\n AppLikeMutationResult,\n AppLikeStatsResult,\n CreateAppLikeInput,\n ListAppLikesQuery,\n} from './types';\nimport { BaseRepository } from '../../data/base-repository';\n\nexport interface AppLikesRepository {\n list(appId: string, query?: ListAppLikesQuery): Promise<AppLikeList>;\n create(appId: string, payload: CreateAppLikeInput): Promise<AppLikeMutationResult>;\n removeById(appId: string, likeId: string): Promise<AppLikeStatsResult>;\n removeMine(appId: string): Promise<AppLikeStatsResult>;\n}\n\nclass AppLikesRepositoryImpl extends BaseRepository implements AppLikesRepository {\n constructor(private readonly remote: AppLikesRemoteDataSource) {\n super();\n }\n\n async list(appId: string, query?: ListAppLikesQuery): Promise<AppLikeList> {\n const res = await this.remote.list(appId, query);\n return this.unwrapOrThrow(res);\n }\n\n async create(appId: string, payload: CreateAppLikeInput): Promise<AppLikeMutationResult> {\n const res = await this.remote.create(appId, payload);\n return this.unwrapOrThrow(res);\n }\n\n async removeById(appId: string, likeId: string): Promise<AppLikeStatsResult> {\n const res = await this.remote.removeById(appId, likeId);\n return this.unwrapOrThrow(res);\n }\n\n async removeMine(appId: string): Promise<AppLikeStatsResult> {\n const res = await this.remote.removeMine(appId);\n return this.unwrapOrThrow(res);\n }\n}\n\nexport const appLikesRepository: AppLikesRepository = new AppLikesRepositoryImpl(appLikesRemoteDataSource);\n\n\n","import * as React from 'react';\nimport { ActivityIndicator, View } from 'react-native';\n\nimport type { ChatMessageListRef } from '../../components/chat/ChatMessageList';\nimport { ChatPage } from '../../components/chat/ChatPage';\nimport { ScrollToBottomButton } from '../../components/chat/ScrollToBottomButton';\nimport { ChatHeader } from '../../components/chat/ChatHeader';\nimport { ForkNoticeBanner } from '../../components/chat/ForkNoticeBanner';\nimport { StudioSheetHeaderIconButton } from '../../components/studio-sheet/StudioSheetHeaderIconButton';\nimport { IconArrowDown, IconBack, IconClose, IconDraw, IconHome } from '../../components/icons/StudioIcons';\nimport { Text } from '../../components/primitives/Text';\nimport type { ChatMessage } from '../../components/models/types';\n\nexport type ChatPanelProps = {\n title?: string;\n autoFocusComposer?: boolean;\n messages: ChatMessage[];\n showTypingIndicator?: boolean;\n loading?: boolean;\n sendDisabled?: boolean;\n forking?: boolean;\n sending?: boolean;\n shouldForkOnEdit?: boolean;\n attachments?: string[];\n onRemoveAttachment?: (index: number) => void;\n onClearAttachments?: () => void;\n onBack: () => void;\n onClose: () => void;\n onNavigateHome?: () => void;\n onStartDraw?: () => void;\n onSend: (text: string, attachments?: string[]) => void | Promise<void>;\n};\n\nexport function ChatPanel({\n title = 'Chat',\n autoFocusComposer = false,\n messages,\n showTypingIndicator,\n loading,\n sendDisabled,\n forking = false,\n sending,\n shouldForkOnEdit,\n attachments = [],\n onRemoveAttachment,\n onClearAttachments,\n onBack,\n onClose,\n onNavigateHome,\n onStartDraw,\n onSend,\n}: ChatPanelProps) {\n const listRef = React.useRef<ChatMessageListRef | null>(null);\n const [nearBottom, setNearBottom] = React.useState(true);\n\n const handleSend = React.useCallback(\n async (text: string, composerAttachments?: string[]) => {\n const all = composerAttachments ?? attachments;\n await onSend(text, all.length > 0 ? all : undefined);\n onClearAttachments?.();\n requestAnimationFrame(() => listRef.current?.scrollToBottom({ animated: true }));\n },\n [attachments, onClearAttachments, onSend]\n );\n\n const handleScrollToBottom = React.useCallback(() => {\n listRef.current?.scrollToBottom({ animated: true });\n }, []);\n\n const header = (\n <ChatHeader\n left={\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <StudioSheetHeaderIconButton onPress={onBack} accessibilityLabel=\"Back\" style={{ marginRight: 8 }}>\n <IconBack size={20} colorToken=\"floatingContent\" />\n </StudioSheetHeaderIconButton>\n {onNavigateHome ? (\n <StudioSheetHeaderIconButton onPress={onNavigateHome} accessibilityLabel=\"Home\">\n <IconHome size={20} colorToken=\"floatingContent\" />\n </StudioSheetHeaderIconButton>\n ) : null}\n </View>\n }\n right={\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {onStartDraw ? (\n <StudioSheetHeaderIconButton onPress={onStartDraw} accessibilityLabel=\"Draw\" intent=\"danger\" style={{ marginRight: 8 }}>\n <IconDraw size={20} colorToken=\"onDanger\" />\n </StudioSheetHeaderIconButton>\n ) : null}\n <StudioSheetHeaderIconButton onPress={onClose} accessibilityLabel=\"Close\">\n <IconClose size={20} colorToken=\"floatingContent\" />\n </StudioSheetHeaderIconButton>\n </View>\n }\n center={null}\n />\n );\n\n const topBanner =\n shouldForkOnEdit ? (\n <ForkNoticeBanner\n isOwner={!shouldForkOnEdit}\n style={{ marginBottom: 12 }}\n />\n ) : null;\n\n const showMessagesLoading = (Boolean(loading) && messages.length === 0) || forking;\n if (showMessagesLoading) {\n return (\n <View style={{ flex: 1 }}>\n <View>{header}</View>\n {topBanner ? <View style={{ paddingHorizontal: 16, paddingTop: 8 }}>{topBanner}</View> : null}\n <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 24, paddingVertical: 12 }}>\n <ActivityIndicator />\n <View style={{ height: 12 }} />\n <Text variant=\"bodyMuted\">{forking ? 'Creating your copy…' : 'Loading messages…'}</Text>\n </View>\n </View>\n );\n }\n\n return (\n <ChatPage\n header={header}\n messages={messages}\n showTypingIndicator={showTypingIndicator}\n topBanner={topBanner}\n listRef={listRef}\n onNearBottomChange={setNearBottom}\n overlay={\n <ScrollToBottomButton\n visible={!nearBottom}\n onPress={handleScrollToBottom}\n style={{ bottom: 80 }}\n >\n <IconArrowDown size={20} colorToken=\"floatingContent\" />\n </ScrollToBottomButton>\n }\n composer={{\n disabled: Boolean(loading) || Boolean(sendDisabled) || Boolean(forking),\n sending: Boolean(sending),\n autoFocus: autoFocusComposer,\n onSend: handleSend,\n attachments,\n onRemoveAttachment: onRemoveAttachment,\n onAddAttachment: onStartDraw,\n useBottomSheetTextInput: true,\n }}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport type { ChatMessage } from '../models/types';\nimport { useTheme } from '../../theme';\nimport { ChatMessageList, type ChatMessageListProps, type ChatMessageListRef } from './ChatMessageList';\nimport { ChatComposer, type ChatComposerProps } from './ChatComposer';\n\nexport type ChatPageProps = {\n header?: React.ReactNode;\n messages: ChatMessage[];\n showTypingIndicator?: boolean;\n renderMessageContent?: ChatMessageListProps['renderMessageContent'];\n topBanner?: React.ReactNode;\n composer: Omit<ChatComposerProps, 'attachments'> & {\n attachments?: ChatComposerProps['attachments'];\n };\n /**\n * Optional overlay (e.g. ScrollToBottomButton).\n */\n overlay?: React.ReactNode;\n style?: ViewStyle;\n onNearBottomChange?: ChatMessageListProps['onNearBottomChange'];\n listRef?: React.RefObject<ChatMessageListRef | null>;\n};\n\nexport function ChatPage({\n header,\n messages,\n showTypingIndicator,\n renderMessageContent,\n topBanner,\n composer,\n overlay,\n style,\n onNearBottomChange,\n listRef,\n}: ChatPageProps) {\n const theme = useTheme();\n const [composerHeight, setComposerHeight] = React.useState(0);\n return (\n <View style={[{ flex: 1 }, style]}>\n {header ? <View>{header}</View> : null}\n {topBanner ? (\n <View style={{ paddingHorizontal: theme.spacing.lg, paddingTop: theme.spacing.sm }}>\n {topBanner}\n </View>\n ) : null}\n <View style={{ flex: 1 }}>\n <ChatMessageList\n ref={listRef}\n messages={messages}\n showTypingIndicator={showTypingIndicator}\n renderMessageContent={renderMessageContent}\n onNearBottomChange={onNearBottomChange}\n contentStyle={{ paddingBottom: theme.spacing.xl + composerHeight }}\n />\n {overlay}\n </View>\n <ChatComposer\n {...composer}\n attachments={composer.attachments ?? []}\n onLayout={({ height }) => setComposerHeight(height)}\n />\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type NativeScrollEvent, type NativeSyntheticEvent, type ViewStyle } from 'react-native';\nimport { BottomSheetFlatList } from '@gorhom/bottom-sheet';\n\nimport type { ChatMessage } from '../models/types';\nimport { useTheme } from '../../theme';\nimport { ChatMessageBubble, type ChatMessageBubbleProps } from './ChatMessageBubble';\nimport { TypingIndicator } from './TypingIndicator';\n\nexport type ChatMessageListRef = {\n scrollToBottom: (options?: { animated?: boolean }) => void;\n};\n\nexport type ChatMessageListProps = {\n messages: ChatMessage[];\n showTypingIndicator?: boolean;\n renderMessageContent?: ChatMessageBubbleProps['renderContent'];\n contentStyle?: ViewStyle;\n /**\n * Called when the user is near the bottom of the list.\n */\n onNearBottomChange?: (nearBottom: boolean) => void;\n /**\n * Distance threshold from bottom (in dp) that counts as \"near bottom\".\n */\n nearBottomThreshold?: number;\n};\n\nexport const ChatMessageList = React.forwardRef<ChatMessageListRef, ChatMessageListProps>(\n (\n {\n messages,\n showTypingIndicator = false,\n renderMessageContent,\n contentStyle,\n onNearBottomChange,\n nearBottomThreshold = 200,\n },\n ref\n ) => {\n const theme = useTheme();\n const listRef = React.useRef<React.ElementRef<typeof BottomSheetFlatList<ChatMessage>>>(null);\n const nearBottomRef = React.useRef(true);\n const initialScrollDoneRef = React.useRef(false);\n const lastMessageIdRef = React.useRef<string | null>(null);\n\n const scrollToBottom = React.useCallback((options?: { animated?: boolean }) => {\n const animated = options?.animated ?? true;\n // Scroll to visual bottom (latest messages) in a normal (non-inverted) list.\n listRef.current?.scrollToEnd({ animated });\n }, []);\n\n React.useImperativeHandle(ref, () => ({ scrollToBottom }), [scrollToBottom]);\n\n const handleScroll = React.useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const { contentOffset, contentSize, layoutMeasurement } = e.nativeEvent;\n const distanceFromBottom = Math.max(contentSize.height - (contentOffset.y + layoutMeasurement.height), 0);\n const isNear = distanceFromBottom <= nearBottomThreshold;\n\n if (nearBottomRef.current !== isNear) {\n nearBottomRef.current = isNear;\n onNearBottomChange?.(isNear);\n }\n },\n [nearBottomThreshold, onNearBottomChange]\n );\n\n // On first load, start at the bottom\n React.useEffect(() => {\n if (initialScrollDoneRef.current) return;\n if (messages.length === 0) return;\n\n initialScrollDoneRef.current = true;\n lastMessageIdRef.current = messages[messages.length - 1]?.id ?? null;\n const id = requestAnimationFrame(() => scrollToBottom({ animated: false }));\n return () => cancelAnimationFrame(id);\n }, [messages, scrollToBottom]);\n\n // When new messages arrive, keep the user pinned to the bottom only if they already were near it.\n React.useEffect(() => {\n if (!initialScrollDoneRef.current) return;\n const lastId = messages.length > 0 ? messages[messages.length - 1]!.id : null;\n const prevLastId = lastMessageIdRef.current;\n lastMessageIdRef.current = lastId;\n if (!lastId || lastId === prevLastId) return;\n if (!nearBottomRef.current) return;\n\n const id = requestAnimationFrame(() => scrollToBottom({ animated: true }));\n return () => cancelAnimationFrame(id);\n }, [messages, scrollToBottom]);\n\n // When typing indicator appears, keep the user at bottom if they already were.\n React.useEffect(() => {\n if (showTypingIndicator && nearBottomRef.current) {\n const id = requestAnimationFrame(() => scrollToBottom({ animated: true }));\n return () => cancelAnimationFrame(id);\n }\n return undefined;\n }, [showTypingIndicator, scrollToBottom]);\n\n return (\n <BottomSheetFlatList\n ref={listRef}\n data={messages}\n keyExtractor={(m: ChatMessage) => m.id}\n onScroll={handleScroll}\n scrollEventThrottle={16}\n showsVerticalScrollIndicator={false}\n contentContainerStyle={[\n {\n paddingHorizontal: theme.spacing.lg,\n paddingTop: theme.spacing.sm,\n paddingBottom: theme.spacing.xl,\n },\n contentStyle,\n ]}\n renderItem={({ item, index }: { item: ChatMessage; index: number }) => (\n <View style={{ marginTop: index === 0 ? 0 : theme.spacing.sm }}>\n <ChatMessageBubble message={item} renderContent={renderMessageContent} />\n </View>\n )}\n ListFooterComponent={\n showTypingIndicator ? (\n <View style={{ marginTop: theme.spacing.sm, alignSelf: 'flex-start', paddingHorizontal: theme.spacing.lg }}>\n <TypingIndicator />\n </View>\n ) : null\n }\n maintainVisibleContentPosition={{ minIndexForVisible: 0, autoscrollToTopThreshold: nearBottomThreshold }}\n />\n );\n }\n);\nChatMessageList.displayName = 'ChatMessageList';\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\nimport { CheckCheck, GitMerge } from 'lucide-react-native';\n\nimport type { ChatMessage } from '../models/types';\nimport { useTheme } from '../../theme';\nimport { MarkdownText } from '../primitives/MarkdownText';\nimport { Surface } from '../primitives/Surface';\n\nexport type ChatMessageBubbleProps = {\n message: ChatMessage;\n /**\n * Optional custom renderer for message content (e.g. markdown).\n */\n renderContent?: (message: ChatMessage) => React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function ChatMessageBubble({ message, renderContent, style }: ChatMessageBubbleProps) {\n const theme = useTheme();\n const metaEvent = message.meta?.event ?? null;\n const metaStatus = message.meta?.status ?? null;\n\n const isMergeApproved = metaEvent === 'merge_request.approved';\n const isMergeRejected = metaEvent === 'merge_request.rejected';\n const isMergeCompleted = metaEvent === 'merge.completed';\n\n const isHuman = message.author === 'human' || isMergeApproved || isMergeRejected;\n\n const align: ViewStyle = { alignSelf: isHuman ? 'flex-end' : 'flex-start' };\n const bubbleVariant = isHuman ? 'surface' : 'surfaceRaised';\n const cornerStyle: ViewStyle = isHuman ? { borderTopRightRadius: 0 } : { borderTopLeftRadius: 0 };\n\n const bodyColor =\n metaStatus === 'success' ? theme.colors.success : metaStatus === 'error' ? theme.colors.danger : undefined;\n\n return (\n <View style={[align, style]}>\n <Surface\n variant={bubbleVariant}\n style={[\n {\n maxWidth: '85%',\n borderRadius: theme.radii.lg,\n paddingHorizontal: theme.spacing.lg,\n paddingVertical: theme.spacing.md,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n cornerStyle,\n ]}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {isMergeCompleted ? (\n <CheckCheck size={16} color={theme.colors.success} style={{ marginRight: theme.spacing.sm }} />\n ) : null}\n {isMergeApproved ? (\n <GitMerge size={16} color={theme.colors.text} style={{ marginRight: theme.spacing.sm }} />\n ) : null}\n <View style={{ flexShrink: 1, minWidth: 0 }}>\n {renderContent ? renderContent(message) : <MarkdownText markdown={message.content} variant=\"chat\" bodyColor={bodyColor} />}\n </View>\n </View>\n </Surface>\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Animated, View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\n\nexport type TypingIndicatorProps = {\n style?: ViewStyle;\n};\n\nexport function TypingIndicator({ style }: TypingIndicatorProps) {\n const theme = useTheme();\n const dotColor = theme.colors.textSubtle;\n const anims = React.useMemo(\n () => [new Animated.Value(0.3), new Animated.Value(0.3), new Animated.Value(0.3)],\n []\n );\n\n React.useEffect(() => {\n const loops: Animated.CompositeAnimation[] = [];\n anims.forEach((a, idx) => {\n const seq = Animated.sequence([\n Animated.timing(a, { toValue: 1, duration: 420, useNativeDriver: true, delay: idx * 140 }),\n Animated.timing(a, { toValue: 0.3, duration: 420, useNativeDriver: true }),\n ]);\n const loop = Animated.loop(seq);\n loops.push(loop);\n loop.start();\n });\n return () => {\n loops.forEach((l) => l.stop());\n };\n }, [anims]);\n\n return (\n <View style={[{ flexDirection: 'row', alignItems: 'center' }, style]}>\n {anims.map((a, i) => (\n <Animated.View\n key={i}\n style={{\n width: 8,\n height: 8,\n borderRadius: 4,\n marginHorizontal: 3,\n backgroundColor: dotColor,\n opacity: a,\n transform: [{ translateY: Animated.multiply(Animated.subtract(a, 0.3), 2) }],\n }}\n />\n ))}\n </View>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View, type ViewStyle } from 'react-native';\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';\n\nimport { useTheme } from '../../theme';\nimport { withAlpha } from '../utils/color';\n\nexport type ScrollToBottomButtonProps = {\n visible: boolean;\n onPress: () => void;\n children: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function ScrollToBottomButton({ visible, onPress, children, style }: ScrollToBottomButtonProps) {\n const theme = useTheme();\n const progress = useSharedValue(visible ? 1 : 0);\n const [pressed, setPressed] = React.useState(false);\n\n React.useEffect(() => {\n progress.value = withTiming(visible ? 1 : 0, { duration: 200, easing: Easing.out(Easing.ease) });\n }, [progress, visible]);\n\n const animStyle = useAnimatedStyle(() => ({\n opacity: progress.value,\n transform: [{ translateY: (1 - progress.value) * 20 }],\n }));\n\n const bg = theme.scheme === 'dark' ? 'rgba(39,39,42,0.9)' : 'rgba(244,244,245,0.95)';\n const border = theme.scheme === 'dark' ? withAlpha('#FFFFFF', 0.12) : withAlpha('#000000', 0.08);\n\n return (\n <Animated.View\n pointerEvents={visible ? 'auto' : 'none'}\n style={[\n {\n position: 'absolute',\n left: 0,\n right: 0,\n alignItems: 'center',\n },\n style,\n animStyle,\n ]}\n >\n <View\n style={{\n width: 44,\n height: 44,\n borderRadius: 22,\n backgroundColor: bg,\n borderWidth: 1,\n borderColor: border,\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n opacity: pressed ? 0.85 : 1,\n }}\n >\n <Pressable\n onPress={onPress}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n hitSlop={10}\n style={{ width: '100%', height: '100%', alignItems: 'center', justifyContent: 'center' }}\n >\n {children}\n </Pressable>\n </View>\n </Animated.View>\n );\n}\n\n\n","import * as React from 'react';\nimport { StyleSheet, View, type ViewStyle } from 'react-native';\n\nimport { StudioSheetHeader } from '../studio-sheet/StudioSheetHeader';\n\nexport type ChatHeaderProps = {\n left?: React.ReactNode;\n right?: React.ReactNode;\n center?: React.ReactNode;\n style?: ViewStyle;\n};\n\nexport function ChatHeader({ left, right, center, style }: ChatHeaderProps) {\n const flattenedStyle = StyleSheet.flatten([\n {\n paddingTop: 0,\n } satisfies ViewStyle,\n style,\n ]);\n\n return (\n <StudioSheetHeader\n left={left}\n right={right}\n center={center}\n style={flattenedStyle}\n />\n );\n}\n\n\n","import * as React from 'react';\nimport { View, type ViewStyle } from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Card } from '../primitives/Card';\nimport { Text } from '../primitives/Text';\n\nexport type ForkNoticeBannerProps = {\n isOwner?: boolean;\n title?: string;\n description?: string | null;\n style?: ViewStyle;\n};\n\nexport function ForkNoticeBanner({ isOwner = true, title, description, style }: ForkNoticeBannerProps) {\n const theme = useTheme();\n const resolvedTitle = title ?? (isOwner ? 'Remixed app' : 'Remix app');\n const resolvedDescription =\n description ??\n (isOwner\n ? 'Any changes you make will be a remix of the original app. You can view the edited version in the Remix tab in your apps page.'\n : 'Once you make edits, this remixed version will appear on your Remixed apps page.');\n\n return (\n <Card\n variant=\"surfaceRaised\"\n padded={false}\n border\n style={[\n {\n width: '100%',\n paddingHorizontal: theme.spacing.lg,\n paddingTop: 14,\n paddingBottom: 8,\n },\n style,\n ]}\n >\n <View style={{ minWidth: 0 }}>\n <Text\n style={{\n color: '#22C55E', // green-500\n fontSize: 14,\n lineHeight: 18,\n fontWeight: theme.typography.fontWeight.medium,\n marginBottom: 4,\n }}\n >\n {resolvedTitle}\n </Text>\n <Text\n style={{\n color: theme.colors.textMuted,\n fontSize: 14,\n lineHeight: 20,\n paddingBottom: 6,\n }}\n >\n {resolvedDescription}\n </Text>\n </View>\n </Card>\n );\n}\n\n\n","import * as React from 'react';\nimport { Pressable, View } from 'react-native';\n\nimport type { MergeRequestSummary } from '../models/types';\nimport { Modal } from '../primitives/Modal';\nimport { Text } from '../primitives/Text';\nimport { useTheme } from '../../theme';\n\nexport type ConfirmMergeRequestDialogProps = {\n visible: boolean;\n onOpenChange: (open: boolean) => void;\n mergeRequest: MergeRequestSummary | null;\n approveDisabled?: boolean;\n /**\n * disables the \"Test edits first\" button and changes its label to \"Preparing…\".\n */\n isBuilding?: boolean;\n onConfirm: () => void | Promise<void>;\n onTestFirst: (mr: MergeRequestSummary) => void | Promise<void>;\n};\n\nexport function ConfirmMergeRequestDialog({\n visible,\n onOpenChange,\n mergeRequest,\n approveDisabled,\n isBuilding,\n onConfirm,\n onTestFirst,\n}: ConfirmMergeRequestDialogProps) {\n const theme = useTheme();\n\n const close = React.useCallback(() => onOpenChange(false), [onOpenChange]);\n\n const canConfirm = Boolean(mergeRequest) && !approveDisabled;\n\n const handleConfirm = React.useCallback(() => {\n if (!mergeRequest) return;\n onOpenChange(false);\n void onConfirm();\n }, [mergeRequest, onConfirm, onOpenChange]);\n\n const handleTestFirst = React.useCallback(() => {\n if (!mergeRequest) return;\n onOpenChange(false);\n void onTestFirst(mergeRequest);\n }, [mergeRequest, onOpenChange, onTestFirst]);\n\n const fullWidthButtonBase = {\n height: 40,\n borderRadius: 999,\n alignItems: 'center' as const,\n justifyContent: 'center' as const,\n alignSelf: 'stretch' as const,\n };\n\n return (\n <Modal\n visible={visible}\n onRequestClose={close}\n contentStyle={{\n borderRadius: theme.radii.sm,\n padding: 24,\n backgroundColor: theme.colors.background,\n }}\n >\n <View>\n <Text\n style={{\n color: theme.colors.text,\n fontSize: 18,\n lineHeight: 24,\n fontWeight: theme.typography.fontWeight.semibold,\n }}\n >\n Are you sure you want to approve this merge request?\n </Text>\n </View>\n\n <View style={{ marginTop: 16 }}>\n {/* Primary */}\n <View\n style={[\n fullWidthButtonBase,\n {\n backgroundColor: theme.colors.primary,\n opacity: canConfirm ? 1 : 0.5,\n },\n ]}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Approve Merge\"\n disabled={!canConfirm}\n onPress={handleConfirm}\n style={[fullWidthButtonBase, { flex: 1 }]}\n >\n <Text style={{ textAlign: 'center', color: theme.colors.onPrimary }}>\n Approve Merge\n </Text>\n </Pressable>\n </View>\n\n {/* Test first (outline) */}\n <View style={{ height: 8 }} />\n <View\n style={[\n fullWidthButtonBase,\n {\n backgroundColor: theme.colors.background,\n borderWidth: 1,\n borderColor: theme.colors.border,\n opacity: isBuilding || !mergeRequest ? 0.5 : 1,\n },\n ]}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={isBuilding ? 'Preparing…' : 'Test edits first'}\n disabled={isBuilding || !mergeRequest}\n onPress={handleTestFirst}\n style={[fullWidthButtonBase, { flex: 1 }]}\n >\n <Text style={{ textAlign: 'center', color: theme.colors.text }}>\n {isBuilding ? 'Preparing…' : 'Test edits first'}\n </Text>\n </Pressable>\n </View>\n\n {/* Cancel (outline) */}\n <View style={{ height: 8 }} />\n <View\n style={[\n fullWidthButtonBase,\n {\n backgroundColor: theme.colors.background,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n ]}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Cancel\"\n onPress={close}\n style={[fullWidthButtonBase, { flex: 1 }]}\n >\n <Text style={{ textAlign: 'center', color: theme.colors.text }}>Cancel</Text>\n </Pressable>\n </View>\n </View>\n </Modal>\n );\n}\n\n\n","import * as React from 'react';\nimport {\n Modal as RNModal,\n Pressable,\n View,\n type ViewStyle,\n} from 'react-native';\n\nimport { useTheme } from '../../theme';\nimport { Card } from './Card';\n\nexport type ModalProps = {\n visible: boolean;\n onRequestClose: () => void;\n children: React.ReactNode;\n /**\n * When true, tapping the backdrop closes the modal.\n */\n dismissOnBackdropPress?: boolean;\n contentStyle?: ViewStyle;\n};\n\nexport function Modal({\n visible,\n onRequestClose,\n dismissOnBackdropPress = true,\n children,\n contentStyle,\n}: ModalProps) {\n const theme = useTheme();\n\n return (\n <RNModal\n visible={visible}\n transparent\n animationType=\"fade\"\n onRequestClose={onRequestClose}\n >\n <View style={{ flex: 1, backgroundColor: theme.colors.backdrop, justifyContent: 'center', padding: theme.spacing.lg }}>\n <Pressable\n accessibilityRole=\"button\"\n onPress={dismissOnBackdropPress ? onRequestClose : undefined}\n style={{ position: 'absolute', inset: 0 }}\n />\n <Card variant=\"surfaceRaised\" padded style={[{ borderRadius: theme.radii.xl }, contentStyle]}>\n {children}\n </Card>\n </View>\n </RNModal>\n );\n}\n\n\n","import * as React from 'react';\n\nimport type { MergeRequest } from '../../data/merge-requests/types';\nimport { ConfirmMergeRequestDialog } from '../../components/dialogs/ConfirmMergeRequestDialog';\nimport type { MergeRequestSummary } from '../../components/models/types';\n\nexport type ConfirmMergeFlowProps = {\n visible: boolean;\n onOpenChange: (open: boolean) => void;\n mergeRequest: MergeRequest | null;\n toSummary: (mr: MergeRequest) => MergeRequestSummary;\n /**\n * Disable the primary \"Approve Merge\" action (e.g. while submitting).\n */\n approveDisabled?: boolean;\n /**\n * Whether the system is building/preparing a test bundle.\n * Disables the \"Test edits first\" action and shows \"Preparing…\".\n */\n isBuilding?: boolean;\n onConfirm: (mr: MergeRequest) => void | Promise<void>;\n onTestFirst: (mr: MergeRequest) => void | Promise<void>;\n};\n\nexport function ConfirmMergeFlow({\n visible,\n onOpenChange,\n mergeRequest,\n toSummary,\n approveDisabled,\n isBuilding,\n onConfirm,\n onTestFirst,\n}: ConfirmMergeFlowProps) {\n return (\n <ConfirmMergeRequestDialog\n visible={visible}\n onOpenChange={onOpenChange}\n mergeRequest={mergeRequest ? toSummary(mergeRequest) : null}\n approveDisabled={approveDisabled}\n isBuilding={isBuilding}\n onConfirm={() => {\n if (!mergeRequest) return;\n return onConfirm(mergeRequest);\n }}\n onTestFirst={(mrSummary) => {\n if (!mergeRequest) return;\n void mrSummary;\n return onTestFirst(mergeRequest);\n }}\n />\n );\n}\n\n\n"],"mappings":"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","names":["React","View","jsx","React","axios","axios","React","React","canRequestLatest","React","React","React","View","jsx","View","React","Keyboard","View","useWindowDimensions","React","View","View","Fragment","jsx","View","jsx","View","React","jsx","jsxs","useCallback","useEffect","useMemo","useRef","Text","View","Animated","LiquidGlassView","isLiquidGlassSupported","jsx","jsxs","useRef","useEffect","useMemo","useCallback","Animated","LiquidGlassView","isLiquidGlassSupported","View","Text","React","Animated","View","jsx","jsxs","Animated","View","React","StyleSheet","View","React","PanResponder","StyleSheet","View","jsx","jsxs","PanResponder","View","StyleSheet","styles","React","Animated","PanResponder","Pressable","View","useWindowDimensions","useSafeAreaInsets","Haptics","Pressable","View","jsx","Pressable","View","jsx","jsxs","useSafeAreaInsets","useWindowDimensions","Animated","clamp","PanResponder","View","Pressable","jsx","jsxs","View","StyleSheet","styles","React","ActivityIndicator","Keyboard","Platform","Pressable","View","useSafeAreaInsets","LiquidGlassView","isLiquidGlassSupported","Play","React","ActivityIndicator","Animated","Pressable","View","LiquidGlassView","isLiquidGlassSupported","React","jsx","MultilineTextInput","X","Check","jsx","X","Check","jsx","jsxs","View","Pressable","Animated","LiquidGlassView","isLiquidGlassSupported","ActivityIndicator","React","View","Image","View","jsx","View","Image","jsx","jsxs","View","React","React","React","Platform","jsx","jsxs","useSafeAreaInsets","Platform","View","LiquidGlassView","isLiquidGlassSupported","Pressable","Play","ActivityIndicator","Keyboard","ActivityIndicator","View","View","BottomSheetScrollView","jsx","jsxs","View","BottomSheetScrollView","View","View","jsx","jsxs","View","React","Pressable","View","LiquidGlassView","isLiquidGlassSupported","jsx","View","LiquidGlassView","isLiquidGlassSupported","Pressable","jsx","jsxs","View","View","View","jsx","View","jsx","jsx","jsxs","View","React","Animated","LinearGradient","Fragment","jsx","jsxs","Image","jsx","Pressable","View","LiquidGlassView","isLiquidGlassSupported","Svg","Path","jsx","jsx","jsxs","View","LiquidGlassView","isLiquidGlassSupported","Pressable","View","Pencil","jsx","jsxs","Pencil","View","jsx","View","View","jsx","jsxs","View","jsx","jsxs","View","ActivityIndicator","View","Pressable","View","jsx","jsxs","Pressable","View","jsx","Fragment","jsx","jsxs","View","ActivityIndicator","React","ActivityIndicator","View","Send","React","Animated","Pressable","View","Check","ChevronDown","Platform","View","jsx","View","Platform","React","jsx","jsxs","Check","Animated","Pressable","View","ChevronDown","React","Animated","View","useWindowDimensions","React","ActivityIndicator","Animated","Pressable","View","Check","ChevronDown","Play","X","React","Pressable","View","jsx","jsx","jsxs","Animated","Pressable","View","ChevronDown","X","ActivityIndicator","Check","Play","jsx","jsxs","useWindowDimensions","Animated","View","Fragment","jsx","jsxs","View","ActivityIndicator","Send","React","React","Haptics","stats","jsx","jsxs","View","ActivityIndicator","React","ActivityIndicator","View","React","View","React","View","View","CheckCheck","GitMerge","jsx","jsxs","View","CheckCheck","GitMerge","React","Animated","View","jsx","Animated","View","jsx","View","jsx","jsxs","View","React","Pressable","View","Animated","Easing","useAnimatedStyle","useSharedValue","withTiming","jsx","useSharedValue","withTiming","Easing","useAnimatedStyle","Animated","View","Pressable","StyleSheet","jsx","StyleSheet","View","jsx","jsxs","View","jsx","jsxs","View","ActivityIndicator","React","Pressable","View","Pressable","View","jsx","jsxs","View","Pressable","jsx","jsxs","View","Pressable","jsx","Fragment","jsx","jsxs","useWindowDimensions","Keyboard","View","jsx","jsxs","View"]}
|