@adminide-stack/yantra-mobile 12.0.137 → 12.0.139
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/CustomDrawer.js +17 -1
- package/lib/components/CustomDrawer.js.map +1 -1
- package/lib/compute.js +106 -1
- package/lib/compute.js.map +1 -1
- package/lib/config/env-config.js +12 -0
- package/lib/config/env-config.js.map +1 -1
- package/lib/features/chat/ChatTranscript.js +2 -2
- package/lib/features/chat/ChatTranscript.js.map +1 -1
- package/lib/features/chat/surfaceNotes.js +4 -0
- package/lib/features/chat/surfaceNotes.js.map +1 -0
- package/lib/features/dictate/backgroundRecording.js.map +1 -1
- package/lib/features/dictate/useDictationRecorder.js +42 -1
- package/lib/features/dictate/useDictationRecorder.js.map +1 -1
- package/lib/features/home/useHomeWeather.js +85 -0
- package/lib/features/home/useHomeWeather.js.map +1 -0
- package/lib/features/home/weather.js +139 -0
- package/lib/features/home/weather.js.map +1 -0
- package/lib/features/notion/NotionPageView.js +819 -0
- package/lib/features/notion/NotionPageView.js.map +1 -0
- package/lib/features/notion/NotionSheets.js +452 -0
- package/lib/features/notion/NotionSheets.js.map +1 -0
- package/lib/features/notion/NotionTrashSheet.js +415 -0
- package/lib/features/notion/NotionTrashSheet.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceView.js +837 -0
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -0
- package/lib/features/notion/notionBlocks.js +203 -0
- package/lib/features/notion/notionBlocks.js.map +1 -0
- package/lib/features/notion/notionDocuments.js +182 -0
- package/lib/features/notion/notionDocuments.js.map +1 -0
- package/lib/features/notion/notionEditorModel.js +180 -0
- package/lib/features/notion/notionEditorModel.js.map +1 -0
- package/lib/features/notion/notionTemplates.js +406 -0
- package/lib/features/notion/notionTemplates.js.map +1 -0
- package/lib/features/notion/notionTheme.js +34 -0
- package/lib/features/notion/notionTheme.js.map +1 -0
- package/lib/features/notion/notionTrash.js +100 -0
- package/lib/features/notion/notionTrash.js.map +1 -0
- package/lib/features/notion/notionUi.js +310 -0
- package/lib/features/notion/notionUi.js.map +1 -0
- package/lib/features/notion/useNotionWorkspace.js +181 -0
- package/lib/features/notion/useNotionWorkspace.js.map +1 -0
- package/lib/features/webbuilder/buildFragments.js +15 -9
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/buildJob.js +3 -3
- package/lib/features/webbuilder/buildJob.js.map +1 -1
- package/lib/features/webbuilder/publicSandboxDomain.js +5 -0
- package/lib/features/webbuilder/publicSandboxDomain.js.map +1 -0
- package/lib/features/webbuilder/sandboxPublicHost.js +74 -0
- package/lib/features/webbuilder/sandboxPublicHost.js.map +1 -0
- package/lib/features/webbuilder/siteAddress.js +2 -1
- package/lib/features/webbuilder/siteAddress.js.map +1 -1
- package/lib/features/webbuilder/webbuilderPrompts.js +3 -2
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
- package/lib/features/webbuilder/workflow.js +2 -2
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/hooks/useChatApi.js +15 -3
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/usePrerequisiteIds.js +15 -2
- package/lib/hooks/usePrerequisiteIds.js.map +1 -1
- package/lib/routes.json +107 -0
- package/lib/screens/Home/HomeScreen.js +20 -5
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/HomeHero.js +117 -0
- package/lib/screens/Home/components/HomeHero.js.map +1 -0
- package/lib/screens/Home/components/HomeSuggestions.js +108 -85
- package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
- package/lib/screens/Home/components/HomeWash.js +44 -0
- package/lib/screens/Home/components/HomeWash.js.map +1 -0
- package/lib/screens/Home/components/homeCatalog.js +125 -0
- package/lib/screens/Home/components/homeCatalog.js.map +1 -0
- package/lib/screens/Notion/index.js +18 -0
- package/lib/screens/Notion/index.js.map +1 -0
- package/lib/screens/NotionPage/index.js +19 -0
- package/lib/screens/NotionPage/index.js.map +1 -0
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +2 -2
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/useRestoredSandboxes.js +16 -8
- package/lib/screens/WebBuilderNative/useRestoredSandboxes.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +6 -5
- package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +5 -4
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +4 -3
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/lib/services/savedWorkspace.js +44 -0
- package/lib/services/savedWorkspace.js.map +1 -0
- package/lib/theme/mobileTokens.js +1 -0
- package/lib/theme/mobileTokens.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotionPageView.js","sources":["../../../src/features/notion/NotionPageView.tsx"],"sourcesContent":["/**\n * Native Notion page editor (browser `/notion/page/:blockId`).\n *\n * Title and text blocks are TextInputs. Edits land in a local model\n * (notionEditorModel) at once and are written in the background on the same\n * mutations the web editor uses: updateBlock (debounced, with `baseTitle` so a\n * concurrent web edit merges), appendChildren (Return → new block after this\n * one), transformBlock (toolbar \"turn into\"), deleteBlock (Backspace on an\n * empty block). Writes are chained per block so a block is created before it\n * is edited. Sub-pages and databases open in another editor; block types\n * native does not draw yet (embeds, tables, media) show as a placeholder.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n Alert,\n Keyboard,\n KeyboardAvoidingView,\n Platform,\n Pressable,\n RefreshControl,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { StackActions, useNavigation } from '@react-navigation/native';\nimport { useApolloClient, useQuery } from '@apollo/client';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { notionPalette, type NotionPalette } from './notionTheme';\nimport {\n NATIVE_NOTION_APPEND_CHILDREN,\n NATIVE_NOTION_BLOCK,\n NATIVE_NOTION_DELETE_BLOCK,\n NATIVE_NOTION_PAGE_TREE,\n NATIVE_NOTION_TRANSFORM_BLOCK,\n NATIVE_NOTION_UPDATE_BLOCK,\n} from './notionDocuments';\nimport {\n blockIcon,\n blockTitle,\n editedLabel,\n isPageBlock,\n pageTitle,\n richTextToPlain,\n toTitleProperty,\n type NotionBlock,\n type NotionBlockTree,\n} from './notionBlocks';\nimport {\n TURN_INTO,\n flattenModel,\n insertAfter,\n isTextType,\n modelFromTree,\n newBlockId,\n nextTypeAfter,\n patchBlock,\n previousLineId,\n removeBlock,\n type EditorBlock,\n type EditorLine,\n type EditorModel,\n} from './notionEditorModel';\n\ntype Palette = NotionPalette;\ntype SaveState = 'idle' | 'saving' | 'saved' | 'error';\ntype PendingSave = { cancel: () => void; flush: () => void };\n\nconst SAVE_DELAY_MS = 500;\nconst PAGE_EMOJIS = ['📄', '📝', '📌', '💡', '🎯', '🚀', '📚', '✅', '🗓️', '💼', '🏠', '❤️', '⭐', '🔥', '🧠', '🎨'];\n\nconst PLACEHOLDER: Record<string, string> = {\n heading_1: 'Heading 1',\n heading_2: 'Heading 2',\n heading_3: 'Heading 3',\n bulleted_list: 'List',\n numbered_list: 'List',\n todo: 'To-do',\n toggle: 'Toggle',\n quote: 'Quote',\n callout: 'Callout',\n code: 'Code',\n};\n\nconst TEXT_STYLE: Record<string, object> = {\n heading_1: { fontSize: 26, lineHeight: 32, fontWeight: '800' },\n heading_2: { fontSize: 21, lineHeight: 28, fontWeight: '700' },\n heading_3: { fontSize: 18, lineHeight: 25, fontWeight: '700' },\n};\n\nfunction saveLabelOf(save: SaveState, lastEdited: string | null | undefined): string {\n if (save === 'saving') return 'Saving…';\n if (save === 'error') return 'Not saved — check your connection';\n if (save === 'saved') return 'Saved';\n return editedLabel(lastEdited);\n}\n\nexport function NotionPageView({\n orgName,\n blockId,\n isDark,\n}: {\n orgName: string | null;\n blockId: string | null;\n isDark: boolean;\n}) {\n const palette = notionPalette(isDark);\n const navigation = useNavigation<any>();\n const client = useApolloClient();\n const insets = useSafeAreaInsets();\n\n const { data, loading, error, refetch } = useQuery<{ getBlockTree?: NotionBlockTree | null }>(\n NATIVE_NOTION_PAGE_TREE,\n {\n variables: { input: { blockId: blockId ?? '', includeChildren: true, maxDepth: 5 } },\n skip: !blockId,\n fetchPolicy: 'network-only',\n },\n );\n const tree = data?.getBlockTree ?? null;\n // The page block itself comes from getBlock, like the web editor (PageEditor.xstate): the\n // tree's root came back without its title / edit time on device, so it only feeds the body.\n const pageQuery = useQuery<{ getBlock?: NotionBlock | null }>(NATIVE_NOTION_BLOCK, {\n variables: { input: { blockId: blockId ?? '' } },\n skip: !blockId,\n fetchPolicy: 'network-only',\n });\n const page = pageQuery.data?.getBlock ?? null;\n\n const [model, setModel] = useState<EditorModel | null>(null);\n const [title, setTitle] = useState('');\n const [icon, setIcon] = useState<string | null>(null);\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const [pendingFocus, setPendingFocus] = useState<string | null>(null);\n const [save, setSave] = useState<SaveState>('idle');\n const [iconPicker, setIconPicker] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n\n const modelRef = useRef<EditorModel | null>(null);\n modelRef.current = model;\n const inputs = useRef(new Map<string, TextInput | null>());\n const pending = useRef(new Map<string, PendingSave>());\n const chains = useRef(new Map<string, Promise<unknown>>());\n const savedTitles = useRef(new Map<string, string>());\n const inFlight = useRef(0);\n\n /** Load the server page (title, icon) and its tree (blocks) into the editor. */\n const applyTree = useCallback((next: NotionBlockTree, pageBlock: NotionBlock) => {\n setModel(modelFromTree(next));\n const t = blockTitle(pageBlock);\n setTitle(t);\n setIcon(blockIcon(pageBlock));\n savedTitles.current.set(pageBlock.id, t);\n const remember = (node: NotionBlockTree) => {\n savedTitles.current.set(node.block.id, blockTitle(node.block));\n (node.children ?? []).forEach(remember);\n };\n (next.children ?? []).forEach(remember);\n }, []);\n\n // The server tree seeds the editor ONCE. After that the local model is the truth:\n // every mutation result is normalised into the Apollo cache and changes `tree`, and\n // re-seeding from it would drop blocks added here (they are not in the cached\n // tree's children) - the page would go blank while saying \"Saved\".\n const seeded = useRef(false);\n useEffect(() => {\n if (!tree || !page || seeded.current) return;\n seeded.current = true;\n applyTree(tree, page);\n }, [tree, page, applyTree]);\n\n useEffect(() => {\n if (!pendingFocus) return undefined;\n const id = pendingFocus;\n const handle = setTimeout(() => {\n inputs.current.get(id)?.focus();\n setPendingFocus(null);\n }, 30);\n return () => clearTimeout(handle);\n }, [pendingFocus, model]);\n\n /** A mutation that fails loudly: GraphQL errors throw even if the client defaults to errorPolicy 'all'. */\n const write = useCallback(\n async (options: Parameters<typeof client.mutate>[0]) => {\n const res = await client.mutate({ ...options, errorPolicy: 'none' });\n if (res.errors?.length) throw new Error(res.errors[0].message);\n if (!res.data) throw new Error('The server returned no data');\n return res;\n },\n [client],\n );\n\n /** Run `op` after every earlier write to the same block (create → edit → delete order). */\n const enqueue = useCallback((id: string, op: () => Promise<unknown>) => {\n inFlight.current += 1;\n setSave('saving');\n const prev = chains.current.get(id) ?? Promise.resolve();\n const next = prev\n .catch(() => undefined)\n .then(op)\n .then(\n () => {\n inFlight.current -= 1;\n if (!inFlight.current && !pending.current.size) setSave('saved');\n },\n (err) => {\n inFlight.current -= 1;\n setSave('error');\n if (__DEV__) console.warn('[NotionPage] save failed', err);\n },\n );\n chains.current.set(id, next);\n return next;\n }, []);\n\n const writeTitle = useCallback(\n (id: string, text: string) => {\n const baseTitle = savedTitles.current.get(id) ?? '';\n savedTitles.current.set(id, text);\n return enqueue(id, () =>\n write({\n mutation: NATIVE_NOTION_UPDATE_BLOCK,\n variables: { input: { id, properties: { title: toTitleProperty(text) }, baseTitle } },\n }),\n );\n },\n [write, enqueue],\n );\n\n /** Debounce a title write per block. */\n const scheduleTitle = useCallback(\n (id: string, text: string) => {\n pending.current.get(id)?.cancel();\n setSave('saving');\n const handle = setTimeout(() => {\n pending.current.delete(id);\n writeTitle(id, text);\n }, SAVE_DELAY_MS);\n const cancel = () => {\n clearTimeout(handle);\n pending.current.delete(id);\n };\n pending.current.set(id, {\n cancel,\n flush: () => {\n cancel();\n writeTitle(id, text);\n },\n });\n },\n [writeTitle],\n );\n\n // Leaving the page writes whatever is still waiting on the debounce.\n useEffect(\n () => () => {\n [...pending.current.values()].forEach((p) => p.flush());\n },\n [],\n );\n\n const updateProps = useCallback(\n (id: string, properties: Record<string, unknown>) =>\n enqueue(id, () =>\n write({ mutation: NATIVE_NOTION_UPDATE_BLOCK, variables: { input: { id, properties } } }),\n ),\n [write, enqueue],\n );\n\n /** New block under `parentId` after `afterId` (end when null); focuses it when it is text. */\n const addBlock = useCallback(\n (parentId: string, afterId: string | null, type: string, extra: Record<string, unknown> = {}) => {\n const id = newBlockId();\n const properties: Record<string, unknown> = {\n ...(isTextType(type) || type === 'page' ? { title: [] } : {}),\n ...(type === 'todo' ? { checked: false } : {}),\n ...extra,\n };\n const block: EditorBlock = { id, type, parentId, text: '', properties };\n setModel((m) => (m ? insertAfter(m, block, afterId) : m));\n savedTitles.current.set(id, '');\n if (isTextType(type)) setPendingFocus(id);\n enqueue(id, () =>\n write({\n mutation: NATIVE_NOTION_APPEND_CHILDREN,\n variables: {\n input: {\n parentId,\n ...(afterId ? { after: afterId } : {}),\n children: [{ id, type, parent: { type: 'block', id: parentId }, properties }],\n },\n },\n }),\n );\n return id;\n },\n [write, enqueue],\n );\n\n const turnInto = useCallback(\n (id: string, type: string) => {\n const block = modelRef.current?.blocks[id];\n if (!block || block.type === type) return;\n setModel((cur) => (cur ? patchBlock(cur, id, { type }) : cur));\n enqueue(id, async () => {\n await write({\n mutation: NATIVE_NOTION_TRANSFORM_BLOCK,\n variables: { blockId: id, newType: type },\n });\n if (type === 'todo') {\n await write({\n mutation: NATIVE_NOTION_UPDATE_BLOCK,\n variables: { input: { id, properties: { checked: false } } },\n });\n }\n });\n },\n [write, enqueue],\n );\n\n const deleteLine = useCallback(\n (id: string) => {\n const m = modelRef.current;\n if (!m) return;\n const prev = previousLineId(m, id);\n pending.current.get(id)?.cancel();\n setModel(removeBlock(m, id));\n if (prev) setPendingFocus(prev);\n else setFocusedId(null);\n enqueue(id, () => write({ mutation: NATIVE_NOTION_DELETE_BLOCK, variables: { blockId: id } }));\n },\n [write, enqueue],\n );\n\n const openPage = useCallback(\n (id: string) => navigation.dispatch(StackActions.push('MainStack.NotionPage', { orgName, blockId: id })),\n [navigation, orgName],\n );\n\n // ---- page-level -------------------------------------------------------\n\n const onTitle = (text: string) => {\n setTitle(text);\n if (blockId) scheduleTitle(blockId, text);\n };\n\n const pickIcon = (emoji: string | null) => {\n setIconPicker(false);\n setIcon(emoji);\n if (blockId) updateProps(blockId, { icon: emoji ? { type: 'emoji', emoji } : null });\n };\n\n const trashPage = () => {\n if (!blockId) return;\n Alert.alert('Move to Trash?', 'You can restore it from Trash.', [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Move to Trash',\n style: 'destructive',\n onPress: async () => {\n try {\n await write({ mutation: NATIVE_NOTION_DELETE_BLOCK, variables: { blockId } });\n client.refetchQueries({ include: ['NativeNotionChildren'] }).catch(() => undefined);\n navigation.goBack();\n } catch (err) {\n Alert.alert(\"Couldn't move to Trash\", err instanceof Error ? err.message : undefined);\n }\n },\n },\n ]);\n };\n\n // ---- blocks -----------------------------------------------------------\n\n const onChangeText = (id: string, text: string) => {\n setModel((m) => (m ? patchBlock(m, id, { text }) : m));\n scheduleTitle(id, text);\n };\n\n const onSubmit = (line: EditorLine) => {\n const { block } = line;\n // Return on an empty list item ends the list (Notion behaviour).\n if (!block.text && block.type !== 'paragraph' && nextTypeAfter(block.type) === block.type) {\n turnInto(block.id, 'paragraph');\n return;\n }\n addBlock(block.parentId, block.id, nextTypeAfter(block.type));\n };\n\n const onBackspace = (line: EditorLine) => {\n const { block } = line;\n if (block.text) return;\n // First Backspace turns a styled empty block back into text, the next removes it.\n if (block.type !== 'paragraph' && block.type !== 'text') turnInto(block.id, 'paragraph');\n else deleteLine(block.id);\n };\n\n const toggleTodo = (block: EditorBlock) => {\n const checked = block.properties.checked !== true;\n setModel((m) => (m ? patchBlock(m, block.id, { properties: { ...block.properties, checked } }) : m));\n updateProps(block.id, { checked });\n };\n\n const addSubPage = () => {\n const m = modelRef.current;\n if (!m) return;\n const anchor = focusedId ? m.blocks[focusedId] : null;\n const id = addBlock(anchor?.parentId ?? m.rootId, anchor?.id ?? null, 'page');\n Keyboard.dismiss();\n // Open once the create has landed so the new editor finds the page.\n chains.current.get(id)?.then(() => openPage(id));\n };\n\n const appendAtEnd = () => {\n const m = modelRef.current;\n if (!m) return;\n const top = m.children[m.rootId] ?? [];\n const last = top.length ? m.blocks[top[top.length - 1]] : null;\n if (last && isTextType(last.type) && !last.text) setPendingFocus(last.id);\n else addBlock(m.rootId, null, 'paragraph');\n };\n\n const lines = useMemo(() => (model ? flattenModel(model) : []), [model]);\n const focused = focusedId && model ? (model.blocks[focusedId] ?? null) : null;\n\n if (!model || !tree || !page) {\n return (\n <View style={[styles.center, { backgroundColor: palette.card }]}>\n {loading || pageQuery.loading || !blockId ? (\n <ActivityIndicator color={palette.primary} />\n ) : (\n <>\n <Text\n style={[\n styles.muted,\n { color: error || pageQuery.error ? palette.danger : palette.textMuted },\n ]}\n >\n {error || pageQuery.error ? \"Couldn't load this page.\" : 'This page was not found.'}\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => {\n refetch();\n pageQuery.refetch();\n }}\n style={styles.retry}\n >\n <Text style={{ color: palette.primary, fontWeight: '600' }}>Try again</Text>\n </Pressable>\n </>\n )}\n </View>\n );\n }\n\n return (\n <KeyboardAvoidingView\n style={[styles.flex, { backgroundColor: palette.card }]}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n keyboardVerticalOffset={Platform.OS === 'ios' ? insets.top + 56 : 0}\n >\n <ScrollView\n style={styles.flex}\n contentContainerStyle={styles.content}\n keyboardShouldPersistTaps=\"handled\"\n refreshControl={\n <RefreshControl\n refreshing={refreshing}\n onRefresh={async () => {\n setRefreshing(true);\n try {\n const [res, pageRes] = await Promise.all([refetch(), pageQuery.refetch()]);\n const next = res.data?.getBlockTree;\n const nextPage = pageRes.data?.getBlock;\n if (next && nextPage && !pending.current.size && !inFlight.current) {\n applyTree(next, nextPage);\n }\n } finally {\n setRefreshing(false);\n }\n }}\n />\n }\n >\n <View style={styles.pageActions}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={icon ? 'Change icon' : 'Add icon'}\n onPress={() => setIconPicker((v) => !v)}\n style={({ pressed }) => [styles.pageAction, pressed && { backgroundColor: palette.pressed }]}\n >\n {icon ? (\n <Text style={styles.pageEmoji}>{icon}</Text>\n ) : (\n <>\n <Ionicons name=\"happy-outline\" size={16} color={palette.textMuted} />\n <Text style={[styles.pageActionLabel, { color: palette.textMuted }]}>Add icon</Text>\n </>\n )}\n </Pressable>\n <View style={styles.flex} />\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Move page to Trash\"\n onPress={trashPage}\n hitSlop={8}\n style={({ pressed }) => [styles.pageAction, pressed && { backgroundColor: palette.pressed }]}\n >\n <Ionicons name=\"trash-outline\" size={18} color={palette.textMuted} />\n </Pressable>\n </View>\n {iconPicker ? (\n <View style={[styles.emojiGrid, { backgroundColor: palette.fill }]}>\n {PAGE_EMOJIS.map((e) => (\n <Pressable\n key={e}\n accessibilityRole=\"button\"\n onPress={() => pickIcon(e)}\n style={styles.emojiCell}\n >\n <Text style={styles.emoji}>{e}</Text>\n </Pressable>\n ))}\n {icon ? (\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => pickIcon(null)}\n style={styles.emojiRemove}\n >\n <Text style={{ color: palette.danger, fontWeight: '600' }}>Remove icon</Text>\n </Pressable>\n ) : null}\n </View>\n ) : null}\n\n <TextInput\n value={title}\n onChangeText={onTitle}\n placeholder=\"Untitled\"\n placeholderTextColor={palette.textFaint}\n multiline\n scrollEnabled={false}\n submitBehavior=\"submit\"\n returnKeyType=\"next\"\n onSubmitEditing={() => {\n const first = lines.find((l) => isTextType(l.block.type));\n if (first) setPendingFocus(first.block.id);\n else addBlock(model.rootId, null, 'paragraph');\n }}\n onFocus={() => setFocusedId(null)}\n style={[styles.title, { color: palette.text }]}\n />\n <Text style={[styles.meta, { color: save === 'error' ? palette.danger : palette.textMuted }]}>\n {saveLabelOf(save, page.lastEditedTime)}\n </Text>\n\n <View style={styles.body}>\n {lines.map((line) => (\n <BlockLine\n key={line.block.id}\n line={line}\n palette={palette}\n focused={line.block.id === focusedId}\n registerInput={(input) => inputs.current.set(line.block.id, input)}\n onFocus={() => setFocusedId(line.block.id)}\n onChangeText={(t) => onChangeText(line.block.id, t)}\n onSubmit={() => onSubmit(line)}\n onBackspace={() => onBackspace(line)}\n onToggleTodo={() => toggleTodo(line.block)}\n onOpenPage={openPage}\n onDelete={() => deleteLine(line.block.id)}\n />\n ))}\n </View>\n\n {/* Tap below the last block to keep writing (Notion's click-to-append area). */}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add a block\"\n onPress={appendAtEnd}\n style={styles.appendArea}\n >\n {lines.length === 0 ? (\n <Text style={[styles.startHint, { color: palette.textFaint }]}>Tap here to start writing…</Text>\n ) : null}\n </Pressable>\n </ScrollView>\n\n {focused ? (\n <EditorToolbar\n palette={palette}\n block={focused}\n onTurnInto={(type) => turnInto(focused.id, type)}\n onDivider={() => {\n addBlock(focused.parentId, focused.id, 'divider');\n }}\n onSubPage={addSubPage}\n onDelete={() => deleteLine(focused.id)}\n onDone={() => {\n Keyboard.dismiss();\n setFocusedId(null);\n }}\n />\n ) : null}\n </KeyboardAvoidingView>\n );\n}\n\nfunction BlockLine({\n line,\n palette,\n focused,\n registerInput,\n onFocus,\n onChangeText,\n onSubmit,\n onBackspace,\n onToggleTodo,\n onOpenPage,\n onDelete,\n}: {\n line: EditorLine;\n palette: Palette;\n focused: boolean;\n registerInput: (input: TextInput | null) => void;\n onFocus: () => void;\n onChangeText: (text: string) => void;\n onSubmit: () => void;\n onBackspace: () => void;\n onToggleTodo: () => void;\n onOpenPage: (id: string) => void;\n onDelete: () => void;\n}) {\n const { block, depth, number } = line;\n const indent = { marginLeft: depth * 22 };\n\n const confirmDelete = () =>\n Alert.alert('Delete block?', undefined, [\n { text: 'Cancel', style: 'cancel' },\n { text: 'Delete', style: 'destructive', onPress: onDelete },\n ]);\n\n if (isPageBlock(block)) {\n const emoji = blockIcon(block);\n return (\n <Pressable\n accessibilityRole=\"link\"\n onPress={() => onOpenPage(block.id)}\n onLongPress={confirmDelete}\n style={({ pressed }) => [\n styles.row,\n styles.linkRow,\n indent,\n pressed && { backgroundColor: palette.pressed },\n ]}\n >\n {emoji ? (\n <Text style={styles.inlineEmoji}>{emoji}</Text>\n ) : (\n <Ionicons\n name={block.type === 'database' ? 'grid-outline' : 'document-text-outline'}\n size={18}\n color={palette.textMuted}\n />\n )}\n <Text style={[styles.text, styles.link, { color: palette.text, borderBottomColor: palette.hairline }]}>\n {block.text.trim() || pageTitle({ properties: block.properties })}\n </Text>\n </Pressable>\n );\n }\n\n if (block.type === 'divider') {\n return (\n <Pressable onLongPress={confirmDelete} style={[styles.dividerHit, indent]}>\n <View style={[styles.divider, { backgroundColor: palette.hairline }]} />\n </Pressable>\n );\n }\n\n if (!isTextType(block.type)) {\n const caption = block.text || richTextToPlain(block.properties.caption) || block.type.replace(/_/g, ' ');\n return (\n <Pressable\n onLongPress={confirmDelete}\n style={[styles.row, styles.unsupported, { borderColor: palette.hairline }, indent]}\n >\n <Ionicons name=\"cube-outline\" size={16} color={palette.textMuted} />\n <Text style={[styles.unsupportedText, { color: palette.textMuted }]} numberOfLines={2}>\n {caption}\n </Text>\n <Text style={[styles.webOnly, { color: palette.textFaint }]}>Web</Text>\n </Pressable>\n );\n }\n\n const checked = block.properties.checked === true;\n let gutter: React.ReactNode = null;\n if (block.type === 'bulleted_list') {\n gutter = <Text style={[styles.text, styles.marker, { color: palette.text }]}>•</Text>;\n } else if (block.type === 'numbered_list') {\n gutter = <Text style={[styles.text, styles.marker, { color: palette.text }]}>{`${number ?? 1}.`}</Text>;\n } else if (block.type === 'todo') {\n gutter = (\n <Pressable\n accessibilityRole=\"checkbox\"\n accessibilityState={{ checked }}\n onPress={onToggleTodo}\n hitSlop={8}\n style={styles.check}\n >\n <Ionicons\n name={checked ? 'checkbox' : 'square-outline'}\n size={21}\n color={checked ? palette.primary : palette.textMuted}\n />\n </Pressable>\n );\n } else if (block.type === 'toggle') {\n gutter = <Ionicons name=\"caret-down\" size={14} color={palette.textMuted} style={styles.caret} />;\n } else if (block.type === 'callout') {\n gutter = <Text style={styles.inlineEmoji}>{blockIcon({ properties: block.properties }) ?? '💡'}</Text>;\n }\n\n return (\n <View\n style={[\n styles.row,\n indent,\n block.type === 'quote' && [styles.quote, { borderLeftColor: palette.text }],\n block.type === 'callout' && [styles.callout, { backgroundColor: palette.fill }],\n block.type === 'code' && [styles.code, { backgroundColor: palette.fill }],\n block.type.startsWith('heading') && styles.headingRow,\n ]}\n >\n {gutter}\n <TextInput\n ref={registerInput}\n value={block.text}\n onChangeText={onChangeText}\n onFocus={onFocus}\n multiline\n scrollEnabled={false}\n submitBehavior={block.type === 'code' ? 'newline' : 'submit'}\n onSubmitEditing={block.type === 'code' ? undefined : onSubmit}\n onKeyPress={(e) => {\n if (e.nativeEvent.key === 'Backspace') onBackspace();\n }}\n autoCorrect={block.type !== 'code'}\n autoCapitalize={block.type === 'code' ? 'none' : 'sentences'}\n placeholder={focused ? (PLACEHOLDER[block.type] ?? 'Type something…') : PLACEHOLDER[block.type]}\n placeholderTextColor={palette.textFaint}\n style={[\n styles.input,\n TEXT_STYLE[block.type] ?? styles.text,\n { color: palette.text },\n block.type === 'todo' && checked && styles.done,\n block.type === 'todo' && checked && { color: palette.textMuted },\n block.type === 'code' && styles.codeText,\n ]}\n textAlignVertical=\"top\"\n />\n </View>\n );\n}\n\nfunction EditorToolbar({\n palette,\n block,\n onTurnInto,\n onDivider,\n onSubPage,\n onDelete,\n onDone,\n}: {\n palette: Palette;\n block: EditorBlock;\n onTurnInto: (type: string) => void;\n onDivider: () => void;\n onSubPage: () => void;\n onDelete: () => void;\n onDone: () => void;\n}) {\n return (\n <View style={[styles.toolbar, { backgroundColor: palette.card, borderTopColor: palette.hairline }]}>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"always\"\n contentContainerStyle={styles.toolbarContent}\n >\n {TURN_INTO.map((t) => {\n const active = t.type === block.type || (t.type === 'paragraph' && block.type === 'text');\n return (\n <Pressable\n key={t.type}\n accessibilityRole=\"button\"\n accessibilityLabel={`Turn into ${t.label}`}\n accessibilityState={{ selected: active }}\n onPress={() => onTurnInto(t.type)}\n style={[styles.tool, { backgroundColor: active ? palette.primarySoft : palette.fill }]}\n >\n <Text style={[styles.toolLabel, { color: active ? palette.primary : palette.text }]}>\n {t.short}\n </Text>\n </Pressable>\n );\n })}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Insert divider\"\n onPress={onDivider}\n style={[styles.tool, { backgroundColor: palette.fill }]}\n >\n <Ionicons name=\"remove-outline\" size={18} color={palette.text} />\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Insert sub-page\"\n onPress={onSubPage}\n style={[styles.tool, { backgroundColor: palette.fill }]}\n >\n <Ionicons name=\"document-text-outline\" size={17} color={palette.text} />\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Delete block\"\n onPress={onDelete}\n style={[styles.tool, { backgroundColor: palette.fill }]}\n >\n <Ionicons name=\"trash-outline\" size={17} color={palette.danger} />\n </Pressable>\n </ScrollView>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Done editing\"\n onPress={onDone}\n style={styles.toolDone}\n hitSlop={6}\n >\n <Ionicons name=\"chevron-down\" size={22} color={palette.text} />\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n flex: { flex: 1 },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: 24 },\n content: { paddingHorizontal: 20, paddingTop: 12, paddingBottom: 40 },\n muted: { fontSize: 15, textAlign: 'center' },\n retry: { marginTop: 12, padding: 8 },\n\n pageActions: { flexDirection: 'row', alignItems: 'center', marginBottom: 4 },\n pageAction: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 8,\n paddingVertical: 6,\n borderRadius: 8,\n },\n pageActionLabel: { fontSize: 14, fontWeight: '500' },\n pageEmoji: { fontSize: 40 },\n emojiGrid: { flexDirection: 'row', flexWrap: 'wrap', padding: 8, borderRadius: 14, marginBottom: 8 },\n emojiCell: { width: '12.5%', aspectRatio: 1, alignItems: 'center', justifyContent: 'center' },\n emoji: { fontSize: 24 },\n emojiRemove: { width: '100%', alignItems: 'center', paddingVertical: 8 },\n\n title: { fontSize: 32, fontWeight: '800', lineHeight: 38, padding: 0, letterSpacing: -0.5 },\n meta: { fontSize: 12, marginTop: 6 },\n body: { marginTop: 16, gap: 2 },\n\n row: { flexDirection: 'row', alignItems: 'flex-start', gap: 8, borderRadius: 6 },\n headingRow: { marginTop: 10 },\n linkRow: { alignItems: 'center', paddingVertical: 6 },\n input: { flex: 1, padding: 0, paddingVertical: 3, margin: 0, minHeight: 30 },\n text: { fontSize: 16, lineHeight: 24 },\n done: { textDecorationLine: 'line-through' },\n marker: { minWidth: 18, paddingTop: 3 },\n check: { paddingTop: 4 },\n caret: { paddingTop: 9 },\n link: { fontWeight: '600', borderBottomWidth: 1, flexShrink: 1 },\n quote: { borderLeftWidth: 3, paddingLeft: 12 },\n callout: { padding: 12, borderRadius: mobileTokens.radius.sm },\n inlineEmoji: { fontSize: 18, lineHeight: 30 },\n code: { padding: 12, borderRadius: mobileTokens.radius.sm },\n codeText: { fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace', fontSize: 13, lineHeight: 19 },\n dividerHit: { paddingVertical: 10 },\n divider: { height: StyleSheet.hairlineWidth },\n unsupported: { borderWidth: 1, borderStyle: 'dashed', padding: 10, alignItems: 'center', marginVertical: 2 },\n unsupportedText: { flex: 1, fontSize: 14, textTransform: 'capitalize' },\n webOnly: { fontSize: 12, fontWeight: '600' },\n\n appendArea: { minHeight: 160, paddingTop: 8 },\n startHint: { fontSize: 16 },\n\n toolbar: {\n flexDirection: 'row',\n alignItems: 'center',\n borderTopWidth: StyleSheet.hairlineWidth,\n paddingVertical: 6,\n },\n toolbarContent: { gap: 6, paddingHorizontal: 10, alignItems: 'center' },\n tool: {\n minWidth: 40,\n height: 36,\n paddingHorizontal: 10,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n toolLabel: { fontSize: 15, fontWeight: '700' },\n toolDone: { paddingHorizontal: 12, height: 36, justifyContent: 'center' },\n});\n"],"names":["_a","_b","_c"],"mappings":"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"}
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useCallback,useState,useMemo}from'react';import {FlatList,StyleSheet,View,Text,Pressable,RefreshControl,ScrollView,SectionList,ActivityIndicator,Alert,TextInput}from'react-native';import {Ionicons}from'@expo/vector-icons';import {useApolloClient,useQuery}from'@apollo/client/index.js';import {NATIVE_NOTION_INBOX,NATIVE_NOTION_MARK_INBOX_READ,NATIVE_NOTION_CHILDREN,NATIVE_NOTION_PAGE_TREE}from'./notionDocuments.js';import {formatMeetingWhen,MEETING_STATUS_LABEL,editedLabel,groupMeetings,pageTitle}from'./notionBlocks.js';import {userTemplateEntry,BUILT_IN_TEMPLATES,filterTemplates,TEMPLATE_CATEGORIES,templateRootFromTree}from'./notionTemplates.js';import {ListRow,Pill,EmptyState,SectionHeader,ui,PageRow}from'./notionUi.js';function Loading({
|
|
2
|
+
palette
|
|
3
|
+
}) {
|
|
4
|
+
return /* @__PURE__ */ jsx(View, { style: styles.loading, children: /* @__PURE__ */ jsx(ActivityIndicator, { color: palette.textMuted }) });
|
|
5
|
+
}
|
|
6
|
+
function groupedItemStyle(palette, index, count) {
|
|
7
|
+
return [{
|
|
8
|
+
backgroundColor: palette.card
|
|
9
|
+
}, index === 0 && styles.groupTop, index === count - 1 && styles.groupBottom];
|
|
10
|
+
}
|
|
11
|
+
function SearchField({
|
|
12
|
+
palette,
|
|
13
|
+
value,
|
|
14
|
+
onChange,
|
|
15
|
+
placeholder
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */ jsxs(View, { style: [styles.searchField, {
|
|
18
|
+
backgroundColor: palette.fill
|
|
19
|
+
}], children: [
|
|
20
|
+
/* @__PURE__ */ jsx(Ionicons, { name: "search", size: 17, color: palette.textMuted }),
|
|
21
|
+
/* @__PURE__ */ jsx(TextInput, { value, onChangeText: onChange, placeholder, placeholderTextColor: palette.textMuted, autoCorrect: false, clearButtonMode: "while-editing", style: [styles.searchInput, {
|
|
22
|
+
color: palette.text
|
|
23
|
+
}] })
|
|
24
|
+
] });
|
|
25
|
+
}
|
|
26
|
+
function Chips({
|
|
27
|
+
palette,
|
|
28
|
+
options,
|
|
29
|
+
value,
|
|
30
|
+
onChange
|
|
31
|
+
}) {
|
|
32
|
+
return /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.chips, children: options.map((o) => {
|
|
33
|
+
const selected = o.id === value;
|
|
34
|
+
return /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "tab", accessibilityState: {
|
|
35
|
+
selected
|
|
36
|
+
}, onPress: () => onChange(o.id), style: [styles.chip, {
|
|
37
|
+
backgroundColor: selected ? palette.text : palette.fill
|
|
38
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.chipLabel, {
|
|
39
|
+
color: selected ? palette.card : palette.text
|
|
40
|
+
}], children: o.label }) }, o.id);
|
|
41
|
+
}) });
|
|
42
|
+
}
|
|
43
|
+
const INBOX_KIND = {
|
|
44
|
+
mention: {
|
|
45
|
+
icon: "at",
|
|
46
|
+
label: "Mentioned you"
|
|
47
|
+
},
|
|
48
|
+
reminder: {
|
|
49
|
+
icon: "alarm-outline",
|
|
50
|
+
label: "Reminder"
|
|
51
|
+
},
|
|
52
|
+
reply: {
|
|
53
|
+
icon: "return-down-forward",
|
|
54
|
+
label: "Replied"
|
|
55
|
+
},
|
|
56
|
+
comment: {
|
|
57
|
+
icon: "chatbubble-outline",
|
|
58
|
+
label: "Commented"
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
function InboxSheet({
|
|
62
|
+
palette,
|
|
63
|
+
onOpenPage
|
|
64
|
+
}) {
|
|
65
|
+
var _a;
|
|
66
|
+
const client = useApolloClient();
|
|
67
|
+
const {
|
|
68
|
+
data,
|
|
69
|
+
loading,
|
|
70
|
+
error,
|
|
71
|
+
refetch
|
|
72
|
+
} = useQuery(NATIVE_NOTION_INBOX, {
|
|
73
|
+
variables: {
|
|
74
|
+
limit: 50
|
|
75
|
+
},
|
|
76
|
+
fetchPolicy: "network-only"
|
|
77
|
+
});
|
|
78
|
+
const items = (_a = data == null ? void 0 : data.notesInbox) != null ? _a : [];
|
|
79
|
+
const unread = items.filter((i) => !i.readAt).length;
|
|
80
|
+
const markRead = useCallback(async (opts) => {
|
|
81
|
+
try {
|
|
82
|
+
await client.mutate({
|
|
83
|
+
mutation: NATIVE_NOTION_MARK_INBOX_READ,
|
|
84
|
+
variables: opts
|
|
85
|
+
});
|
|
86
|
+
await Promise.all([refetch(), client.refetchQueries({
|
|
87
|
+
include: ["NativeNotionInboxUnread"]
|
|
88
|
+
})]);
|
|
89
|
+
} catch (e) {
|
|
90
|
+
}
|
|
91
|
+
}, [client, refetch]);
|
|
92
|
+
if (loading && !data) return /* @__PURE__ */ jsx(Loading, { palette });
|
|
93
|
+
return /* @__PURE__ */ jsx(FlatList, { data: items, keyExtractor: (i) => i.id, contentContainerStyle: styles.content, refreshControl: /* @__PURE__ */ jsx(RefreshControl, { refreshing: false, onRefresh: () => refetch() }), ListHeaderComponent: unread ? /* @__PURE__ */ jsxs(View, { style: styles.inboxHeader, children: [
|
|
94
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.note, {
|
|
95
|
+
color: palette.textMuted
|
|
96
|
+
}], children: `${unread} unread` }),
|
|
97
|
+
/* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: () => markRead({
|
|
98
|
+
all: true
|
|
99
|
+
}), hitSlop: 8, children: /* @__PURE__ */ jsx(Text, { style: [styles.link, {
|
|
100
|
+
color: palette.primary
|
|
101
|
+
}], children: "Mark all read" }) })
|
|
102
|
+
] }) : null, ListEmptyComponent: /* @__PURE__ */ jsx(EmptyState, { palette, icon: error ? "cloud-offline-outline" : "notifications-outline", title: error ? "Couldn't load your inbox" : "You're all caught up", text: error ? "Pull down to try again." : "Mentions of you and your @date reminders show up here." }), renderItem: ({
|
|
103
|
+
item,
|
|
104
|
+
index
|
|
105
|
+
}) => {
|
|
106
|
+
var _a2, _b, _c;
|
|
107
|
+
const kind = (_a2 = INBOX_KIND[item.kind]) != null ? _a2 : INBOX_KIND.mention;
|
|
108
|
+
const when = editedLabel((_c = (_b = item.dueAt) != null ? _b : item.showAt) != null ? _c : item.createdAt).replace("Edited ", "");
|
|
109
|
+
return /* @__PURE__ */ jsx(View, { style: groupedItemStyle(palette, index, items.length), children: /* @__PURE__ */ jsx(ListRow, { palette, icon: kind.icon, iconColor: item.readAt ? palette.textMuted : palette.primary, iconBg: item.readAt ? palette.fill : palette.primarySoft, title: item.text || kind.label, subtitle: `${kind.label}${when ? ` \xB7 ${when}` : ""}`, divider: index < items.length - 1, onPress: () => {
|
|
110
|
+
if (!item.readAt) markRead({
|
|
111
|
+
ids: [item.id]
|
|
112
|
+
});
|
|
113
|
+
onOpenPage(item.pageId || item.blockId);
|
|
114
|
+
}, trailing: item.readAt ? void 0 : /* @__PURE__ */ jsx(View, { style: [styles.unreadDot, {
|
|
115
|
+
backgroundColor: palette.primary
|
|
116
|
+
}] }) }) });
|
|
117
|
+
} });
|
|
118
|
+
}
|
|
119
|
+
const STATUS_COLORS = {
|
|
120
|
+
scheduled: {
|
|
121
|
+
fg: "#0369a1",
|
|
122
|
+
bg: "rgba(14,165,233,0.12)"
|
|
123
|
+
},
|
|
124
|
+
live: {
|
|
125
|
+
fg: "#e11d48",
|
|
126
|
+
bg: "rgba(244,63,94,0.14)"
|
|
127
|
+
},
|
|
128
|
+
ended: {
|
|
129
|
+
fg: "#78716c",
|
|
130
|
+
bg: "rgba(120,113,108,0.12)"
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
function MeetingRowView({
|
|
134
|
+
row,
|
|
135
|
+
palette,
|
|
136
|
+
onPress,
|
|
137
|
+
divider
|
|
138
|
+
}) {
|
|
139
|
+
const status = STATUS_COLORS[row.status];
|
|
140
|
+
const who = row.attendees.length ? ` \xB7 ${row.attendees.join(", ")}` : "";
|
|
141
|
+
return /* @__PURE__ */ jsx(ListRow, { palette, emoji: row.icon, icon: "calendar-outline", title: row.title, subtitle: `${formatMeetingWhen(row.startsAt)}${who}`, onPress, divider, trailing: /* @__PURE__ */ jsx(Pill, { label: MEETING_STATUS_LABEL[row.status], color: status.fg, bg: status.bg }) });
|
|
142
|
+
}
|
|
143
|
+
function MeetingsSheet({
|
|
144
|
+
palette,
|
|
145
|
+
notion,
|
|
146
|
+
onOpenPage
|
|
147
|
+
}) {
|
|
148
|
+
const [creating, setCreating] = useState(false);
|
|
149
|
+
const sections = useMemo(() => {
|
|
150
|
+
const g = groupMeetings(notion.meetings);
|
|
151
|
+
return [{
|
|
152
|
+
title: "Today",
|
|
153
|
+
data: g.today
|
|
154
|
+
}, {
|
|
155
|
+
title: "Upcoming",
|
|
156
|
+
data: g.upcoming
|
|
157
|
+
}, {
|
|
158
|
+
title: "Past",
|
|
159
|
+
data: g.past
|
|
160
|
+
}].filter((s) => s.data.length);
|
|
161
|
+
}, [notion.meetings]);
|
|
162
|
+
const newMeeting = async () => {
|
|
163
|
+
setCreating(true);
|
|
164
|
+
try {
|
|
165
|
+
const created = await notion.createMeeting();
|
|
166
|
+
if (created == null ? void 0 : created.id) onOpenPage(created.id);
|
|
167
|
+
} catch (err) {
|
|
168
|
+
Alert.alert("Couldn't create the meeting", err instanceof Error ? err.message : void 0);
|
|
169
|
+
} finally {
|
|
170
|
+
setCreating(false);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
if (!sections.length) {
|
|
174
|
+
return /* @__PURE__ */ jsx(ScrollView, { contentContainerStyle: styles.content, children: /* @__PURE__ */ jsx(EmptyState, { palette, icon: "calendar-outline", title: "No meetings yet", text: "A meeting page holds the agenda, attendees and AI meeting notes.", action: {
|
|
175
|
+
label: "New meeting",
|
|
176
|
+
onPress: newMeeting,
|
|
177
|
+
busy: creating
|
|
178
|
+
} }) });
|
|
179
|
+
}
|
|
180
|
+
return /* @__PURE__ */ jsx(SectionList, { sections, keyExtractor: (r) => r.id, contentContainerStyle: styles.content, stickySectionHeadersEnabled: false, ListHeaderComponent: /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: newMeeting, disabled: creating, style: ({
|
|
181
|
+
pressed
|
|
182
|
+
}) => [styles.wideButton, {
|
|
183
|
+
backgroundColor: palette.primarySoft
|
|
184
|
+
}, pressed && ui.pressedScale], children: creating ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: palette.primary }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
185
|
+
/* @__PURE__ */ jsx(Ionicons, { name: "add", size: 18, color: palette.primary }),
|
|
186
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.wideButtonLabel, {
|
|
187
|
+
color: palette.primary
|
|
188
|
+
}], children: "New meeting" })
|
|
189
|
+
] }) }), renderSectionHeader: ({
|
|
190
|
+
section
|
|
191
|
+
}) => /* @__PURE__ */ jsx(SectionHeader, { label: section.title, count: section.data.length, palette }), renderItem: ({
|
|
192
|
+
item,
|
|
193
|
+
index,
|
|
194
|
+
section
|
|
195
|
+
}) => /* @__PURE__ */ jsx(View, { style: groupedItemStyle(palette, index, section.data.length), children: /* @__PURE__ */ jsx(MeetingRowView, { row: item, palette, onPress: () => onOpenPage(item.id), divider: index < section.data.length - 1 }) }) });
|
|
196
|
+
}
|
|
197
|
+
function AllPagesSheet({
|
|
198
|
+
palette,
|
|
199
|
+
notion,
|
|
200
|
+
onOpenPage
|
|
201
|
+
}) {
|
|
202
|
+
const [filter, setFilter] = useState("");
|
|
203
|
+
const [sort, setSort] = useState("edited");
|
|
204
|
+
const rows = useMemo(() => {
|
|
205
|
+
const q = filter.trim().toLowerCase();
|
|
206
|
+
const list = notion.pages.filter((p) => !q || pageTitle(p).toLowerCase().includes(q));
|
|
207
|
+
return sort === "title" ? [...list].sort((a, b) => pageTitle(a).localeCompare(pageTitle(b))) : list;
|
|
208
|
+
}, [filter, notion.pages, sort]);
|
|
209
|
+
return /* @__PURE__ */ jsx(FlatList, { data: rows, keyExtractor: (p) => p.id, keyboardShouldPersistTaps: "handled", contentContainerStyle: styles.content, ListHeaderComponent: /* @__PURE__ */ jsxs(View, { style: styles.toolbar, children: [
|
|
210
|
+
/* @__PURE__ */ jsx(SearchField, { palette, value: filter, onChange: setFilter, placeholder: "Filter by title" }),
|
|
211
|
+
/* @__PURE__ */ jsx(Chips, { palette, options: [{
|
|
212
|
+
id: "edited",
|
|
213
|
+
label: "Last edited"
|
|
214
|
+
}, {
|
|
215
|
+
id: "title",
|
|
216
|
+
label: "Title A\u2013Z"
|
|
217
|
+
}], value: sort, onChange: setSort })
|
|
218
|
+
] }), ListEmptyComponent: /* @__PURE__ */ jsx(EmptyState, { palette, icon: "documents-outline", title: filter.trim() ? "No matching pages" : "No pages yet", text: filter.trim() ? "Try a different title." : "Pages you create show up here." }), renderItem: ({
|
|
219
|
+
item,
|
|
220
|
+
index
|
|
221
|
+
}) => /* @__PURE__ */ jsx(View, { style: groupedItemStyle(palette, index, rows.length), children: /* @__PURE__ */ jsx(PageRow, { page: item, palette, onPress: () => onOpenPage(item.id), divider: index < rows.length - 1 }) }) });
|
|
222
|
+
}
|
|
223
|
+
function TemplatesSheet({
|
|
224
|
+
palette,
|
|
225
|
+
notion,
|
|
226
|
+
onOpenPage
|
|
227
|
+
}) {
|
|
228
|
+
var _a;
|
|
229
|
+
const client = useApolloClient();
|
|
230
|
+
const [category, setCategory] = useState("all");
|
|
231
|
+
const [query, setQuery] = useState("");
|
|
232
|
+
const [using, setUsing] = useState(null);
|
|
233
|
+
const libraryQuery = useQuery(NATIVE_NOTION_CHILDREN, {
|
|
234
|
+
variables: {
|
|
235
|
+
blockId: (_a = notion.templateLibraryId) != null ? _a : "",
|
|
236
|
+
pageSize: 100
|
|
237
|
+
},
|
|
238
|
+
skip: !notion.templateLibraryId,
|
|
239
|
+
fetchPolicy: "cache-and-network"
|
|
240
|
+
});
|
|
241
|
+
const mine = useMemo(() => {
|
|
242
|
+
var _a2, _b, _c;
|
|
243
|
+
return ((_c = (_b = (_a2 = libraryQuery.data) == null ? void 0 : _a2.getBlockChildren) == null ? void 0 : _b.results) != null ? _c : []).filter((b) => !b.inTrash && (b.type === "page" || b.type === "database")).map(userTemplateEntry);
|
|
244
|
+
}, [libraryQuery.data]);
|
|
245
|
+
const all = useMemo(() => [...BUILT_IN_TEMPLATES, ...mine], [mine]);
|
|
246
|
+
const shown = useMemo(() => filterTemplates(all, category, query), [all, category, query]);
|
|
247
|
+
const sections = useMemo(() => {
|
|
248
|
+
if (category !== "all") return [{
|
|
249
|
+
title: "",
|
|
250
|
+
data: shown
|
|
251
|
+
}];
|
|
252
|
+
return TEMPLATE_CATEGORIES.filter((c) => c.id !== "all").map((c) => ({
|
|
253
|
+
title: c.label,
|
|
254
|
+
data: shown.filter((t) => t.category === c.id)
|
|
255
|
+
})).filter((s) => s.data.length);
|
|
256
|
+
}, [category, shown]);
|
|
257
|
+
const use = async (template) => {
|
|
258
|
+
var _a2;
|
|
259
|
+
if (!notion.workspace) {
|
|
260
|
+
Alert.alert("Create a workspace first", "Templates create pages inside a workspace.");
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
setUsing(template.id);
|
|
264
|
+
try {
|
|
265
|
+
let root = template.root;
|
|
266
|
+
if (template.sourceBlockId) {
|
|
267
|
+
const res = await client.query({
|
|
268
|
+
query: NATIVE_NOTION_PAGE_TREE,
|
|
269
|
+
variables: {
|
|
270
|
+
input: {
|
|
271
|
+
blockId: template.sourceBlockId,
|
|
272
|
+
includeChildren: true,
|
|
273
|
+
maxDepth: 5
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
fetchPolicy: "network-only"
|
|
277
|
+
});
|
|
278
|
+
const tree = (_a2 = res.data) == null ? void 0 : _a2.getBlockTree;
|
|
279
|
+
if (!tree) throw new Error("Template not found");
|
|
280
|
+
root = templateRootFromTree(tree);
|
|
281
|
+
}
|
|
282
|
+
const created = await notion.createFromTemplate({
|
|
283
|
+
root
|
|
284
|
+
});
|
|
285
|
+
if (created == null ? void 0 : created.failedRows) {
|
|
286
|
+
Alert.alert("Some rows were not added", `${created.failedRows} database row(s) could not be created.`);
|
|
287
|
+
}
|
|
288
|
+
if (created == null ? void 0 : created.id) onOpenPage(created.id);
|
|
289
|
+
} catch (err) {
|
|
290
|
+
Alert.alert("Couldn't use this template", err instanceof Error ? err.message : void 0);
|
|
291
|
+
} finally {
|
|
292
|
+
setUsing(null);
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
return /* @__PURE__ */ jsx(SectionList, { sections, keyExtractor: (t) => t.id, keyboardShouldPersistTaps: "handled", contentContainerStyle: styles.content, stickySectionHeadersEnabled: false, ListHeaderComponent: /* @__PURE__ */ jsxs(View, { style: styles.toolbar, children: [
|
|
296
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.note, {
|
|
297
|
+
color: palette.textMuted
|
|
298
|
+
}], children: "Start a page from a template, or save any page as your own from the web." }),
|
|
299
|
+
/* @__PURE__ */ jsx(SearchField, { palette, value: query, onChange: setQuery, placeholder: "Search templates" }),
|
|
300
|
+
/* @__PURE__ */ jsx(Chips, { palette, options: TEMPLATE_CATEGORIES, value: category, onChange: setCategory })
|
|
301
|
+
] }), ListEmptyComponent: /* @__PURE__ */ jsx(EmptyState, { palette, icon: "albums-outline", title: category === "mine" ? "No saved templates" : "No matching templates", text: category === "mine" ? "Save a page as a template from its \u2022\u2022\u2022 menu on the web." : "Try another search or category." }), renderSectionHeader: ({
|
|
302
|
+
section
|
|
303
|
+
}) => section.title ? /* @__PURE__ */ jsx(SectionHeader, { label: section.title, palette }) : null, renderItem: ({
|
|
304
|
+
item
|
|
305
|
+
}) => /* @__PURE__ */ jsx(TemplateCard, { template: item, palette, busy: using === item.id, disabled: Boolean(using), onUse: () => use(item) }) });
|
|
306
|
+
}
|
|
307
|
+
function TemplateCard({
|
|
308
|
+
template,
|
|
309
|
+
palette,
|
|
310
|
+
busy,
|
|
311
|
+
disabled,
|
|
312
|
+
onUse
|
|
313
|
+
}) {
|
|
314
|
+
return /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", accessibilityLabel: `Use template ${template.name}`, onPress: onUse, disabled, style: ({
|
|
315
|
+
pressed
|
|
316
|
+
}) => [styles.templateCard, {
|
|
317
|
+
backgroundColor: pressed ? palette.pressed : palette.card
|
|
318
|
+
}, ui.cardShadow], children: [
|
|
319
|
+
/* @__PURE__ */ jsx(View, { style: [styles.templateIcon, {
|
|
320
|
+
backgroundColor: palette.fill
|
|
321
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: styles.templateEmoji, children: template.icon }) }),
|
|
322
|
+
/* @__PURE__ */ jsxs(View, { style: ui.flex, children: [
|
|
323
|
+
/* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.templateName, {
|
|
324
|
+
color: palette.text
|
|
325
|
+
}], children: template.name }),
|
|
326
|
+
/* @__PURE__ */ jsx(Text, { numberOfLines: 2, style: [styles.templateDesc, {
|
|
327
|
+
color: palette.textMuted
|
|
328
|
+
}], children: template.description })
|
|
329
|
+
] }),
|
|
330
|
+
/* @__PURE__ */ jsx(View, { style: [styles.useButton, {
|
|
331
|
+
backgroundColor: palette.primarySoft
|
|
332
|
+
}], children: busy ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: palette.primary }) : /* @__PURE__ */ jsx(Text, { style: [styles.useLabel, {
|
|
333
|
+
color: palette.primary
|
|
334
|
+
}], children: "Use" }) })
|
|
335
|
+
] });
|
|
336
|
+
}
|
|
337
|
+
const styles = StyleSheet.create({
|
|
338
|
+
loading: {
|
|
339
|
+
paddingVertical: 48,
|
|
340
|
+
alignItems: "center"
|
|
341
|
+
},
|
|
342
|
+
content: {
|
|
343
|
+
padding: 16,
|
|
344
|
+
paddingBottom: 48
|
|
345
|
+
},
|
|
346
|
+
groupTop: {
|
|
347
|
+
borderTopLeftRadius: 16,
|
|
348
|
+
borderTopRightRadius: 16
|
|
349
|
+
},
|
|
350
|
+
groupBottom: {
|
|
351
|
+
borderBottomLeftRadius: 16,
|
|
352
|
+
borderBottomRightRadius: 16
|
|
353
|
+
},
|
|
354
|
+
note: {
|
|
355
|
+
fontSize: 14,
|
|
356
|
+
lineHeight: 20
|
|
357
|
+
},
|
|
358
|
+
link: {
|
|
359
|
+
fontSize: 15,
|
|
360
|
+
fontWeight: "600"
|
|
361
|
+
},
|
|
362
|
+
toolbar: {
|
|
363
|
+
gap: 12,
|
|
364
|
+
marginBottom: 12
|
|
365
|
+
},
|
|
366
|
+
inboxHeader: {
|
|
367
|
+
flexDirection: "row",
|
|
368
|
+
justifyContent: "space-between",
|
|
369
|
+
alignItems: "center",
|
|
370
|
+
marginBottom: 12
|
|
371
|
+
},
|
|
372
|
+
unreadDot: {
|
|
373
|
+
width: 9,
|
|
374
|
+
height: 9,
|
|
375
|
+
borderRadius: 5
|
|
376
|
+
},
|
|
377
|
+
searchField: {
|
|
378
|
+
flexDirection: "row",
|
|
379
|
+
alignItems: "center",
|
|
380
|
+
gap: 8,
|
|
381
|
+
height: 40,
|
|
382
|
+
paddingHorizontal: 12,
|
|
383
|
+
borderRadius: 12
|
|
384
|
+
},
|
|
385
|
+
searchInput: {
|
|
386
|
+
flex: 1,
|
|
387
|
+
fontSize: 16,
|
|
388
|
+
paddingVertical: 0
|
|
389
|
+
},
|
|
390
|
+
chips: {
|
|
391
|
+
gap: 8
|
|
392
|
+
},
|
|
393
|
+
chip: {
|
|
394
|
+
paddingHorizontal: 14,
|
|
395
|
+
paddingVertical: 8,
|
|
396
|
+
borderRadius: 999
|
|
397
|
+
},
|
|
398
|
+
chipLabel: {
|
|
399
|
+
fontSize: 14,
|
|
400
|
+
fontWeight: "600"
|
|
401
|
+
},
|
|
402
|
+
wideButton: {
|
|
403
|
+
flexDirection: "row",
|
|
404
|
+
alignItems: "center",
|
|
405
|
+
justifyContent: "center",
|
|
406
|
+
gap: 6,
|
|
407
|
+
minHeight: 48,
|
|
408
|
+
borderRadius: 14
|
|
409
|
+
},
|
|
410
|
+
wideButtonLabel: {
|
|
411
|
+
fontSize: 16,
|
|
412
|
+
fontWeight: "700"
|
|
413
|
+
},
|
|
414
|
+
templateCard: {
|
|
415
|
+
flexDirection: "row",
|
|
416
|
+
alignItems: "center",
|
|
417
|
+
gap: 12,
|
|
418
|
+
padding: 14,
|
|
419
|
+
borderRadius: 16,
|
|
420
|
+
marginBottom: 10
|
|
421
|
+
},
|
|
422
|
+
templateIcon: {
|
|
423
|
+
width: 44,
|
|
424
|
+
height: 44,
|
|
425
|
+
borderRadius: 12,
|
|
426
|
+
alignItems: "center",
|
|
427
|
+
justifyContent: "center"
|
|
428
|
+
},
|
|
429
|
+
templateEmoji: {
|
|
430
|
+
fontSize: 22
|
|
431
|
+
},
|
|
432
|
+
templateName: {
|
|
433
|
+
fontSize: 16,
|
|
434
|
+
fontWeight: "700"
|
|
435
|
+
},
|
|
436
|
+
templateDesc: {
|
|
437
|
+
fontSize: 13,
|
|
438
|
+
lineHeight: 18,
|
|
439
|
+
marginTop: 2
|
|
440
|
+
},
|
|
441
|
+
useButton: {
|
|
442
|
+
minWidth: 64,
|
|
443
|
+
paddingHorizontal: 12,
|
|
444
|
+
paddingVertical: 7,
|
|
445
|
+
borderRadius: 999,
|
|
446
|
+
alignItems: "center"
|
|
447
|
+
},
|
|
448
|
+
useLabel: {
|
|
449
|
+
fontSize: 13,
|
|
450
|
+
fontWeight: "700"
|
|
451
|
+
}
|
|
452
|
+
});export{AllPagesSheet,InboxSheet,MeetingRowView,MeetingsSheet,TemplatesSheet};//# sourceMappingURL=NotionSheets.js.map
|