@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.141

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 (220) hide show
  1. package/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/devices/bodyComposition.js +116 -0
  12. package/lib/features/devices/bodyComposition.js.map +1 -0
  13. package/lib/features/devices/readings.js.map +1 -1
  14. package/lib/features/devices/session.js +22 -2
  15. package/lib/features/devices/session.js.map +1 -1
  16. package/lib/features/discover/DiscoverArticle.js +105 -92
  17. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  18. package/lib/features/discover/DiscoverFeed.js +97 -48
  19. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  20. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  21. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  22. package/lib/features/discover/DiscoverSidebar.js +555 -0
  23. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  24. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  25. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  26. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  27. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  28. package/lib/features/discover/followUpQuery.js +42 -0
  29. package/lib/features/discover/followUpQuery.js.map +1 -0
  30. package/lib/features/discover/markets.js +37 -0
  31. package/lib/features/discover/markets.js.map +1 -0
  32. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  33. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  34. package/lib/features/discover/weather.js +42 -0
  35. package/lib/features/discover/weather.js.map +1 -0
  36. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  37. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  38. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  39. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  40. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  41. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  42. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  43. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  44. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  45. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  46. package/lib/features/notion/NotionBlockSheets.js +206 -0
  47. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  48. package/lib/features/notion/NotionBlockView.js +36 -0
  49. package/lib/features/notion/NotionBlockView.js.map +1 -0
  50. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  51. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  52. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  53. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  54. package/lib/features/notion/NotionHistorySheet.js +439 -0
  55. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  56. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  57. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  58. package/lib/features/notion/NotionMentionSheet.js +279 -0
  59. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  60. package/lib/features/notion/NotionPageMenu.js +585 -0
  61. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  62. package/lib/features/notion/NotionPageTree.js +220 -0
  63. package/lib/features/notion/NotionPageTree.js.map +1 -0
  64. package/lib/features/notion/NotionPageView.js +1253 -152
  65. package/lib/features/notion/NotionPageView.js.map +1 -1
  66. package/lib/features/notion/NotionShareSheet.js +606 -0
  67. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  68. package/lib/features/notion/NotionSheets.js +87 -15
  69. package/lib/features/notion/NotionSheets.js.map +1 -1
  70. package/lib/features/notion/NotionSidebarSections.js +492 -0
  71. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  72. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  73. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  74. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  75. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  76. package/lib/features/notion/database/DatabaseCells.js +554 -0
  77. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  78. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  79. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  80. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  81. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  82. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  83. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  84. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  85. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  86. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  87. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  88. package/lib/features/notion/database/chartData.js +89 -0
  89. package/lib/features/notion/database/chartData.js.map +1 -0
  90. package/lib/features/notion/database/chartView.js +112 -0
  91. package/lib/features/notion/database/chartView.js.map +1 -0
  92. package/lib/features/notion/database/connectorButton.js +33 -0
  93. package/lib/features/notion/database/connectorButton.js.map +1 -0
  94. package/lib/features/notion/database/databaseCalc.js +208 -0
  95. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  96. package/lib/features/notion/database/databaseCalendar.js +157 -0
  97. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  98. package/lib/features/notion/database/databaseCsv.js +98 -0
  99. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  100. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  101. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  102. package/lib/features/notion/database/databaseFilter.js +473 -0
  103. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  104. package/lib/features/notion/database/databaseFormula.js +1072 -0
  105. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  106. package/lib/features/notion/database/databaseGroup.js +151 -0
  107. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  108. package/lib/features/notion/database/databaseRollup.js +58 -0
  109. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  110. package/lib/features/notion/database/databaseTimeline.js +156 -0
  111. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  112. package/lib/features/notion/database/databaseView.js +1188 -0
  113. package/lib/features/notion/database/databaseView.js.map +1 -0
  114. package/lib/features/notion/database/databaseViews.js +310 -0
  115. package/lib/features/notion/database/databaseViews.js.map +1 -0
  116. package/lib/features/notion/database/relationSource.js +92 -0
  117. package/lib/features/notion/database/relationSource.js.map +1 -0
  118. package/lib/features/notion/database/uniqueId.js +17 -0
  119. package/lib/features/notion/database/uniqueId.js.map +1 -0
  120. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  121. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  122. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  123. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  124. package/lib/features/notion/notionCodeLanguages.js +112 -0
  125. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  126. package/lib/features/notion/notionComments.js +86 -0
  127. package/lib/features/notion/notionComments.js.map +1 -0
  128. package/lib/features/notion/notionConnections.js +74 -0
  129. package/lib/features/notion/notionConnections.js.map +1 -0
  130. package/lib/features/notion/notionDocuments.js +453 -1
  131. package/lib/features/notion/notionDocuments.js.map +1 -1
  132. package/lib/features/notion/notionEditorModel.js +142 -7
  133. package/lib/features/notion/notionEditorModel.js.map +1 -1
  134. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  135. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  136. package/lib/features/notion/notionMedia.js +119 -0
  137. package/lib/features/notion/notionMedia.js.map +1 -0
  138. package/lib/features/notion/notionMentionDate.js +32 -0
  139. package/lib/features/notion/notionMentionDate.js.map +1 -0
  140. package/lib/features/notion/notionMentionOptions.js +162 -0
  141. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  142. package/lib/features/notion/notionNotesAgent.js +445 -0
  143. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  144. package/lib/features/notion/notionPageAccess.js +168 -0
  145. package/lib/features/notion/notionPageAccess.js.map +1 -0
  146. package/lib/features/notion/notionPageActions.js +138 -0
  147. package/lib/features/notion/notionPageActions.js.map +1 -0
  148. package/lib/features/notion/notionPageHistory.js +154 -0
  149. package/lib/features/notion/notionPageHistory.js.map +1 -0
  150. package/lib/features/notion/notionPageKinds.js +200 -0
  151. package/lib/features/notion/notionPageKinds.js.map +1 -0
  152. package/lib/features/notion/notionRecents.js +48 -0
  153. package/lib/features/notion/notionRecents.js.map +1 -0
  154. package/lib/features/notion/notionRichText.js +177 -0
  155. package/lib/features/notion/notionRichText.js.map +1 -0
  156. package/lib/features/notion/notionRichTitle.js +336 -0
  157. package/lib/features/notion/notionRichTitle.js.map +1 -0
  158. package/lib/features/notion/useNotionWorkspace.js +272 -13
  159. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  160. package/lib/features/notion/usePageActions.js +155 -0
  161. package/lib/features/notion/usePageActions.js.map +1 -0
  162. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  163. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  164. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  165. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  166. package/lib/features/study/StudyAgentChatPane.js +1 -1
  167. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  168. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  169. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  170. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  171. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  172. package/lib/features/webbuilder/buildFragments.js +1 -1
  173. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  174. package/lib/features/webbuilder/codeFiles.js +302 -0
  175. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  176. package/lib/features/webbuilder/codeHighlight.js +209 -0
  177. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  178. package/lib/features/webbuilder/components/CodeView.js +682 -52
  179. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  180. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  181. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  182. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  183. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  184. package/lib/features/webbuilder/stepLabels.js +68 -0
  185. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  186. package/lib/hooks/useHostChatSteering.js +45 -0
  187. package/lib/hooks/useHostChatSteering.js.map +1 -0
  188. package/lib/screens/Chat/index.js +2 -12
  189. package/lib/screens/Chat/index.js.map +1 -1
  190. package/lib/screens/Devices/index.js +205 -3
  191. package/lib/screens/Devices/index.js.map +1 -1
  192. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  193. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  194. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  195. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  196. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  197. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  198. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  199. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  200. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  201. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  202. package/lib/screens/NotionPage/index.js +2 -2
  203. package/lib/screens/NotionPage/index.js.map +1 -1
  204. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  205. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  206. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  207. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  208. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  209. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  210. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  211. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  212. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  213. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  214. package/lib/screens/WebBuilderNative/index.js +1 -1
  215. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  216. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  217. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  218. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  219. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  220. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotionWorkspaceAdmin.js","sources":["../../../src/features/notion/NotionWorkspaceAdmin.tsx"],"sourcesContent":["/**\n * Workspace management - the web WorkspaceAdminDialogs on a phone:\n * - Settings: name and icon (emoji or image URL), Move workspace to trash;\n * - Members: names (notesUsers), role change, remove, add by email / user id with a role;\n * - Guests: people with page access only, and the pages they can see; remove.\n * Only owners / admins can change anything (web canManageWorkspace); everyone else\n * gets the same lists read-only. Server errors are shown as the server words them.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n Alert,\n KeyboardAvoidingView,\n Modal,\n Platform,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { useApolloClient, useQuery } from '@apollo/client';\nimport {\n NATIVE_NOTES_USERS,\n NATIVE_NOTES_VIEWER,\n NATIVE_NOTION_ADD_MEMBER,\n NATIVE_NOTION_GUESTS,\n NATIVE_NOTION_MEMBERS,\n NATIVE_NOTION_REMOVE_GUEST,\n NATIVE_NOTION_REMOVE_MEMBER,\n NATIVE_NOTION_UPDATE_MEMBER,\n NATIVE_NOTION_UPDATE_WORKSPACE,\n NATIVE_NOTION_WORKSPACE_DETAIL,\n} from './notionDocuments';\nimport {\n ROLE_LABEL,\n WORKSPACE_ROLES,\n canManageWorkspace,\n serverErrorText,\n viewerWorkspaceRole,\n workspaceIconInput,\n type WorkspaceMember,\n type WorkspaceRole,\n} from './notionPageActions';\nimport type { NotionPalette } from './notionTheme';\nimport { ui } from './notionUi';\nimport type { NotionWorkspaceState } from './useNotionWorkspace';\n\ntype Palette = NotionPalette;\ntype Tab = 'settings' | 'members' | 'guests';\n\ninterface NotesUser {\n id: string;\n name?: string | null;\n email?: string | null;\n}\n\ninterface WorkspaceDetail {\n id: string;\n name: string;\n icon?: { type?: string; emoji?: string; url?: string } | null;\n ownerId?: string | null;\n members?: WorkspaceMember[] | null;\n}\n\nexport function WorkspaceAdminSheet({\n visible,\n initialTab = 'settings',\n palette,\n notion,\n onClose,\n}: {\n visible: boolean;\n initialTab?: Tab;\n palette: Palette;\n notion: NotionWorkspaceState;\n onClose: () => void;\n}) {\n const [tab, setTab] = useState<Tab>(initialTab);\n useEffect(() => {\n if (visible) setTab(initialTab);\n }, [visible, initialTab]);\n const workspaceId = notion.workspace?.id ?? '';\n\n const detailQuery = useQuery<{ getWorkspace?: WorkspaceDetail | null }>(NATIVE_NOTION_WORKSPACE_DETAIL, {\n variables: { workspaceId },\n skip: !visible || !workspaceId,\n fetchPolicy: 'network-only',\n });\n const viewerQuery = useQuery<{ notesViewer?: NotesUser | null }>(NATIVE_NOTES_VIEWER, {\n skip: !visible,\n fetchPolicy: 'cache-first',\n });\n const detail = detailQuery.data?.getWorkspace ?? null;\n const role = viewerWorkspaceRole(detail, viewerQuery.data?.notesViewer ?? null);\n const manage = canManageWorkspace(role);\n\n return (\n <Modal visible={visible} animationType=\"slide\" presentationStyle=\"pageSheet\" onRequestClose={onClose}>\n <View style={[ui.flex, { backgroundColor: palette.bg }]}>\n <View style={[ui.sheetHeader, { borderBottomColor: palette.hairline }]}>\n <View style={[ui.sheetHeaderSide, ui.sheetHeaderLeft]} />\n <Text numberOfLines={1} style={[ui.sheetHeaderTitle, { color: palette.text }]}>\n {notion.workspace?.name ?? 'Workspace'}\n </Text>\n <Pressable accessibilityRole=\"button\" onPress={onClose} hitSlop={8} style={ui.sheetHeaderSide}>\n <Text style={[ui.sheetHeaderDone, { color: palette.primary }]}>Done</Text>\n </Pressable>\n </View>\n <View style={[styles.tabs, { backgroundColor: palette.fill }]}>\n {(['settings', 'members', 'guests'] as Tab[]).map((t) => (\n <Pressable\n key={t}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: tab === t }}\n onPress={() => setTab(t)}\n style={[styles.tab, tab === t && [styles.tabActive, { backgroundColor: palette.card }]]}\n >\n <Text style={[styles.tabLabel, { color: tab === t ? palette.text : palette.textMuted }]}>\n {t === 'settings' ? 'Settings' : t === 'members' ? 'Members' : 'Guests'}\n </Text>\n </Pressable>\n ))}\n </View>\n {!manage ? (\n <Text style={[styles.readOnly, { color: palette.textMuted }]}>\n {`You're ${role ? `a ${ROLE_LABEL[role].toLowerCase()}` : 'not an admin'} here — only owners and admins can change the workspace.`}\n </Text>\n ) : null}\n {visible && workspaceId ? (\n <KeyboardAvoidingView\n style={ui.flex}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n keyboardVerticalOffset={Platform.OS === 'ios' ? 80 : 0}\n >\n {tab === 'settings' ? (\n <SettingsTab\n palette={palette}\n notion={notion}\n detail={detail}\n loading={detailQuery.loading && !detail}\n manage={manage}\n onSaved={() => {\n detailQuery.refetch();\n notion.refetchWorkspaces();\n }}\n onDeleted={onClose}\n />\n ) : null}\n {tab === 'members' ? (\n <MembersTab\n palette={palette}\n workspaceId={workspaceId}\n manage={manage}\n viewer={viewerQuery.data?.notesViewer ?? null}\n onLeft={async () => {\n onClose();\n const res = await notion.refetchWorkspaces();\n const next = (res.data?.listWorkspaces ?? []).find((w) => w.id !== workspaceId);\n if (next) notion.selectWorkspace(next.id);\n }}\n />\n ) : null}\n {tab === 'guests' ? (\n <GuestsTab palette={palette} workspaceId={workspaceId} manage={manage} />\n ) : null}\n </KeyboardAvoidingView>\n ) : null}\n </View>\n </Modal>\n );\n}\n\n// ============================================================================\n// SETTINGS\n// ============================================================================\n\nfunction SettingsTab({\n palette,\n notion,\n detail,\n loading,\n manage,\n onSaved,\n onDeleted,\n}: {\n palette: Palette;\n notion: NotionWorkspaceState;\n detail: WorkspaceDetail | null;\n loading: boolean;\n manage: boolean;\n onSaved: () => void;\n onDeleted: () => void;\n}) {\n const client = useApolloClient();\n const [name, setName] = useState('');\n const [icon, setIcon] = useState('');\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState<{ text: string; error?: boolean } | null>(null);\n useEffect(() => {\n if (!detail) return;\n setName(detail.name ?? '');\n setIcon(detail.icon?.emoji ?? detail.icon?.url ?? '');\n }, [detail]);\n\n const dirty =\n !!detail &&\n (name.trim() !== (detail.name ?? '') || icon.trim() !== (detail.icon?.emoji ?? detail.icon?.url ?? ''));\n\n const save = async () => {\n if (!detail || !name.trim()) return;\n setBusy(true);\n setMessage(null);\n const iconInput = workspaceIconInput(icon);\n try {\n await client.mutate({\n mutation: NATIVE_NOTION_UPDATE_WORKSPACE,\n variables: {\n id: detail.id,\n input: { name: name.trim(), ...(iconInput ? { icon: iconInput } : { clearIcon: true }) },\n },\n errorPolicy: 'none',\n });\n setMessage({ text: 'Saved' });\n onSaved();\n } catch (err) {\n setMessage({ text: serverErrorText(err), error: true });\n } finally {\n setBusy(false);\n }\n };\n\n const remove = () => {\n if (!detail) return;\n Alert.alert(\n `Move “${detail.name}” to trash?`,\n 'Its pages go with it. This affects everyone in the workspace.',\n [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Move to trash',\n style: 'destructive',\n onPress: async () => {\n try {\n await notion.deleteWorkspace(detail.id);\n onDeleted();\n } catch (err) {\n setMessage({ text: serverErrorText(err), error: true });\n }\n },\n },\n ],\n );\n };\n\n if (loading) return <Loading palette={palette} />;\n return (\n <ScrollView contentContainerStyle={styles.content} keyboardShouldPersistTaps=\"handled\">\n <Text style={[styles.label, { color: palette.textMuted }]}>Name</Text>\n <TextInput\n value={name}\n onChangeText={setName}\n editable={manage}\n placeholder=\"Workspace name\"\n placeholderTextColor={palette.textFaint}\n style={[styles.input, { color: palette.text, backgroundColor: palette.card }]}\n />\n <Text style={[styles.label, { color: palette.textMuted }]}>Icon</Text>\n <TextInput\n value={icon}\n onChangeText={setIcon}\n editable={manage}\n placeholder=\"An emoji, or an image URL\"\n placeholderTextColor={palette.textFaint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[styles.input, { color: palette.text, backgroundColor: palette.card }]}\n />\n <Text style={[styles.help, { color: palette.textFaint }]}>Leave empty to remove the icon.</Text>\n {message ? (\n <Text style={[styles.message, { color: message.error ? palette.danger : palette.textMuted }]}>\n {message.text}\n </Text>\n ) : null}\n {manage ? (\n <Pressable\n accessibilityRole=\"button\"\n onPress={save}\n disabled={!dirty || busy || !name.trim()}\n style={[\n ui.primaryButton,\n styles.block,\n { backgroundColor: palette.primary },\n (!dirty || busy || !name.trim()) && styles.disabled,\n ]}\n >\n {busy ? (\n <ActivityIndicator size=\"small\" color={palette.onPrimary} />\n ) : (\n <Text style={[ui.primaryButtonLabel, { color: palette.onPrimary }]}>Save changes</Text>\n )}\n </Pressable>\n ) : null}\n {manage ? (\n <View style={[styles.danger, { borderColor: palette.dangerSoft }]}>\n <Text style={[styles.dangerTitle, { color: palette.text }]}>Move workspace to trash</Text>\n <Text style={[styles.help, { color: palette.textMuted }]}>\n The workspace and its pages leave everyone's sidebar.\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n onPress={remove}\n style={[styles.dangerButton, { backgroundColor: palette.dangerSoft }]}\n >\n <Text style={[styles.dangerLabel, { color: palette.danger }]}>Move to trash</Text>\n </Pressable>\n </View>\n ) : null}\n </ScrollView>\n );\n}\n\n// ============================================================================\n// MEMBERS\n// ============================================================================\n\nfunction useUserNames(ids: string[]) {\n const { data } = useQuery<{ notesUsers?: NotesUser[] | null }>(NATIVE_NOTES_USERS, {\n variables: { ids },\n skip: !ids.length,\n fetchPolicy: 'cache-first',\n });\n return useMemo(() => {\n const out = new Map<string, NotesUser>();\n (data?.notesUsers ?? []).forEach((u) => out.set(u.id, u));\n return out;\n }, [data]);\n}\n\nfunction MembersTab({\n palette,\n workspaceId,\n manage,\n viewer,\n onLeft,\n}: {\n palette: Palette;\n workspaceId: string;\n manage: boolean;\n viewer: NotesUser | null;\n onLeft: () => void;\n}) {\n const client = useApolloClient();\n const isMe = (userId: string) =>\n !!viewer &&\n [viewer.id, viewer.email].some(\n (x) => typeof x === 'string' && x.trim().toLowerCase() === userId.trim().toLowerCase(),\n );\n const { data, loading, error, refetch } = useQuery<{ notionWorkspaceMembers?: WorkspaceMember[] | null }>(\n NATIVE_NOTION_MEMBERS,\n { variables: { workspaceId }, fetchPolicy: 'network-only' },\n );\n const [members, setMembers] = useState<WorkspaceMember[] | null>(null);\n useEffect(() => setMembers(data?.notionWorkspaceMembers ?? null), [data]);\n const list = members ?? [];\n const users = useUserNames(useMemo(() => list.map((m) => m.userId), [list]));\n const [newUser, setNewUser] = useState('');\n const [newRole, setNewRole] = useState<WorkspaceRole>('member');\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n\n const run = async (key: string, mutation: typeof NATIVE_NOTION_ADD_MEMBER, field: string, variables: object) => {\n setBusy(key);\n setMessage(null);\n try {\n const res = await client.mutate({\n mutation,\n variables: { workspaceId, ...variables },\n errorPolicy: 'none',\n });\n const next = (res.data as Record<string, WorkspaceMember[] | undefined> | null)?.[field];\n if (Array.isArray(next)) setMembers(next);\n else await refetch();\n return true;\n } catch (err) {\n setMessage(serverErrorText(err));\n return false;\n } finally {\n setBusy(null);\n }\n };\n\n /** Web \"Leave\": take yourself out of the workspace (any role; the server keeps the last owner). */\n const leave = () =>\n Alert.alert('Leave this workspace?', \"You'll lose access to its pages unless someone adds you again.\", [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Leave',\n style: 'destructive',\n onPress: async () => {\n const me = list.find((m) => isMe(m.userId));\n if (!me) return;\n const ok = await run(me.userId, NATIVE_NOTION_REMOVE_MEMBER, 'removeNotionWorkspaceMember', {\n userId: me.userId,\n });\n if (ok) onLeft();\n },\n },\n ]);\n\n const memberMenu = (m: WorkspaceMember, label: string) => {\n if (isMe(m.userId)) {\n leave();\n return;\n }\n if (!manage) return;\n Alert.alert(label, `Role: ${ROLE_LABEL[m.role as WorkspaceRole] ?? m.role}`, [\n ...WORKSPACE_ROLES.filter((r) => r !== m.role).map((r) => ({\n text: `Make ${ROLE_LABEL[r].toLowerCase()}`,\n onPress: () => {\n run(m.userId, NATIVE_NOTION_UPDATE_MEMBER, 'updateNotionWorkspaceMember', {\n userId: m.userId,\n role: r,\n });\n },\n })),\n {\n text: 'Remove from workspace',\n style: 'destructive' as const,\n onPress: () => {\n run(m.userId, NATIVE_NOTION_REMOVE_MEMBER, 'removeNotionWorkspaceMember', { userId: m.userId });\n },\n },\n { text: 'Cancel', style: 'cancel' as const },\n ]);\n };\n\n if (loading && !data) return <Loading palette={palette} />;\n return (\n <ScrollView contentContainerStyle={styles.content} keyboardShouldPersistTaps=\"handled\">\n {manage ? (\n <View style={[styles.card, { backgroundColor: palette.card }]}>\n <Text style={[styles.cardTitle, { color: palette.text }]}>Add a member</Text>\n <TextInput\n value={newUser}\n onChangeText={setNewUser}\n placeholder=\"Email or user id\"\n placeholderTextColor={palette.textFaint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n keyboardType=\"email-address\"\n style={[styles.input, { color: palette.text, backgroundColor: palette.fill }]}\n />\n <View style={styles.roleRow}>\n {(['admin', 'member', 'guest'] as WorkspaceRole[]).map((r) => (\n <Pressable\n key={r}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: newRole === r }}\n onPress={() => setNewRole(r)}\n style={[\n styles.roleChip,\n { backgroundColor: newRole === r ? palette.primarySoft : palette.fill },\n ]}\n >\n <Text\n style={[\n styles.roleChipLabel,\n { color: newRole === r ? palette.primary : palette.text },\n ]}\n >\n {ROLE_LABEL[r]}\n </Text>\n </Pressable>\n ))}\n </View>\n <Pressable\n accessibilityRole=\"button\"\n disabled={!newUser.trim() || busy === 'add'}\n onPress={async () => {\n const ok = await run('add', NATIVE_NOTION_ADD_MEMBER, 'addNotionWorkspaceMember', {\n userId: newUser.trim(),\n role: newRole,\n });\n if (ok) setNewUser('');\n }}\n style={[\n ui.primaryButton,\n styles.block,\n { backgroundColor: palette.primary, marginTop: 12 },\n (!newUser.trim() || busy === 'add') && styles.disabled,\n ]}\n >\n {busy === 'add' ? (\n <ActivityIndicator size=\"small\" color={palette.onPrimary} />\n ) : (\n <Text style={[ui.primaryButtonLabel, { color: palette.onPrimary }]}>Add</Text>\n )}\n </Pressable>\n </View>\n ) : null}\n {message || error ? (\n <Text style={[styles.message, { color: palette.danger }]}>{message ?? serverErrorText(error)}</Text>\n ) : null}\n <Text style={[styles.label, { color: palette.textMuted }]}>{`${list.length} members`}</Text>\n <View style={[ui.group, { backgroundColor: palette.card }]}>\n {list.map((m, i) => {\n const u = users.get(m.userId);\n const label = u?.name?.trim() || u?.email || m.userId;\n return (\n <Pressable\n key={m.userId}\n accessibilityRole=\"button\"\n onPress={() => memberMenu(m, label)}\n disabled={!manage && !isMe(m.userId)}\n style={({ pressed }) => [styles.person, pressed && { backgroundColor: palette.pressed }]}\n >\n <Avatar palette={palette} label={label} />\n <View\n style={[\n styles.personBody,\n i < list.length - 1 && ui.hairline,\n { borderBottomColor: palette.hairline },\n ]}\n >\n <View style={ui.flex}>\n <Text numberOfLines={1} style={[styles.personName, { color: palette.text }]}>\n {label}\n {isMe(m.userId) ? ' (you)' : ''}\n </Text>\n {u?.email && u.email !== label ? (\n <Text\n numberOfLines={1}\n style={[styles.personSub, { color: palette.textMuted }]}\n >\n {u.email}\n </Text>\n ) : null}\n </View>\n {busy === m.userId ? (\n <ActivityIndicator size=\"small\" color={palette.textMuted} />\n ) : (\n <>\n <View style={[styles.rolePill, { backgroundColor: palette.fill }]}>\n <Text style={[styles.rolePillLabel, { color: palette.textMuted }]}>\n {ROLE_LABEL[m.role as WorkspaceRole] ?? m.role}\n </Text>\n </View>\n {isMe(m.userId) ? (\n <Text style={[styles.removeLabel, { color: palette.danger }]}>Leave</Text>\n ) : null}\n </>\n )}\n </View>\n </Pressable>\n );\n })}\n </View>\n </ScrollView>\n );\n}\n\n// ============================================================================\n// GUESTS\n// ============================================================================\n\ninterface Guest {\n userId: string;\n pages: Array<{ id: string; title: string; permission: string }>;\n}\n\nfunction GuestsTab({ palette, workspaceId, manage }: { palette: Palette; workspaceId: string; manage: boolean }) {\n const client = useApolloClient();\n const { data, loading, error, refetch } = useQuery<{ notionWorkspaceGuests?: Guest[] | null }>(\n NATIVE_NOTION_GUESTS,\n { variables: { workspaceId }, fetchPolicy: 'network-only' },\n );\n const guests = data?.notionWorkspaceGuests ?? [];\n const users = useUserNames(useMemo(() => guests.map((g) => g.userId), [guests]));\n const [message, setMessage] = useState<string | null>(null);\n\n const remove = (g: Guest, label: string) =>\n Alert.alert(`Remove ${label}?`, 'They lose access to every page shared with them here.', [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Remove',\n style: 'destructive',\n onPress: async () => {\n try {\n await client.mutate({\n mutation: NATIVE_NOTION_REMOVE_GUEST,\n variables: { workspaceId, userId: g.userId },\n errorPolicy: 'none',\n });\n await refetch();\n } catch (err) {\n setMessage(serverErrorText(err));\n }\n },\n },\n ]);\n\n if (loading && !data) return <Loading palette={palette} />;\n return (\n <ScrollView contentContainerStyle={styles.content}>\n <Text style={[styles.help, { color: palette.textMuted }]}>\n Guests can open only the pages shared with them.\n </Text>\n {message || error ? (\n <Text style={[styles.message, { color: palette.danger }]}>{message ?? serverErrorText(error)}</Text>\n ) : null}\n {!guests.length ? (\n <Text style={[styles.empty, { color: palette.textMuted }]}>No guests in this workspace.</Text>\n ) : (\n <View style={[ui.group, { backgroundColor: palette.card, marginTop: 12 }]}>\n {guests.map((g, i) => {\n const u = users.get(g.userId);\n const label = u?.name?.trim() || u?.email || g.userId;\n return (\n <View key={g.userId} style={styles.person}>\n <Avatar palette={palette} label={label} />\n <View\n style={[\n styles.personBody,\n i < guests.length - 1 && ui.hairline,\n { borderBottomColor: palette.hairline },\n ]}\n >\n <View style={ui.flex}>\n <Text numberOfLines={1} style={[styles.personName, { color: palette.text }]}>\n {label}\n </Text>\n <Text\n numberOfLines={2}\n style={[styles.personSub, { color: palette.textMuted }]}\n >\n {g.pages.map((p) => p.title || 'Untitled').join(', ') || 'No pages'}\n </Text>\n </View>\n {manage ? (\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => remove(g, label)}\n hitSlop={8}\n >\n <Text style={[styles.removeLabel, { color: palette.danger }]}>Remove</Text>\n </Pressable>\n ) : null}\n </View>\n </View>\n );\n })}\n </View>\n )}\n </ScrollView>\n );\n}\n\nfunction Avatar({ palette, label }: { palette: Palette; label: string }) {\n return (\n <View style={[styles.avatar, { backgroundColor: palette.primarySoft }]}>\n <Text style={[styles.avatarText, { color: palette.primary }]}>\n {label.trim().charAt(0).toUpperCase() || '?'}\n </Text>\n </View>\n );\n}\n\nfunction Loading({ palette }: { palette: Palette }) {\n return (\n <View style={styles.loading}>\n <ActivityIndicator color={palette.textMuted} />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n tabs: { flexDirection: 'row', margin: 16, marginBottom: 4, padding: 3, borderRadius: 12 },\n tab: { flex: 1, alignItems: 'center', paddingVertical: 8, borderRadius: 9 },\n tabActive: {\n shadowColor: '#000',\n shadowOpacity: 0.08,\n shadowRadius: 3,\n shadowOffset: { width: 0, height: 1 },\n elevation: 1,\n },\n tabLabel: { fontSize: 14, fontWeight: '600' },\n readOnly: { fontSize: 13, marginHorizontal: 20, marginTop: 8 },\n content: { padding: 16, paddingBottom: 48 },\n loading: { paddingVertical: 48, alignItems: 'center' },\n label: { fontSize: 13, fontWeight: '600', marginTop: 16, marginBottom: 6, marginLeft: 2 },\n input: { fontSize: 16, height: 48, paddingHorizontal: 14, borderRadius: 12 },\n help: { fontSize: 13, marginTop: 6, marginLeft: 2, lineHeight: 18 },\n message: { fontSize: 14, marginTop: 12 },\n block: { alignSelf: 'stretch' },\n disabled: { opacity: 0.45 },\n danger: { marginTop: 32, padding: 16, borderRadius: 16, borderWidth: 1 },\n dangerTitle: { fontSize: 16, fontWeight: '700' },\n dangerButton: { marginTop: 12, alignItems: 'center', paddingVertical: 12, borderRadius: 12 },\n dangerLabel: { fontSize: 15, fontWeight: '700' },\n card: { padding: 16, borderRadius: 16 },\n cardTitle: { fontSize: 16, fontWeight: '700', marginBottom: 10 },\n roleRow: { flexDirection: 'row', gap: 8, marginTop: 10 },\n roleChip: { paddingHorizontal: 14, paddingVertical: 8, borderRadius: 999 },\n roleChipLabel: { fontSize: 14, fontWeight: '600' },\n person: { flexDirection: 'row', alignItems: 'center', paddingLeft: 14 },\n personBody: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginLeft: 12,\n paddingRight: 14,\n minHeight: 60,\n },\n personName: { fontSize: 16, fontWeight: '600' },\n personSub: { fontSize: 13, marginTop: 2 },\n rolePill: { paddingHorizontal: 10, paddingVertical: 4, borderRadius: 999 },\n rolePillLabel: { fontSize: 12, fontWeight: '700' },\n removeLabel: { fontSize: 14, fontWeight: '700' },\n avatar: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center' },\n avatarText: { fontSize: 15, fontWeight: '700' },\n empty: { fontSize: 15, textAlign: 'center', paddingVertical: 32 },\n});\n"],"names":["_a","_b","_c","_d","_e"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useMemo,useCallback,useState,useRef,useEffect}from'react';import {Alert,View,StyleSheet,Pressable,Text,ActivityIndicator,ScrollView,RefreshControl,Modal,TextInput,FlatList,KeyboardAvoidingView,Platform}from'react-native';import {Ionicons}from'@expo/vector-icons';import {useNavigation,useFocusEffect,CommonActions}from'@react-navigation/native';import {useQuery,useLazyQuery}from'@apollo/client/index.js';import {NATIVE_NOTION_INBOX_UNREAD,NATIVE_NOTION_SEARCH}from'./notionDocuments.js';import {nextMeetings,greeting,PAGE_TYPES}from'./notionBlocks.js';import {notionPalette}from'./notionTheme.js';import {WorkspaceBadge,ui,EmptyState,SectionHeader,Group,ListRow,PageRow,SheetHeader}from'./notionUi.js';import {MeetingRowView,InboxSheet,MeetingsSheet,AllPagesSheet,TemplatesSheet}from'./NotionSheets.js';import {TrashSheet}from'./NotionTrashSheet.js';import {useNotionWorkspace}from'./useNotionWorkspace.js';import {afterNativeModalClose}from'../../utils/drawerNavigation.js';var __defProp = Object.defineProperty;
1
+ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useMemo,useCallback,useState,useRef,useEffect}from'react';import {Alert,View,StyleSheet,Pressable,Text,ActivityIndicator,ScrollView,RefreshControl,Modal,TextInput,FlatList,KeyboardAvoidingView,Platform}from'react-native';import {Ionicons}from'@expo/vector-icons';import {useNavigation,useFocusEffect,CommonActions}from'@react-navigation/native';import {useQuery,useApolloClient}from'@apollo/client/index.js';import {NATIVE_NOTION_INBOX_UNREAD,NATIVE_NOTION_SEARCH_HITS}from'./notionDocuments.js';import {SEARCH_FILTERS,hitBreadcrumb}from'./notionPageActions.js';import {nextMeetings,greeting,isPageBlock,pageTitle,blockIcon}from'./notionBlocks.js';import {notionPalette}from'./notionTheme.js';import {WorkspaceBadge,ui,EmptyState,SectionHeader,Group,ListRow,SheetHeader}from'./notionUi.js';import {MeetingRowView,InboxSheet,MeetingsSheet,AllPagesSheet,TemplatesSheet}from'./NotionSheets.js';import {TrashSheet}from'./NotionTrashSheet.js';import {FavoritesList,PageTree}from'./NotionPageTree.js';import {WorkspaceAdminSheet}from'./NotionWorkspaceAdmin.js';import {usePageActions}from'./usePageActions.js';import {RecentStrip,AgentsSection,TeamspacesSection,AgentTemplateSheet,AddTeamspaceSheet}from'./NotionSidebarSections.js';import {readRecents}from'./notionRecents.js';import {ConnectionsSheet}from'./NotionConnectionsSheet.js';import {useNotionWorkspace}from'./useNotionWorkspace.js';import {afterNativeModalClose}from'../../utils/drawerNavigation.js';var __defProp = Object.defineProperty;
2
2
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
3
  var __hasOwnProp = Object.prototype.hasOwnProperty;
4
4
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -69,7 +69,7 @@ function NotionWorkspaceView({
69
69
  orgName,
70
70
  isDark
71
71
  }) {
72
- var _a, _b, _c, _d, _e, _f, _g, _h;
72
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
73
73
  const palette = useMemo(() => notionPalette(isDark), [isDark]);
74
74
  const tint = useCallback((key) => ({
75
75
  fg: TINTS[key].fg,
@@ -89,10 +89,17 @@ function NotionWorkspaceView({
89
89
  });
90
90
  const unread = (_b = (_a = unreadQuery.data) == null ? void 0 : _a.notesInboxUnreadCount) != null ? _b : 0;
91
91
  const refreshOnFocus = useRef(() => void 0);
92
+ const [recents, setRecents] = useState([]);
92
93
  refreshOnFocus.current = () => {
94
+ var _a2;
93
95
  notion.refresh().catch(() => void 0);
94
96
  unreadQuery.refetch().catch(() => void 0);
97
+ readRecents((_a2 = notion.workspace) == null ? void 0 : _a2.id).then(setRecents);
95
98
  };
99
+ useEffect(() => {
100
+ var _a2;
101
+ readRecents((_a2 = notion.workspace) == null ? void 0 : _a2.id).then(setRecents);
102
+ }, [(_c = notion.workspace) == null ? void 0 : _c.id]);
96
103
  useFocusEffect(useCallback(() => {
97
104
  refreshOnFocus.current();
98
105
  }, []));
@@ -114,6 +121,35 @@ function NotionWorkspaceView({
114
121
  navigateToPage(blockId);
115
122
  }
116
123
  }, [navigateToPage, sheet]);
124
+ const pageActions = usePageActions({
125
+ notion,
126
+ palette,
127
+ onOpenPage: openPage
128
+ });
129
+ const [admin, setAdmin] = useState(null);
130
+ const [agentPicker, setAgentPicker] = useState(false);
131
+ const [teamspaceOpen, setTeamspaceOpen] = useState(false);
132
+ const [connectionsOpen, setConnectionsOpen] = useState(false);
133
+ const addSectionPage = async (teamspace) => {
134
+ try {
135
+ const created = await notion.createSectionPage(teamspace);
136
+ if (created == null ? void 0 : created.id) openPage(created.id);
137
+ } catch (err) {
138
+ Alert.alert("Couldn't create the page", err instanceof Error ? err.message : void 0);
139
+ }
140
+ };
141
+ const confirmDeleteWorkspace = () => {
142
+ const ws = notion.workspace;
143
+ if (!ws) return;
144
+ Alert.alert(`Move \u201C${ws.name}\u201D to trash?`, "Its pages go with it. This affects everyone in the workspace.", [{
145
+ text: "Cancel",
146
+ style: "cancel"
147
+ }, {
148
+ text: "Move to trash",
149
+ style: "destructive",
150
+ onPress: () => notion.deleteWorkspace(ws.id).catch((err) => Alert.alert("Couldn't move the workspace to trash", err instanceof Error ? err.message : void 0))
151
+ }]);
152
+ };
117
153
  const askAi = useCallback(() => {
118
154
  navigation.dispatch(CommonActions.navigate({
119
155
  name: "MainStack.Chat",
@@ -183,11 +219,11 @@ function NotionWorkspaceView({
183
219
  }, {
184
220
  key: "meetings",
185
221
  icon: "calendar-outline",
186
- subtitle: `${notion.meetings.length} meetings`
222
+ subtitle: `${notion.meetings.length} ${notion.meetings.length === 1 ? "meeting" : "meetings"}`
187
223
  }, {
188
224
  key: "all",
189
225
  icon: "documents-outline",
190
- subtitle: `${notion.pages.length} pages`
226
+ subtitle: `${notion.pages.length} ${notion.pages.length === 1 ? "page" : "pages"}`
191
227
  }, {
192
228
  key: "templates",
193
229
  icon: "albums-outline",
@@ -247,7 +283,7 @@ function NotionWorkspaceView({
247
283
  /* @__PURE__ */ jsxs(View, { style: styles.switcherText, children: [
248
284
  /* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.switcherName, {
249
285
  color: palette.text
250
- }], children: (_d = (_c = notion.workspace) == null ? void 0 : _c.name) != null ? _d : "No workspace" }),
286
+ }], children: (_e = (_d = notion.workspace) == null ? void 0 : _d.name) != null ? _e : "No workspace" }),
251
287
  /* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.switcherMeta, {
252
288
  color: palette.textMuted
253
289
  }], children: hasWorkspace ? `${notion.pages.length} ${notion.pages.length === 1 ? "page" : "pages"}` : "Tap to create one" })
@@ -271,7 +307,15 @@ function NotionWorkspaceView({
271
307
  backgroundColor: palette.primary
272
308
  }, pressed && ui.pressedScale], children: busy === "page" ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: palette.onPrimary }) : /* @__PURE__ */ jsx(Ionicons, { name: "create-outline", size: 20, color: palette.onPrimary }) })
273
309
  ] }),
274
- searching ? /* @__PURE__ */ jsx(SearchMode, { palette, tint, workspaceId: (_f = (_e = notion.workspace) == null ? void 0 : _e.id) != null ? _f : null, commands, onOpenPage: openPage, onCancel: () => setSearching(false) }) : /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.homeContent, refreshControl: /* @__PURE__ */ jsx(RefreshControl, { refreshing, onRefresh, tintColor: palette.textMuted }), children: [
310
+ searching ? /* @__PURE__ */ jsx(SearchMode, { palette, tint, workspaceId: (_g = (_f = notion.workspace) == null ? void 0 : _f.id) != null ? _g : null, commands, onOpenPage: openPage, onCreatePage: async (title) => {
311
+ if (!requireWorkspace()) return;
312
+ try {
313
+ const created = await notion.createPage(title);
314
+ if (created == null ? void 0 : created.id) openPage(created.id);
315
+ } catch (err) {
316
+ Alert.alert("Couldn't create the page", err instanceof Error ? err.message : void 0);
317
+ }
318
+ }, onCancel: () => setSearching(false) }) : /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.homeContent, refreshControl: /* @__PURE__ */ jsx(RefreshControl, { refreshing, onRefresh, tintColor: palette.textMuted }), children: [
275
319
  /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "search", onPress: () => setSearching(true), style: [styles.searchPill, {
276
320
  backgroundColor: palette.fill
277
321
  }], children: [
@@ -305,6 +349,7 @@ function NotionWorkspaceView({
305
349
  label: "Create workspace",
306
350
  onPress: () => setCreateOpen(true)
307
351
  } }) : /* @__PURE__ */ jsxs(Fragment, { children: [
352
+ /* @__PURE__ */ jsx(RecentStrip, { recents, palette, onOpen: openPage }),
308
353
  upcoming.length ? /* @__PURE__ */ jsxs(Fragment, { children: [
309
354
  /* @__PURE__ */ jsx(SectionHeader, { label: "Upcoming meetings", palette, action: {
310
355
  label: "See all",
@@ -312,6 +357,10 @@ function NotionWorkspaceView({
312
357
  } }),
313
358
  /* @__PURE__ */ jsx(Group, { palette, children: upcoming.map((m, i) => /* @__PURE__ */ jsx(MeetingRowView, { row: m, palette, onPress: () => openPage(m.id), divider: i < upcoming.length - 1 }, m.id)) })
314
359
  ] }) : null,
360
+ notion.favoriteIds.length ? /* @__PURE__ */ jsxs(Fragment, { children: [
361
+ /* @__PURE__ */ jsx(SectionHeader, { label: "Favorites", count: notion.favoriteIds.length, palette }),
362
+ /* @__PURE__ */ jsx(FavoritesList, { ids: notion.favoriteIds, pages: notion.pages, palette, favoriteIds: notion.favoriteIds, onOpenPage: openPage, onActions: (page) => pageActions.open(page) })
363
+ ] }) : null,
315
364
  /* @__PURE__ */ jsx(SectionHeader, { label: "Browse", palette }),
316
365
  /* @__PURE__ */ jsx(Group, { palette, children: browse.map((b, i) => {
317
366
  const t = tint(b.key === "meetings" ? "meeting" : b.key);
@@ -322,15 +371,24 @@ function NotionWorkspaceView({
322
371
  /* @__PURE__ */ jsx(Ionicons, { name: "chevron-forward", size: 16, color: palette.textFaint })
323
372
  ] }) : void 0 }, b.key);
324
373
  }) }),
325
- /* @__PURE__ */ jsx(SectionHeader, { label: "My pages", count: notion.pages.length, palette, action: notion.pages.length > 8 ? {
326
- label: "See all",
374
+ /* @__PURE__ */ jsx(AgentsSection, { agents: notion.agents, palette, isDark, onOpen: openPage, onNew: () => setAgentPicker(true) }),
375
+ /* @__PURE__ */ jsx(TeamspacesSection, { groups: notion.teamspaceGroups, palette, isDark, favoriteIds: notion.favoriteIds, onOpenPage: openPage, onActions: (page) => pageActions.open(page), onAddPage: (name) => addSectionPage(name), onAddTeamspace: () => setTeamspaceOpen(true), onRemoveTeamspace: (t) => Alert.alert(`Remove \u201C${t.name}\u201D?`, "Its pages move back to My pages.", [{
376
+ text: "Cancel",
377
+ style: "cancel"
378
+ }, {
379
+ text: "Remove",
380
+ style: "destructive",
381
+ onPress: () => notion.removeTeamspace(t.id).catch(() => void 0)
382
+ }]) }),
383
+ /* @__PURE__ */ jsx(SectionHeader, { label: "My pages", count: notion.myPages.length, palette, action: {
384
+ label: "All pages",
327
385
  onPress: () => openSheet("all")
328
- } : void 0 }),
329
- notion.pages.length === 0 ? /* @__PURE__ */ jsx(EmptyState, { palette, icon: "document-text-outline", title: "No pages yet", text: "Start with a blank page or pick a template.", action: {
386
+ } }),
387
+ notion.myPages.length === 0 ? /* @__PURE__ */ jsx(EmptyState, { palette, icon: "document-text-outline", title: "No pages yet", text: "Start with a blank page or pick a template.", action: {
330
388
  label: "New page",
331
389
  onPress: () => run("page"),
332
390
  busy: busy === "page"
333
- } }) : /* @__PURE__ */ jsx(Group, { palette, children: notion.pages.slice(0, 8).map((page, i, shown) => /* @__PURE__ */ jsx(PageRow, { page, palette, onPress: () => openPage(page.id), divider: i < shown.length - 1 }, page.id)) })
391
+ } }) : /* @__PURE__ */ jsx(PageTree, { pages: notion.myPages, palette, favoriteIds: notion.favoriteIds, onOpenPage: openPage, onActions: (page) => pageActions.open(page) })
334
392
  ] })
335
393
  ] }),
336
394
  /* @__PURE__ */ jsx(Modal, { visible: sheet !== null, animationType: "slide", presentationStyle: "pageSheet", onRequestClose: () => setSheet(null), children: /* @__PURE__ */ jsx(View, { style: [styles.root, {
@@ -343,13 +401,33 @@ function NotionWorkspaceView({
343
401
  sheet === "templates" ? /* @__PURE__ */ jsx(TemplatesSheet, { palette, notion, onOpenPage: openPage }) : null,
344
402
  sheet === "trash" ? /* @__PURE__ */ jsx(TrashSheet, { palette, notion, onOpenPage: openPage }) : null
345
403
  ] }) : null }) }),
346
- /* @__PURE__ */ jsx(WorkspaceMenu, { visible: menuOpen, palette, workspaces: notion.workspaces, activeId: (_h = (_g = notion.workspace) == null ? void 0 : _g.id) != null ? _h : null, onClose: () => setMenuOpen(false), onSelect: (id) => {
404
+ /* @__PURE__ */ jsx(WorkspaceMenu, { visible: menuOpen, palette, workspaces: notion.workspaces, activeId: (_i = (_h = notion.workspace) == null ? void 0 : _h.id) != null ? _i : null, onClose: () => setMenuOpen(false), onSelect: (id) => {
347
405
  notion.selectWorkspace(id);
348
406
  setMenuOpen(false);
349
407
  }, onCreate: () => {
350
408
  setMenuOpen(false);
351
409
  setCreateOpen(true);
410
+ }, onSettings: () => {
411
+ setMenuOpen(false);
412
+ afterNativeModalClose(() => setAdmin("settings"));
413
+ }, onMembers: () => {
414
+ setMenuOpen(false);
415
+ afterNativeModalClose(() => setAdmin("members"));
416
+ }, onConnections: () => {
417
+ setMenuOpen(false);
418
+ afterNativeModalClose(() => setConnectionsOpen(true));
419
+ }, onDeleteWorkspace: () => {
420
+ setMenuOpen(false);
421
+ afterNativeModalClose(confirmDeleteWorkspace);
352
422
  } }),
423
+ /* @__PURE__ */ jsx(ConnectionsSheet, { visible: connectionsOpen, palette, orgName, onClose: () => setConnectionsOpen(false) }),
424
+ /* @__PURE__ */ jsx(AgentTemplateSheet, { visible: agentPicker, palette, isDark, onPick: async (template) => {
425
+ const created = await notion.createAgent(template);
426
+ if (created == null ? void 0 : created.id) afterNativeModalClose(() => openPage(created.id));
427
+ }, onClose: () => setAgentPicker(false) }),
428
+ /* @__PURE__ */ jsx(AddTeamspaceSheet, { visible: teamspaceOpen, palette, isDark, onAdd: (name, color) => notion.addTeamspace(name, color), onClose: () => setTeamspaceOpen(false) }),
429
+ /* @__PURE__ */ jsx(WorkspaceAdminSheet, { visible: admin !== null, initialTab: admin != null ? admin : "settings", palette, notion, onClose: () => setAdmin(null) }),
430
+ pageActions.element,
353
431
  /* @__PURE__ */ jsx(CreateWorkspaceSheet, { visible: createOpen, palette, onClose: () => setCreateOpen(false), onCreate: notion.createWorkspace })
354
432
  ] });
355
433
  }
@@ -359,47 +437,76 @@ function SearchMode({
359
437
  workspaceId,
360
438
  commands,
361
439
  onOpenPage,
440
+ onCreatePage,
362
441
  onCancel
363
442
  }) {
443
+ const client = useApolloClient();
364
444
  const [text, setText] = useState("");
365
- const [runSearch, {
366
- data,
367
- loading,
368
- error
369
- }] = useLazyQuery(NATIVE_NOTION_SEARCH, {
370
- fetchPolicy: "network-only"
371
- });
445
+ const [filter, setFilter] = useState("all");
446
+ const [hits, setHits] = useState([]);
447
+ const [cursor, setCursor] = useState(null);
448
+ const [loading, setLoading] = useState(false);
449
+ const [error, setError] = useState(false);
372
450
  const query = text.trim();
373
- useEffect(() => {
374
- if (!query) return void 0;
375
- const timer = setTimeout(() => {
376
- runSearch({
451
+ const seq = useRef(0);
452
+ const fetchPage = useCallback(async (after) => {
453
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
454
+ const id = ++seq.current;
455
+ setLoading(true);
456
+ setError(false);
457
+ const types = (_a = SEARCH_FILTERS.find((f) => f.id === filter)) == null ? void 0 : _a.types;
458
+ try {
459
+ const res = await client.query({
460
+ query: NATIVE_NOTION_SEARCH_HITS,
377
461
  variables: {
378
- input: __spreadValues({
462
+ input: __spreadValues(__spreadValues(__spreadValues({
379
463
  query,
380
- types: PAGE_TYPES,
381
- pageSize: 30
382
- }, workspaceId ? {
464
+ pageSize: 25
465
+ }, types ? {
466
+ types
467
+ } : {}), workspaceId ? {
383
468
  workspaceId
469
+ } : {}), after ? {
470
+ startCursor: after
384
471
  } : {})
385
- }
472
+ },
473
+ fetchPolicy: "network-only"
386
474
  });
387
- }, 250);
475
+ if (id !== seq.current) return;
476
+ const page = ((_d = (_c = (_b = res.data) == null ? void 0 : _b.searchBlocks) == null ? void 0 : _c.hits) != null ? _d : []).filter((h) => (h == null ? void 0 : h.block) && !h.block.inTrash);
477
+ setHits((prev) => {
478
+ const merged = after ? [...prev, ...page] : page;
479
+ const seen = /* @__PURE__ */ new Set();
480
+ return merged.filter((h) => !seen.has(h.block.id) && Boolean(seen.add(h.block.id)));
481
+ });
482
+ const more = (_f = (_e = res.data) == null ? void 0 : _e.searchBlocks) == null ? void 0 : _f.hasMore;
483
+ setCursor(more ? (_i = (_h = (_g = res.data) == null ? void 0 : _g.searchBlocks) == null ? void 0 : _h.nextCursor) != null ? _i : null : null);
484
+ } catch (e) {
485
+ if (id === seq.current) setError(true);
486
+ } finally {
487
+ if (id === seq.current) setLoading(false);
488
+ }
489
+ }, [client, filter, query, workspaceId]);
490
+ useEffect(() => {
491
+ if (!query) {
492
+ seq.current += 1;
493
+ setHits([]);
494
+ setCursor(null);
495
+ setLoading(false);
496
+ return void 0;
497
+ }
498
+ const timer = setTimeout(() => fetchPage(null), 250);
388
499
  return () => clearTimeout(timer);
389
- }, [query, runSearch, workspaceId]);
390
- const results = useMemo(() => {
391
- var _a, _b;
392
- const seen = /* @__PURE__ */ new Set();
393
- return ((_b = (_a = data == null ? void 0 : data.searchBlocks) == null ? void 0 : _a.results) != null ? _b : []).filter((b) => {
394
- if (b.inTrash || seen.has(b.id)) return false;
395
- seen.add(b.id);
396
- return true;
397
- });
398
- }, [data]);
500
+ }, [fetchPage, query]);
399
501
  const shownCommands = commands.filter((c) => !query || c.label.toLowerCase().includes(query.toLowerCase()));
502
+ const exactTitle = hits.some((h) => isPageBlock(h.block) && pageTitle(h.block).toLowerCase() === query.toLowerCase());
400
503
  let hint = "";
401
- if (query && error) hint = "Search failed. Try again.";
402
- else if (query && !loading && !results.length && !shownCommands.length) hint = "No matching pages";
504
+ if (query && error) hint = "Search failed. Pull down or type again to retry.";
505
+ else if (query && !loading && !hits.length) hint = "No results";
506
+ const openHit = (h) => {
507
+ var _a, _b;
508
+ return onOpenPage(isPageBlock(h.block) ? h.block.id : (_b = (_a = h.container) == null ? void 0 : _a.id) != null ? _b : h.block.id);
509
+ };
403
510
  return /* @__PURE__ */ jsxs(View, { style: ui.flex, children: [
404
511
  /* @__PURE__ */ jsxs(View, { style: styles.searchBar, children: [
405
512
  /* @__PURE__ */ jsxs(View, { style: [styles.searchField, {
@@ -415,12 +522,37 @@ function SearchMode({
415
522
  color: palette.primary
416
523
  }], children: "Cancel" }) })
417
524
  ] }),
525
+ query ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, keyboardShouldPersistTaps: "always", contentContainerStyle: styles.filterRow, style: styles.filterBar, children: SEARCH_FILTERS.map((f) => {
526
+ const active = f.id === filter;
527
+ return /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "tab", accessibilityState: {
528
+ selected: active
529
+ }, onPress: () => setFilter(f.id), style: [styles.filterChip, {
530
+ backgroundColor: active ? palette.text : palette.fill
531
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.filterLabel, {
532
+ color: active ? palette.card : palette.text
533
+ }], children: f.label }) }, f.id);
534
+ }) }) : null,
418
535
  /* @__PURE__ */ jsxs(ScrollView, { keyboardShouldPersistTaps: "handled", contentContainerStyle: styles.searchContent, children: [
419
- query && results.length ? /* @__PURE__ */ jsxs(Fragment, { children: [
536
+ query && hits.length ? /* @__PURE__ */ jsxs(Fragment, { children: [
420
537
  /* @__PURE__ */ jsx(Text, { style: [styles.searchSection, {
421
538
  color: palette.textMuted
422
- }], children: "Pages" }),
423
- /* @__PURE__ */ jsx(Group, { palette, children: results.map((page, i) => /* @__PURE__ */ jsx(PageRow, { page, palette, onPress: () => onOpenPage(page.id), divider: i < results.length - 1 }, page.id)) })
539
+ }], children: "Results" }),
540
+ /* @__PURE__ */ jsx(Group, { palette, children: hits.map((h, i) => {
541
+ var _a, _b;
542
+ const isPage = isPageBlock(h.block);
543
+ const crumb = hitBreadcrumb(h.parentPath);
544
+ const snippet = ((_a = h.snippet) != null ? _a : "").trim();
545
+ return /* @__PURE__ */ jsx(ListRow, { palette, emoji: blockIcon(h.block), icon: h.block.type === "database" ? "grid-outline" : isPage ? "document-text-outline" : h.block.type === "todo" ? "checkbox-outline" : h.block.type === "code" ? "code-slash-outline" : "reorder-two-outline", title: isPage ? pageTitle(h.block) : snippet || pageTitle(h.block), subtitle: [crumb || (isPage ? "" : (_b = h.container) == null ? void 0 : _b.title), isPage ? snippet : ""].filter(Boolean).join(" \xB7 "), onPress: () => openHit(h), divider: i < hits.length - 1 }, h.block.id);
546
+ }) }),
547
+ cursor ? /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: () => fetchPage(cursor), disabled: loading, style: styles.loadMore, children: /* @__PURE__ */ jsx(Text, { style: [styles.loadMoreLabel, {
548
+ color: palette.primary
549
+ }], children: loading ? "Loading\u2026" : "Load more" }) }) : null
550
+ ] }) : null,
551
+ query && !exactTitle && !loading ? /* @__PURE__ */ jsxs(Fragment, { children: [
552
+ /* @__PURE__ */ jsx(Text, { style: [styles.searchSection, {
553
+ color: palette.textMuted
554
+ }], children: "Create" }),
555
+ /* @__PURE__ */ jsx(Group, { palette, children: /* @__PURE__ */ jsx(ListRow, { palette, icon: "add", iconColor: tint("page").fg, iconBg: tint("page").bg, title: `Create page \u201C${query}\u201D`, onPress: () => onCreatePage(query) }) })
424
556
  ] }) : null,
425
557
  shownCommands.length ? /* @__PURE__ */ jsxs(Fragment, { children: [
426
558
  /* @__PURE__ */ jsx(Text, { style: [styles.searchSection, {
@@ -444,7 +576,11 @@ function WorkspaceMenu({
444
576
  activeId,
445
577
  onClose,
446
578
  onSelect,
447
- onCreate
579
+ onCreate,
580
+ onSettings,
581
+ onMembers,
582
+ onDeleteWorkspace,
583
+ onConnections
448
584
  }) {
449
585
  return /* @__PURE__ */ jsx(Modal, { visible, transparent: true, animationType: "fade", onRequestClose: onClose, children: /* @__PURE__ */ jsx(Pressable, { style: [styles.backdrop, {
450
586
  backgroundColor: palette.backdrop
@@ -479,6 +615,45 @@ function WorkspaceMenu({
479
615
  item.id === activeId ? /* @__PURE__ */ jsx(Ionicons, { name: "checkmark-circle", size: 22, color: palette.primary }) : null
480
616
  ] })
481
617
  ] }) }),
618
+ activeId ? /* @__PURE__ */ jsx(View, { style: [styles.menuList, styles.menuActions, {
619
+ backgroundColor: palette.bg
620
+ }], children: [{
621
+ label: "Workspace settings\u2026",
622
+ icon: "settings-outline",
623
+ onPress: onSettings
624
+ }, {
625
+ label: "Members\u2026",
626
+ icon: "people-outline",
627
+ onPress: onMembers
628
+ }, {
629
+ label: "Connections\u2026",
630
+ icon: "link-outline",
631
+ onPress: onConnections
632
+ }].map((a, i) => /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", onPress: a.onPress, style: ({
633
+ pressed
634
+ }) => [styles.menuRow, pressed && {
635
+ backgroundColor: palette.pressed
636
+ }], children: [
637
+ /* @__PURE__ */ jsx(Ionicons, { name: a.icon, size: 20, color: palette.text }),
638
+ /* @__PURE__ */ jsxs(View, { style: [styles.menuRowBody, i < 2 && ui.hairline, {
639
+ borderBottomColor: palette.hairline
640
+ }], children: [
641
+ /* @__PURE__ */ jsx(Text, { style: [styles.menuRowLabel, {
642
+ color: palette.text
643
+ }], children: a.label }),
644
+ /* @__PURE__ */ jsx(Ionicons, { name: "chevron-forward", size: 16, color: palette.textFaint })
645
+ ] })
646
+ ] }, a.label)) }) : null,
647
+ activeId ? /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", onPress: onDeleteWorkspace, style: ({
648
+ pressed
649
+ }) => [styles.dangerRow, pressed && {
650
+ backgroundColor: palette.pressed
651
+ }], children: [
652
+ /* @__PURE__ */ jsx(Ionicons, { name: "trash-outline", size: 19, color: palette.danger }),
653
+ /* @__PURE__ */ jsx(Text, { style: [styles.menuRowLabel, {
654
+ color: palette.danger
655
+ }], children: "Move workspace to trash" })
656
+ ] }) : null,
482
657
  /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", onPress: onCreate, style: ({
483
658
  pressed
484
659
  }) => [styles.secondaryButton, {
@@ -707,6 +882,31 @@ const styles = StyleSheet.create({
707
882
  fontSize: 16,
708
883
  fontWeight: "500"
709
884
  },
885
+ filterBar: {
886
+ flexGrow: 0
887
+ },
888
+ filterRow: {
889
+ gap: 8,
890
+ paddingHorizontal: 16,
891
+ paddingBottom: 4
892
+ },
893
+ filterChip: {
894
+ paddingHorizontal: 14,
895
+ paddingVertical: 7,
896
+ borderRadius: 999
897
+ },
898
+ filterLabel: {
899
+ fontSize: 14,
900
+ fontWeight: "600"
901
+ },
902
+ loadMore: {
903
+ alignItems: "center",
904
+ paddingVertical: 14
905
+ },
906
+ loadMoreLabel: {
907
+ fontSize: 15,
908
+ fontWeight: "700"
909
+ },
710
910
  searchContent: {
711
911
  paddingHorizontal: 16,
712
912
  paddingBottom: 48
@@ -752,6 +952,18 @@ const styles = StyleSheet.create({
752
952
  maxHeight: 320,
753
953
  flexGrow: 0
754
954
  },
955
+ menuActions: {
956
+ marginTop: 12
957
+ },
958
+ dangerRow: {
959
+ flexDirection: "row",
960
+ alignItems: "center",
961
+ gap: 12,
962
+ paddingHorizontal: 12,
963
+ paddingVertical: 14,
964
+ marginTop: 8,
965
+ borderRadius: 12
966
+ },
755
967
  menuRow: {
756
968
  flexDirection: "row",
757
969
  alignItems: "center",