@adminide-stack/yantra-mobile 12.0.142-alpha.0 → 12.0.144
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/lib/features/attachments/displayUserMessageText.js +2 -2
- package/lib/features/attachments/displayUserMessageText.js.map +1 -1
- package/lib/features/devices/bodyComposition.js +116 -0
- package/lib/features/devices/bodyComposition.js.map +1 -0
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +22 -2
- package/lib/features/devices/session.js.map +1 -1
- package/lib/features/notion/NotionAgentPanel.js +987 -0
- package/lib/features/notion/NotionAgentPanel.js.map +1 -0
- package/lib/features/notion/NotionAskAiSheet.js +362 -0
- package/lib/features/notion/NotionAskAiSheet.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +4 -3
- package/lib/features/notion/NotionBlockView.js.map +1 -1
- package/lib/features/notion/NotionConnectionsSheet.js +47 -13
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -1
- package/lib/features/notion/NotionPageView.js +68 -8
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +1 -1
- package/lib/features/notion/NotionSidebarSections.js.map +1 -1
- package/lib/features/notion/NotionWorkspaceView.js +14 -9
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +3 -1
- package/lib/features/notion/database/DatabaseCells.js.map +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -1
- package/lib/features/notion/notionAgentRunStatus.js +2 -2
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -1
- package/lib/features/notion/notionAgentRuns.js +57 -0
- package/lib/features/notion/notionAgentRuns.js.map +1 -0
- package/lib/features/notion/notionAiContext.js +91 -0
- package/lib/features/notion/notionAiContext.js.map +1 -0
- package/lib/features/notion/notionConnections.js +42 -4
- package/lib/features/notion/notionConnections.js.map +1 -1
- package/lib/features/notion/notionDocuments.js +61 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionNotesAgent.js +173 -3
- package/lib/features/notion/notionNotesAgent.js.map +1 -1
- package/lib/features/notion/notionPageKinds.js +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +229 -97
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +33 -7
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/buildJob.js +2 -2
- package/lib/features/webbuilder/buildJob.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +18 -1
- package/lib/features/webbuilder/codeFiles.js.map +1 -1
- package/lib/features/webbuilder/components/BottomTabs.js.map +1 -1
- package/lib/features/webbuilder/components/CodeView.js +134 -56
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/Composer.js +2 -2
- package/lib/features/webbuilder/components/Composer.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewFrame.js +19 -3
- package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +310 -46
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +141 -12
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectSheets.js +792 -0
- package/lib/features/webbuilder/components/ProjectSheets.js.map +1 -0
- package/lib/features/webbuilder/components/ProjectsScreen.js +14 -2
- package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js +914 -58
- package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
- package/lib/features/webbuilder/components/TemplateCard.js +9 -6
- package/lib/features/webbuilder/components/TemplateCard.js.map +1 -1
- package/lib/features/webbuilder/components/TemplatesSheet.js +5 -17
- package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -1
- package/lib/features/webbuilder/connectorTemplates.js +171 -0
- package/lib/features/webbuilder/connectorTemplates.js.map +1 -0
- package/lib/features/webbuilder/fileTree.js +163 -0
- package/lib/features/webbuilder/fileTree.js.map +1 -0
- package/lib/features/webbuilder/followUps.js +67 -0
- package/lib/features/webbuilder/followUps.js.map +1 -0
- package/lib/features/webbuilder/previewProbe.js +49 -0
- package/lib/features/webbuilder/previewProbe.js.map +1 -0
- package/lib/features/webbuilder/previewRoutes.js +156 -0
- package/lib/features/webbuilder/previewRoutes.js.map +1 -0
- package/lib/features/webbuilder/projectTools.js +341 -0
- package/lib/features/webbuilder/projectTools.js.map +1 -0
- package/lib/features/webbuilder/publishTools.js +475 -0
- package/lib/features/webbuilder/publishTools.js.map +1 -0
- package/lib/features/webbuilder/sleepNotice.js +13 -0
- package/lib/features/webbuilder/sleepNotice.js.map +1 -0
- package/lib/features/webbuilder/stepLabels.js +37 -7
- package/lib/features/webbuilder/stepLabels.js.map +1 -1
- package/lib/features/webbuilder/studioCatalog.js +5 -1
- package/lib/features/webbuilder/studioCatalog.js.map +1 -1
- package/lib/features/webbuilder/templateCatalog.js +140 -0
- package/lib/features/webbuilder/templateCatalog.js.map +1 -0
- package/lib/features/webbuilder/webbuilderPrompts.js +31 -5
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
- package/lib/features/webbuilder/workflow.js +8 -4
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/screens/Devices/index.js +205 -3
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +9 -6
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/keepAlive.js +53 -3
- package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/unreachableRetry.js +23 -0
- package/lib/screens/WebBuilderNative/unreachableRetry.js.map +1 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js +37 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js.map +1 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +6 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +302 -40
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +2 -2
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -1
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +147 -77
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectSheets.js","sources":["../../../../src/features/webbuilder/components/ProjectSheets.tsx"],"sourcesContent":["/**\n * The project menu and its dialogs - the web project menu on sheets: Project settings\n * (name, instructions for the AI, delete), Rename, Integrations (\"Add AI to my site\" and\n * the connector catalog), Push to my GitHub (with \"Keep in sync\"), Demo video and Import\n * a project from a GitHub repository.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { ActivityIndicator, Alert, Image, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport {\n aiRequest,\n DEFAULT_SYNC_BRANCH,\n githubSyncPatch,\n groupCatalog,\n importTurn,\n integrationRequest,\n isValidRepoName,\n normalizeBranch,\n normalizeProjectKnowledge,\n normalizeProjectTitle,\n parseCatalog,\n parseProjectSettings,\n parseRepoInput,\n PROJECT_KNOWLEDGE_MAX,\n readRepoCheck,\n readSettingsUpdateReply,\n repoSlug,\n withIntegration,\n type IntegrationCatalogEntry,\n type ProjectSettings,\n type RepoCheck,\n} from '../projectTools';\nimport type { WebBuilderBuild, WebBuilderProjectTools } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { PrimaryButton, SecondaryButton, Sheet, type IconName } from './ui';\n\n// ── The menu ─────────────────────────────────────────────────────────────\n\nexport interface ProjectMenuItem {\n key: string;\n icon: IconName;\n label: string;\n hint?: string;\n run: () => void;\n /** Rows shown under this one when it is opened (GitHub's). */\n children?: ProjectMenuItem[];\n}\n\nexport interface ProjectMenuSection {\n title?: string;\n items: ProjectMenuItem[];\n}\n\nfunction Row({\n item,\n onPick,\n open,\n onToggle,\n theme,\n}: {\n item: ProjectMenuItem;\n onPick: (item: ProjectMenuItem) => void;\n open?: boolean;\n onToggle?: () => void;\n theme: WebBuilderTheme;\n}) {\n const parent = Boolean(item.children?.length);\n let trailing: IconName | null = null;\n if (parent) trailing = open ? 'chevron-down' : 'chevron-right';\n return (\n <Tap\n onPress={parent ? (onToggle ?? (() => undefined)) : () => onPick(item)}\n accessibilityRole=\"button\"\n accessibilityLabel={item.hint ? `${item.label}. ${item.hint}` : item.label}\n accessibilityState={parent ? { expanded: Boolean(open) } : undefined}\n style={styles.row}\n pressedStyle={DIM}\n testID={`webbuilder-menu-${item.key}`}\n >\n <MaterialCommunityIcons name={item.icon} size={20} color={theme.muted} />\n <View style={styles.rowText}>\n <Text style={[styles.rowLabel, { color: theme.ink }]}>{item.label}</Text>\n {item.hint ? <Text style={[styles.rowHint, { color: theme.muted }]}>{item.hint}</Text> : null}\n </View>\n {trailing ? <MaterialCommunityIcons name={trailing} size={20} color={theme.faint} /> : null}\n </Tap>\n );\n}\n\nexport function ProjectMenuSheet({\n visible,\n title,\n sections,\n onClose,\n theme,\n}: {\n visible: boolean;\n title: string;\n sections: ProjectMenuSection[];\n onClose: () => void;\n theme: WebBuilderTheme;\n}) {\n const [openKey, setOpenKey] = useState<string | null>(null);\n useEffect(() => {\n if (!visible) setOpenKey(null);\n }, [visible]);\n const pick = (item: ProjectMenuItem) => {\n onClose();\n // Let the sheet close before the item opens one of its own.\n setTimeout(item.run, 300);\n };\n return (\n <Sheet visible={visible} title={title} onClose={onClose} theme={theme} testID=\"webbuilder-project-menu\">\n <ScrollView style={styles.scroll} contentContainerStyle={styles.menuBody}>\n {sections\n .filter((s) => s.items.length)\n .map((section, i) => (\n <View key={section.title ?? `s${i}`}>\n {i > 0 ? <View style={[styles.divider, { backgroundColor: theme.border }]} /> : null}\n {section.title ? (\n <Text style={[styles.section, { color: theme.muted }]}>{section.title}</Text>\n ) : null}\n {section.items.map((item) => (\n <View key={item.key}>\n <Row\n item={item}\n onPick={pick}\n open={openKey === item.key}\n onToggle={() => setOpenKey(openKey === item.key ? null : item.key)}\n theme={theme}\n />\n {openKey === item.key && item.children?.length ? (\n <View style={[styles.sub, { borderLeftColor: theme.border }]}>\n {item.children.map((child) => (\n <Row key={child.key} item={child} onPick={pick} theme={theme} />\n ))}\n </View>\n ) : null}\n </View>\n ))}\n </View>\n ))}\n </ScrollView>\n </Sheet>\n );\n}\n\n// ── Project settings / Rename ────────────────────────────────────────────\n\nexport type ProjectSettingsMode = 'settings' | 'rename';\n\nexport function ProjectSettingsSheet({\n visible,\n mode,\n channelId,\n title,\n tools,\n aiBusy,\n onSaved,\n onDeleted,\n onClose,\n theme,\n}: {\n visible: boolean;\n mode: ProjectSettingsMode;\n channelId: string | null;\n title: string;\n tools: WebBuilderProjectTools;\n aiBusy: boolean;\n onSaved: (settings: { title: string | null; instructions: string }) => void;\n onDeleted: () => void;\n onClose: () => void;\n theme: WebBuilderTheme;\n}) {\n const [name, setName] = useState(title);\n const [knowledge, setKnowledge] = useState('');\n const [loaded, setLoaded] = useState<ProjectSettings | null>(null);\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!visible) return undefined;\n setName(title);\n setError(null);\n if (!channelId) return undefined;\n // Fresh values from the server on open, unless the person already started typing.\n let alive = true;\n setLoading(true);\n tools\n .loadSettings(channelId)\n .then((raw) => {\n const s = parseProjectSettings(raw);\n if (!alive || !s) return;\n setLoaded(s);\n if (s.title) setName((prev) => (prev === title ? s.title || prev : prev));\n setKnowledge((prev) => prev || s.instructions);\n })\n .catch(() => undefined)\n .finally(() => {\n if (alive) setLoading(false);\n });\n return () => {\n alive = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, channelId]);\n\n const save = async () => {\n if (!channelId) return;\n const t = normalizeProjectTitle(name);\n if (!t) {\n setError('Give the project a name.');\n return;\n }\n const patch: Record<string, unknown> = {};\n if (t !== title) patch.title = t;\n const instructions = normalizeProjectKnowledge(knowledge);\n if (mode === 'settings' && instructions !== (loaded?.instructions ?? '')) patch.instructions = instructions;\n if (!Object.keys(patch).length) {\n onClose();\n return;\n }\n setSaving(true);\n setError(null);\n try {\n const reply = readSettingsUpdateReply(await tools.updateSettings(channelId, patch));\n if (!reply.ok) {\n setError(reply.error || \"Couldn't save the settings.\");\n return;\n }\n onSaved({ title: t, instructions });\n onClose();\n } catch {\n setError(\"Couldn't save the settings. Check your connection and try again.\");\n } finally {\n setSaving(false);\n }\n };\n\n const remove = () => {\n if (!channelId) return;\n if (aiBusy) {\n setError('Wait for the AI to finish before deleting this project.');\n return;\n }\n Alert.alert(`Delete \"${title}\"?`, 'Its chat, builds and settings are removed. This cannot be undone.', [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Delete project',\n style: 'destructive',\n onPress: () => {\n setDeleting(true);\n setError(null);\n tools\n .deleteProject(channelId)\n .then((r) => {\n if (!r.ok) {\n setError(r.error || 'The project could not be deleted.');\n return;\n }\n onClose();\n onDeleted();\n })\n .catch(() => setError('The project could not be deleted. Try again.'))\n .finally(() => setDeleting(false));\n },\n },\n ]);\n };\n\n const count = knowledge.length;\n return (\n <Sheet\n visible={visible}\n title={mode === 'rename' ? 'Rename' : 'Project settings'}\n onClose={onClose}\n theme={theme}\n testID=\"webbuilder-project-settings\"\n >\n <ScrollView style={styles.scroll} contentContainerStyle={styles.body} keyboardShouldPersistTaps=\"handled\">\n <Text style={[styles.label, { color: theme.ink }]}>Name</Text>\n <TextInput\n value={name}\n onChangeText={setName}\n autoFocus={mode === 'rename'}\n returnKeyType=\"done\"\n onSubmitEditing={mode === 'rename' ? () => save().catch(() => undefined) : undefined}\n style={[\n styles.input,\n { color: theme.ink, borderColor: theme.border, backgroundColor: theme.screen },\n ]}\n accessibilityLabel=\"Project name\"\n testID=\"webbuilder-project-name\"\n />\n {mode === 'settings' ? (\n <>\n <View style={styles.labelRow}>\n <Text style={[styles.label, { color: theme.ink }]}>Project instructions</Text>\n <Text style={[styles.rowHint, { color: theme.muted }]}>\n {count} / {PROJECT_KNOWLEDGE_MAX}\n </Text>\n </View>\n <TextInput\n value={knowledge}\n onChangeText={(t) => setKnowledge(t.slice(0, PROJECT_KNOWLEDGE_MAX))}\n multiline\n placeholder={\n 'Rules the AI always follows for this project, e.g.\\n- Brand colour #0f766e, font Inter\\n- Write in British English\\n- Never add a login page'\n }\n placeholderTextColor={theme.faint}\n textAlignVertical=\"top\"\n style={[\n styles.input,\n styles.area,\n { color: theme.ink, borderColor: theme.accent, backgroundColor: theme.screen },\n ]}\n accessibilityLabel=\"Project instructions\"\n testID=\"webbuilder-project-instructions\"\n />\n <Text style={[styles.help, { color: theme.muted }]}>\n Sent to the AI with every build, edit and fix of this project. Saved with the project.\n </Text>\n </>\n ) : null}\n {loading ? <ActivityIndicator color={theme.accent} /> : null}\n {error ? <Text style={[styles.help, { color: theme.crit }]}>{error}</Text> : null}\n <PrimaryButton\n label=\"Save\"\n onPress={() => {\n save().catch(() => undefined);\n }}\n theme={theme}\n busy={saving}\n disabled={!channelId}\n testID=\"webbuilder-project-save\"\n />\n {mode === 'settings' ? (\n <Tap\n onPress={remove}\n disabled={deleting}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Delete project\"\n style={styles.danger}\n pressedStyle={DIM}\n testID=\"webbuilder-project-delete\"\n >\n {deleting ? (\n <ActivityIndicator size=\"small\" color={theme.crit} />\n ) : (\n <MaterialCommunityIcons name=\"trash-can-outline\" size={18} color={theme.crit} />\n )}\n <Text style={[styles.dangerText, { color: theme.crit }]}>Delete project</Text>\n </Tap>\n ) : null}\n </ScrollView>\n </Sheet>\n );\n}\n\n// ── Push to my GitHub ────────────────────────────────────────────────────\n\nexport function GithubPushSheet({\n visible,\n build,\n channelId,\n title,\n tools,\n onStarted,\n onClose,\n theme,\n}: {\n visible: boolean;\n build: WebBuilderBuild | null;\n channelId: string | null;\n title: string;\n tools: WebBuilderProjectTools;\n onStarted: (message: string) => void;\n onClose: () => void;\n theme: WebBuilderTheme;\n}) {\n const [repo, setRepo] = useState('');\n const [sync, setSync] = useState(true);\n const [branch, setBranch] = useState(DEFAULT_SYNC_BRANCH);\n const [repoUrl, setRepoUrl] = useState('');\n const [working, setWorking] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!visible) return undefined;\n setError(null);\n setRepo(repoSlug(title));\n if (!channelId) return undefined;\n // The repo this project pushed to before is kept for it (web \"kept for this project\").\n let alive = true;\n tools\n .loadSettings(channelId)\n .then((raw) => {\n const gh = parseProjectSettings(raw)?.github;\n if (!alive || !gh) return;\n if (gh.repoUrl) {\n setRepoUrl(gh.repoUrl);\n setRepo(gh.repoUrl.split('/').pop() || repoSlug(title));\n }\n if (gh.branch) setBranch(gh.branch);\n setSync(gh.sync !== false);\n })\n .catch(() => undefined);\n return () => {\n alive = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, channelId]);\n\n const name = repo.trim();\n const canSubmit = Boolean(build?.sandboxId) && isValidRepoName(name) && (!sync || Boolean(normalizeBranch(branch)));\n\n const push = async () => {\n if (!build || !canSubmit) return;\n setWorking(true);\n setError(null);\n try {\n if (channelId) {\n const patch = githubSyncPatch(repoUrl, branch, sync);\n if (patch) await tools.updateSettings(channelId, { github: patch }).catch(() => null);\n }\n const r = await tools.pushToGithub(build, name);\n if (!r.ok) {\n setError(r.message || \"The push didn't start. Try again.\");\n return;\n }\n onClose();\n onStarted(r.message || 'Push started. Follow along in the chat.');\n } catch {\n setError(\"The push didn't start. Check your connection and try again.\");\n } finally {\n setWorking(false);\n }\n };\n\n return (\n <Sheet visible={visible} title=\"Push to GitHub\" onClose={onClose} theme={theme} testID=\"webbuilder-github-push\">\n <ScrollView style={styles.scroll} contentContainerStyle={styles.body} keyboardShouldPersistTaps=\"handled\">\n <Text style={[styles.help, { color: theme.muted }]}>\n Repository name for this build - kept for this project.\n </Text>\n <TextInput\n value={repo}\n onChangeText={(t) => setRepo(t.replace(/[^A-Za-z0-9._-]/g, '-').slice(0, 100))}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[\n styles.input,\n { color: theme.ink, borderColor: theme.accent, backgroundColor: theme.screen },\n ]}\n accessibilityLabel=\"Repository name\"\n testID=\"webbuilder-github-repo\"\n />\n <View style={[styles.card, { borderColor: theme.border }]}>\n <Tap\n onPress={() => setSync((v) => !v)}\n accessibilityRole=\"checkbox\"\n accessibilityState={{ checked: sync }}\n style={styles.checkRow}\n pressedStyle={DIM}\n testID=\"webbuilder-github-sync\"\n >\n <MaterialCommunityIcons\n name={sync ? 'checkbox-marked' : 'checkbox-blank-outline'}\n size={22}\n color={sync ? theme.info : theme.muted}\n />\n <View style={styles.rowText}>\n <Text style={[styles.rowLabel, { color: theme.ink }]}>Keep in sync automatically</Text>\n <Text style={[styles.rowHint, { color: theme.muted }]}>\n Every change is pushed as a commit, and changes made on GitHub come back before the next\n edit. If both sides changed, we ask which version to keep.\n </Text>\n </View>\n </Tap>\n {sync ? (\n <>\n <Text style={[styles.rowHint, { color: theme.muted }]}>Branch</Text>\n <TextInput\n value={branch}\n onChangeText={setBranch}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[\n styles.input,\n { color: theme.ink, borderColor: theme.border, backgroundColor: theme.card },\n ]}\n accessibilityLabel=\"Branch\"\n />\n </>\n ) : null}\n </View>\n {!build?.sandboxId ? (\n <Text style={[styles.help, { color: theme.muted }]}>Wake the preview to push to GitHub.</Text>\n ) : null}\n {error ? <Text style={[styles.help, { color: theme.crit }]}>{error}</Text> : null}\n <PrimaryButton\n label={repoUrl ? 'Push' : 'Create & Push'}\n icon=\"github\"\n onPress={() => {\n push().catch(() => undefined);\n }}\n theme={theme}\n busy={working}\n disabled={!canSubmit}\n testID=\"webbuilder-github-submit\"\n />\n </ScrollView>\n </Sheet>\n );\n}\n\n// ── Integrations ─────────────────────────────────────────────────────────\n\ntype Picked = { kind: 'ai' } | { kind: 'connector'; entry: IntegrationCatalogEntry };\n\nfunction EntryRow({\n entry,\n onPress,\n theme,\n}: {\n entry: IntegrationCatalogEntry;\n onPress: () => void;\n theme: WebBuilderTheme;\n}) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={entry.title}\n style={styles.row}\n pressedStyle={DIM}\n >\n {entry.logo ? (\n <Image source={{ uri: entry.logo }} style={styles.logo} resizeMode=\"contain\" />\n ) : (\n <View style={[styles.logo, styles.logoBlank, { backgroundColor: theme.chip }]}>\n <MaterialCommunityIcons name=\"power-plug-outline\" size={18} color={theme.muted} />\n </View>\n )}\n <View style={styles.rowText}>\n <Text style={[styles.rowLabel, { color: theme.ink }]}>{entry.title}</Text>\n {entry.description ? (\n <Text style={[styles.rowHint, { color: theme.muted }]} numberOfLines={2}>\n {entry.description}\n </Text>\n ) : null}\n </View>\n <MaterialCommunityIcons name=\"chevron-right\" size={20} color={theme.faint} />\n </Tap>\n );\n}\n\nexport function IntegrationsSheet({\n visible,\n channelId,\n tools,\n aiBusy,\n onRequest,\n onClose,\n theme,\n}: {\n visible: boolean;\n channelId: string | null;\n tools: WebBuilderProjectTools;\n aiBusy: boolean;\n /** Send the edit request to the AI (the chat opens). */\n onRequest: (text: string) => void;\n onClose: () => void;\n theme: WebBuilderTheme;\n}) {\n const [search, setSearch] = useState('');\n const [catalog, setCatalog] = useState<IntegrationCatalogEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [failed, setFailed] = useState(false);\n const [picked, setPicked] = useState<Picked | null>(null);\n const [purpose, setPurpose] = useState('');\n const [working, setWorking] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const load = () => {\n setLoading(true);\n setFailed(false);\n tools\n .integrations()\n .then((raw) => setCatalog(parseCatalog(raw)))\n .catch(() => setFailed(true))\n .finally(() => setLoading(false));\n };\n useEffect(() => {\n if (!visible) return;\n setPicked(null);\n setSearch('');\n setError(null);\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible]);\n\n const { featured, groups } = useMemo(() => groupCatalog(catalog, search), [catalog, search]);\n const showAi = !search.trim() || /ai|assistant|chat|search|writ/i.test(search);\n\n const add = async () => {\n if (!picked) return;\n if (aiBusy) {\n setError('Wait for the AI to finish, then add it.');\n return;\n }\n setWorking(true);\n setError(null);\n try {\n if (picked.kind === 'connector' && channelId) {\n // Saved to the project's integrations, so later turns know about it.\n const current = parseProjectSettings(await tools.loadSettings(channelId).catch(() => null));\n const list = withIntegration(current?.integrations ?? [], picked.entry, purpose);\n const reply = readSettingsUpdateReply(await tools.updateSettings(channelId, { integrations: list }));\n if (!reply.ok) {\n setError(reply.error || \"Couldn't save the integration.\");\n return;\n }\n }\n onClose();\n onRequest(picked.kind === 'ai' ? aiRequest(purpose) : integrationRequest(picked.entry, purpose));\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Couldn't add it. Try again.\");\n } finally {\n setWorking(false);\n }\n };\n\n let body: React.ReactNode;\n if (picked) {\n const ai = picked.kind === 'ai';\n body = (\n <View style={styles.body}>\n <Tap\n onPress={() => setPicked(null)}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back to Integrations\"\n style={styles.back}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={22} color={theme.ink} />\n <Text style={[styles.backText, { color: theme.ink }]}>Integrations</Text>\n </Tap>\n <Text style={[styles.help, { color: theme.muted }]}>\n {ai\n ? \"A chat assistant, smart search, writing help - runs on your site's server.\"\n : picked.entry.description || `Add ${picked.entry.title} to your site.`}\n </Text>\n <Text style={[styles.label, { color: theme.ink }]}>What should it do? (optional)</Text>\n <TextInput\n value={purpose}\n onChangeText={setPurpose}\n placeholder={ai ? \"An assistant that answers visitors' questions\" : 'e.g. the products on my site'}\n placeholderTextColor={theme.faint}\n style={[\n styles.input,\n { color: theme.ink, borderColor: theme.border, backgroundColor: theme.screen },\n ]}\n accessibilityLabel=\"What it should do\"\n />\n {error ? <Text style={[styles.help, { color: theme.crit }]}>{error}</Text> : null}\n <PrimaryButton\n label=\"Add to my site\"\n icon=\"plus\"\n onPress={() => {\n add().catch(() => undefined);\n }}\n theme={theme}\n busy={working}\n disabled={aiBusy}\n testID=\"webbuilder-integration-add\"\n />\n </View>\n );\n } else {\n body = (\n <View style={styles.body}>\n <View style={[styles.search, { borderColor: theme.accent, backgroundColor: theme.screen }]}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={theme.muted} />\n <TextInput\n value={search}\n onChangeText={setSearch}\n placeholder=\"Search integrations\"\n placeholderTextColor={theme.faint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[styles.searchInput, { color: theme.ink }]}\n accessibilityLabel=\"Search integrations\"\n testID=\"webbuilder-integrations-search\"\n />\n </View>\n <ScrollView style={styles.list} keyboardShouldPersistTaps=\"handled\">\n {showAi ? (\n <Tap\n onPress={() => {\n setPurpose('');\n setPicked({ kind: 'ai' });\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add AI to my site\"\n style={[styles.aiCard, { backgroundColor: theme.chip, borderColor: theme.border }]}\n pressedStyle={DIM}\n testID=\"webbuilder-integration-ai\"\n >\n <View style={[styles.logo, styles.logoBlank, { backgroundColor: theme.accentSoft }]}>\n <MaterialCommunityIcons name=\"creation\" size={18} color={theme.accent} />\n </View>\n <View style={styles.rowText}>\n <Text style={[styles.rowLabel, { color: theme.ink }]}>Add AI to my site</Text>\n <Text style={[styles.rowHint, { color: theme.muted }]}>\n A chat assistant, smart search, writing help - runs on your site's server.\n </Text>\n </View>\n </Tap>\n ) : null}\n {loading ? <ActivityIndicator color={theme.accent} style={styles.spin} /> : null}\n {!loading && failed ? (\n <View style={styles.empty}>\n <Text style={[styles.help, { color: theme.muted }]}>\n Couldn't load the integrations.\n </Text>\n <SecondaryButton label=\"Try again\" icon=\"refresh\" onPress={load} theme={theme} />\n </View>\n ) : null}\n {!loading && !failed && featured.length ? (\n <>\n <Text style={[styles.section, { color: theme.muted }]}>POPULAR</Text>\n {featured.map((e) => (\n <EntryRow\n key={e.id}\n entry={e}\n onPress={() => {\n setPurpose('');\n setPicked({ kind: 'connector', entry: e });\n }}\n theme={theme}\n />\n ))}\n </>\n ) : null}\n {!loading && !failed\n ? groups.map((g) => (\n <View key={g.category}>\n <Text style={[styles.section, { color: theme.muted }]}>\n {g.category.toUpperCase()}\n </Text>\n {g.entries.map((e) => (\n <EntryRow\n key={e.id}\n entry={e}\n onPress={() => {\n setPurpose('');\n setPicked({ kind: 'connector', entry: e });\n }}\n theme={theme}\n />\n ))}\n </View>\n ))\n : null}\n {!loading && !failed && !featured.length && !groups.length ? (\n <View style={styles.empty}>\n <MaterialCommunityIcons name=\"power-plug-outline\" size={24} color={theme.muted} />\n <Text style={[styles.emptyTitle, { color: theme.ink }]}>\n {search.trim() ? 'No integrations match' : 'No other integrations yet'}\n </Text>\n <Text style={[styles.help, styles.center, { color: theme.muted }]}>\n More integrations show up here when your organization adds them.\n </Text>\n </View>\n ) : null}\n </ScrollView>\n </View>\n );\n }\n\n return (\n <Sheet\n visible={visible}\n title={picked?.kind === 'ai' ? 'Add AI to my site' : picked?.entry.title || 'Integrations'}\n onClose={onClose}\n theme={theme}\n testID=\"webbuilder-integrations\"\n >\n {body}\n </Sheet>\n );\n}\n\n// ── Import a project ─────────────────────────────────────────────────────\n\nexport function ImportProjectSheet({\n visible,\n onImport,\n onClose,\n theme,\n fetchImpl = fetch,\n}: {\n visible: boolean;\n /** Start the imported project (a new site, the agent clones and runs it). */\n onImport: (turn: string) => void;\n onClose: () => void;\n theme: WebBuilderTheme;\n fetchImpl?: typeof fetch;\n}) {\n const [input, setInput] = useState('');\n const [checking, setChecking] = useState(false);\n const [result, setResult] = useState<RepoCheck | null>(null);\n useEffect(() => {\n if (!visible) return;\n setInput('');\n setResult(null);\n }, [visible]);\n\n const check = async () => {\n const parsed = parseRepoInput(input);\n if (!parsed.ok) {\n setResult({ ok: false, message: parsed.error });\n return;\n }\n setChecking(true);\n try {\n const res = await fetchImpl(`https://api.github.com/repos/${parsed.ref.owner}/${parsed.ref.repo}`, {\n headers: { Accept: 'application/vnd.github+json' },\n });\n const body = await res.json().catch(() => null);\n setResult(readRepoCheck(parsed.ref, res.status, body));\n } catch {\n setResult({ ok: false, message: \"Couldn't reach GitHub. Check your connection, then try again.\" });\n } finally {\n setChecking(false);\n }\n };\n\n return (\n <Sheet visible={visible} title=\"Import a project\" onClose={onClose} theme={theme} testID=\"webbuilder-import\">\n <ScrollView style={styles.scroll} contentContainerStyle={styles.body} keyboardShouldPersistTaps=\"handled\">\n <Text style={[styles.help, { color: theme.muted }]}>\n Bring an app you built elsewhere - Vite or Next.js - with its code and history.\n </Text>\n <Text style={[styles.label, { color: theme.ink }]}>GitHub repository</Text>\n <View style={styles.inline}>\n <View\n style={[\n styles.search,\n styles.grow,\n { borderColor: theme.accent, backgroundColor: theme.screen },\n ]}\n >\n <MaterialCommunityIcons name=\"github\" size={18} color={theme.muted} />\n <TextInput\n value={input}\n onChangeText={(t) => {\n setInput(t);\n setResult(null);\n }}\n placeholder=\"https://github.com/you/your-app\"\n placeholderTextColor={theme.faint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n keyboardType=\"url\"\n returnKeyType=\"go\"\n onSubmitEditing={() => {\n check().catch(() => undefined);\n }}\n style={[styles.searchInput, { color: theme.ink }]}\n accessibilityLabel=\"GitHub repository\"\n testID=\"webbuilder-import-repo\"\n />\n </View>\n <Tap\n onPress={() => {\n check().catch(() => undefined);\n }}\n disabled={!input.trim() || checking}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Check\"\n style={[\n styles.checkBtn,\n { backgroundColor: theme.accent },\n (!input.trim() || checking) && styles.disabled,\n ]}\n pressedStyle={DIM}\n testID=\"webbuilder-import-check\"\n >\n {checking ? (\n <ActivityIndicator size=\"small\" color={theme.accentInk} />\n ) : (\n <Text style={[styles.checkText, { color: theme.accentInk }]}>Check</Text>\n )}\n </Tap>\n </View>\n <Text style={[styles.help, { color: theme.muted }]}>\n From another app builder: use its GitHub sync to put your app on GitHub, then paste the\n repository's address here.\n </Text>\n {result && !result.ok ? (\n <Text style={[styles.help, { color: theme.crit }]}>{result.message}</Text>\n ) : null}\n {result?.ok ? (\n <View style={[styles.card, { borderColor: theme.border }]} testID=\"webbuilder-import-found\">\n <View style={styles.checkRow}>\n <MaterialCommunityIcons name=\"source-repository\" size={22} color={theme.good} />\n <View style={styles.rowText}>\n <Text style={[styles.rowLabel, { color: theme.ink }]}>\n {result.ref.owner}/{result.name}\n </Text>\n <Text style={[styles.rowHint, { color: theme.muted }]}>\n Branch {result.ref.branch}\n {result.description ? ` · ${result.description}` : ''}\n </Text>\n </View>\n </View>\n <PrimaryButton\n label=\"Import\"\n icon=\"download\"\n onPress={() => {\n onClose();\n onImport(importTurn(result.ref));\n }}\n theme={theme}\n testID=\"webbuilder-import-start\"\n />\n </View>\n ) : null}\n </ScrollView>\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create({\n scroll: { flexGrow: 0 },\n menuBody: { paddingBottom: 12 },\n body: { gap: 12, paddingBottom: 12 },\n row: { flexDirection: 'row', alignItems: 'center', gap: 12, paddingVertical: 12, minHeight: 52 },\n rowText: { flex: 1 },\n rowLabel: { fontSize: 16, fontWeight: '500' },\n rowHint: { fontSize: 13, marginTop: 2, lineHeight: 18 },\n sub: { marginLeft: 10, paddingLeft: 12, borderLeftWidth: StyleSheet.hairlineWidth },\n divider: { height: StyleSheet.hairlineWidth, marginVertical: 6 },\n section: { fontSize: 12, fontWeight: '700', letterSpacing: 0.6, paddingTop: 10, paddingBottom: 2 },\n label: { fontSize: 14, fontWeight: '600' },\n labelRow: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' },\n input: { borderWidth: 1.5, borderRadius: 12, paddingHorizontal: 14, paddingVertical: 12, fontSize: 16 },\n area: { minHeight: 160 },\n help: { fontSize: 13, lineHeight: 18 },\n center: { textAlign: 'center' },\n danger: { flexDirection: 'row', alignItems: 'center', gap: 8, alignSelf: 'flex-start', paddingVertical: 8 },\n dangerText: { fontSize: 15, fontWeight: '600' },\n card: { gap: 10, padding: 12, borderRadius: 12, borderWidth: StyleSheet.hairlineWidth },\n checkRow: { flexDirection: 'row', alignItems: 'flex-start', gap: 10 },\n back: { flexDirection: 'row', alignItems: 'center', gap: 2, alignSelf: 'flex-start', paddingVertical: 4 },\n backText: { fontSize: 15, fontWeight: '600' },\n search: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n borderWidth: 1.5,\n borderRadius: 12,\n paddingHorizontal: 12,\n minHeight: 48,\n },\n searchInput: { flex: 1, fontSize: 16, paddingVertical: 10 },\n list: { maxHeight: 420 },\n aiCard: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n padding: 12,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n marginBottom: 4,\n },\n logo: { width: 34, height: 34, borderRadius: 8 },\n logoBlank: { alignItems: 'center', justifyContent: 'center' },\n spin: { paddingVertical: 20 },\n empty: { alignItems: 'center', gap: 8, paddingVertical: 24 },\n emptyTitle: { fontSize: 16, fontWeight: '700' },\n inline: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n grow: { flex: 1 },\n checkBtn: {\n minHeight: 48,\n paddingHorizontal: 16,\n borderRadius: 12,\n alignItems: 'center',\n justifyContent: 'center',\n },\n checkText: { fontSize: 15, fontWeight: '700' },\n disabled: { opacity: 0.5 },\n});\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {memo,useMemo,useState,useEffect,useRef}from'react';import {View,StyleSheet,Text,ActivityIndicator,Platform,ActionSheetIOS,Alert,FlatList,TextInput,Linking,Share}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {WebView}from'react-native-webview';import {Tap,DIM}from'../../inbox/components/Tap.js';import {PreviewPlaceholder}from'./PreviewPlaceholder.js';import {CenteredState}from'./ui.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {memo,useMemo,useState,useEffect,useRef}from'react';import {View,StyleSheet,Text,ActivityIndicator,Platform,ActionSheetIOS,Alert,FlatList,TextInput,Linking,Share}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {WebView}from'react-native-webview';import {Tap,DIM}from'../../inbox/components/Tap.js';import {probePreview,mayFrame}from'../previewProbe.js';import {PreviewPlaceholder}from'./PreviewPlaceholder.js';import {CenteredState}from'./ui.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -111,15 +111,27 @@ function PageThumb({
|
|
|
111
111
|
onFail
|
|
112
112
|
}) {
|
|
113
113
|
const [ready, setReady] = useState(false);
|
|
114
|
+
const [verified, setVerified] = useState(false);
|
|
114
115
|
const readyRef = useRef(false);
|
|
115
116
|
useEffect(() => {
|
|
116
117
|
readyRef.current = false;
|
|
117
118
|
setReady(false);
|
|
119
|
+
setVerified(false);
|
|
120
|
+
let live = true;
|
|
121
|
+
probePreview(uri).then((probe) => {
|
|
122
|
+
if (!live) return;
|
|
123
|
+
if (mayFrame(probe)) setVerified(true);
|
|
124
|
+
else onFail();
|
|
125
|
+
});
|
|
118
126
|
const timer = setTimeout(() => {
|
|
119
127
|
if (!readyRef.current) onFail();
|
|
120
128
|
}, THUMB_TIMEOUT_MS);
|
|
121
|
-
return () =>
|
|
129
|
+
return () => {
|
|
130
|
+
live = false;
|
|
131
|
+
clearTimeout(timer);
|
|
132
|
+
};
|
|
122
133
|
}, [uri]);
|
|
134
|
+
if (!verified) return null;
|
|
123
135
|
return /* @__PURE__ */ jsx(View, { style: [styles.pageBox, !ready && styles.hidden], pointerEvents: "none", children: /* @__PURE__ */ jsx(WebView, { source: {
|
|
124
136
|
uri
|
|
125
137
|
}, style: styles.pageWeb, scrollEnabled: false, javaScriptEnabled: true, domStorageEnabled: true, originWhitelist: ["*"], mediaPlaybackRequiresUserAction: true, onLoadEnd: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsScreen.js","sources":["../../../../src/features/webbuilder/components/ProjectsScreen.tsx"],"sourcesContent":["/**\n * Projects - every site you have built, laid out the way the Lovable app lists\n * them: a large title with search and filter, one row per project (its latest\n * screenshot, its name, whether it is live and when it last changed, a menu),\n * and \"New project\" floating above the tabs. Same list as the web's \"Your\n * builds\" (the web gallery rules), paged as you scroll.\n */\nimport React, { memo, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActionSheetIOS,\n ActivityIndicator,\n Alert,\n FlatList,\n Linking,\n Platform,\n Share,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport { WebView } from 'react-native-webview';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderProject } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { PreviewPlaceholder } from './PreviewPlaceholder';\nimport { CenteredState, type IconName } from './ui';\n\nconst GUTTER = 20;\n\ntype StatusFilter = 'all' | 'live' | 'draft';\n\n/** \"just now\", \"10 minutes ago\", \"3 hours ago\", \"yesterday\", \"12 Oct\". */\nexport function editedAgo(ms: number, now = Date.now()): string {\n if (!ms) return '';\n const min = Math.floor(Math.max(0, now - ms) / 60_000);\n if (min < 1) return 'just now';\n if (min < 60) return `${min} minute${min === 1 ? '' : 's'} ago`;\n const hours = Math.floor(min / 60);\n if (hours < 24) return `${hours} hour${hours === 1 ? '' : 's'} ago`;\n if (hours < 48) return 'yesterday';\n const d = new Date(ms);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${d.getDate()} ${months[d.getMonth()]}`;\n}\n\nfunction RoundButton({\n icon,\n label,\n active,\n onPress,\n theme,\n}: {\n icon: IconName;\n label: string;\n active: boolean;\n onPress: () => void;\n theme: WebBuilderTheme;\n}) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ selected: active }}\n style={[\n styles.round,\n {\n backgroundColor: active ? theme.accentSoft : theme.card,\n borderColor: active ? theme.accentBorder : theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name={icon} size={22} color={active ? theme.accent : theme.ink} />\n </Tap>\n );\n}\n\nfunction openMenu(project: WebBuilderProject, onOpen: () => void) {\n const actions: Array<{ label: string; run: () => void }> = [{ label: 'Open', run: onOpen }];\n if (project.previewUrl) {\n const url = project.previewUrl;\n actions.push({ label: 'Open preview in browser', run: () => Linking.openURL(url).catch(() => undefined) });\n }\n if (project.liveUrl) {\n const url = project.liveUrl;\n actions.push({\n label: 'Share live link',\n run: () => Share.share({ message: url, url }).catch(() => undefined),\n });\n }\n if (Platform.OS === 'ios') {\n ActionSheetIOS.showActionSheetWithOptions(\n {\n title: project.title,\n options: [...actions.map((a) => a.label), 'Cancel'],\n cancelButtonIndex: actions.length,\n },\n (index) => actions[index]?.run(),\n );\n return;\n }\n Alert.alert(project.title, undefined, [\n ...actions.map((a) => ({ text: a.label, onPress: a.run })),\n { text: 'Cancel', style: 'cancel' as const },\n ]);\n}\n\nconst THUMB = 84;\n/** The page is laid out at phone width, then scaled into the tile. */\nconst THUMB_PAGE = 390;\nconst THUMB_SCALE = THUMB / THUMB_PAGE;\n/** A page that has not drawn by now is treated as unavailable (a sleeping sandbox can hang). */\nconst THUMB_TIMEOUT_MS = 15_000;\n\ntype ThumbSource = { kind: 'cover' | 'page'; uri: string };\n\n/**\n * What a project's thumbnail can show, best first - the Lovable order: its cover\n * screenshot, then the published site (it does not expire), then the sandbox\n * preview. When none of them loads, the page skeleton.\n */\nexport function thumbSources(project: Pick<WebBuilderProject, 'coverUrl' | 'liveUrl' | 'previewUrl'>): ThumbSource[] {\n const out: ThumbSource[] = [];\n if (project.coverUrl) out.push({ kind: 'cover', uri: project.coverUrl });\n if (project.liveUrl) out.push({ kind: 'page', uri: project.liveUrl });\n if (project.previewUrl && project.previewUrl !== project.liveUrl)\n out.push({ kind: 'page', uri: project.previewUrl });\n return out;\n}\n\n/** The live page, scaled into the tile: untouchable, and gives up on an error or a stall. */\nfunction PageThumb({ uri, onFail }: { uri: string; onFail: () => void }) {\n const [ready, setReady] = useState(false);\n const readyRef = useRef(false);\n useEffect(() => {\n readyRef.current = false;\n setReady(false);\n const timer = setTimeout(() => {\n if (!readyRef.current) onFail();\n }, THUMB_TIMEOUT_MS);\n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uri]);\n return (\n <View style={[styles.pageBox, !ready && styles.hidden]} pointerEvents=\"none\">\n <WebView\n source={{ uri }}\n style={styles.pageWeb}\n scrollEnabled={false}\n javaScriptEnabled\n domStorageEnabled\n originWhitelist={['*']}\n mediaPlaybackRequiresUserAction\n onLoadEnd={() => {\n readyRef.current = true;\n setReady(true);\n }}\n onHttpError={(event) => {\n // A sleeping or reclaimed sandbox answers with the host's error page.\n if (event.nativeEvent.statusCode >= 400) onFail();\n }}\n onError={onFail}\n />\n </View>\n );\n}\n\n/**\n * The project's picture: cover, else the published site, else the sandbox\n * preview, else the page skeleton (expired or never built).\n */\nconst ProjectThumb = memo(function ProjectThumb({\n project,\n theme,\n}: {\n project: WebBuilderProject;\n theme: WebBuilderTheme;\n}) {\n const sources = useMemo(\n () => thumbSources(project),\n [project.coverUrl, project.liveUrl, project.previewUrl], // eslint-disable-line react-hooks/exhaustive-deps\n );\n const [index, setIndex] = useState(0);\n useEffect(() => setIndex(0), [sources]);\n const source = sources[index] ?? null;\n const next = () => setIndex((i) => i + 1);\n\n return (\n <View style={[styles.thumb, { borderColor: theme.border, backgroundColor: theme.card }]}>\n {/* The page skeleton sits underneath (the chat card's), so a row is never blank. */}\n <View style={[styles.skeletonTile, { backgroundColor: theme.stage }]}>\n <View style={styles.skeletonScale}>\n <PreviewPlaceholder theme={theme} compact />\n </View>\n </View>\n {source?.kind === 'cover' ? (\n <Image\n source={{ uri: source.uri }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n contentPosition=\"top\"\n cachePolicy=\"memory-disk\"\n recyclingKey={project.channelId}\n transition={150}\n onError={next}\n accessibilityIgnoresInvertColors\n />\n ) : null}\n {source?.kind === 'page' ? <PageThumb key={source.uri} uri={source.uri} onFail={next} /> : null}\n </View>\n );\n});\n\n/** One project row - memoised so a list refresh only redraws the rows that changed. */\nconst ProjectRow = memo(function ProjectRow({\n project,\n onOpen,\n theme,\n}: {\n project: WebBuilderProject;\n onOpen: (project: WebBuilderProject) => void;\n theme: WebBuilderTheme;\n}) {\n return (\n <Tap\n onPress={() => onOpen(project)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Open ${project.title}`}\n style={styles.row}\n pressedStyle={DIM}\n testID={`webbuilder-project-${project.channelId}`}\n >\n <ProjectThumb project={project} theme={theme} />\n <View style={styles.rowText}>\n <Text style={[styles.rowTitle, { color: theme.ink }]} numberOfLines={1}>\n {project.title}\n </Text>\n {project.building ? (\n // A turn is running on it (maybe started and left): tap to watch it again.\n <View style={styles.meta} accessibilityLabel=\"Building\">\n <ActivityIndicator size=\"small\" color={theme.accent} style={styles.buildingSpin} />\n <Text style={[styles.metaText, styles.buildingText, { color: theme.accent }]} numberOfLines={1}>\n Building…\n </Text>\n </View>\n ) : (\n <View style={styles.meta}>\n {project.liveUrl ? <View style={[styles.dot, { backgroundColor: theme.good }]} /> : null}\n <Text style={[styles.metaText, { color: theme.muted }]} numberOfLines={1}>\n {project.liveUrl ? 'Live' : 'Draft'} · {editedAgo(project.updatedAt)}\n </Text>\n </View>\n )}\n </View>\n <Tap\n onPress={() => openMenu(project, () => onOpen(project))}\n accessibilityRole=\"button\"\n accessibilityLabel={`More for ${project.title}`}\n hitSlop={8}\n style={[styles.more, { backgroundColor: theme.chip }]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"dots-horizontal\" size={20} color={theme.ink} />\n </Tap>\n </Tap>\n );\n});\n\nexport function ProjectsScreen({\n projects,\n loading,\n error,\n hasMore,\n onRefresh,\n onLoadMore,\n onOpen,\n onNewProject,\n topInset,\n bottomInset,\n theme,\n}: {\n projects: WebBuilderProject[];\n loading: boolean;\n error: string | null;\n hasMore: boolean;\n onRefresh?: () => void;\n onLoadMore?: () => void;\n onOpen: (project: WebBuilderProject) => void;\n onNewProject: () => void;\n topInset: number;\n /** Room for the floating tab bar. */\n bottomInset: number;\n theme: WebBuilderTheme;\n}) {\n const [searchOpen, setSearchOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [filterOpen, setFilterOpen] = useState(false);\n const [status, setStatus] = useState<StatusFilter>('all');\n\n const shown = useMemo(() => {\n const q = query.trim().toLowerCase();\n return projects.filter(\n (p) =>\n (!q || p.title.toLowerCase().includes(q)) &&\n (status === 'all' || (status === 'live' ? Boolean(p.liveUrl) : !p.liveUrl)),\n );\n }, [projects, query, status]);\n const filtering = Boolean(query.trim()) || status !== 'all';\n\n let empty: React.ReactElement;\n if (loading) {\n empty = (\n <View>\n {[0, 1, 2, 3].map((i) => (\n <View key={i} style={styles.row}>\n <View style={[styles.thumb, { backgroundColor: theme.chip }]} />\n <View style={styles.rowText}>\n <View style={[styles.skeletonTitle, { backgroundColor: theme.chip }]} />\n <View style={[styles.skeletonMeta, { backgroundColor: theme.chip }]} />\n </View>\n </View>\n ))}\n </View>\n );\n } else if (error) {\n empty = (\n <CenteredState\n icon=\"cloud-off-outline\"\n title=\"Your projects didn't load\"\n body={error}\n theme={theme}\n primary={onRefresh ? { label: 'Try again', icon: 'refresh', onPress: onRefresh } : undefined}\n />\n );\n } else if (filtering) {\n empty = (\n <CenteredState\n icon=\"text-search\"\n title=\"No project matches\"\n body=\"Try another name, or show all projects.\"\n theme={theme}\n secondary={{\n label: 'Show all',\n onPress: () => {\n setQuery('');\n setStatus('all');\n },\n }}\n />\n );\n } else {\n empty = (\n <CenteredState\n icon=\"folder-outline\"\n title=\"No projects yet\"\n body=\"Describe a site or start from a template. What you build shows up here, on your phone and on the web.\"\n theme={theme}\n />\n );\n }\n\n return (\n <View style={styles.fill}>\n <FlatList\n data={shown}\n keyExtractor={(p) => p.channelId}\n contentContainerStyle={[styles.content, { paddingTop: topInset, paddingBottom: bottomInset + 84 }]}\n refreshing={loading && projects.length > 0}\n onRefresh={onRefresh}\n onEndReached={hasMore && !filtering ? onLoadMore : undefined}\n onEndReachedThreshold={0.6}\n keyboardShouldPersistTaps=\"handled\"\n initialNumToRender={8}\n maxToRenderPerBatch={8}\n windowSize={7}\n removeClippedSubviews\n ListEmptyComponent={empty}\n testID=\"webbuilder-projects\"\n ListHeaderComponent={\n <View style={styles.header}>\n <View style={styles.titleRow}>\n <Text style={[styles.title, { color: theme.ink }]} accessibilityRole=\"header\">\n Projects\n </Text>\n <RoundButton\n icon=\"magnify\"\n label=\"Search projects\"\n active={searchOpen}\n onPress={() => {\n if (searchOpen) setQuery('');\n setSearchOpen((v) => !v);\n }}\n theme={theme}\n />\n <RoundButton\n icon=\"filter-variant\"\n label=\"Filter projects\"\n active={filterOpen || status !== 'all'}\n onPress={() => setFilterOpen((v) => !v)}\n theme={theme}\n />\n </View>\n {searchOpen ? (\n <View style={[styles.search, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={theme.faint} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search projects\"\n placeholderTextColor={theme.faint}\n autoFocus\n style={[styles.searchInput, { color: theme.ink }]}\n accessibilityLabel=\"Search projects\"\n />\n </View>\n ) : null}\n {filterOpen ? (\n <View style={styles.filters}>\n {(['all', 'live', 'draft'] as const).map((value) => {\n const active = status === value;\n return (\n <Tap\n key={value}\n onPress={() => setStatus(value)}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active }}\n style={[\n styles.filter,\n active\n ? { backgroundColor: theme.ink, borderColor: theme.ink }\n : { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n pressedStyle={DIM}\n >\n <Text\n style={[styles.filterLabel, { color: active ? theme.card : theme.ink }]}\n >\n {{ all: 'All', live: 'Live', draft: 'Draft' }[value]}\n </Text>\n </Tap>\n );\n })}\n </View>\n ) : null}\n </View>\n }\n renderItem={({ item }) => <ProjectRow project={item} onOpen={onOpen} theme={theme} />}\n />\n <Tap\n onPress={onNewProject}\n accessibilityRole=\"button\"\n accessibilityLabel=\"New project\"\n style={[\n styles.fab,\n {\n bottom: bottomInset + 14,\n backgroundColor: theme.ink,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n pressedStyle={DIM}\n testID=\"webbuilder-new-project\"\n >\n <MaterialCommunityIcons name=\"plus\" size={30} color={theme.card} />\n </Tap>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n buildingSpin: { transform: [{ scale: 0.8 }] },\n buildingText: { fontWeight: '600' },\n fill: { flex: 1 },\n content: { paddingHorizontal: GUTTER, flexGrow: 1 },\n header: { gap: 14, paddingBottom: 16 },\n titleRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n title: { flex: 1, fontSize: 34, lineHeight: 40, fontWeight: '800', letterSpacing: -0.8 },\n round: {\n width: 48,\n height: 48,\n borderRadius: 24,\n borderWidth: StyleSheet.hairlineWidth,\n alignItems: 'center',\n justifyContent: 'center',\n shadowOpacity: 0.08,\n shadowRadius: 10,\n shadowOffset: { width: 0, height: 4 },\n elevation: 3,\n },\n search: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n borderRadius: 14,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 12,\n },\n searchInput: { flex: 1, fontSize: 16, paddingVertical: 11 },\n filters: { flexDirection: 'row', gap: 8 },\n filter: { paddingHorizontal: 16, paddingVertical: 8, borderRadius: 999, borderWidth: StyleSheet.hairlineWidth },\n filterLabel: { fontSize: 14, fontWeight: '600' },\n row: { flexDirection: 'row', alignItems: 'center', gap: 16, paddingVertical: 10 },\n thumb: {\n width: 84,\n height: 84,\n borderRadius: 16,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n },\n skeletonTile: { ...StyleSheet.absoluteFillObject, alignItems: 'center', justifyContent: 'center' },\n // The compact skeleton is ~228pt with its padding; scaled to sit inside the 84pt tile.\n skeletonScale: { width: 228, height: 228, transform: [{ scale: 0.4 }] },\n pageBox: {\n position: 'absolute',\n width: THUMB_PAGE,\n height: THUMB_PAGE,\n left: (THUMB - THUMB_PAGE) / 2,\n top: (THUMB - THUMB_PAGE) / 2,\n transform: [{ scale: THUMB_SCALE }],\n },\n pageWeb: { flex: 1, backgroundColor: 'transparent' },\n hidden: { opacity: 0 },\n rowText: { flex: 1, gap: 4 },\n rowTitle: { fontSize: 17, fontWeight: '600', letterSpacing: -0.2 },\n meta: { flexDirection: 'row', alignItems: 'center', gap: 6 },\n dot: { width: 7, height: 7, borderRadius: 4 },\n metaText: { fontSize: 14 },\n more: { width: 40, height: 40, borderRadius: 20, alignItems: 'center', justifyContent: 'center' },\n skeletonTitle: { height: 14, width: '60%', borderRadius: 7 },\n skeletonMeta: { height: 12, width: '40%', borderRadius: 6 },\n fab: {\n position: 'absolute',\n right: 20,\n width: 64,\n height: 64,\n borderRadius: 32,\n alignItems: 'center',\n justifyContent: 'center',\n shadowOpacity: 0.22,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 8 },\n elevation: 8,\n },\n});\n"],"names":["ProjectThumb","ProjectRow"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProjectsScreen.js","sources":["../../../../src/features/webbuilder/components/ProjectsScreen.tsx"],"sourcesContent":["/**\n * Projects - every site you have built, laid out the way app builders list\n * them: a large title with search and filter, one row per project (its latest\n * screenshot, its name, whether it is live and when it last changed, a menu),\n * and \"New project\" floating above the tabs. Same list as the web's \"Your\n * builds\" (the web gallery rules), paged as you scroll.\n */\nimport React, { memo, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActionSheetIOS,\n ActivityIndicator,\n Alert,\n FlatList,\n Linking,\n Platform,\n Share,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport { WebView } from 'react-native-webview';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderProject } from '../types';\nimport { mayFrame, probePreview } from '../previewProbe';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { PreviewPlaceholder } from './PreviewPlaceholder';\nimport { CenteredState, type IconName } from './ui';\n\nconst GUTTER = 20;\n\ntype StatusFilter = 'all' | 'live' | 'draft';\n\n/** \"just now\", \"10 minutes ago\", \"3 hours ago\", \"yesterday\", \"12 Oct\". */\nexport function editedAgo(ms: number, now = Date.now()): string {\n if (!ms) return '';\n const min = Math.floor(Math.max(0, now - ms) / 60_000);\n if (min < 1) return 'just now';\n if (min < 60) return `${min} minute${min === 1 ? '' : 's'} ago`;\n const hours = Math.floor(min / 60);\n if (hours < 24) return `${hours} hour${hours === 1 ? '' : 's'} ago`;\n if (hours < 48) return 'yesterday';\n const d = new Date(ms);\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${d.getDate()} ${months[d.getMonth()]}`;\n}\n\nfunction RoundButton({\n icon,\n label,\n active,\n onPress,\n theme,\n}: {\n icon: IconName;\n label: string;\n active: boolean;\n onPress: () => void;\n theme: WebBuilderTheme;\n}) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ selected: active }}\n style={[\n styles.round,\n {\n backgroundColor: active ? theme.accentSoft : theme.card,\n borderColor: active ? theme.accentBorder : theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name={icon} size={22} color={active ? theme.accent : theme.ink} />\n </Tap>\n );\n}\n\nfunction openMenu(project: WebBuilderProject, onOpen: () => void) {\n const actions: Array<{ label: string; run: () => void }> = [{ label: 'Open', run: onOpen }];\n if (project.previewUrl) {\n const url = project.previewUrl;\n actions.push({ label: 'Open preview in browser', run: () => Linking.openURL(url).catch(() => undefined) });\n }\n if (project.liveUrl) {\n const url = project.liveUrl;\n actions.push({\n label: 'Share live link',\n run: () => Share.share({ message: url, url }).catch(() => undefined),\n });\n }\n if (Platform.OS === 'ios') {\n ActionSheetIOS.showActionSheetWithOptions(\n {\n title: project.title,\n options: [...actions.map((a) => a.label), 'Cancel'],\n cancelButtonIndex: actions.length,\n },\n (index) => actions[index]?.run(),\n );\n return;\n }\n Alert.alert(project.title, undefined, [\n ...actions.map((a) => ({ text: a.label, onPress: a.run })),\n { text: 'Cancel', style: 'cancel' as const },\n ]);\n}\n\nconst THUMB = 84;\n/** The page is laid out at phone width, then scaled into the tile. */\nconst THUMB_PAGE = 390;\nconst THUMB_SCALE = THUMB / THUMB_PAGE;\n/** A page that has not drawn by now is treated as unavailable (a sleeping sandbox can hang). */\nconst THUMB_TIMEOUT_MS = 15_000;\n\ntype ThumbSource = { kind: 'cover' | 'page'; uri: string };\n\n/**\n * What a project's thumbnail can show, best first: its cover\n * screenshot, then the published site (it does not expire), then the sandbox\n * preview. When none of them loads, the page skeleton.\n */\nexport function thumbSources(project: Pick<WebBuilderProject, 'coverUrl' | 'liveUrl' | 'previewUrl'>): ThumbSource[] {\n const out: ThumbSource[] = [];\n if (project.coverUrl) out.push({ kind: 'cover', uri: project.coverUrl });\n if (project.liveUrl) out.push({ kind: 'page', uri: project.liveUrl });\n if (project.previewUrl && project.previewUrl !== project.liveUrl)\n out.push({ kind: 'page', uri: project.previewUrl });\n return out;\n}\n\n/** The live page, scaled into the tile: untouchable, and gives up on an error or a stall. */\nfunction PageThumb({ uri, onFail }: { uri: string; onFail: () => void }) {\n const [ready, setReady] = useState(false);\n const [verified, setVerified] = useState(false);\n const readyRef = useRef(false);\n useEffect(() => {\n readyRef.current = false;\n setReady(false);\n setVerified(false);\n let live = true;\n // A known-dead sandbox is never framed (web #fbd72c42): its error page can be a 200.\n probePreview(uri).then((probe) => {\n if (!live) return;\n if (mayFrame(probe)) setVerified(true);\n else onFail();\n });\n const timer = setTimeout(() => {\n if (!readyRef.current) onFail();\n }, THUMB_TIMEOUT_MS);\n return () => {\n live = false;\n clearTimeout(timer);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uri]);\n if (!verified) return null;\n return (\n <View style={[styles.pageBox, !ready && styles.hidden]} pointerEvents=\"none\">\n <WebView\n source={{ uri }}\n style={styles.pageWeb}\n scrollEnabled={false}\n javaScriptEnabled\n domStorageEnabled\n originWhitelist={['*']}\n mediaPlaybackRequiresUserAction\n onLoadEnd={() => {\n readyRef.current = true;\n setReady(true);\n }}\n onHttpError={(event) => {\n // A sleeping or reclaimed sandbox answers with the host's error page.\n if (event.nativeEvent.statusCode >= 400) onFail();\n }}\n onError={onFail}\n />\n </View>\n );\n}\n\n/**\n * The project's picture: cover, else the published site, else the sandbox\n * preview, else the page skeleton (expired or never built).\n */\nconst ProjectThumb = memo(function ProjectThumb({\n project,\n theme,\n}: {\n project: WebBuilderProject;\n theme: WebBuilderTheme;\n}) {\n const sources = useMemo(\n () => thumbSources(project),\n [project.coverUrl, project.liveUrl, project.previewUrl], // eslint-disable-line react-hooks/exhaustive-deps\n );\n const [index, setIndex] = useState(0);\n useEffect(() => setIndex(0), [sources]);\n const source = sources[index] ?? null;\n const next = () => setIndex((i) => i + 1);\n\n return (\n <View style={[styles.thumb, { borderColor: theme.border, backgroundColor: theme.card }]}>\n {/* The page skeleton sits underneath (the chat card's), so a row is never blank. */}\n <View style={[styles.skeletonTile, { backgroundColor: theme.stage }]}>\n <View style={styles.skeletonScale}>\n <PreviewPlaceholder theme={theme} compact />\n </View>\n </View>\n {source?.kind === 'cover' ? (\n <Image\n source={{ uri: source.uri }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n contentPosition=\"top\"\n cachePolicy=\"memory-disk\"\n recyclingKey={project.channelId}\n transition={150}\n onError={next}\n accessibilityIgnoresInvertColors\n />\n ) : null}\n {source?.kind === 'page' ? <PageThumb key={source.uri} uri={source.uri} onFail={next} /> : null}\n </View>\n );\n});\n\n/** One project row - memoised so a list refresh only redraws the rows that changed. */\nconst ProjectRow = memo(function ProjectRow({\n project,\n onOpen,\n theme,\n}: {\n project: WebBuilderProject;\n onOpen: (project: WebBuilderProject) => void;\n theme: WebBuilderTheme;\n}) {\n return (\n <Tap\n onPress={() => onOpen(project)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Open ${project.title}`}\n style={styles.row}\n pressedStyle={DIM}\n testID={`webbuilder-project-${project.channelId}`}\n >\n <ProjectThumb project={project} theme={theme} />\n <View style={styles.rowText}>\n <Text style={[styles.rowTitle, { color: theme.ink }]} numberOfLines={1}>\n {project.title}\n </Text>\n {project.building ? (\n // A turn is running on it (maybe started and left): tap to watch it again.\n <View style={styles.meta} accessibilityLabel=\"Building\">\n <ActivityIndicator size=\"small\" color={theme.accent} style={styles.buildingSpin} />\n <Text style={[styles.metaText, styles.buildingText, { color: theme.accent }]} numberOfLines={1}>\n Building…\n </Text>\n </View>\n ) : (\n <View style={styles.meta}>\n {project.liveUrl ? <View style={[styles.dot, { backgroundColor: theme.good }]} /> : null}\n <Text style={[styles.metaText, { color: theme.muted }]} numberOfLines={1}>\n {project.liveUrl ? 'Live' : 'Draft'} · {editedAgo(project.updatedAt)}\n </Text>\n </View>\n )}\n </View>\n <Tap\n onPress={() => openMenu(project, () => onOpen(project))}\n accessibilityRole=\"button\"\n accessibilityLabel={`More for ${project.title}`}\n hitSlop={8}\n style={[styles.more, { backgroundColor: theme.chip }]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"dots-horizontal\" size={20} color={theme.ink} />\n </Tap>\n </Tap>\n );\n});\n\nexport function ProjectsScreen({\n projects,\n loading,\n error,\n hasMore,\n onRefresh,\n onLoadMore,\n onOpen,\n onNewProject,\n topInset,\n bottomInset,\n theme,\n}: {\n projects: WebBuilderProject[];\n loading: boolean;\n error: string | null;\n hasMore: boolean;\n onRefresh?: () => void;\n onLoadMore?: () => void;\n onOpen: (project: WebBuilderProject) => void;\n onNewProject: () => void;\n topInset: number;\n /** Room for the floating tab bar. */\n bottomInset: number;\n theme: WebBuilderTheme;\n}) {\n const [searchOpen, setSearchOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [filterOpen, setFilterOpen] = useState(false);\n const [status, setStatus] = useState<StatusFilter>('all');\n\n const shown = useMemo(() => {\n const q = query.trim().toLowerCase();\n return projects.filter(\n (p) =>\n (!q || p.title.toLowerCase().includes(q)) &&\n (status === 'all' || (status === 'live' ? Boolean(p.liveUrl) : !p.liveUrl)),\n );\n }, [projects, query, status]);\n const filtering = Boolean(query.trim()) || status !== 'all';\n\n let empty: React.ReactElement;\n if (loading) {\n empty = (\n <View>\n {[0, 1, 2, 3].map((i) => (\n <View key={i} style={styles.row}>\n <View style={[styles.thumb, { backgroundColor: theme.chip }]} />\n <View style={styles.rowText}>\n <View style={[styles.skeletonTitle, { backgroundColor: theme.chip }]} />\n <View style={[styles.skeletonMeta, { backgroundColor: theme.chip }]} />\n </View>\n </View>\n ))}\n </View>\n );\n } else if (error) {\n empty = (\n <CenteredState\n icon=\"cloud-off-outline\"\n title=\"Your projects didn't load\"\n body={error}\n theme={theme}\n primary={onRefresh ? { label: 'Try again', icon: 'refresh', onPress: onRefresh } : undefined}\n />\n );\n } else if (filtering) {\n empty = (\n <CenteredState\n icon=\"text-search\"\n title=\"No project matches\"\n body=\"Try another name, or show all projects.\"\n theme={theme}\n secondary={{\n label: 'Show all',\n onPress: () => {\n setQuery('');\n setStatus('all');\n },\n }}\n />\n );\n } else {\n empty = (\n <CenteredState\n icon=\"folder-outline\"\n title=\"No projects yet\"\n body=\"Describe a site or start from a template. What you build shows up here, on your phone and on the web.\"\n theme={theme}\n />\n );\n }\n\n return (\n <View style={styles.fill}>\n <FlatList\n data={shown}\n keyExtractor={(p) => p.channelId}\n contentContainerStyle={[styles.content, { paddingTop: topInset, paddingBottom: bottomInset + 84 }]}\n refreshing={loading && projects.length > 0}\n onRefresh={onRefresh}\n onEndReached={hasMore && !filtering ? onLoadMore : undefined}\n onEndReachedThreshold={0.6}\n keyboardShouldPersistTaps=\"handled\"\n initialNumToRender={8}\n maxToRenderPerBatch={8}\n windowSize={7}\n removeClippedSubviews\n ListEmptyComponent={empty}\n testID=\"webbuilder-projects\"\n ListHeaderComponent={\n <View style={styles.header}>\n <View style={styles.titleRow}>\n <Text style={[styles.title, { color: theme.ink }]} accessibilityRole=\"header\">\n Projects\n </Text>\n <RoundButton\n icon=\"magnify\"\n label=\"Search projects\"\n active={searchOpen}\n onPress={() => {\n if (searchOpen) setQuery('');\n setSearchOpen((v) => !v);\n }}\n theme={theme}\n />\n <RoundButton\n icon=\"filter-variant\"\n label=\"Filter projects\"\n active={filterOpen || status !== 'all'}\n onPress={() => setFilterOpen((v) => !v)}\n theme={theme}\n />\n </View>\n {searchOpen ? (\n <View style={[styles.search, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={theme.faint} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search projects\"\n placeholderTextColor={theme.faint}\n autoFocus\n style={[styles.searchInput, { color: theme.ink }]}\n accessibilityLabel=\"Search projects\"\n />\n </View>\n ) : null}\n {filterOpen ? (\n <View style={styles.filters}>\n {(['all', 'live', 'draft'] as const).map((value) => {\n const active = status === value;\n return (\n <Tap\n key={value}\n onPress={() => setStatus(value)}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active }}\n style={[\n styles.filter,\n active\n ? { backgroundColor: theme.ink, borderColor: theme.ink }\n : { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n pressedStyle={DIM}\n >\n <Text\n style={[styles.filterLabel, { color: active ? theme.card : theme.ink }]}\n >\n {{ all: 'All', live: 'Live', draft: 'Draft' }[value]}\n </Text>\n </Tap>\n );\n })}\n </View>\n ) : null}\n </View>\n }\n renderItem={({ item }) => <ProjectRow project={item} onOpen={onOpen} theme={theme} />}\n />\n <Tap\n onPress={onNewProject}\n accessibilityRole=\"button\"\n accessibilityLabel=\"New project\"\n style={[\n styles.fab,\n {\n bottom: bottomInset + 14,\n backgroundColor: theme.ink,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n pressedStyle={DIM}\n testID=\"webbuilder-new-project\"\n >\n <MaterialCommunityIcons name=\"plus\" size={30} color={theme.card} />\n </Tap>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n buildingSpin: { transform: [{ scale: 0.8 }] },\n buildingText: { fontWeight: '600' },\n fill: { flex: 1 },\n content: { paddingHorizontal: GUTTER, flexGrow: 1 },\n header: { gap: 14, paddingBottom: 16 },\n titleRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n title: { flex: 1, fontSize: 34, lineHeight: 40, fontWeight: '800', letterSpacing: -0.8 },\n round: {\n width: 48,\n height: 48,\n borderRadius: 24,\n borderWidth: StyleSheet.hairlineWidth,\n alignItems: 'center',\n justifyContent: 'center',\n shadowOpacity: 0.08,\n shadowRadius: 10,\n shadowOffset: { width: 0, height: 4 },\n elevation: 3,\n },\n search: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n borderRadius: 14,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 12,\n },\n searchInput: { flex: 1, fontSize: 16, paddingVertical: 11 },\n filters: { flexDirection: 'row', gap: 8 },\n filter: { paddingHorizontal: 16, paddingVertical: 8, borderRadius: 999, borderWidth: StyleSheet.hairlineWidth },\n filterLabel: { fontSize: 14, fontWeight: '600' },\n row: { flexDirection: 'row', alignItems: 'center', gap: 16, paddingVertical: 10 },\n thumb: {\n width: 84,\n height: 84,\n borderRadius: 16,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n },\n skeletonTile: { ...StyleSheet.absoluteFillObject, alignItems: 'center', justifyContent: 'center' },\n // The compact skeleton is ~228pt with its padding; scaled to sit inside the 84pt tile.\n skeletonScale: { width: 228, height: 228, transform: [{ scale: 0.4 }] },\n pageBox: {\n position: 'absolute',\n width: THUMB_PAGE,\n height: THUMB_PAGE,\n left: (THUMB - THUMB_PAGE) / 2,\n top: (THUMB - THUMB_PAGE) / 2,\n transform: [{ scale: THUMB_SCALE }],\n },\n pageWeb: { flex: 1, backgroundColor: 'transparent' },\n hidden: { opacity: 0 },\n rowText: { flex: 1, gap: 4 },\n rowTitle: { fontSize: 17, fontWeight: '600', letterSpacing: -0.2 },\n meta: { flexDirection: 'row', alignItems: 'center', gap: 6 },\n dot: { width: 7, height: 7, borderRadius: 4 },\n metaText: { fontSize: 14 },\n more: { width: 40, height: 40, borderRadius: 20, alignItems: 'center', justifyContent: 'center' },\n skeletonTitle: { height: 14, width: '60%', borderRadius: 7 },\n skeletonMeta: { height: 12, width: '40%', borderRadius: 6 },\n fab: {\n position: 'absolute',\n right: 20,\n width: 64,\n height: 64,\n borderRadius: 32,\n alignItems: 'center',\n justifyContent: 'center',\n shadowOpacity: 0.22,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 8 },\n elevation: 8,\n },\n});\n"],"names":["ProjectThumb","ProjectRow"],"mappings":"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"}
|