@adminide-stack/yantra-mobile 12.0.137 → 12.0.139

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.
Files changed (89) hide show
  1. package/lib/components/CustomDrawer.js +17 -1
  2. package/lib/components/CustomDrawer.js.map +1 -1
  3. package/lib/compute.js +106 -1
  4. package/lib/compute.js.map +1 -1
  5. package/lib/config/env-config.js +12 -0
  6. package/lib/config/env-config.js.map +1 -1
  7. package/lib/features/chat/ChatTranscript.js +2 -2
  8. package/lib/features/chat/ChatTranscript.js.map +1 -1
  9. package/lib/features/chat/surfaceNotes.js +4 -0
  10. package/lib/features/chat/surfaceNotes.js.map +1 -0
  11. package/lib/features/dictate/backgroundRecording.js.map +1 -1
  12. package/lib/features/dictate/useDictationRecorder.js +42 -1
  13. package/lib/features/dictate/useDictationRecorder.js.map +1 -1
  14. package/lib/features/home/useHomeWeather.js +85 -0
  15. package/lib/features/home/useHomeWeather.js.map +1 -0
  16. package/lib/features/home/weather.js +139 -0
  17. package/lib/features/home/weather.js.map +1 -0
  18. package/lib/features/notion/NotionPageView.js +819 -0
  19. package/lib/features/notion/NotionPageView.js.map +1 -0
  20. package/lib/features/notion/NotionSheets.js +452 -0
  21. package/lib/features/notion/NotionSheets.js.map +1 -0
  22. package/lib/features/notion/NotionTrashSheet.js +415 -0
  23. package/lib/features/notion/NotionTrashSheet.js.map +1 -0
  24. package/lib/features/notion/NotionWorkspaceView.js +837 -0
  25. package/lib/features/notion/NotionWorkspaceView.js.map +1 -0
  26. package/lib/features/notion/notionBlocks.js +203 -0
  27. package/lib/features/notion/notionBlocks.js.map +1 -0
  28. package/lib/features/notion/notionDocuments.js +182 -0
  29. package/lib/features/notion/notionDocuments.js.map +1 -0
  30. package/lib/features/notion/notionEditorModel.js +180 -0
  31. package/lib/features/notion/notionEditorModel.js.map +1 -0
  32. package/lib/features/notion/notionTemplates.js +406 -0
  33. package/lib/features/notion/notionTemplates.js.map +1 -0
  34. package/lib/features/notion/notionTheme.js +34 -0
  35. package/lib/features/notion/notionTheme.js.map +1 -0
  36. package/lib/features/notion/notionTrash.js +100 -0
  37. package/lib/features/notion/notionTrash.js.map +1 -0
  38. package/lib/features/notion/notionUi.js +310 -0
  39. package/lib/features/notion/notionUi.js.map +1 -0
  40. package/lib/features/notion/useNotionWorkspace.js +181 -0
  41. package/lib/features/notion/useNotionWorkspace.js.map +1 -0
  42. package/lib/features/webbuilder/buildFragments.js +15 -9
  43. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  44. package/lib/features/webbuilder/buildJob.js +3 -3
  45. package/lib/features/webbuilder/buildJob.js.map +1 -1
  46. package/lib/features/webbuilder/publicSandboxDomain.js +5 -0
  47. package/lib/features/webbuilder/publicSandboxDomain.js.map +1 -0
  48. package/lib/features/webbuilder/sandboxPublicHost.js +74 -0
  49. package/lib/features/webbuilder/sandboxPublicHost.js.map +1 -0
  50. package/lib/features/webbuilder/siteAddress.js +2 -1
  51. package/lib/features/webbuilder/siteAddress.js.map +1 -1
  52. package/lib/features/webbuilder/webbuilderPrompts.js +3 -2
  53. package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
  54. package/lib/features/webbuilder/workflow.js +2 -2
  55. package/lib/features/webbuilder/workflow.js.map +1 -1
  56. package/lib/hooks/useChatApi.js +15 -3
  57. package/lib/hooks/useChatApi.js.map +1 -1
  58. package/lib/hooks/usePrerequisiteIds.js +15 -2
  59. package/lib/hooks/usePrerequisiteIds.js.map +1 -1
  60. package/lib/routes.json +107 -0
  61. package/lib/screens/Home/HomeScreen.js +20 -5
  62. package/lib/screens/Home/HomeScreen.js.map +1 -1
  63. package/lib/screens/Home/components/HomeHero.js +117 -0
  64. package/lib/screens/Home/components/HomeHero.js.map +1 -0
  65. package/lib/screens/Home/components/HomeSuggestions.js +108 -85
  66. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  67. package/lib/screens/Home/components/HomeWash.js +44 -0
  68. package/lib/screens/Home/components/HomeWash.js.map +1 -0
  69. package/lib/screens/Home/components/homeCatalog.js +125 -0
  70. package/lib/screens/Home/components/homeCatalog.js.map +1 -0
  71. package/lib/screens/Notion/index.js +18 -0
  72. package/lib/screens/Notion/index.js.map +1 -0
  73. package/lib/screens/NotionPage/index.js +19 -0
  74. package/lib/screens/NotionPage/index.js.map +1 -0
  75. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +2 -2
  76. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  77. package/lib/screens/WebBuilderNative/useRestoredSandboxes.js +16 -8
  78. package/lib/screens/WebBuilderNative/useRestoredSandboxes.js.map +1 -1
  79. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +6 -5
  80. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -1
  81. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +5 -4
  82. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  83. package/lib/screens/WebBuilderNative/webbuilderTransport.js +4 -3
  84. package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
  85. package/lib/services/savedWorkspace.js +44 -0
  86. package/lib/services/savedWorkspace.js.map +1 -0
  87. package/lib/theme/mobileTokens.js +1 -0
  88. package/lib/theme/mobileTokens.js.map +1 -1
  89. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotionWorkspaceView.js","sources":["../../../src/features/notion/NotionWorkspaceView.tsx"],"sourcesContent":["/**\n * Native Notion workspace (browser `/notion`). The web sidebar maps to\n * phone-standard pieces:\n * - workspace menu (switch / create workspace) → bottom sheet\n * - Search + the ⌘K command palette → search mode with Quick actions\n * - Inbox / Meetings / All pages / Templates / Trash → page sheets (NotionSheets)\n * - Yantra AI → the app chat\n * - Home: greeting, quick actions, upcoming meetings, My pages\n * Pages open in the native page viewer (`MainStack.NotionPage`).\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n Alert,\n FlatList,\n KeyboardAvoidingView,\n Modal,\n Platform,\n Pressable,\n RefreshControl,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { CommonActions, useFocusEffect, useNavigation } from '@react-navigation/native';\nimport { useLazyQuery, useQuery } from '@apollo/client';\nimport { NATIVE_NOTION_INBOX_UNREAD, NATIVE_NOTION_SEARCH } from './notionDocuments';\nimport { PAGE_TYPES, greeting, nextMeetings, type NotionBlock, type NotionWorkspace } from './notionBlocks';\nimport { notionPalette, type NotionPalette } from './notionTheme';\nimport {\n EmptyState,\n Group,\n ListRow,\n PageRow,\n SectionHeader,\n SheetHeader,\n WorkspaceBadge,\n ui,\n type IconName,\n} from './notionUi';\nimport { AllPagesSheet, InboxSheet, MeetingRowView, MeetingsSheet, TemplatesSheet } from './NotionSheets';\nimport { TrashSheet } from './NotionTrashSheet';\nimport { useNotionWorkspace } from './useNotionWorkspace';\nimport { afterNativeModalClose } from '../../utils/drawerNavigation';\n\ntype Palette = NotionPalette;\ntype SheetKind = 'inbox' | 'meetings' | 'all' | 'templates' | 'trash';\n\nconst SHEET_TITLES: Record<SheetKind, string> = {\n inbox: 'Inbox',\n meetings: 'Meetings',\n all: 'All pages',\n templates: 'Templates',\n trash: 'Trash',\n};\n\n/** Tinted icon chips (one hue each, like Notion's home). */\nconst TINTS = {\n ai: { light: '#f3e8ff', dark: 'rgba(168,85,247,0.2)', fg: '#9333ea' },\n page: { light: '#fff1e6', dark: 'rgba(251,146,60,0.2)', fg: '#ea580c' },\n templates: { light: '#dcfce7', dark: 'rgba(34,197,94,0.2)', fg: '#16a34a' },\n meeting: { light: '#e0f2fe', dark: 'rgba(56,189,248,0.2)', fg: '#0284c7' },\n inbox: { light: '#fee2e2', dark: 'rgba(244,63,94,0.2)', fg: '#e11d48' },\n trash: { light: '#f5f5f4', dark: 'rgba(148,163,184,0.18)', fg: '#78716c' },\n all: { light: '#fef3c7', dark: 'rgba(245,158,11,0.2)', fg: '#d97706' },\n} as const;\ntype TintKey = keyof typeof TINTS;\n\nfunction todayLabel(date: Date = new Date()): string {\n return date.toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' });\n}\n\nexport function NotionWorkspaceView({ orgName, isDark }: { orgName: string | null; isDark: boolean }) {\n const palette = useMemo(() => notionPalette(isDark), [isDark]);\n const tint = useCallback(\n (key: TintKey) => ({ fg: TINTS[key].fg, bg: isDark ? TINTS[key].dark : TINTS[key].light }),\n [isDark],\n );\n const navigation = useNavigation<any>();\n const notion = useNotionWorkspace();\n const [searching, setSearching] = useState(false);\n const [sheet, setSheet] = useState<SheetKind | null>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n const [createOpen, setCreateOpen] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n const [busy, setBusy] = useState<'page' | 'meeting' | null>(null);\n const hasWorkspace = Boolean(notion.workspace);\n\n const unreadQuery = useQuery<{ notesInboxUnreadCount?: number }>(NATIVE_NOTION_INBOX_UNREAD, {\n fetchPolicy: 'cache-and-network',\n });\n const unread = unreadQuery.data?.notesInboxUnreadCount ?? 0;\n\n // Back from a page editor: titles, icons and new pages show without a pull-to-refresh.\n // Through a ref: `refresh` is rebuilt every render and must not re-run the focus effect.\n const refreshOnFocus = useRef<() => void>(() => undefined);\n refreshOnFocus.current = () => {\n notion.refresh().catch(() => undefined);\n unreadQuery.refetch().catch(() => undefined);\n };\n useFocusEffect(\n useCallback(() => {\n refreshOnFocus.current();\n }, []),\n );\n const upcoming = useMemo(() => nextMeetings(notion.meetings), [notion.meetings]);\n\n const navigateToPage = useCallback(\n (blockId: string) => {\n navigation.dispatch(CommonActions.navigate({ name: 'MainStack.NotionPage', params: { orgName, blockId } }));\n },\n [navigation, orgName],\n );\n\n /** Open a page from anywhere: a sheet closes first so the push lands on the stack. */\n const openPage = useCallback(\n (blockId: string) => {\n if (sheet) {\n setSheet(null);\n afterNativeModalClose(() => navigateToPage(blockId));\n } else {\n navigateToPage(blockId);\n }\n },\n [navigateToPage, sheet],\n );\n\n const askAi = useCallback(() => {\n navigation.dispatch(CommonActions.navigate({ name: 'MainStack.Chat', params: orgName ? { orgName } : {} }));\n }, [navigation, orgName]);\n\n const requireWorkspace = useCallback(() => {\n if (hasWorkspace) return true;\n setCreateOpen(true);\n return false;\n }, [hasWorkspace]);\n\n const run = useCallback(\n async (kind: 'page' | 'meeting') => {\n if (!requireWorkspace() || busy) return;\n setBusy(kind);\n try {\n const created = kind === 'page' ? await notion.createPage() : await notion.createMeeting();\n if (created?.id) openPage(created.id);\n } catch (err) {\n Alert.alert(`Couldn't create the ${kind}`, err instanceof Error ? err.message : undefined);\n } finally {\n setBusy(null);\n }\n },\n [busy, notion, openPage, requireWorkspace],\n );\n\n const openSheet = useCallback(\n (kind: SheetKind) => {\n setSearching(false);\n if (kind !== 'inbox' && kind !== 'trash' && !requireWorkspace()) return;\n setSheet(kind);\n },\n [requireWorkspace],\n );\n\n const onRefresh = useCallback(async () => {\n setRefreshing(true);\n try {\n await Promise.all([notion.refresh(), unreadQuery.refetch()]);\n } finally {\n setRefreshing(false);\n }\n }, [notion, unreadQuery]);\n\n const quickActions: Array<{ key: TintKey; label: string; icon: IconName; onPress: () => void; busy?: boolean }> = [\n { key: 'ai', label: 'Ask AI', icon: 'sparkles', onPress: askAi },\n { key: 'page', label: 'New page', icon: 'add', onPress: () => run('page'), busy: busy === 'page' },\n { key: 'templates', label: 'Templates', icon: 'albums-outline', onPress: () => openSheet('templates') },\n {\n key: 'meeting',\n label: 'Meeting',\n icon: 'calendar-outline',\n onPress: () => run('meeting'),\n busy: busy === 'meeting',\n },\n ];\n\n const browse: Array<{ key: SheetKind; icon: IconName; subtitle?: string; badge?: number }> = [\n { key: 'inbox', icon: 'notifications-outline', subtitle: 'Mentions and reminders', badge: unread },\n { key: 'meetings', icon: 'calendar-outline', subtitle: `${notion.meetings.length} meetings` },\n { key: 'all', icon: 'documents-outline', subtitle: `${notion.pages.length} pages` },\n { key: 'templates', icon: 'albums-outline', subtitle: 'Start from a ready-made page' },\n { key: 'trash', icon: 'trash-outline', subtitle: 'Restore deleted pages' },\n ];\n\n /** The web ⌘K palette's Quick actions, shown while the search field is empty. */\n const commands: Array<{ key: string; label: string; icon: IconName; tintKey: TintKey; onPress: () => void }> = [\n { key: 'new', label: 'New page', icon: 'add', tintKey: 'page', onPress: () => run('page') },\n { key: 'all', label: 'All pages', icon: 'documents-outline', tintKey: 'all', onPress: () => openSheet('all') },\n {\n key: 'trash',\n label: 'Open Trash',\n icon: 'trash-outline',\n tintKey: 'trash',\n onPress: () => openSheet('trash'),\n },\n {\n key: 'templates',\n label: 'Browse template gallery',\n icon: 'albums-outline',\n tintKey: 'templates',\n onPress: () => openSheet('templates'),\n },\n { key: 'ai', label: 'Go to Yantra AI', icon: 'sparkles', tintKey: 'ai', onPress: askAi },\n {\n key: 'meetings',\n label: 'Go to Meetings',\n icon: 'calendar-outline',\n tintKey: 'meeting',\n onPress: () => openSheet('meetings'),\n },\n ];\n\n return (\n <View style={[styles.root, { backgroundColor: palette.bg }]}>\n <View style={styles.header}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={hasWorkspace ? 'Workspace menu' : 'Create workspace'}\n onPress={() => (hasWorkspace ? setMenuOpen(true) : setCreateOpen(true))}\n style={({ pressed }) => [styles.switcher, pressed && { backgroundColor: palette.pressed }]}\n >\n <WorkspaceBadge workspace={notion.workspace} palette={palette} />\n <View style={styles.switcherText}>\n <Text numberOfLines={1} style={[styles.switcherName, { color: palette.text }]}>\n {notion.workspace?.name ?? 'No workspace'}\n </Text>\n <Text numberOfLines={1} style={[styles.switcherMeta, { color: palette.textMuted }]}>\n {hasWorkspace\n ? `${notion.pages.length} ${notion.pages.length === 1 ? 'page' : 'pages'}`\n : 'Tap to create one'}\n </Text>\n </View>\n <Ionicons name=\"chevron-down\" size={16} color={palette.textMuted} />\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={unread ? `Inbox, ${unread} unread` : 'Inbox'}\n onPress={() => openSheet('inbox')}\n style={({ pressed }) => [\n styles.iconButton,\n { backgroundColor: palette.fill },\n pressed && ui.pressedScale,\n ]}\n >\n <Ionicons name=\"notifications-outline\" size={20} color={palette.text} />\n {unread ? (\n <View style={[styles.badgeDot, { backgroundColor: palette.primary, borderColor: palette.bg }]}>\n <Text style={styles.badgeDotText}>{unread > 9 ? '9+' : unread}</Text>\n </View>\n ) : null}\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"New page\"\n onPress={() => run('page')}\n style={({ pressed }) => [\n styles.iconButton,\n { backgroundColor: palette.primary },\n pressed && ui.pressedScale,\n ]}\n >\n {busy === 'page' ? (\n <ActivityIndicator size=\"small\" color={palette.onPrimary} />\n ) : (\n <Ionicons name=\"create-outline\" size={20} color={palette.onPrimary} />\n )}\n </Pressable>\n </View>\n\n {searching ? (\n <SearchMode\n palette={palette}\n tint={tint}\n workspaceId={notion.workspace?.id ?? null}\n commands={commands}\n onOpenPage={openPage}\n onCancel={() => setSearching(false)}\n />\n ) : (\n <ScrollView\n contentContainerStyle={styles.homeContent}\n refreshControl={\n <RefreshControl refreshing={refreshing} onRefresh={onRefresh} tintColor={palette.textMuted} />\n }\n >\n <Pressable\n accessibilityRole=\"search\"\n onPress={() => setSearching(true)}\n style={[styles.searchPill, { backgroundColor: palette.fill }]}\n >\n <Ionicons name=\"search\" size={17} color={palette.textMuted} />\n <Text style={[styles.searchPlaceholder, { color: palette.textMuted }]}>\n Search pages or jump to…\n </Text>\n </Pressable>\n\n <Text style={[styles.date, { color: palette.textMuted }]}>{todayLabel().toUpperCase()}</Text>\n <Text style={[styles.greeting, { color: palette.text }]}>{greeting()}</Text>\n\n <View style={styles.actions}>\n {quickActions.map((a) => {\n const t = tint(a.key);\n return (\n <Pressable\n key={a.key}\n accessibilityRole=\"button\"\n accessibilityLabel={a.label}\n onPress={a.onPress}\n style={({ pressed }) => [\n styles.action,\n { backgroundColor: pressed ? palette.pressed : palette.card },\n ui.cardShadow,\n ]}\n >\n <View style={[styles.actionIcon, { backgroundColor: t.bg }]}>\n {a.busy ? (\n <ActivityIndicator size=\"small\" color={t.fg} />\n ) : (\n <Ionicons name={a.icon} size={20} color={t.fg} />\n )}\n </View>\n <Text numberOfLines={1} style={[styles.actionLabel, { color: palette.text }]}>\n {a.label}\n </Text>\n </Pressable>\n );\n })}\n </View>\n\n {notion.loading ? (\n <View style={styles.loading}>\n <ActivityIndicator color={palette.textMuted} />\n </View>\n ) : notion.error ? (\n <EmptyState\n palette={palette}\n icon=\"cloud-offline-outline\"\n title=\"Couldn't load your workspace\"\n text=\"Check your connection and pull down to try again.\"\n />\n ) : !hasWorkspace ? (\n <EmptyState\n palette={palette}\n icon=\"albums-outline\"\n title=\"No workspace yet\"\n text=\"Create a workspace to start organizing your pages.\"\n action={{ label: 'Create workspace', onPress: () => setCreateOpen(true) }}\n />\n ) : (\n <>\n {upcoming.length ? (\n <>\n <SectionHeader\n label=\"Upcoming meetings\"\n palette={palette}\n action={{ label: 'See all', onPress: () => openSheet('meetings') }}\n />\n <Group palette={palette}>\n {upcoming.map((m, i) => (\n <MeetingRowView\n key={m.id}\n row={m}\n palette={palette}\n onPress={() => openPage(m.id)}\n divider={i < upcoming.length - 1}\n />\n ))}\n </Group>\n </>\n ) : null}\n\n <SectionHeader label=\"Browse\" palette={palette} />\n <Group palette={palette}>\n {browse.map((b, i) => {\n const t = tint(b.key === 'meetings' ? 'meeting' : b.key);\n return (\n <ListRow\n key={b.key}\n palette={palette}\n icon={b.icon}\n iconColor={t.fg}\n iconBg={t.bg}\n title={SHEET_TITLES[b.key]}\n subtitle={b.subtitle}\n onPress={() => openSheet(b.key)}\n divider={i < browse.length - 1}\n trailing={\n b.badge ? (\n <View style={styles.trailing}>\n <View\n style={[\n styles.countBadge,\n { backgroundColor: palette.primary },\n ]}\n >\n <Text style={styles.countBadgeText}>{b.badge}</Text>\n </View>\n <Ionicons\n name=\"chevron-forward\"\n size={16}\n color={palette.textFaint}\n />\n </View>\n ) : undefined\n }\n />\n );\n })}\n </Group>\n\n <SectionHeader\n label=\"My pages\"\n count={notion.pages.length}\n palette={palette}\n action={\n notion.pages.length > 8\n ? { label: 'See all', onPress: () => openSheet('all') }\n : undefined\n }\n />\n {notion.pages.length === 0 ? (\n <EmptyState\n palette={palette}\n icon=\"document-text-outline\"\n title=\"No pages yet\"\n text=\"Start with a blank page or pick a template.\"\n action={{ label: 'New page', onPress: () => run('page'), busy: busy === 'page' }}\n />\n ) : (\n <Group palette={palette}>\n {notion.pages.slice(0, 8).map((page, i, shown) => (\n <PageRow\n key={page.id}\n page={page}\n palette={palette}\n onPress={() => openPage(page.id)}\n divider={i < shown.length - 1}\n />\n ))}\n </Group>\n )}\n </>\n )}\n </ScrollView>\n )}\n\n <Modal\n visible={sheet !== null}\n animationType=\"slide\"\n presentationStyle=\"pageSheet\"\n onRequestClose={() => setSheet(null)}\n >\n <View style={[styles.root, { backgroundColor: palette.bg }]}>\n {sheet ? (\n <>\n <SheetHeader title={SHEET_TITLES[sheet]} onDone={() => setSheet(null)} palette={palette} />\n {sheet === 'inbox' ? <InboxSheet palette={palette} onOpenPage={openPage} /> : null}\n {sheet === 'meetings' ? (\n <MeetingsSheet palette={palette} notion={notion} onOpenPage={openPage} />\n ) : null}\n {sheet === 'all' ? (\n <AllPagesSheet palette={palette} notion={notion} onOpenPage={openPage} />\n ) : null}\n {sheet === 'templates' ? (\n <TemplatesSheet palette={palette} notion={notion} onOpenPage={openPage} />\n ) : null}\n {sheet === 'trash' ? (\n <TrashSheet palette={palette} notion={notion} onOpenPage={openPage} />\n ) : null}\n </>\n ) : null}\n </View>\n </Modal>\n\n <WorkspaceMenu\n visible={menuOpen}\n palette={palette}\n workspaces={notion.workspaces}\n activeId={notion.workspace?.id ?? null}\n onClose={() => setMenuOpen(false)}\n onSelect={(id) => {\n notion.selectWorkspace(id);\n setMenuOpen(false);\n }}\n onCreate={() => {\n setMenuOpen(false);\n setCreateOpen(true);\n }}\n />\n <CreateWorkspaceSheet\n visible={createOpen}\n palette={palette}\n onClose={() => setCreateOpen(false)}\n onCreate={notion.createWorkspace}\n />\n </View>\n );\n}\n\nfunction SearchMode({\n palette,\n tint,\n workspaceId,\n commands,\n onOpenPage,\n onCancel,\n}: {\n palette: Palette;\n tint: (key: TintKey) => { fg: string; bg: string };\n workspaceId: string | null;\n commands: Array<{ key: string; label: string; icon: IconName; tintKey: TintKey; onPress: () => void }>;\n onOpenPage: (id: string) => void;\n onCancel: () => void;\n}) {\n const [text, setText] = useState('');\n const [runSearch, { data, loading, error }] = useLazyQuery<{ searchBlocks?: { results?: NotionBlock[] | null } }>(\n NATIVE_NOTION_SEARCH,\n { fetchPolicy: 'network-only' },\n );\n const query = text.trim();\n\n useEffect(() => {\n if (!query) return undefined;\n const timer = setTimeout(() => {\n runSearch({\n variables: {\n input: { query, types: PAGE_TYPES, pageSize: 30, ...(workspaceId ? { workspaceId } : {}) },\n },\n });\n }, 250);\n return () => clearTimeout(timer);\n }, [query, runSearch, workspaceId]);\n\n const results = useMemo(() => {\n const seen = new Set<string>();\n return (data?.searchBlocks?.results ?? []).filter((b) => {\n if (b.inTrash || seen.has(b.id)) return false;\n seen.add(b.id);\n return true;\n });\n }, [data]);\n\n const shownCommands = commands.filter((c) => !query || c.label.toLowerCase().includes(query.toLowerCase()));\n let hint = '';\n if (query && error) hint = 'Search failed. Try again.';\n else if (query && !loading && !results.length && !shownCommands.length) hint = 'No matching pages';\n\n return (\n <View style={ui.flex}>\n <View style={styles.searchBar}>\n <View style={[styles.searchField, { backgroundColor: palette.fill }]}>\n <Ionicons name=\"search\" size={17} color={palette.textMuted} />\n <TextInput\n value={text}\n onChangeText={setText}\n placeholder=\"Search pages, jump to, or run a command…\"\n placeholderTextColor={palette.textMuted}\n autoFocus\n autoCorrect={false}\n returnKeyType=\"search\"\n clearButtonMode=\"while-editing\"\n style={[styles.searchInput, { color: palette.text }]}\n />\n {loading ? <ActivityIndicator size=\"small\" color={palette.textMuted} /> : null}\n </View>\n <Pressable accessibilityRole=\"button\" onPress={onCancel} hitSlop={8}>\n <Text style={[styles.cancel, { color: palette.primary }]}>Cancel</Text>\n </Pressable>\n </View>\n <ScrollView keyboardShouldPersistTaps=\"handled\" contentContainerStyle={styles.searchContent}>\n {query && results.length ? (\n <>\n <Text style={[styles.searchSection, { color: palette.textMuted }]}>Pages</Text>\n <Group palette={palette}>\n {results.map((page, i) => (\n <PageRow\n key={page.id}\n page={page}\n palette={palette}\n onPress={() => onOpenPage(page.id)}\n divider={i < results.length - 1}\n />\n ))}\n </Group>\n </>\n ) : null}\n {shownCommands.length ? (\n <>\n <Text style={[styles.searchSection, { color: palette.textMuted }]}>Quick actions</Text>\n <Group palette={palette}>\n {shownCommands.map((c, i) => {\n const t = tint(c.tintKey);\n return (\n <ListRow\n key={c.key}\n palette={palette}\n icon={c.icon}\n iconColor={t.fg}\n iconBg={t.bg}\n title={c.label}\n onPress={c.onPress}\n divider={i < shownCommands.length - 1}\n />\n );\n })}\n </Group>\n </>\n ) : null}\n {hint ? (\n <Text style={[styles.hint, { color: error ? palette.danger : palette.textMuted }]}>{hint}</Text>\n ) : null}\n </ScrollView>\n </View>\n );\n}\n\nfunction WorkspaceMenu({\n visible,\n palette,\n workspaces,\n activeId,\n onClose,\n onSelect,\n onCreate,\n}: {\n visible: boolean;\n palette: Palette;\n workspaces: NotionWorkspace[];\n activeId: string | null;\n onClose: () => void;\n onSelect: (id: string) => void;\n onCreate: () => void;\n}) {\n return (\n <Modal visible={visible} transparent animationType=\"fade\" onRequestClose={onClose}>\n <Pressable style={[styles.backdrop, { backgroundColor: palette.backdrop }]} onPress={onClose}>\n <Pressable style={[styles.bottomSheet, { backgroundColor: palette.card }]}>\n <View style={[styles.grabber, { backgroundColor: palette.hairline }]} />\n <Text style={[styles.bottomSheetTitle, { color: palette.text }]}>Workspaces</Text>\n <FlatList\n data={workspaces}\n keyExtractor={(w) => w.id}\n style={[styles.menuList, { backgroundColor: palette.bg }]}\n renderItem={({ item, index }) => (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ selected: item.id === activeId }}\n onPress={() => onSelect(item.id)}\n style={({ pressed }) => [\n styles.menuRow,\n pressed && { backgroundColor: palette.pressed },\n ]}\n >\n <WorkspaceBadge workspace={item} palette={palette} size={32} />\n <View\n style={[\n styles.menuRowBody,\n index < workspaces.length - 1 && ui.hairline,\n { borderBottomColor: palette.hairline },\n ]}\n >\n <Text numberOfLines={1} style={[styles.menuRowLabel, { color: palette.text }]}>\n {item.name}\n </Text>\n {item.id === activeId ? (\n <Ionicons name=\"checkmark-circle\" size={22} color={palette.primary} />\n ) : null}\n </View>\n </Pressable>\n )}\n />\n <Pressable\n accessibilityRole=\"button\"\n onPress={onCreate}\n style={({ pressed }) => [\n styles.secondaryButton,\n { backgroundColor: palette.primarySoft },\n pressed && ui.pressedScale,\n ]}\n >\n <Ionicons name=\"add\" size={18} color={palette.primary} />\n <Text style={[styles.secondaryButtonLabel, { color: palette.primary }]}>Create workspace</Text>\n </Pressable>\n </Pressable>\n </Pressable>\n </Modal>\n );\n}\n\n/** Web \"New workspace\" dialog: a blank name becomes \"Untitled workspace\". */\nfunction CreateWorkspaceSheet({\n visible,\n palette,\n onClose,\n onCreate,\n}: {\n visible: boolean;\n palette: Palette;\n onClose: () => void;\n onCreate: (name: string) => Promise<unknown>;\n}) {\n const [name, setName] = useState('');\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n if (visible) setName('');\n }, [visible]);\n\n const submit = async () => {\n if (saving) return;\n setSaving(true);\n try {\n await onCreate(name);\n onClose();\n } catch (err) {\n Alert.alert(\"Couldn't create the workspace\", err instanceof Error ? err.message : undefined);\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Modal visible={visible} transparent animationType=\"fade\" onRequestClose={onClose}>\n <KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'padding' : undefined} style={ui.flex}>\n <Pressable style={[styles.backdrop, { backgroundColor: palette.backdrop }]} onPress={onClose}>\n <Pressable style={[styles.bottomSheet, { backgroundColor: palette.card }]}>\n <View style={[styles.grabber, { backgroundColor: palette.hairline }]} />\n <View style={[styles.dialogIcon, { backgroundColor: palette.primarySoft }]}>\n <Ionicons name=\"albums-outline\" size={26} color={palette.primary} />\n </View>\n <Text style={[styles.dialogTitle, { color: palette.text }]}>New workspace</Text>\n <Text style={[styles.dialogText, { color: palette.textMuted }]}>\n Give your workspace a name. You can change it later.\n </Text>\n <Text style={[styles.fieldLabel, { color: palette.textMuted }]}>Name</Text>\n <TextInput\n value={name}\n onChangeText={setName}\n placeholder=\"e.g. Marketing, Personal, Team Alpha\"\n placeholderTextColor={palette.textFaint}\n autoFocus\n returnKeyType=\"done\"\n onSubmitEditing={submit}\n style={[styles.dialogInput, { color: palette.text, backgroundColor: palette.fill }]}\n />\n <Text style={[styles.fieldHelp, { color: palette.textFaint }]}>\n Leave blank to use “Untitled workspace”.\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n onPress={submit}\n disabled={saving}\n style={({ pressed }) => [\n ui.primaryButton,\n styles.blockButton,\n { backgroundColor: palette.primary },\n pressed && ui.pressedScale,\n ]}\n >\n {saving ? (\n <ActivityIndicator size=\"small\" color={palette.onPrimary} />\n ) : (\n <Text style={[ui.primaryButtonLabel, { color: palette.onPrimary }]}>Create</Text>\n )}\n </Pressable>\n <Pressable accessibilityRole=\"button\" onPress={onClose} style={styles.textButton}>\n <Text style={[styles.textButtonLabel, { color: palette.textMuted }]}>Cancel</Text>\n </Pressable>\n </Pressable>\n </Pressable>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n loading: { paddingVertical: 48, alignItems: 'center' },\n\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 12,\n paddingTop: 8,\n paddingBottom: 4,\n },\n switcher: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: 10, padding: 6, borderRadius: 14 },\n switcherText: { flexShrink: 1 },\n switcherName: { fontSize: 17, fontWeight: '700', letterSpacing: -0.2 },\n switcherMeta: { fontSize: 13, marginTop: 1 },\n iconButton: { width: 40, height: 40, borderRadius: 20, alignItems: 'center', justifyContent: 'center' },\n badgeDot: {\n position: 'absolute',\n top: -2,\n right: -2,\n minWidth: 18,\n height: 18,\n paddingHorizontal: 4,\n borderRadius: 9,\n borderWidth: 2,\n alignItems: 'center',\n justifyContent: 'center',\n },\n badgeDotText: { color: '#fff', fontSize: 10, fontWeight: '800' },\n\n homeContent: { paddingHorizontal: 16, paddingTop: 8, paddingBottom: 48 },\n searchPill: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n height: 40,\n paddingHorizontal: 12,\n borderRadius: 12,\n },\n searchPlaceholder: { fontSize: 16 },\n date: { fontSize: 12, fontWeight: '600', letterSpacing: 0.6, marginTop: 24 },\n greeting: { fontSize: 32, fontWeight: '800', letterSpacing: -0.6, marginTop: 4 },\n\n actions: { flexDirection: 'row', gap: 10, marginTop: 20 },\n action: { flex: 1, alignItems: 'center', gap: 8, paddingVertical: 14, borderRadius: 16 },\n actionIcon: { width: 44, height: 44, borderRadius: 14, alignItems: 'center', justifyContent: 'center' },\n actionLabel: { fontSize: 13, fontWeight: '600' },\n\n trailing: { flexDirection: 'row', alignItems: 'center', gap: 6 },\n countBadge: {\n minWidth: 22,\n height: 22,\n paddingHorizontal: 6,\n borderRadius: 11,\n alignItems: 'center',\n justifyContent: 'center',\n },\n countBadgeText: { color: '#fff', fontSize: 12, fontWeight: '800' },\n\n searchBar: { flexDirection: 'row', alignItems: 'center', gap: 12, paddingHorizontal: 16, paddingVertical: 8 },\n searchField: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n height: 40,\n paddingHorizontal: 12,\n borderRadius: 12,\n },\n searchInput: { flex: 1, fontSize: 16, paddingVertical: 0 },\n cancel: { fontSize: 16, fontWeight: '500' },\n searchContent: { paddingHorizontal: 16, paddingBottom: 48 },\n searchSection: { fontSize: 13, fontWeight: '600', marginTop: 16, marginBottom: 8, marginLeft: 4 },\n hint: { fontSize: 15, textAlign: 'center', paddingVertical: 40 },\n\n backdrop: { flex: 1, justifyContent: 'flex-end' },\n bottomSheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 16,\n paddingTop: 8,\n paddingBottom: 36,\n },\n grabber: { alignSelf: 'center', width: 36, height: 5, borderRadius: 3, marginBottom: 12 },\n bottomSheetTitle: { fontSize: 20, fontWeight: '700', marginBottom: 12, marginLeft: 4 },\n menuList: { borderRadius: 16, maxHeight: 320, flexGrow: 0 },\n menuRow: { flexDirection: 'row', alignItems: 'center', paddingLeft: 12 },\n menuRowBody: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginLeft: 12,\n paddingRight: 12,\n paddingVertical: 14,\n },\n menuRowLabel: { flex: 1, fontSize: 16, fontWeight: '600' },\n secondaryButton: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n minHeight: 48,\n marginTop: 14,\n borderRadius: 14,\n },\n secondaryButtonLabel: { fontSize: 16, fontWeight: '700' },\n\n dialogIcon: {\n alignSelf: 'center',\n width: 60,\n height: 60,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: 4,\n },\n dialogTitle: { fontSize: 20, fontWeight: '700', textAlign: 'center', marginTop: 14 },\n dialogText: { fontSize: 15, textAlign: 'center', marginTop: 6 },\n fieldLabel: { fontSize: 13, fontWeight: '600', marginTop: 20, marginBottom: 6, marginLeft: 2 },\n dialogInput: { fontSize: 16, height: 48, paddingHorizontal: 14, borderRadius: 12 },\n fieldHelp: { fontSize: 13, marginTop: 6, marginLeft: 2 },\n blockButton: { alignSelf: 'stretch' },\n textButton: { alignItems: 'center', paddingVertical: 12, marginTop: 4 },\n textButtonLabel: { fontSize: 16, fontWeight: '600' },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const PAGE_TYPES = ["page", "database"];
21
+ function richTextToPlain(value) {
22
+ if (typeof value === "string") return value;
23
+ if (!Array.isArray(value)) return "";
24
+ return value.map((rt) => {
25
+ var _a;
26
+ return (rt == null ? void 0 : rt.plainText) || ((_a = rt == null ? void 0 : rt.text) == null ? void 0 : _a.content) || "";
27
+ }).join("");
28
+ }
29
+ function blockTitle(block) {
30
+ var _a;
31
+ return richTextToPlain((_a = block == null ? void 0 : block.properties) == null ? void 0 : _a.title);
32
+ }
33
+ function pageTitle(block) {
34
+ return blockTitle(block).trim() || "Untitled";
35
+ }
36
+ function blockIcon(block) {
37
+ var _a;
38
+ const icon = (_a = block == null ? void 0 : block.properties) == null ? void 0 : _a.icon;
39
+ if (typeof icon === "string") return icon || null;
40
+ return typeof (icon == null ? void 0 : icon.emoji) === "string" && icon.emoji ? icon.emoji : null;
41
+ }
42
+ function workspaceIcon(workspace) {
43
+ var _a;
44
+ const emoji = (_a = workspace == null ? void 0 : workspace.icon) == null ? void 0 : _a.emoji;
45
+ return typeof emoji === "string" && emoji ? emoji : null;
46
+ }
47
+ function toTitleProperty(text) {
48
+ return [{
49
+ type: "text",
50
+ text: {
51
+ content: text
52
+ },
53
+ plainText: text,
54
+ annotations: {}
55
+ }];
56
+ }
57
+ function greeting(date = /* @__PURE__ */ new Date()) {
58
+ const h = date.getHours();
59
+ if (h < 5) return "Working late";
60
+ if (h < 12) return "Good morning";
61
+ if (h < 18) return "Good afternoon";
62
+ return "Good evening";
63
+ }
64
+ function isPageBlock(block) {
65
+ return Boolean(block && PAGE_TYPES.includes(block.type));
66
+ }
67
+ function timeOf(value) {
68
+ const t = value ? Date.parse(value) : NaN;
69
+ return Number.isFinite(t) ? t : 0;
70
+ }
71
+ function pageKindOf(properties) {
72
+ const k = properties == null ? void 0 : properties.kind;
73
+ return k === "agent" || k === "meeting" ? k : "page";
74
+ }
75
+ function isHiddenListingBlock(properties) {
76
+ return !!properties && (properties.hidden === true || properties.notesTemplateLibrary === true || properties.notesSettings === true);
77
+ }
78
+ function livePagesByRecent(blocks) {
79
+ return blocks.filter((b) => isPageBlock(b) && !b.inTrash && !b.archived && !isHiddenListingBlock(b.properties)).sort((a, b) => timeOf(b.lastEditedTime) - timeOf(a.lastEditedTime));
80
+ }
81
+ function editedLabel(value, now = Date.now()) {
82
+ const t = timeOf(value);
83
+ if (!t) return "";
84
+ const mins = Math.max(0, Math.round((now - t) / 6e4));
85
+ if (mins < 1) return "Edited just now";
86
+ if (mins < 60) return `Edited ${mins}m ago`;
87
+ const hours = Math.round(mins / 60);
88
+ if (hours < 24) return `Edited ${hours}h ago`;
89
+ const days = Math.round(hours / 24);
90
+ if (days < 30) return `Edited ${days}d ago`;
91
+ return `Edited ${new Date(t).toLocaleDateString()}`;
92
+ }
93
+ const MEETING_STATUS_LABEL = {
94
+ scheduled: "Scheduled",
95
+ live: "Live",
96
+ ended: "Ended"
97
+ };
98
+ function meetingStatusOf(meta, startsAt, now) {
99
+ const s = meta == null ? void 0 : meta.status;
100
+ if (s === "live" || s === "ended") return s;
101
+ return startsAt > now ? "scheduled" : "ended";
102
+ }
103
+ function meetingRowOf(block, now = Date.now()) {
104
+ var _a, _b, _c, _d;
105
+ if (!(block == null ? void 0 : block.id) || pageKindOf(block.properties) !== "meeting" || block.inTrash) return null;
106
+ const meta = (_b = (_a = block.properties) == null ? void 0 : _a.meeting) != null ? _b : void 0;
107
+ const startsAt = Date.parse((_c = meta == null ? void 0 : meta.startsAt) != null ? _c : "") || Date.parse((_d = block.createdTime) != null ? _d : "") || 0;
108
+ const attendees = Array.isArray(meta == null ? void 0 : meta.attendees) ? meta.attendees.filter((a) => typeof a === "string" && !!a.trim()) : [];
109
+ const icon = blockIcon(block);
110
+ return __spreadProps(__spreadValues({
111
+ id: block.id,
112
+ title: blockTitle(block).trim() || "Untitled meeting"
113
+ }, icon ? {
114
+ icon
115
+ } : {}), {
116
+ startsAt,
117
+ attendees,
118
+ status: meetingStatusOf(meta, startsAt, now)
119
+ });
120
+ }
121
+ function startOfDay(ms) {
122
+ const d = new Date(ms);
123
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
124
+ }
125
+ function groupMeetings(rows, now = Date.now()) {
126
+ const dayStart = startOfDay(now);
127
+ const dayEnd = dayStart + 24 * 60 * 60 * 1e3;
128
+ const today = [];
129
+ const upcoming = [];
130
+ const past = [];
131
+ rows.forEach((r) => {
132
+ if (r.status === "live" || r.startsAt >= dayStart && r.startsAt < dayEnd) today.push(r);
133
+ else if (r.startsAt >= dayEnd) upcoming.push(r);
134
+ else past.push(r);
135
+ });
136
+ today.sort((a, b) => a.startsAt - b.startsAt);
137
+ upcoming.sort((a, b) => a.startsAt - b.startsAt);
138
+ past.sort((a, b) => b.startsAt - a.startsAt);
139
+ return {
140
+ today,
141
+ upcoming,
142
+ past
143
+ };
144
+ }
145
+ function nextMeetings(rows, now = Date.now(), limit = 3) {
146
+ return rows.filter((r) => r.status === "live" || r.startsAt >= now).sort((a, b) => a.startsAt - b.startsAt).slice(0, limit);
147
+ }
148
+ function formatMeetingWhen(ms, now = Date.now()) {
149
+ if (!ms) return "No date";
150
+ const d = new Date(ms);
151
+ const time = d.toLocaleTimeString(void 0, {
152
+ hour: "numeric",
153
+ minute: "2-digit"
154
+ });
155
+ const dayDiff = Math.round((startOfDay(ms) - startOfDay(now)) / (24 * 60 * 60 * 1e3));
156
+ if (dayDiff === 0) return `Today \xB7 ${time}`;
157
+ if (dayDiff === 1) return `Tomorrow \xB7 ${time}`;
158
+ if (dayDiff === -1) return `Yesterday \xB7 ${time}`;
159
+ const sameYear = d.getFullYear() === new Date(now).getFullYear();
160
+ const date = d.toLocaleDateString(void 0, __spreadValues({
161
+ weekday: "short",
162
+ month: "short",
163
+ day: "numeric"
164
+ }, sameYear ? {} : {
165
+ year: "numeric"
166
+ }));
167
+ return `${date} \xB7 ${time}`;
168
+ }
169
+ function newMeetingProperties(start = /* @__PURE__ */ new Date()) {
170
+ const title = `Meeting \u2014 ${start.toLocaleDateString(void 0, {
171
+ month: "short",
172
+ day: "numeric"
173
+ })}`;
174
+ return {
175
+ title: toTitleProperty(title),
176
+ icon: {
177
+ type: "emoji",
178
+ emoji: "\u{1F5D3}\uFE0F"
179
+ },
180
+ kind: "meeting",
181
+ section: "private",
182
+ meeting: {
183
+ startsAt: start.toISOString(),
184
+ attendees: [],
185
+ status: "scheduled"
186
+ }
187
+ };
188
+ }
189
+ function meetingEmbedChild() {
190
+ return {
191
+ type: "embed",
192
+ properties: {
193
+ embedType: "form",
194
+ widgetKey: "TriliumMeetingWidget",
195
+ fieldSchema: {
196
+ type: "string",
197
+ title: "AI Meeting Notes",
198
+ description: "Meeting notes (JSON)"
199
+ },
200
+ value: ""
201
+ }
202
+ };
203
+ }export{MEETING_STATUS_LABEL,PAGE_TYPES,blockIcon,blockTitle,editedLabel,formatMeetingWhen,greeting,groupMeetings,isHiddenListingBlock,isPageBlock,livePagesByRecent,meetingEmbedChild,meetingRowOf,newMeetingProperties,nextMeetings,pageKindOf,pageTitle,richTextToPlain,toTitleProperty,workspaceIcon};//# sourceMappingURL=notionBlocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notionBlocks.js","sources":["../../../src/features/notion/notionBlocks.ts"],"sourcesContent":["/**\n * Notion block helpers shared by the native workspace and page viewer. Mirrors\n * the web workspace (forms-stack `notion-api/browser`): a block's title is the\n * rich-text array in `properties.title`, its icon is `properties.icon.emoji`.\n *\n * Pure: no RN imports, so it runs under jest as-is.\n */\n\nexport interface NotionBlockParent {\n id: string;\n type: string;\n}\n\nexport interface NotionBlock {\n id: string;\n type: string;\n properties?: Record<string, unknown> | null;\n content?: string[] | null;\n parent?: NotionBlockParent | null;\n workspaceId?: string | null;\n lastEditedTime?: string | null;\n createdTime?: string | null;\n inTrash?: boolean | null;\n archived?: boolean | null;\n rootPageId?: string | null;\n}\n\nexport interface NotionBlockTree {\n block: NotionBlock;\n children?: NotionBlockTree[] | null;\n}\n\nexport interface NotionWorkspace {\n id: string;\n name: string;\n icon?: { type?: string; emoji?: string } | null;\n}\n\n/** Blocks the workspace lists as pages (sidebar, All pages, search hits). */\nexport const PAGE_TYPES: readonly string[] = ['page', 'database'];\n\ntype RichText = { plainText?: string; text?: { content?: string } };\n\n/** Plain text of a rich-text property (`properties.title` and friends). */\nexport function richTextToPlain(value: unknown): string {\n if (typeof value === 'string') return value;\n if (!Array.isArray(value)) return '';\n return (value as RichText[]).map((rt) => rt?.plainText || rt?.text?.content || '').join('');\n}\n\nexport function blockTitle(block: Pick<NotionBlock, 'properties'> | null | undefined): string {\n return richTextToPlain(block?.properties?.title);\n}\n\n/** What a page shows when it has no title yet. */\nexport function pageTitle(block: Pick<NotionBlock, 'properties'> | null | undefined): string {\n return blockTitle(block).trim() || 'Untitled';\n}\n\nexport function blockIcon(block: Pick<NotionBlock, 'properties'> | null | undefined): string | null {\n const icon = block?.properties?.icon as { emoji?: unknown } | string | null | undefined;\n if (typeof icon === 'string') return icon || null;\n return typeof icon?.emoji === 'string' && icon.emoji ? icon.emoji : null;\n}\n\nexport function workspaceIcon(workspace: NotionWorkspace | null | undefined): string | null {\n const emoji = workspace?.icon?.emoji;\n return typeof emoji === 'string' && emoji ? emoji : null;\n}\n\n/** The web's title property shape (NotionWorkspacePage `toTitleProperty`). */\nexport function toTitleProperty(text: string): Array<Record<string, unknown>> {\n return [{ type: 'text', text: { content: text }, plainText: text, annotations: {} }];\n}\n\n/** The web home's greeting (NotionEmptyState). */\nexport function greeting(date: Date = new Date()): string {\n const h = date.getHours();\n if (h < 5) return 'Working late';\n if (h < 12) return 'Good morning';\n if (h < 18) return 'Good afternoon';\n return 'Good evening';\n}\n\nexport function isPageBlock(block: Pick<NotionBlock, 'type'> | null | undefined): boolean {\n return Boolean(block && PAGE_TYPES.includes(block.type));\n}\n\nfunction timeOf(value: string | null | undefined): number {\n const t = value ? Date.parse(value) : NaN;\n return Number.isFinite(t) ? t : 0;\n}\n\ntype Props = Record<string, unknown> | null | undefined;\n\n/** What a root page is (web utils/pageKinds): meetings and agents list apart from My pages. */\nexport type PageKind = 'page' | 'agent' | 'meeting';\n\nexport function pageKindOf(properties: Props): PageKind {\n const k = properties?.kind;\n return k === 'agent' || k === 'meeting' ? k : 'page';\n}\n\n/**\n * Blocks the web shell never lists: the user-template library page, the settings page and\n * internal hidden blocks (an agent's Runs database).\n */\nexport function isHiddenListingBlock(properties: Props): boolean {\n return (\n !!properties &&\n (properties.hidden === true || properties.notesTemplateLibrary === true || properties.notesSettings === true)\n );\n}\n\n/** Live, listable pages only, most recently edited first. */\nexport function livePagesByRecent(blocks: readonly NotionBlock[]): NotionBlock[] {\n return blocks\n .filter((b) => isPageBlock(b) && !b.inTrash && !b.archived && !isHiddenListingBlock(b.properties))\n .sort((a, b) => timeOf(b.lastEditedTime) - timeOf(a.lastEditedTime));\n}\n\n/** \"Edited 5m ago\" style label; empty when the time is unknown. */\nexport function editedLabel(value: string | null | undefined, now: number = Date.now()): string {\n const t = timeOf(value);\n if (!t) return '';\n const mins = Math.max(0, Math.round((now - t) / 60000));\n if (mins < 1) return 'Edited just now';\n if (mins < 60) return `Edited ${mins}m ago`;\n const hours = Math.round(mins / 60);\n if (hours < 24) return `Edited ${hours}h ago`;\n const days = Math.round(hours / 24);\n if (days < 30) return `Edited ${days}d ago`;\n return `Edited ${new Date(t).toLocaleDateString()}`;\n}\n\n/** One rendered line of a page body: the block plus its list/nesting context. */\nexport interface PageLine {\n block: NotionBlock;\n depth: number;\n /** 1-based position within a run of numbered_list siblings. */\n number?: number;\n}\n\n/**\n * Flatten a page's block tree into the lines the viewer renders, depth-first.\n * Sub-pages and databases become one line (tap opens them) and are not\n * expanded; a collapsed toggle's children still show (read-only viewer).\n */\nexport function flattenPageTree(children: readonly NotionBlockTree[] | null | undefined, depth = 0): PageLine[] {\n const lines: PageLine[] = [];\n let run = 0;\n for (const node of children ?? []) {\n const block = node?.block;\n if (block && !block.inTrash && !block.archived) {\n run = block.type === 'numbered_list' ? run + 1 : 0;\n lines.push({ block, depth, ...(block.type === 'numbered_list' ? { number: run } : {}) });\n if (!isPageBlock(block)) lines.push(...flattenPageTree(node.children, depth + 1));\n }\n }\n return lines;\n}\n\n// ============================================================================\n// MEETINGS (web utils/pageKinds + components/api/notesSettings)\n// ============================================================================\n\nexport type MeetingStatus = 'scheduled' | 'live' | 'ended';\n\ninterface MeetingMeta {\n startsAt?: string;\n attendees?: unknown[];\n status?: MeetingStatus;\n}\n\nexport interface MeetingRow {\n id: string;\n title: string;\n icon?: string;\n /** ms since epoch: meeting.startsAt, else the page's createdTime, else 0. */\n startsAt: number;\n attendees: string[];\n status: MeetingStatus;\n}\n\nexport const MEETING_STATUS_LABEL: Record<MeetingStatus, string> = {\n scheduled: 'Scheduled',\n live: 'Live',\n ended: 'Ended',\n};\n\n/** Explicit status wins; otherwise future → scheduled, else ended. */\nfunction meetingStatusOf(meta: MeetingMeta | undefined, startsAt: number, now: number): MeetingStatus {\n const s = meta?.status;\n if (s === 'live' || s === 'ended') return s;\n return startsAt > now ? 'scheduled' : 'ended';\n}\n\nexport function meetingRowOf(block: NotionBlock, now: number = Date.now()): MeetingRow | null {\n if (!block?.id || pageKindOf(block.properties) !== 'meeting' || block.inTrash) return null;\n const meta = (block.properties?.meeting ?? undefined) as MeetingMeta | undefined;\n const startsAt = Date.parse(meta?.startsAt ?? '') || Date.parse(block.createdTime ?? '') || 0;\n const attendees = Array.isArray(meta?.attendees)\n ? meta.attendees.filter((a): a is string => typeof a === 'string' && !!a.trim())\n : [];\n const icon = blockIcon(block);\n return {\n id: block.id,\n title: blockTitle(block).trim() || 'Untitled meeting',\n ...(icon ? { icon } : {}),\n startsAt,\n attendees,\n status: meetingStatusOf(meta, startsAt, now),\n };\n}\n\nfunction startOfDay(ms: number): number {\n const d = new Date(ms);\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n}\n\n/** Today (any time today, or live) / Upcoming (soonest first) / Past (newest first). */\nexport function groupMeetings(\n rows: readonly MeetingRow[],\n now: number = Date.now(),\n): { today: MeetingRow[]; upcoming: MeetingRow[]; past: MeetingRow[] } {\n const dayStart = startOfDay(now);\n const dayEnd = dayStart + 24 * 60 * 60 * 1000;\n const today: MeetingRow[] = [];\n const upcoming: MeetingRow[] = [];\n const past: MeetingRow[] = [];\n rows.forEach((r) => {\n if (r.status === 'live' || (r.startsAt >= dayStart && r.startsAt < dayEnd)) today.push(r);\n else if (r.startsAt >= dayEnd) upcoming.push(r);\n else past.push(r);\n });\n today.sort((a, b) => a.startsAt - b.startsAt);\n upcoming.sort((a, b) => a.startsAt - b.startsAt);\n past.sort((a, b) => b.startsAt - a.startsAt);\n return { today, upcoming, past };\n}\n\n/** Meetings that haven't ended (live + still to come), soonest first. */\nexport function nextMeetings(rows: readonly MeetingRow[], now: number = Date.now(), limit = 3): MeetingRow[] {\n return rows\n .filter((r) => r.status === 'live' || r.startsAt >= now)\n .sort((a, b) => a.startsAt - b.startsAt)\n .slice(0, limit);\n}\n\nexport function formatMeetingWhen(ms: number, now: number = Date.now()): string {\n if (!ms) return 'No date';\n const d = new Date(ms);\n const time = d.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n const dayDiff = Math.round((startOfDay(ms) - startOfDay(now)) / (24 * 60 * 60 * 1000));\n if (dayDiff === 0) return `Today · ${time}`;\n if (dayDiff === 1) return `Tomorrow · ${time}`;\n if (dayDiff === -1) return `Yesterday · ${time}`;\n const sameYear = d.getFullYear() === new Date(now).getFullYear();\n const date = d.toLocaleDateString(undefined, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n ...(sameYear ? {} : { year: 'numeric' }),\n });\n return `${date} · ${time}`;\n}\n\n/** Properties of a new meeting page (web `newMeetingProperties`). */\nexport function newMeetingProperties(start: Date = new Date()): Record<string, unknown> {\n const title = `Meeting — ${start.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })}`;\n return {\n title: toTitleProperty(title),\n icon: { type: 'emoji', emoji: '🗓️' },\n kind: 'meeting',\n section: 'private',\n meeting: { startsAt: start.toISOString(), attendees: [], status: 'scheduled' },\n };\n}\n\n/** The meeting recorder widget the web puts inside every new meeting page. */\nexport function meetingEmbedChild(): { type: string; properties: Record<string, unknown> } {\n return {\n type: 'embed',\n properties: {\n embedType: 'form',\n widgetKey: 'TriliumMeetingWidget',\n fieldSchema: { type: 'string', title: 'AI Meeting Notes', description: 'Meeting notes (JSON)' },\n value: '',\n },\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ import {gql}from'@apollo/client/index.js';const BLOCK_FIELDS = gql`
2
+ fragment NativeNotionBlockFields on NotionBlock {
3
+ id
4
+ type
5
+ properties
6
+ content
7
+ parent {
8
+ type
9
+ id
10
+ }
11
+ workspaceId
12
+ createdTime
13
+ lastEditedTime
14
+ archived
15
+ inTrash
16
+ rootPageId
17
+ }
18
+ `;
19
+ const NATIVE_NOTION_WORKSPACES = gql`
20
+ query NativeNotionWorkspaces {
21
+ listWorkspaces {
22
+ id
23
+ name
24
+ icon
25
+ }
26
+ }
27
+ `;
28
+ const NATIVE_NOTION_CHILDREN = gql`
29
+ query NativeNotionChildren($blockId: String!, $startCursor: String, $pageSize: Int) {
30
+ getBlockChildren(blockId: $blockId, startCursor: $startCursor, pageSize: $pageSize) {
31
+ results {
32
+ ...NativeNotionBlockFields
33
+ }
34
+ nextCursor
35
+ hasMore
36
+ }
37
+ }
38
+ ${BLOCK_FIELDS}
39
+ `;
40
+ const NATIVE_NOTION_PAGE_TREE = gql`
41
+ query NativeNotionPageTree($input: NotionGetBlockInput!) {
42
+ getBlockTree(input: $input) {
43
+ block {
44
+ ...NativeNotionBlockFields
45
+ }
46
+ children {
47
+ block {
48
+ ...NativeNotionBlockFields
49
+ }
50
+ children {
51
+ block {
52
+ ...NativeNotionBlockFields
53
+ }
54
+ children {
55
+ block {
56
+ ...NativeNotionBlockFields
57
+ }
58
+ children {
59
+ block {
60
+ ...NativeNotionBlockFields
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ${BLOCK_FIELDS}
69
+ `;
70
+ const NATIVE_NOTION_SEARCH = gql`
71
+ query NativeNotionSearch($input: NotionSearchBlocksInput!) {
72
+ searchBlocks(input: $input) {
73
+ results {
74
+ ...NativeNotionBlockFields
75
+ }
76
+ hasMore
77
+ nextCursor
78
+ }
79
+ }
80
+ ${BLOCK_FIELDS}
81
+ `;
82
+ const NATIVE_NOTION_TRASH = gql`
83
+ query NativeNotionTrash($workspaceId: String) {
84
+ listTrash(workspaceId: $workspaceId) {
85
+ ...NativeNotionBlockFields
86
+ }
87
+ }
88
+ ${BLOCK_FIELDS}
89
+ `;
90
+ const NATIVE_NOTION_CREATE_WORKSPACE = gql`
91
+ mutation NativeNotionCreateWorkspace($input: NotionCreateWorkspaceInput!) {
92
+ createWorkspace(input: $input) {
93
+ id
94
+ name
95
+ icon
96
+ }
97
+ }
98
+ `;
99
+ const NATIVE_NOTION_CREATE_BLOCK = gql`
100
+ mutation NativeNotionCreateBlock($input: NotionCreateBlockInput!) {
101
+ createBlock(input: $input) {
102
+ ...NativeNotionBlockFields
103
+ }
104
+ }
105
+ ${BLOCK_FIELDS}
106
+ `;
107
+ const NATIVE_NOTION_UPDATE_BLOCK = gql`
108
+ mutation NativeNotionUpdateBlock($input: NotionUpdateBlockInput!) {
109
+ updateBlock(input: $input) {
110
+ ...NativeNotionBlockFields
111
+ }
112
+ }
113
+ ${BLOCK_FIELDS}
114
+ `;
115
+ const NATIVE_NOTION_DELETE_BLOCK = gql`
116
+ mutation NativeNotionDeleteBlock($blockId: String!) {
117
+ deleteBlock(blockId: $blockId)
118
+ }
119
+ `;
120
+ const NATIVE_NOTION_RESTORE_BLOCK = gql`
121
+ mutation NativeNotionRestoreBlock($blockId: String!) {
122
+ restoreBlock(blockId: $blockId) {
123
+ id
124
+ inTrash
125
+ }
126
+ }
127
+ `;
128
+ const NATIVE_NOTION_INBOX = gql`
129
+ query NativeNotionInbox($limit: Int) {
130
+ notesInbox(limit: $limit) {
131
+ id
132
+ kind
133
+ pageId
134
+ blockId
135
+ actorId
136
+ text
137
+ createdAt
138
+ dueAt
139
+ showAt
140
+ readAt
141
+ }
142
+ }
143
+ `;
144
+ const NATIVE_NOTION_INBOX_UNREAD = gql`
145
+ query NativeNotionInboxUnread {
146
+ notesInboxUnreadCount
147
+ }
148
+ `;
149
+ const NATIVE_NOTION_MARK_INBOX_READ = gql`
150
+ mutation NativeNotionMarkInboxRead($ids: [String!], $all: Boolean) {
151
+ markNotesInboxRead(ids: $ids, all: $all)
152
+ }
153
+ `;
154
+ const NATIVE_NOTION_APPEND_CHILDREN = gql`
155
+ mutation NativeNotionAppendChildren($input: NotionAppendBlocksInput!) {
156
+ appendChildren(input: $input) {
157
+ ...NativeNotionBlockFields
158
+ }
159
+ }
160
+ ${BLOCK_FIELDS}
161
+ `;
162
+ const NATIVE_NOTION_TRANSFORM_BLOCK = gql`
163
+ mutation NativeNotionTransformBlock($blockId: String!, $newType: NotionBlockType!) {
164
+ transformBlock(blockId: $blockId, newType: $newType) {
165
+ id
166
+ type
167
+ }
168
+ }
169
+ `;
170
+ const NATIVE_NOTION_BLOCK = gql`
171
+ query NativeNotionBlock($input: NotionGetBlockInput!) {
172
+ getBlock(input: $input) {
173
+ ...NativeNotionBlockFields
174
+ }
175
+ }
176
+ ${BLOCK_FIELDS}
177
+ `;
178
+ const NATIVE_NOTION_PERMANENTLY_DELETE = gql`
179
+ mutation NativeNotionPermanentlyDelete($blockId: String!) {
180
+ permanentlyDeleteBlock(blockId: $blockId)
181
+ }
182
+ `;export{NATIVE_NOTION_APPEND_CHILDREN,NATIVE_NOTION_BLOCK,NATIVE_NOTION_CHILDREN,NATIVE_NOTION_CREATE_BLOCK,NATIVE_NOTION_CREATE_WORKSPACE,NATIVE_NOTION_DELETE_BLOCK,NATIVE_NOTION_INBOX,NATIVE_NOTION_INBOX_UNREAD,NATIVE_NOTION_MARK_INBOX_READ,NATIVE_NOTION_PAGE_TREE,NATIVE_NOTION_PERMANENTLY_DELETE,NATIVE_NOTION_RESTORE_BLOCK,NATIVE_NOTION_SEARCH,NATIVE_NOTION_TRANSFORM_BLOCK,NATIVE_NOTION_TRASH,NATIVE_NOTION_UPDATE_BLOCK,NATIVE_NOTION_WORKSPACES};//# sourceMappingURL=notionDocuments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notionDocuments.js","sources":["../../../src/features/notion/notionDocuments.ts"],"sourcesContent":["/**\n * GraphQL for the native Notion workspace - the same operations the web\n * workspace (forms-stack `notion-api/browser/src/graphql`) runs against the\n * main backend's block schema. Field sets are trimmed to what native renders.\n */\nimport { gql } from '@apollo/client';\n\nconst BLOCK_FIELDS = gql`\n fragment NativeNotionBlockFields on NotionBlock {\n id\n type\n properties\n content\n parent {\n type\n id\n }\n workspaceId\n createdTime\n lastEditedTime\n archived\n inTrash\n rootPageId\n }\n`;\n\nexport const NATIVE_NOTION_WORKSPACES = gql`\n query NativeNotionWorkspaces {\n listWorkspaces {\n id\n name\n icon\n }\n }\n`;\n\nexport const NATIVE_NOTION_CHILDREN = gql`\n query NativeNotionChildren($blockId: String!, $startCursor: String, $pageSize: Int) {\n getBlockChildren(blockId: $blockId, startCursor: $startCursor, pageSize: $pageSize) {\n results {\n ...NativeNotionBlockFields\n }\n nextCursor\n hasMore\n }\n }\n ${BLOCK_FIELDS}\n`;\n\n/** A page with its body: four levels covers nested lists/toggles on a phone. */\nexport const NATIVE_NOTION_PAGE_TREE = gql`\n query NativeNotionPageTree($input: NotionGetBlockInput!) {\n getBlockTree(input: $input) {\n block {\n ...NativeNotionBlockFields\n }\n children {\n block {\n ...NativeNotionBlockFields\n }\n children {\n block {\n ...NativeNotionBlockFields\n }\n children {\n block {\n ...NativeNotionBlockFields\n }\n children {\n block {\n ...NativeNotionBlockFields\n }\n }\n }\n }\n }\n }\n }\n ${BLOCK_FIELDS}\n`;\n\nexport const NATIVE_NOTION_SEARCH = gql`\n query NativeNotionSearch($input: NotionSearchBlocksInput!) {\n searchBlocks(input: $input) {\n results {\n ...NativeNotionBlockFields\n }\n hasMore\n nextCursor\n }\n }\n ${BLOCK_FIELDS}\n`;\n\nexport const NATIVE_NOTION_TRASH = gql`\n query NativeNotionTrash($workspaceId: String) {\n listTrash(workspaceId: $workspaceId) {\n ...NativeNotionBlockFields\n }\n }\n ${BLOCK_FIELDS}\n`;\n\nexport const NATIVE_NOTION_CREATE_WORKSPACE = gql`\n mutation NativeNotionCreateWorkspace($input: NotionCreateWorkspaceInput!) {\n createWorkspace(input: $input) {\n id\n name\n icon\n }\n }\n`;\n\nexport const NATIVE_NOTION_CREATE_BLOCK = gql`\n mutation NativeNotionCreateBlock($input: NotionCreateBlockInput!) {\n createBlock(input: $input) {\n ...NativeNotionBlockFields\n }\n }\n ${BLOCK_FIELDS}\n`;\n\nexport const NATIVE_NOTION_UPDATE_BLOCK = gql`\n mutation NativeNotionUpdateBlock($input: NotionUpdateBlockInput!) {\n updateBlock(input: $input) {\n ...NativeNotionBlockFields\n }\n }\n ${BLOCK_FIELDS}\n`;\n\nexport const NATIVE_NOTION_DELETE_BLOCK = gql`\n mutation NativeNotionDeleteBlock($blockId: String!) {\n deleteBlock(blockId: $blockId)\n }\n`;\n\nexport const NATIVE_NOTION_RESTORE_BLOCK = gql`\n mutation NativeNotionRestoreBlock($blockId: String!) {\n restoreBlock(blockId: $blockId) {\n id\n inTrash\n }\n }\n`;\n\n/** Inbox: @mentions of you and your due @date reminders (web components/api/inbox). */\nexport const NATIVE_NOTION_INBOX = gql`\n query NativeNotionInbox($limit: Int) {\n notesInbox(limit: $limit) {\n id\n kind\n pageId\n blockId\n actorId\n text\n createdAt\n dueAt\n showAt\n readAt\n }\n }\n`;\n\nexport const NATIVE_NOTION_INBOX_UNREAD = gql`\n query NativeNotionInboxUnread {\n notesInboxUnreadCount\n }\n`;\n\nexport const NATIVE_NOTION_MARK_INBOX_READ = gql`\n mutation NativeNotionMarkInboxRead($ids: [String!], $all: Boolean) {\n markNotesInboxRead(ids: $ids, all: $all)\n }\n`;\n\n/** Insert blocks under a parent, right after the `after` sibling (else at the end). */\nexport const NATIVE_NOTION_APPEND_CHILDREN = gql`\n mutation NativeNotionAppendChildren($input: NotionAppendBlocksInput!) {\n appendChildren(input: $input) {\n ...NativeNotionBlockFields\n }\n }\n ${BLOCK_FIELDS}\n`;\n\nexport const NATIVE_NOTION_TRANSFORM_BLOCK = gql`\n mutation NativeNotionTransformBlock($blockId: String!, $newType: NotionBlockType!) {\n transformBlock(blockId: $blockId, newType: $newType) {\n id\n type\n }\n }\n`;\n\n/** The page itself (title, icon, edit time) - the web editor reads it with getBlock, not from the tree. */\nexport const NATIVE_NOTION_BLOCK = gql`\n query NativeNotionBlock($input: NotionGetBlockInput!) {\n getBlock(input: $input) {\n ...NativeNotionBlockFields\n }\n }\n ${BLOCK_FIELDS}\n`;\n\n/** Delete forever (Trash \"Delete forever\" / \"Empty trash\"). */\nexport const NATIVE_NOTION_PERMANENTLY_DELETE = gql`\n mutation NativeNotionPermanentlyDelete($blockId: String!) {\n permanentlyDeleteBlock(blockId: $blockId)\n }\n`;\n"],"names":[],"mappings":"0CAMA,MAAM,YAAe,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAkBd,MAAM,wBAA2B,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASjC,MAAM,sBAAyB,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAUhC,YAAY;AAAA;AAIX,MAAM,uBAA0B,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EA4BjC,YAAY;AAAA;AAEX,MAAM,oBAAuB,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAU9B,YAAY;AAAA;AAEX,MAAM,mBAAsB,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAM7B,YAAY;AAAA;AAEX,MAAM,8BAAiC,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASvC,MAAM,0BAA6B,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAMpC,YAAY;AAAA;AAEX,MAAM,0BAA6B,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAMpC,YAAY;AAAA;AAEX,MAAM,0BAA6B,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAKnC,MAAM,2BAA8B,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUpC,MAAM,mBAAsB,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB5B,MAAM,0BAA6B,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAKnC,MAAM,6BAAgC,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAOtC,MAAM,6BAAgC,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAMvC,YAAY;AAAA;AAEX,MAAM,6BAAgC,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUtC,MAAM,mBAAsB,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAM7B,YAAY;AAAA;AAIX,MAAM,gCAAmC,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA"}