@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.
- package/lib/features/agent-chat/NativeAgentChat.js +21 -4
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ApprovalCard.js +353 -0
- package/lib/features/chat/ApprovalCard.js.map +1 -0
- package/lib/features/chat/AskUserCard.js +9 -2
- package/lib/features/chat/AskUserCard.js.map +1 -1
- package/lib/features/chat/askUser.js +25 -3
- package/lib/features/chat/askUser.js.map +1 -1
- package/lib/features/chat/queuedFollowUpRows.js +13 -0
- package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
- package/lib/features/devices/bodyComposition.js +116 -0
- package/lib/features/devices/bodyComposition.js.map +1 -0
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +22 -2
- package/lib/features/devices/session.js.map +1 -1
- package/lib/features/discover/DiscoverArticle.js +105 -92
- package/lib/features/discover/DiscoverArticle.js.map +1 -1
- package/lib/features/discover/DiscoverFeed.js +97 -48
- package/lib/features/discover/DiscoverFeed.js.map +1 -1
- package/lib/features/discover/DiscoverFollowUp.js +135 -0
- package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
- package/lib/features/discover/DiscoverSidebar.js +555 -0
- package/lib/features/discover/DiscoverSidebar.js.map +1 -0
- package/lib/features/discover/DiscoverSkeletons.js +123 -0
- package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
- package/lib/features/discover/DiscoverStoryCards.js +193 -87
- package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
- package/lib/features/discover/followUpQuery.js +42 -0
- package/lib/features/discover/followUpQuery.js.map +1 -0
- package/lib/features/discover/markets.js +37 -0
- package/lib/features/discover/markets.js.map +1 -0
- package/lib/features/discover/useDiscoverSidebar.js +148 -0
- package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
- package/lib/features/discover/weather.js +42 -0
- package/lib/features/discover/weather.js.map +1 -0
- package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
- package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
- package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
- package/lib/features/notion/NotionBlockSheets.js +206 -0
- package/lib/features/notion/NotionBlockSheets.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +36 -0
- package/lib/features/notion/NotionBlockView.js.map +1 -0
- package/lib/features/notion/NotionCommentsSheet.js +461 -0
- package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
- package/lib/features/notion/NotionConnectionsSheet.js +244 -0
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
- package/lib/features/notion/NotionHistorySheet.js +439 -0
- package/lib/features/notion/NotionHistorySheet.js.map +1 -0
- package/lib/features/notion/NotionMediaBlocks.js +803 -0
- package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
- package/lib/features/notion/NotionMentionSheet.js +279 -0
- package/lib/features/notion/NotionMentionSheet.js.map +1 -0
- package/lib/features/notion/NotionPageMenu.js +585 -0
- package/lib/features/notion/NotionPageMenu.js.map +1 -0
- package/lib/features/notion/NotionPageTree.js +220 -0
- package/lib/features/notion/NotionPageTree.js.map +1 -0
- package/lib/features/notion/NotionPageView.js +1253 -152
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionShareSheet.js +606 -0
- package/lib/features/notion/NotionShareSheet.js.map +1 -0
- package/lib/features/notion/NotionSheets.js +87 -15
- package/lib/features/notion/NotionSheets.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +492 -0
- package/lib/features/notion/NotionSidebarSections.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceView.js +257 -45
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +554 -0
- package/lib/features/notion/database/DatabaseCells.js.map +1 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseLayouts.js +461 -0
- package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseSheets.js +791 -0
- package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
- package/lib/features/notion/database/NotionDatabaseView.js +817 -0
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
- package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
- package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
- package/lib/features/notion/database/chartData.js +89 -0
- package/lib/features/notion/database/chartData.js.map +1 -0
- package/lib/features/notion/database/chartView.js +112 -0
- package/lib/features/notion/database/chartView.js.map +1 -0
- package/lib/features/notion/database/connectorButton.js +33 -0
- package/lib/features/notion/database/connectorButton.js.map +1 -0
- package/lib/features/notion/database/databaseCalc.js +208 -0
- package/lib/features/notion/database/databaseCalc.js.map +1 -0
- package/lib/features/notion/database/databaseCalendar.js +157 -0
- package/lib/features/notion/database/databaseCalendar.js.map +1 -0
- package/lib/features/notion/database/databaseCsv.js +98 -0
- package/lib/features/notion/database/databaseCsv.js.map +1 -0
- package/lib/features/notion/database/databaseCsvActions.js +58 -0
- package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
- package/lib/features/notion/database/databaseFilter.js +473 -0
- package/lib/features/notion/database/databaseFilter.js.map +1 -0
- package/lib/features/notion/database/databaseFormula.js +1072 -0
- package/lib/features/notion/database/databaseFormula.js.map +1 -0
- package/lib/features/notion/database/databaseGroup.js +151 -0
- package/lib/features/notion/database/databaseGroup.js.map +1 -0
- package/lib/features/notion/database/databaseRollup.js +58 -0
- package/lib/features/notion/database/databaseRollup.js.map +1 -0
- package/lib/features/notion/database/databaseTimeline.js +156 -0
- package/lib/features/notion/database/databaseTimeline.js.map +1 -0
- package/lib/features/notion/database/databaseView.js +1188 -0
- package/lib/features/notion/database/databaseView.js.map +1 -0
- package/lib/features/notion/database/databaseViews.js +310 -0
- package/lib/features/notion/database/databaseViews.js.map +1 -0
- package/lib/features/notion/database/relationSource.js +92 -0
- package/lib/features/notion/database/relationSource.js.map +1 -0
- package/lib/features/notion/database/uniqueId.js +17 -0
- package/lib/features/notion/database/uniqueId.js.map +1 -0
- package/lib/features/notion/database/useNotionDatabase.js +617 -0
- package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
- package/lib/features/notion/notionAgentRunStatus.js +39 -0
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
- package/lib/features/notion/notionCodeLanguages.js +112 -0
- package/lib/features/notion/notionCodeLanguages.js.map +1 -0
- package/lib/features/notion/notionComments.js +86 -0
- package/lib/features/notion/notionComments.js.map +1 -0
- package/lib/features/notion/notionConnections.js +74 -0
- package/lib/features/notion/notionConnections.js.map +1 -0
- package/lib/features/notion/notionDocuments.js +453 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionEditorModel.js +142 -7
- package/lib/features/notion/notionEditorModel.js.map +1 -1
- package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
- package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
- package/lib/features/notion/notionMedia.js +119 -0
- package/lib/features/notion/notionMedia.js.map +1 -0
- package/lib/features/notion/notionMentionDate.js +32 -0
- package/lib/features/notion/notionMentionDate.js.map +1 -0
- package/lib/features/notion/notionMentionOptions.js +162 -0
- package/lib/features/notion/notionMentionOptions.js.map +1 -0
- package/lib/features/notion/notionNotesAgent.js +445 -0
- package/lib/features/notion/notionNotesAgent.js.map +1 -0
- package/lib/features/notion/notionPageAccess.js +168 -0
- package/lib/features/notion/notionPageAccess.js.map +1 -0
- package/lib/features/notion/notionPageActions.js +138 -0
- package/lib/features/notion/notionPageActions.js.map +1 -0
- package/lib/features/notion/notionPageHistory.js +154 -0
- package/lib/features/notion/notionPageHistory.js.map +1 -0
- package/lib/features/notion/notionPageKinds.js +200 -0
- package/lib/features/notion/notionPageKinds.js.map +1 -0
- package/lib/features/notion/notionRecents.js +48 -0
- package/lib/features/notion/notionRecents.js.map +1 -0
- package/lib/features/notion/notionRichText.js +177 -0
- package/lib/features/notion/notionRichText.js.map +1 -0
- package/lib/features/notion/notionRichTitle.js +336 -0
- package/lib/features/notion/notionRichTitle.js.map +1 -0
- package/lib/features/notion/useNotionWorkspace.js +272 -13
- package/lib/features/notion/useNotionWorkspace.js.map +1 -1
- package/lib/features/notion/usePageActions.js +155 -0
- package/lib/features/notion/usePageActions.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +1 -1
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
- package/lib/features/study/StudyAgentChatPane.js +1 -1
- package/lib/features/study/StudyAgentChatPane.js.map +1 -1
- package/lib/features/travel/TravelAgentChatPane.js +1 -1
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +1 -1
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +302 -0
- package/lib/features/webbuilder/codeFiles.js.map +1 -0
- package/lib/features/webbuilder/codeHighlight.js +209 -0
- package/lib/features/webbuilder/codeHighlight.js.map +1 -0
- package/lib/features/webbuilder/components/CodeView.js +682 -52
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +3 -3
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/stepLabels.js +68 -0
- package/lib/features/webbuilder/stepLabels.js.map +1 -0
- package/lib/hooks/useHostChatSteering.js +45 -0
- package/lib/hooks/useHostChatSteering.js.map +1 -0
- package/lib/screens/Chat/index.js +2 -12
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Devices/index.js +205 -3
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
- package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
- package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
- package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
- package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
- package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
- package/lib/screens/NotionPage/index.js +2 -2
- package/lib/screens/NotionPage/index.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
- package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- 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,
|
|
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: (
|
|
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: (
|
|
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(
|
|
326
|
-
|
|
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
|
-
}
|
|
329
|
-
notion.
|
|
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(
|
|
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: (
|
|
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 [
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
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
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
|
|
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
|
-
|
|
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
|
-
}, [
|
|
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.
|
|
402
|
-
else if (query && !loading && !
|
|
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 &&
|
|
536
|
+
query && hits.length ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
420
537
|
/* @__PURE__ */ jsx(Text, { style: [styles.searchSection, {
|
|
421
538
|
color: palette.textMuted
|
|
422
|
-
}], children: "
|
|
423
|
-
/* @__PURE__ */ jsx(Group, { palette, children:
|
|
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",
|