@adminide-stack/yantra-mobile 12.0.140 → 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/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/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 +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNotionDatabase.js","sources":["../../../../src/features/notion/database/useNotionDatabase.ts"],"sourcesContent":["/**\n * Data for one database - the web containers/DatabasePage data layer on a phone: the database\n * block (title, icon, `properties.schema`), its `database_row` children paged through\n * `queryDatabase` in creation order, and its saved views.\n *\n * Writes are optimistic like the web: a cell edit lands in a local overlay at once and is sent\n * with `updateBlock` (the server merges top-level properties, so only `{ [prop]: value }` goes\n * up); a failure rolls it back. Row deletes hide the rows, delete them and hand back an undo.\n * View edits apply locally first and persist with `updateDatabaseView` (filters debounced).\n * A database without saved views gets the implicit Table view; its edits stay local until the\n * first real view is created.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useApolloClient, useMutation, useQuery } from '@apollo/client';\nimport {\n NATIVE_NOTION_BLOCK,\n NATIVE_NOTION_CREATE_BLOCK,\n NATIVE_NOTION_CREATE_DATABASE_VIEW,\n NATIVE_NOTION_DATABASE_VIEWS,\n NATIVE_NOTION_DELETE_BLOCK,\n NATIVE_NOTION_DELETE_DATABASE_VIEW,\n NATIVE_NOTION_QUERY_DATABASE,\n NATIVE_NOTION_RESTORE_BLOCK,\n NATIVE_NOTION_UPDATE_BLOCK,\n NATIVE_NOTION_UPDATE_DATABASE_VIEW,\n} from '../notionDocuments';\nimport { serverErrorText } from '../notionPageActions';\nimport {\n extraColumnFields,\n parseViewSorts,\n type ColumnLike,\n type DatabaseSchema,\n type RowLike,\n type SortSpec,\n} from './databaseView';\nimport { parseViewFilter, serializeViewFilter, type FilterCondition } from './databaseFilter';\nimport { maxUniqueId, uniqueIdProperties } from './uniqueId';\nimport { DEFAULT_VIEW_ID, parseViewSettings, viewLayout, type ViewSettings, type ViewType } from './databaseViews';\n\n/** The server caps a page at 200 rows (web utils/databaseBatch SERVER_MAX_PAGE_SIZE). */\nconst PAGE_SIZE = 200;\n/** Rows in creation order, oldest first (web ROWS_CREATION_ORDER). */\nconst ROWS_CREATION_ORDER = [{ timestamp: 'createdTime', direction: 'ascending' }];\nconst FILTER_SAVE_DELAY = 600;\n\nexport interface DatabaseColumn extends ColumnLike {\n width?: number;\n}\n\nexport interface DatabaseRow extends RowLike {\n type?: string;\n}\n\nexport interface DatabaseViewModel {\n id: string;\n name: string;\n type: ViewType;\n sorts: SortSpec[];\n conditions: FilterCondition[];\n groupBy: string | null;\n properties: unknown;\n settings: ViewSettings;\n}\n\n/** Fields `updateDatabaseView` accepts, in view-model terms. */\nexport interface ViewChange {\n name?: string;\n type?: ViewType;\n sorts?: SortSpec[];\n conditions?: FilterCondition[];\n groupBy?: string | null;\n properties?: unknown;\n settings?: ViewSettings;\n}\n\ninterface RawBlock {\n id: string;\n type: string;\n properties?: Record<string, any> | null;\n createdTime?: string | null;\n lastEditedTime?: string | null;\n createdBy?: string | null;\n lastEditedBy?: string | null;\n workspaceId?: string | null;\n parent?: { type?: string | null; id?: string | null } | null;\n}\n\ninterface RawView {\n id: string;\n name?: string | null;\n type?: string | null;\n filter?: unknown;\n sorts?: unknown;\n properties?: unknown;\n groupBy?: string | null;\n settings?: unknown;\n}\n\ninterface QueryPage {\n queryDatabase?: {\n results?: RawBlock[] | null;\n nextCursor?: string | null;\n hasMore?: boolean | null;\n totalCount?: number | null;\n } | null;\n}\n\nexport function columnsFromSchema(schema: DatabaseSchema | undefined): DatabaseColumn[] {\n if (!schema) return [];\n return Object.entries(schema).map(([name, def]) => ({\n name,\n type: (def?.type as string) || 'text',\n options: def?.options || [],\n width: def?.type === 'title' ? 220 : undefined,\n expression: typeof def?.expression === 'string' ? def.expression : undefined,\n databaseId: typeof def?.databaseId === 'string' ? def.databaseId : undefined,\n ...extraColumnFields(def),\n }));\n}\n\nexport function rowFromBlock(b: RawBlock): DatabaseRow {\n return {\n id: b.id,\n type: b.type,\n properties: b.properties || {},\n createdTime: b.createdTime ?? undefined,\n lastEditedTime: b.lastEditedTime ?? undefined,\n createdBy: b.createdBy ?? undefined,\n lastEditedBy: b.lastEditedBy ?? undefined,\n };\n}\n\nexport function viewFromRaw(v: RawView): DatabaseViewModel {\n return {\n id: v.id,\n name: v.name || 'Default',\n type: viewLayout(v.type),\n sorts: parseViewSorts(v.sorts),\n conditions: parseViewFilter(v.filter),\n groupBy: v.groupBy ?? null,\n properties: v.properties ?? undefined,\n settings: parseViewSettings(v.settings),\n };\n}\n\nexport const IMPLICIT_TABLE_VIEW: DatabaseViewModel = {\n id: DEFAULT_VIEW_ID,\n name: 'Table',\n type: 'table',\n sorts: [],\n conditions: [],\n groupBy: null,\n properties: undefined,\n settings: {},\n};\n\n/** A database title from `properties.title` (string or rich text). */\nexport function databaseTitle(properties: Record<string, any> | null | undefined): string {\n const t = properties?.title;\n if (typeof t === 'string') return t;\n if (Array.isArray(t)) return t.map((rt: any) => rt?.plainText ?? rt?.text?.content ?? '').join('');\n return '';\n}\n\n/** The `updateDatabaseView` / `createDatabaseView` fields for a change. */\nfunction viewInputOf(change: ViewChange): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (change.name !== undefined) out.name = change.name;\n if (change.type !== undefined) out.type = change.type;\n if (change.sorts !== undefined) out.sorts = change.sorts;\n if (change.conditions !== undefined) out.filter = serializeViewFilter(change.conditions);\n if (change.groupBy !== undefined) out.groupBy = change.groupBy;\n if (change.properties !== undefined) out.properties = change.properties;\n if (change.settings !== undefined) out.settings = change.settings;\n return out;\n}\n\nexport function useNotionDatabase(blockId: string) {\n const client = useApolloClient();\n const block = useQuery<{ getBlock?: RawBlock | null }>(NATIVE_NOTION_BLOCK, {\n variables: { input: { blockId } },\n skip: !blockId,\n fetchPolicy: 'cache-and-network',\n });\n const viewsQuery = useQuery<{ getDatabaseViews?: RawView[] | null }>(NATIVE_NOTION_DATABASE_VIEWS, {\n variables: { databaseId: blockId },\n skip: !blockId,\n fetchPolicy: 'cache-and-network',\n });\n const [updateBlock] = useMutation(NATIVE_NOTION_UPDATE_BLOCK);\n const [createBlock] = useMutation(NATIVE_NOTION_CREATE_BLOCK);\n const [deleteBlock] = useMutation(NATIVE_NOTION_DELETE_BLOCK);\n const [restoreBlock] = useMutation(NATIVE_NOTION_RESTORE_BLOCK);\n const [createView] = useMutation(NATIVE_NOTION_CREATE_DATABASE_VIEW);\n const [updateView] = useMutation(NATIVE_NOTION_UPDATE_DATABASE_VIEW);\n const [deleteView] = useMutation(NATIVE_NOTION_DELETE_DATABASE_VIEW);\n\n // ---- Rows (paged by cursor; kept here rather than in the Apollo cache merge) ----\n const [rows, setRows] = useState<DatabaseRow[]>([]);\n const [cursor, setCursor] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [totalCount, setTotalCount] = useState<number | null>(null);\n const [rowsLoading, setRowsLoading] = useState(true);\n const [rowsError, setRowsError] = useState<string | null>(null);\n const loadSeq = useRef(0);\n const rowsCountRef = useRef(0);\n rowsCountRef.current = rows.length;\n\n const fetchPage = useCallback(\n async (startCursor: string | null) => {\n const res = await client.query<QueryPage>({\n query: NATIVE_NOTION_QUERY_DATABASE,\n variables: {\n input: {\n databaseId: blockId,\n pageSize: PAGE_SIZE,\n sorts: ROWS_CREATION_ORDER,\n ...(startCursor ? { startCursor } : {}),\n },\n },\n fetchPolicy: 'network-only',\n });\n const page = res.data?.queryDatabase;\n return {\n rows: (page?.results ?? []).filter((b): b is RawBlock => !!b?.id).map(rowFromBlock),\n cursor: page?.nextCursor ?? null,\n hasMore: Boolean(page?.hasMore),\n total: typeof page?.totalCount === 'number' ? page.totalCount : null,\n };\n },\n [blockId, client],\n );\n\n /** Reload from the first page, keeping as many rows as were loaded before. */\n const reloadRows = useCallback(async () => {\n if (!blockId) return;\n const seq = ++loadSeq.current;\n setRowsError(null);\n try {\n const want = Math.max(rowsCountRef.current, 1);\n let page = await fetchPage(null);\n let all = page.rows;\n while (page.hasMore && page.cursor && all.length < want) {\n page = await fetchPage(page.cursor);\n all = all.concat(page.rows);\n }\n if (seq !== loadSeq.current) return;\n setRows(all);\n setCursor(page.cursor);\n setHasMore(page.hasMore);\n setTotalCount(page.total);\n } catch (err) {\n if (seq === loadSeq.current) setRowsError(serverErrorText(err));\n } finally {\n if (seq === loadSeq.current) setRowsLoading(false);\n }\n }, [blockId, fetchPage]);\n\n useEffect(() => {\n setRowsLoading(true);\n rowsCountRef.current = 0;\n reloadRows();\n }, [reloadRows]);\n\n const [loadingMore, setLoadingMore] = useState(false);\n const loadMore = useCallback(async () => {\n if (!hasMore || !cursor || loadingMore) return;\n setLoadingMore(true);\n try {\n const page = await fetchPage(cursor);\n setRows((prev) => {\n const seen = new Set(prev.map((r) => r.id));\n return prev.concat(page.rows.filter((r) => !seen.has(r.id)));\n });\n setCursor(page.cursor);\n setHasMore(page.hasMore);\n } catch (err) {\n setRowsError(serverErrorText(err));\n } finally {\n setLoadingMore(false);\n }\n }, [cursor, fetchPage, hasMore, loadingMore]);\n\n /** Page in every remaining row (schema migrations must reach rows not on screen yet). */\n const loadAll = useCallback(async (): Promise<DatabaseRow[]> => {\n let all = rows;\n let next = cursor;\n let more = hasMore;\n for (let i = 0; more && next && i < 100; i += 1) {\n const page = await fetchPage(next);\n const seen = new Set(all.map((r) => r.id));\n all = all.concat(page.rows.filter((r) => !seen.has(r.id)));\n next = page.cursor;\n more = page.hasMore;\n }\n setRows(all);\n setCursor(next);\n setHasMore(more);\n return all;\n }, [cursor, fetchPage, hasMore, rows]);\n\n // ---- Database block (title, icon, schema) ----\n const dbBlock = block.data?.getBlock ?? null;\n const [schemaOverride, setSchemaOverride] = useState<DatabaseSchema | null>(null);\n const serverSchema = useMemo<DatabaseSchema>(\n () => (dbBlock?.properties?.schema as DatabaseSchema) ?? {},\n [dbBlock],\n );\n const schema = schemaOverride ?? serverSchema;\n const columns = useMemo(() => columnsFromSchema(schema), [schema]);\n const title = databaseTitle(dbBlock?.properties);\n const icon = (dbBlock?.properties?.icon as string | undefined) ?? null;\n\n /** Replace the schema (`properties.schema`) optimistically; resolves false on failure. */\n const saveSchema = useCallback(\n async (next: DatabaseSchema): Promise<string | null> => {\n setSchemaOverride(next);\n try {\n await updateBlock({\n variables: { input: { id: blockId, properties: { schema: next } } },\n errorPolicy: 'none',\n });\n return null;\n } catch (err) {\n setSchemaOverride(null);\n return serverErrorText(err);\n }\n },\n [blockId, updateBlock],\n );\n // Drop the override once the server copy matches it.\n useEffect(() => {\n if (schemaOverride && JSON.stringify(serverSchema) === JSON.stringify(schemaOverride)) {\n setSchemaOverride(null);\n }\n }, [schemaOverride, serverSchema]);\n\n const renameDatabase = useCallback(\n async (next: string): Promise<string | null> => {\n try {\n await updateBlock({\n variables: {\n input: { id: blockId, properties: { title: [{ text: { content: next }, plainText: next }] } },\n },\n errorPolicy: 'none',\n });\n return null;\n } catch (err) {\n return serverErrorText(err);\n }\n },\n [blockId, updateBlock],\n );\n\n // ---- Cells (optimistic) ----\n const updateCell = useCallback(\n async (rowId: string, property: string, value: unknown): Promise<string | null> => {\n let previous: unknown;\n setRows((prev) =>\n prev.map((r) => {\n if (r.id !== rowId) return r;\n previous = r.properties[property];\n return { ...r, properties: { ...r.properties, [property]: value } };\n }),\n );\n try {\n await updateBlock({\n variables: { input: { id: rowId, properties: { [property]: value } } },\n errorPolicy: 'none',\n });\n return null;\n } catch (err) {\n setRows((prev) =>\n prev.map((r) =>\n r.id === rowId ? { ...r, properties: { ...r.properties, [property]: previous } } : r,\n ),\n );\n return serverErrorText(err);\n }\n },\n [updateBlock],\n );\n\n /** Merge `patch` into a row's properties (optimistic; rolled back on failure). */\n const patchRow = useCallback(\n async (rowId: string, patch: Record<string, unknown>): Promise<string | null> => {\n let previous: Record<string, any> | null = null;\n setRows((prev) =>\n prev.map((r) => {\n if (r.id !== rowId) return r;\n previous = r.properties;\n return { ...r, properties: { ...r.properties, ...patch } };\n }),\n );\n try {\n await updateBlock({\n variables: { input: { id: rowId, properties: patch } },\n errorPolicy: 'none',\n });\n return null;\n } catch (err) {\n const before = previous;\n if (before) setRows((prev) => prev.map((r) => (r.id === rowId ? { ...r, properties: before } : r)));\n return serverErrorText(err);\n }\n },\n [updateBlock],\n );\n\n /** Rename / retype a property everywhere: rows hold the new key after a rename. */\n const patchRowsLocally = useCallback((fn: (row: DatabaseRow) => DatabaseRow) => {\n setRows((prev) => prev.map(fn));\n }, []);\n\n // ---- Rows ----\n /** Highest unique id handed out per property (rows created since the last load). */\n const lastUniqueRef = useRef<Record<string, number>>({});\n /** The next unique ids (web DatabasePage takeUniqueIds): past every row, loaded or not. */\n const takeUniqueIds = useCallback(async (): Promise<Record<string, number>> => {\n const props = uniqueIdProperties(schema);\n if (!props.length) return {};\n const all = hasMore ? await loadAll() : rows;\n const out: Record<string, number> = {};\n for (const prop of props) {\n const next = Math.max(maxUniqueId(all, prop), lastUniqueRef.current[prop] ?? 0) + 1;\n out[prop] = next;\n lastUniqueRef.current[prop] = next;\n }\n return out;\n }, [hasMore, loadAll, rows, schema]);\n\n const addRow = useCallback(\n async (initial: Record<string, unknown> = {}): Promise<{ id?: string; error?: string }> => {\n try {\n const ids = await takeUniqueIds();\n const res = await createBlock({\n variables: {\n input: {\n type: 'database_row',\n parent: { type: 'database', id: blockId },\n properties: { title: [{ text: { content: '' }, plainText: '' }], ...initial, ...ids },\n },\n },\n errorPolicy: 'none',\n });\n const created = (res.data as { createBlock?: RawBlock } | null)?.createBlock;\n if (created?.id) {\n setRows((prev) => prev.concat(rowFromBlock(created)));\n setTotalCount((n) => (n == null ? n : n + 1));\n }\n return { id: created?.id };\n } catch (err) {\n return { error: serverErrorText(err) };\n }\n },\n [blockId, createBlock, takeUniqueIds],\n );\n\n /** Delete rows; resolves with the deleted ids and the first failure. */\n const deleteRows = useCallback(\n async (ids: string[]) => {\n const removed = rows.filter((r) => ids.includes(r.id));\n setRows((prev) => prev.filter((r) => !ids.includes(r.id)));\n const results = await Promise.allSettled(\n ids.map((id) => deleteBlock({ variables: { blockId: id }, errorPolicy: 'none' })),\n );\n const failed = ids.filter((_, i) => results[i].status === 'rejected');\n if (failed.length) {\n setRows((prev) => prev.concat(removed.filter((r) => failed.includes(r.id))));\n }\n const deleted = ids.filter((id) => !failed.includes(id));\n setTotalCount((n) => (n == null ? n : Math.max(0, n - deleted.length)));\n const rejection = results.find((r): r is PromiseRejectedResult => r.status === 'rejected');\n return { deleted, error: rejection ? serverErrorText(rejection.reason) : null };\n },\n [deleteBlock, rows],\n );\n\n const restoreRows = useCallback(\n async (ids: string[]) => {\n await Promise.allSettled(ids.map((id) => restoreBlock({ variables: { blockId: id } })));\n await reloadRows();\n },\n [reloadRows, restoreBlock],\n );\n\n // ---- Views ----\n const serverViews = useMemo(\n () => (viewsQuery.data?.getDatabaseViews ?? []).filter((v): v is RawView => !!v?.id).map(viewFromRaw),\n [viewsQuery.data],\n );\n const [overrides, setOverrides] = useState<Record<string, ViewChange>>({});\n const views = useMemo<DatabaseViewModel[]>(() => {\n const base = serverViews.length ? serverViews : [IMPLICIT_TABLE_VIEW];\n return base.map((v) => {\n const o = overrides[v.id];\n return o ? { ...v, ...o, settings: o.settings ?? v.settings } : v;\n });\n }, [overrides, serverViews]);\n const [activeViewId, setActiveViewId] = useState<string | null>(null);\n const activeView = views.find((v) => v.id === activeViewId) ?? views[0];\n\n const filterTimers = useRef<Record<string, ReturnType<typeof setTimeout>>>({});\n useEffect(\n () => () => {\n Object.values(filterTimers.current).forEach(clearTimeout);\n },\n [],\n );\n\n const persistView = useCallback(\n async (viewId: string, change: ViewChange) => {\n try {\n await updateView({\n variables: { input: { databaseId: blockId, viewId, ...viewInputOf(change) } },\n errorPolicy: 'none',\n });\n return null;\n } catch (err) {\n return serverErrorText(err);\n }\n },\n [blockId, updateView],\n );\n\n /** Apply a view change locally and persist it (filters debounced; the implicit view stays local). */\n const changeView = useCallback(\n (viewId: string, change: ViewChange): Promise<string | null> => {\n setOverrides((prev) => ({ ...prev, [viewId]: { ...prev[viewId], ...change } }));\n if (viewId === DEFAULT_VIEW_ID) return Promise.resolve(null);\n if (change.conditions && Object.keys(change).length === 1) {\n clearTimeout(filterTimers.current[viewId]);\n return new Promise((resolve) => {\n filterTimers.current[viewId] = setTimeout(\n () => persistView(viewId, change).then(resolve),\n FILTER_SAVE_DELAY,\n );\n });\n }\n return persistView(viewId, change);\n },\n [persistView],\n );\n\n const addView = useCallback(\n async (draft: { name: string; type: ViewType; groupBy?: string | null }): Promise<string | null> => {\n try {\n // The implicit Table view's local settings are saved first so nothing is lost.\n if (!serverViews.length) {\n const implicit = views[0];\n await createView({\n variables: {\n input: {\n databaseId: blockId,\n name: implicit.name,\n type: 'table',\n ...viewInputOf({\n sorts: implicit.sorts,\n conditions: implicit.conditions,\n properties: implicit.properties,\n settings: implicit.settings,\n }),\n },\n },\n errorPolicy: 'none',\n });\n }\n const res = await createView({\n variables: {\n input: {\n databaseId: blockId,\n name: draft.name,\n type: draft.type,\n ...(draft.groupBy ? { groupBy: draft.groupBy } : {}),\n },\n },\n errorPolicy: 'none',\n });\n await viewsQuery.refetch();\n const id = (res.data as { createDatabaseView?: { id?: string } } | null)?.createDatabaseView?.id;\n if (id) setActiveViewId(id);\n return null;\n } catch (err) {\n return serverErrorText(err);\n }\n },\n [blockId, createView, serverViews.length, views, viewsQuery],\n );\n\n const duplicateView = useCallback(\n async (view: DatabaseViewModel, name: string): Promise<string | null> => {\n try {\n const res = await createView({\n variables: {\n input: {\n databaseId: blockId,\n name,\n type: view.type,\n ...viewInputOf({\n sorts: view.sorts,\n conditions: view.conditions,\n groupBy: view.groupBy,\n properties: view.properties,\n settings: view.settings,\n }),\n },\n },\n errorPolicy: 'none',\n });\n await viewsQuery.refetch();\n const id = (res.data as { createDatabaseView?: { id?: string } } | null)?.createDatabaseView?.id;\n if (id) setActiveViewId(id);\n return null;\n } catch (err) {\n return serverErrorText(err);\n }\n },\n [blockId, createView, viewsQuery],\n );\n\n const removeView = useCallback(\n async (viewId: string): Promise<string | null> => {\n if (viewId === DEFAULT_VIEW_ID) return null;\n try {\n await deleteView({ variables: { databaseId: blockId, viewId }, errorPolicy: 'none' });\n if (activeViewId === viewId) setActiveViewId(null);\n await viewsQuery.refetch();\n return null;\n } catch (err) {\n return serverErrorText(err);\n }\n },\n [activeViewId, blockId, deleteView, viewsQuery],\n );\n\n const refresh = useCallback(async () => {\n await Promise.allSettled([block.refetch(), viewsQuery.refetch(), reloadRows()]);\n }, [block, reloadRows, viewsQuery]);\n\n return {\n block: dbBlock,\n title,\n icon,\n schema,\n columns,\n rows,\n totalCount,\n hasMore,\n loadMore,\n loadAll,\n loadingMore,\n loading: (block.loading && !dbBlock) || rowsLoading,\n error: block.error ? serverErrorText(block.error) : rowsError,\n views,\n hasSavedViews: serverViews.length > 0,\n activeView,\n setActiveViewId,\n changeView,\n addView,\n duplicateView,\n removeView,\n saveSchema,\n renameDatabase,\n updateCell,\n patchRow,\n patchRowsLocally,\n addRow,\n deleteRows,\n restoreRows,\n reloadRows,\n refresh,\n };\n}\n\nexport type NotionDatabaseApi = ReturnType<typeof useNotionDatabase>;\n\n/** A new database block's properties (web constants/blockTypes \"Database\"). */\nexport const NEW_DATABASE_PROPERTIES = {\n title: [\n {\n type: 'text',\n text: { content: 'Untitled database' },\n plainText: 'Untitled database',\n annotations: {},\n },\n ],\n schema: {\n title: { type: 'title' },\n Status: {\n type: 'select',\n options: [\n { name: 'To Do', color: 'gray' },\n { name: 'In Progress', color: 'blue' },\n { name: 'Done', color: 'green' },\n ],\n },\n Date: { type: 'date' },\n },\n};\n"],"names":["_a","_b","_c"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const AGENT_RUN_STATUSES = ["queued", "running", "succeeded", "failed", "needs_input"];
|
|
2
|
+
const RUN_STATUS_OPTION = {
|
|
3
|
+
queued: {
|
|
4
|
+
name: "Queued",
|
|
5
|
+
color: "gray",
|
|
6
|
+
group: "todo"
|
|
7
|
+
},
|
|
8
|
+
running: {
|
|
9
|
+
name: "Running",
|
|
10
|
+
color: "blue",
|
|
11
|
+
group: "in_progress"
|
|
12
|
+
},
|
|
13
|
+
needs_input: {
|
|
14
|
+
name: "Needs input",
|
|
15
|
+
color: "yellow",
|
|
16
|
+
group: "in_progress"
|
|
17
|
+
},
|
|
18
|
+
succeeded: {
|
|
19
|
+
name: "Succeeded",
|
|
20
|
+
color: "green",
|
|
21
|
+
group: "complete"
|
|
22
|
+
},
|
|
23
|
+
failed: {
|
|
24
|
+
name: "Failed",
|
|
25
|
+
color: "red",
|
|
26
|
+
group: "complete"
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
Object.fromEntries(AGENT_RUN_STATUSES.map((s) => [s, RUN_STATUS_OPTION[s].name]));
|
|
30
|
+
const STALE_RUN_MS = 15 * 60 * 1e3;
|
|
31
|
+
function isAgentRunStatus(v) {
|
|
32
|
+
return typeof v === "string" && AGENT_RUN_STATUSES.includes(v);
|
|
33
|
+
}
|
|
34
|
+
function effectiveRunStatus(status, at, now = Date.now()) {
|
|
35
|
+
if (status !== "running") return status;
|
|
36
|
+
const ms = typeof at === "number" ? at : typeof at === "string" ? Date.parse(at) : NaN;
|
|
37
|
+
if (!Number.isFinite(ms) || ms <= 0 || now - ms > STALE_RUN_MS) return "failed";
|
|
38
|
+
return "running";
|
|
39
|
+
}export{AGENT_RUN_STATUSES,RUN_STATUS_OPTION,STALE_RUN_MS,effectiveRunStatus,isAgentRunStatus};//# sourceMappingURL=notionAgentRunStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notionAgentRunStatus.js","sources":["../../../src/features/notion/notionAgentRunStatus.ts"],"sourcesContent":["// Ported from forms-stack packages/notion-api/browser/src/utils/agentRunStatus.ts (develop).\n/* eslint-disable */\n/**\n * agentRunStatus — the ONE source for an agent run's status: the status values, their labels /\n * Runs-database options, and the \"effective\" status every surface shows (sidebar dot, Home,\n * agent page header). A `running` lastRun older than {@link STALE_RUN_MS} (tab closed mid-run)\n * — or one without a readable start time — counts as failed, so nothing reads \"Running\" forever.\n *\n * Framework-free and dependency-free: utils/pageKinds and utils/notesAgent both re-export it.\n */\n\nexport type AgentRunStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'needs_input';\n\nexport const AGENT_RUN_STATUSES: readonly AgentRunStatus[] = [\n 'queued',\n 'running',\n 'succeeded',\n 'failed',\n 'needs_input',\n];\n\n/** The Runs database's Status options (name = the label shown everywhere). */\nexport const RUN_STATUS_OPTION: Record<AgentRunStatus, { name: string; color: string; group: string }> = {\n queued: { name: 'Queued', color: 'gray', group: 'todo' },\n running: { name: 'Running', color: 'blue', group: 'in_progress' },\n needs_input: { name: 'Needs input', color: 'yellow', group: 'in_progress' },\n succeeded: { name: 'Succeeded', color: 'green', group: 'complete' },\n failed: { name: 'Failed', color: 'red', group: 'complete' },\n};\n\nexport const AGENT_RUN_LABEL: Record<AgentRunStatus, string> = Object.fromEntries(\n AGENT_RUN_STATUSES.map((s) => [s, RUN_STATUS_OPTION[s].name]),\n) as Record<AgentRunStatus, string>;\n\n/** A \"running\" lastRun older than this is treated as interrupted (tab closed mid-run). */\nexport const STALE_RUN_MS = 15 * 60 * 1000;\n\nexport function isAgentRunStatus(v: unknown): v is AgentRunStatus {\n return typeof v === 'string' && (AGENT_RUN_STATUSES as readonly string[]).includes(v);\n}\n\n/**\n * The status to show for a stored run: `running` that started more than 15 minutes ago (or at an\n * unknown time) is `failed`; anything else as stored. `at` is an ISO string or ms since epoch.\n */\nexport function effectiveRunStatus(\n status: AgentRunStatus,\n at: string | number | null | undefined,\n now: number = Date.now(),\n): AgentRunStatus {\n if (status !== 'running') return status;\n const ms = typeof at === 'number' ? at : typeof at === 'string' ? Date.parse(at) : NaN;\n if (!Number.isFinite(ms) || ms <= 0 || now - ms > STALE_RUN_MS) return 'failed';\n return 'running';\n}\n"],"names":[],"mappings":"AAYO,MAAM,qBAAgD,CAAC,QAAA,EAAU,SAAW,EAAA,WAAA,EAAa,UAAU,aAAa;AAGhH,MAAM,iBAIR,GAAA;AAAA,EACH,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,QAAA;AAAA,IACN,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,SAAA;AAAA,IACN,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,aAAA;AAAA,IACN,KAAO,EAAA,QAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA,SAAW,EAAA;AAAA,IACT,IAAM,EAAA,WAAA;AAAA,IACN,KAAO,EAAA,OAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,QAAA;AAAA,IACN,KAAO,EAAA,KAAA;AAAA,IACP,KAAO,EAAA;AAAA;AAEX;AAC+D,MAAA,CAAO,WAAY,CAAA,kBAAA,CAAmB,GAAI,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,EAAG,iBAAkB,CAAA,CAAC,CAAE,CAAA,IAAI,CAAC,CAAC;AAGhI,MAAA,YAAA,GAAe,KAAK,EAAK,GAAA;AAC/B,SAAS,iBAAiB,CAAiC,EAAA;AAChE,EAAA,OAAO,OAAO,CAAA,KAAM,QAAa,IAAA,kBAAA,CAAyC,SAAS,CAAC,CAAA;AACtF;AAMO,SAAS,mBAAmB,MAAwB,EAAA,EAAA,EAAwC,GAAc,GAAA,IAAA,CAAK,KAAuB,EAAA;AAC3I,EAAI,IAAA,MAAA,KAAW,WAAkB,OAAA,MAAA;AACjC,EAAM,MAAA,EAAA,GAAK,OAAO,EAAA,KAAO,QAAW,GAAA,EAAA,GAAK,OAAO,EAAA,KAAO,QAAW,GAAA,IAAA,CAAK,KAAM,CAAA,EAAE,CAAI,GAAA,GAAA;AACnF,EAAI,IAAA,CAAC,MAAO,CAAA,QAAA,CAAS,EAAE,CAAA,IAAK,MAAM,CAAK,IAAA,GAAA,GAAM,EAAK,GAAA,YAAA,EAAqB,OAAA,QAAA;AACvE,EAAO,OAAA,SAAA;AACT"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
const CODE_LANGUAGES = [{
|
|
2
|
+
value: "plain",
|
|
3
|
+
label: "Plain text"
|
|
4
|
+
}, {
|
|
5
|
+
value: "javascript",
|
|
6
|
+
label: "JavaScript"
|
|
7
|
+
}, {
|
|
8
|
+
value: "typescript",
|
|
9
|
+
label: "TypeScript"
|
|
10
|
+
}, {
|
|
11
|
+
value: "jsx",
|
|
12
|
+
label: "JSX"
|
|
13
|
+
}, {
|
|
14
|
+
value: "tsx",
|
|
15
|
+
label: "TSX"
|
|
16
|
+
}, {
|
|
17
|
+
value: "python",
|
|
18
|
+
label: "Python"
|
|
19
|
+
}, {
|
|
20
|
+
value: "json",
|
|
21
|
+
label: "JSON"
|
|
22
|
+
}, {
|
|
23
|
+
value: "bash",
|
|
24
|
+
label: "Shell"
|
|
25
|
+
}, {
|
|
26
|
+
value: "sql",
|
|
27
|
+
label: "SQL"
|
|
28
|
+
}, {
|
|
29
|
+
value: "html",
|
|
30
|
+
label: "HTML"
|
|
31
|
+
}, {
|
|
32
|
+
value: "css",
|
|
33
|
+
label: "CSS"
|
|
34
|
+
}, {
|
|
35
|
+
value: "markdown",
|
|
36
|
+
label: "Markdown"
|
|
37
|
+
}, {
|
|
38
|
+
value: "yaml",
|
|
39
|
+
label: "YAML"
|
|
40
|
+
}, {
|
|
41
|
+
value: "graphql",
|
|
42
|
+
label: "GraphQL"
|
|
43
|
+
}, {
|
|
44
|
+
value: "go",
|
|
45
|
+
label: "Go"
|
|
46
|
+
}, {
|
|
47
|
+
value: "java",
|
|
48
|
+
label: "Java"
|
|
49
|
+
}, {
|
|
50
|
+
value: "kotlin",
|
|
51
|
+
label: "Kotlin"
|
|
52
|
+
}, {
|
|
53
|
+
value: "swift",
|
|
54
|
+
label: "Swift"
|
|
55
|
+
}, {
|
|
56
|
+
value: "rust",
|
|
57
|
+
label: "Rust"
|
|
58
|
+
}, {
|
|
59
|
+
value: "c",
|
|
60
|
+
label: "C"
|
|
61
|
+
}, {
|
|
62
|
+
value: "cpp",
|
|
63
|
+
label: "C++"
|
|
64
|
+
}, {
|
|
65
|
+
value: "csharp",
|
|
66
|
+
label: "C#"
|
|
67
|
+
}, {
|
|
68
|
+
value: "php",
|
|
69
|
+
label: "PHP"
|
|
70
|
+
}, {
|
|
71
|
+
value: "ruby",
|
|
72
|
+
label: "Ruby"
|
|
73
|
+
}, {
|
|
74
|
+
value: "diff",
|
|
75
|
+
label: "Diff"
|
|
76
|
+
}, {
|
|
77
|
+
value: "docker",
|
|
78
|
+
label: "Dockerfile"
|
|
79
|
+
}];
|
|
80
|
+
const ALIASES = {
|
|
81
|
+
js: "javascript",
|
|
82
|
+
ts: "typescript",
|
|
83
|
+
py: "python",
|
|
84
|
+
sh: "bash",
|
|
85
|
+
shell: "bash",
|
|
86
|
+
zsh: "bash",
|
|
87
|
+
yml: "yaml",
|
|
88
|
+
md: "markdown",
|
|
89
|
+
"c++": "cpp",
|
|
90
|
+
"c#": "csharp",
|
|
91
|
+
cs: "csharp",
|
|
92
|
+
rb: "ruby",
|
|
93
|
+
kt: "kotlin",
|
|
94
|
+
golang: "go",
|
|
95
|
+
dockerfile: "docker",
|
|
96
|
+
gql: "graphql",
|
|
97
|
+
text: "plain",
|
|
98
|
+
plaintext: "plain",
|
|
99
|
+
xml: "html"
|
|
100
|
+
};
|
|
101
|
+
function normalizeLanguage(raw) {
|
|
102
|
+
var _a;
|
|
103
|
+
const v = String(raw != null ? raw : "").trim().toLowerCase();
|
|
104
|
+
if (!v) return "plain";
|
|
105
|
+
const a = (_a = ALIASES[v]) != null ? _a : v;
|
|
106
|
+
return CODE_LANGUAGES.some((l) => l.value === a) ? a : "plain";
|
|
107
|
+
}
|
|
108
|
+
function languageLabel(raw) {
|
|
109
|
+
var _a, _b;
|
|
110
|
+
const v = normalizeLanguage(raw);
|
|
111
|
+
return (_b = (_a = CODE_LANGUAGES.find((l) => l.value === v)) == null ? void 0 : _a.label) != null ? _b : "Plain text";
|
|
112
|
+
}export{CODE_LANGUAGES,languageLabel,normalizeLanguage};//# sourceMappingURL=notionCodeLanguages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notionCodeLanguages.js","sources":["../../../src/features/notion/notionCodeLanguages.ts"],"sourcesContent":["// Ported from forms-stack packages/notion-api/browser/src/utils/codeLanguages.ts (develop): the picker\n// list and alias normalisation; the web-only Prism grammar table is left out.\n/* eslint-disable */\n/**\n * Code block languages: the picker list and how each maps to a Prism grammar (with the grammars\n * it builds on, loaded first). `normalizeLanguage` accepts aliases (\"ts\", \"py\", \"sh\", \"yml\").\n */\nexport const CODE_LANGUAGES: Array<{ value: string; label: string }> = [\n { value: 'plain', label: 'Plain text' },\n { value: 'javascript', label: 'JavaScript' },\n { value: 'typescript', label: 'TypeScript' },\n { value: 'jsx', label: 'JSX' },\n { value: 'tsx', label: 'TSX' },\n { value: 'python', label: 'Python' },\n { value: 'json', label: 'JSON' },\n { value: 'bash', label: 'Shell' },\n { value: 'sql', label: 'SQL' },\n { value: 'html', label: 'HTML' },\n { value: 'css', label: 'CSS' },\n { value: 'markdown', label: 'Markdown' },\n { value: 'yaml', label: 'YAML' },\n { value: 'graphql', label: 'GraphQL' },\n { value: 'go', label: 'Go' },\n { value: 'java', label: 'Java' },\n { value: 'kotlin', label: 'Kotlin' },\n { value: 'swift', label: 'Swift' },\n { value: 'rust', label: 'Rust' },\n { value: 'c', label: 'C' },\n { value: 'cpp', label: 'C++' },\n { value: 'csharp', label: 'C#' },\n { value: 'php', label: 'PHP' },\n { value: 'ruby', label: 'Ruby' },\n { value: 'diff', label: 'Diff' },\n { value: 'docker', label: 'Dockerfile' },\n];\n\nconst ALIASES: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n py: 'python',\n sh: 'bash',\n shell: 'bash',\n zsh: 'bash',\n yml: 'yaml',\n md: 'markdown',\n 'c++': 'cpp',\n 'c#': 'csharp',\n cs: 'csharp',\n rb: 'ruby',\n kt: 'kotlin',\n golang: 'go',\n dockerfile: 'docker',\n gql: 'graphql',\n text: 'plain',\n plaintext: 'plain',\n xml: 'html',\n};\n\nexport function normalizeLanguage(raw: unknown): string {\n const v = String(raw ?? '')\n .trim()\n .toLowerCase();\n if (!v) return 'plain';\n const a = ALIASES[v] ?? v;\n return CODE_LANGUAGES.some((l) => l.value === a) ? a : 'plain';\n}\n\nexport function languageLabel(raw: unknown): string {\n const v = normalizeLanguage(raw);\n return CODE_LANGUAGES.find((l) => l.value === v)?.label ?? 'Plain text';\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {runsText}from'./notionRichTitle.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
const COMMENT_REACTIONS = ["\u{1F44D}", "\u{1F525}", "\u{1F389}", "\u2764\uFE0F", "\u{1F440}", "\u2705"];
|
|
18
|
+
const time = (s) => {
|
|
19
|
+
const t = s ? Date.parse(s) : NaN;
|
|
20
|
+
return Number.isNaN(t) ? 0 : t;
|
|
21
|
+
};
|
|
22
|
+
function groupThreads(comments, opts = {}) {
|
|
23
|
+
var _a, _b, _c;
|
|
24
|
+
const roots = /* @__PURE__ */ new Map();
|
|
25
|
+
for (const c of comments) if (!c.parentId) roots.set(c.id, c);
|
|
26
|
+
const replies = /* @__PURE__ */ new Map();
|
|
27
|
+
for (const c of comments) {
|
|
28
|
+
if (!c.parentId || c.deleted) continue;
|
|
29
|
+
if (!roots.has(c.threadId)) continue;
|
|
30
|
+
const list = (_a = replies.get(c.threadId)) != null ? _a : [];
|
|
31
|
+
list.push(c);
|
|
32
|
+
replies.set(c.threadId, list);
|
|
33
|
+
}
|
|
34
|
+
const threads = [];
|
|
35
|
+
for (const root of roots.values()) {
|
|
36
|
+
if (opts.includeResolved === false && root.resolved) continue;
|
|
37
|
+
const rs = ((_b = replies.get(root.id)) != null ? _b : []).sort((a, b) => time(a.createdTime) - time(b.createdTime));
|
|
38
|
+
if (root.deleted && rs.length === 0) continue;
|
|
39
|
+
const last = rs.length ? rs[rs.length - 1].createdTime : root.createdTime;
|
|
40
|
+
threads.push({
|
|
41
|
+
id: root.id,
|
|
42
|
+
pageId: root.pageId,
|
|
43
|
+
blockId: (_c = root.blockId) != null ? _c : null,
|
|
44
|
+
root,
|
|
45
|
+
replies: rs,
|
|
46
|
+
resolved: !!root.resolved,
|
|
47
|
+
lastActivity: last
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return threads.sort((a, b) => time(a.root.createdTime) - time(b.root.createdTime));
|
|
51
|
+
}
|
|
52
|
+
const reactionCount = (r) => {
|
|
53
|
+
var _a;
|
|
54
|
+
return (_a = r.count) != null ? _a : r.userIds.length;
|
|
55
|
+
};
|
|
56
|
+
const commentText = (body) => runsText(body != null ? body : []);
|
|
57
|
+
const textToBody = (text) => text ? [{
|
|
58
|
+
content: text
|
|
59
|
+
}] : [];
|
|
60
|
+
function authorName(author, opts = {}) {
|
|
61
|
+
if (author.kind === "agent") return author.name || "Yantra AI";
|
|
62
|
+
if (author.name) return author.name;
|
|
63
|
+
return opts.mine ? "You" : "Someone";
|
|
64
|
+
}
|
|
65
|
+
function commentTimeLabel(iso, now = /* @__PURE__ */ new Date()) {
|
|
66
|
+
const t = time(iso);
|
|
67
|
+
if (!t) return "";
|
|
68
|
+
const diff = Math.max(0, now.getTime() - t);
|
|
69
|
+
const min = Math.floor(diff / 6e4);
|
|
70
|
+
if (min < 1) return "Just now";
|
|
71
|
+
if (min < 60) return `${min}m ago`;
|
|
72
|
+
const hours = Math.floor(min / 60);
|
|
73
|
+
const d = new Date(t);
|
|
74
|
+
if (hours < 24 && d.getDate() === now.getDate()) return `${hours}h ago`;
|
|
75
|
+
const startToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
|
|
76
|
+
const startThat = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
|
|
77
|
+
const days = Math.round((startToday - startThat) / 864e5);
|
|
78
|
+
if (days === 1) return "Yesterday";
|
|
79
|
+
if (days < 7) return `${days}d ago`;
|
|
80
|
+
return d.toLocaleDateString(void 0, __spreadValues({
|
|
81
|
+
month: "short",
|
|
82
|
+
day: "numeric"
|
|
83
|
+
}, d.getFullYear() === now.getFullYear() ? {} : {
|
|
84
|
+
year: "numeric"
|
|
85
|
+
}));
|
|
86
|
+
}export{COMMENT_REACTIONS,authorName,commentText,commentTimeLabel,groupThreads,reactionCount,textToBody};//# sourceMappingURL=notionComments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notionComments.js","sources":["../../../src/features/notion/notionComments.ts"],"sourcesContent":["// Ported from forms-stack packages/notion-api/browser/src/utils/comments.ts (develop); only import paths changed.\n/* eslint-disable */\n/**\n * Comments — pure helpers shared by the comment UI, its API hooks and tests.\n *\n * A thread is a root comment (`parentId` null, `threadId` = its own id) plus its replies, all on\n * one page; `blockId` anchors it to a block (null = page-level). `body` is rich runs, the same\n * format as block titles (utils/richTitle). `resolved` is thread-level, stored on the root.\n */\nimport { runsText, type RichRun } from './notionRichTitle';\n\nexport type NotesCommentAuthorKind = 'user' | 'agent';\n\nexport interface NotesCommentAuthor {\n kind: NotesCommentAuthorKind;\n id: string;\n name?: string | null;\n avatarUrl?: string | null;\n}\n\nexport interface NotesCommentReaction {\n emoji: string;\n userIds: string[];\n count?: number;\n /** The viewer reacted with this emoji (server-computed). */\n reacted?: boolean;\n}\n\nexport interface NotesComment {\n id: string;\n workspaceId?: string;\n pageId: string;\n blockId?: string | null;\n threadId: string;\n parentId?: string | null;\n body: RichRun[];\n author: NotesCommentAuthor;\n reactions: NotesCommentReaction[];\n resolved: boolean;\n createdBy?: string;\n createdTime: string;\n editedTime?: string | null;\n deleted?: boolean;\n /** The viewer posted it (may edit / delete). */\n mine?: boolean;\n}\n\nexport interface NotesCommentThread {\n id: string;\n pageId: string;\n blockId: string | null;\n root: NotesComment;\n replies: NotesComment[];\n resolved: boolean;\n /** Time of the latest comment in the thread (sorting). */\n lastActivity: string;\n}\n\n/** The one agent author the browser may post as (Phase 1: AI replies to @AI mentions). */\nexport const YANTRA_AI_AUTHOR: NotesCommentAuthor = { kind: 'agent', id: 'yantra-ai', name: 'Yantra AI' };\n\n/** The \"@Yantra AI\" mention run the composer inserts. */\nexport const YANTRA_AI_MENTION_RUN: RichRun = {\n content: 'Yantra AI',\n mention: { type: 'user', id: YANTRA_AI_AUTHOR.id, name: 'Yantra AI' },\n};\n\n/** The quick reactions offered on every comment (small fixed set). */\nexport const COMMENT_REACTIONS = ['👍', '🔥', '🎉', '❤️', '👀', '✅'] as const;\n\nconst time = (s: string | null | undefined) => {\n const t = s ? Date.parse(s) : NaN;\n return Number.isNaN(t) ? 0 : t;\n};\n\n/**\n * Group comments into threads (oldest thread first, replies oldest first). Replies whose root is\n * missing are dropped; `includeResolved: false` drops resolved threads.\n *\n * Mirrors the server's visibility rule (NotionCommentService.visible) so a delete shows at once\n * without a refetch: deleted replies are dropped, and a deleted root only stays (as \"This comment\n * was deleted.\") while its thread still has live replies.\n */\nexport function groupThreads(comments: NotesComment[], opts: { includeResolved?: boolean } = {}): NotesCommentThread[] {\n const roots = new Map<string, NotesComment>();\n for (const c of comments) if (!c.parentId) roots.set(c.id, c);\n const replies = new Map<string, NotesComment[]>();\n for (const c of comments) {\n if (!c.parentId || c.deleted) continue;\n if (!roots.has(c.threadId)) continue;\n const list = replies.get(c.threadId) ?? [];\n list.push(c);\n replies.set(c.threadId, list);\n }\n const threads: NotesCommentThread[] = [];\n for (const root of roots.values()) {\n if (opts.includeResolved === false && root.resolved) continue;\n const rs = (replies.get(root.id) ?? []).sort((a, b) => time(a.createdTime) - time(b.createdTime));\n if (root.deleted && rs.length === 0) continue;\n const last = rs.length ? rs[rs.length - 1].createdTime : root.createdTime;\n threads.push({\n id: root.id,\n pageId: root.pageId,\n blockId: root.blockId ?? null,\n root,\n replies: rs,\n resolved: !!root.resolved,\n lastActivity: last,\n });\n }\n return threads.sort((a, b) => time(a.root.createdTime) - time(b.root.createdTime));\n}\n\n/**\n * Open (unresolved) thread count per block id; page-level threads are under `''`. A thread counts\n * only while it has a live comment (a deleted root with no live replies is gone).\n */\nexport function countsByBlock(threads: NotesCommentThread[]): Map<string, number> {\n const out = new Map<string, number>();\n for (const t of threads) {\n if (t.resolved) continue;\n if (t.root.deleted && !t.replies.some((r) => !r.deleted)) continue;\n const key = t.blockId ?? '';\n out.set(key, (out.get(key) ?? 0) + 1);\n }\n return out;\n}\n\n/** Toggle the viewer's reaction locally (optimistic UI). `viewerId` may be '' when unknown. */\nexport function toggleReaction(\n reactions: NotesCommentReaction[],\n emoji: string,\n viewerId: string,\n): NotesCommentReaction[] {\n const list = reactions.map((r) => ({ ...r, userIds: [...(r.userIds ?? [])] }));\n const hit = list.find((r) => r.emoji === emoji);\n const me = viewerId || '__me__';\n if (hit) {\n const had = hit.reacted ?? hit.userIds.includes(me);\n const before = hit.count ?? hit.userIds.length;\n hit.userIds = had ? hit.userIds.filter((u) => u !== me) : [...hit.userIds, me];\n hit.count = Math.max(0, before + (had ? -1 : 1));\n hit.reacted = !had;\n } else {\n list.push({ emoji, userIds: [me], count: 1, reacted: true });\n }\n return list.filter((r) => (r.count ?? r.userIds.length) > 0);\n}\n\nexport const reactionCount = (r: NotesCommentReaction) => r.count ?? r.userIds.length;\n\n/** Plain text of a comment body. */\nexport const commentText = (body: RichRun[] | null | undefined): string => runsText(body ?? []);\n\n/** Does this body ask the AI to answer? An @Yantra AI mention, or \"@AI\" / \"@Yantra AI\" typed. */\nexport function mentionsAi(body: RichRun[] | null | undefined): boolean {\n for (const r of body ?? []) {\n if (r.mention?.type === 'user' && (r.mention.id === YANTRA_AI_AUTHOR.id || /^yantra ai$/i.test(r.mention.name)))\n return true;\n }\n return /(^|[^\\w@])@(ai|yantra\\s?ai)\\b/i.test(commentText(body));\n}\n\n/** Plain text → one run (AI replies, tests). */\nexport const textToBody = (text: string): RichRun[] => (text ? [{ content: text }] : []);\n\n/** Display name for an author: the viewer's own comments say \"You\" when no name is known. */\nexport function authorName(author: NotesCommentAuthor, opts: { mine?: boolean } = {}): string {\n if (author.kind === 'agent') return author.name || 'Yantra AI';\n if (author.name) return author.name;\n return opts.mine ? 'You' : 'Someone';\n}\n\nexport function authorInitial(name: string): string {\n const ch = name.trim().charAt(0);\n return ch ? ch.toUpperCase() : '?';\n}\n\n/** Compact relative time like Notion's comment headers: \"Just now\", \"5m\", \"3h\", \"Yesterday\", \"Jan 4\". */\nexport function commentTimeLabel(iso: string, now: Date = new Date()): string {\n const t = time(iso);\n if (!t) return '';\n const diff = Math.max(0, now.getTime() - t);\n const min = Math.floor(diff / 60_000);\n if (min < 1) return 'Just now';\n if (min < 60) return `${min}m ago`;\n const hours = Math.floor(min / 60);\n const d = new Date(t);\n if (hours < 24 && d.getDate() === now.getDate()) return `${hours}h ago`;\n const startToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n const startThat = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const days = Math.round((startToday - startThat) / 86_400_000);\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days}d ago`;\n return d.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n ...(d.getFullYear() === now.getFullYear() ? {} : { year: 'numeric' }),\n });\n}\n\n/** \"1 reply\" / \"3 replies\". */\nexport const repliesLabel = (n: number) => (n === 1 ? '1 reply' : `${n} replies`);\n\n/** Thread transcript for the AI prompt: \"Name: text\" lines, oldest first. */\nexport function threadTranscript(thread: Pick<NotesCommentThread, 'root' | 'replies'>): Array<{\n author: string;\n kind: NotesCommentAuthorKind;\n text: string;\n}> {\n return [thread.root, ...thread.replies]\n .filter((c) => !c.deleted)\n .map((c) => ({\n author: authorName(c.author, { mine: c.mine }),\n kind: c.author.kind,\n text: commentText(c.body),\n }));\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
function connectorNameFromRecord(record) {
|
|
21
|
+
const metadata = record.metadata;
|
|
22
|
+
const formData = record.formData;
|
|
23
|
+
const customFields = metadata == null ? void 0 : metadata.customFields;
|
|
24
|
+
return String((customFields == null ? void 0 : customFields.connectorName) || (customFields == null ? void 0 : customFields.providerId) || (metadata == null ? void 0 : metadata.providerId) || (formData == null ? void 0 : formData.providerId) || (formData == null ? void 0 : formData.provider) || "").trim();
|
|
25
|
+
}
|
|
26
|
+
function toVaultCredential(r) {
|
|
27
|
+
var _a, _b, _c, _d, _e;
|
|
28
|
+
return {
|
|
29
|
+
id: String(r.id),
|
|
30
|
+
name: String((_a = r.name) != null ? _a : ""),
|
|
31
|
+
connector: connectorNameFromRecord(r),
|
|
32
|
+
status: String((_b = r.status) != null ? _b : ""),
|
|
33
|
+
owner: (_c = r.owner) == null ? void 0 : _c.username,
|
|
34
|
+
lastUsedAt: (_d = r.lastUsedAt) != null ? _d : null,
|
|
35
|
+
createdAt: (_e = r.createdAt) != null ? _e : null
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function connectorDisplayName(name) {
|
|
39
|
+
return name.replace(/[-_]+/g, " ").replace(/\s+/g, " ").trim().replace(/\b\w/g, (c) => c.toUpperCase());
|
|
40
|
+
}
|
|
41
|
+
function requiresCredentials(app) {
|
|
42
|
+
var _a;
|
|
43
|
+
const methods = ((_a = app.authMethods) != null ? _a : []).map((m) => m.toLowerCase());
|
|
44
|
+
return !methods.length || methods.some((m) => m !== "none");
|
|
45
|
+
}
|
|
46
|
+
function buildConnectionRows(catalog, credentials) {
|
|
47
|
+
const rows = /* @__PURE__ */ new Map();
|
|
48
|
+
catalog.forEach((c) => {
|
|
49
|
+
if (!requiresCredentials(c)) return;
|
|
50
|
+
rows.set(c.id, __spreadProps(__spreadValues(__spreadValues({
|
|
51
|
+
connector: c.id,
|
|
52
|
+
label: c.title && c.title !== c.id ? c.title : connectorDisplayName(c.id)
|
|
53
|
+
}, c.logo ? {
|
|
54
|
+
logo: c.logo
|
|
55
|
+
} : {}), c.description ? {
|
|
56
|
+
description: c.description
|
|
57
|
+
} : {}), {
|
|
58
|
+
credentials: []
|
|
59
|
+
}));
|
|
60
|
+
});
|
|
61
|
+
credentials.forEach((cred) => {
|
|
62
|
+
var _a;
|
|
63
|
+
const key = cred.connector || cred.name;
|
|
64
|
+
if (!key) return;
|
|
65
|
+
const row = (_a = rows.get(key)) != null ? _a : {
|
|
66
|
+
connector: key,
|
|
67
|
+
label: connectorDisplayName(key),
|
|
68
|
+
credentials: []
|
|
69
|
+
};
|
|
70
|
+
row.credentials.push(cred);
|
|
71
|
+
rows.set(key, row);
|
|
72
|
+
});
|
|
73
|
+
return [...rows.values()].sort((a, b) => Number(b.credentials.length > 0) - Number(a.credentials.length > 0) || a.label.localeCompare(b.label));
|
|
74
|
+
}export{buildConnectionRows,connectorDisplayName,connectorNameFromRecord,requiresCredentials,toVaultCredential};//# sourceMappingURL=notionConnections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notionConnections.js","sources":["../../../src/features/notion/notionConnections.ts"],"sourcesContent":["/**\n * Connections (web components/connector/ConnectionsDialog): every app that needs a credential,\n * and whether the vault holds one for it. The row rules are the web's - credentials are matched\n * to an app by connectorNameFromRecord (web connectorCredentialResolution), connected apps come\n * first, then by name. The phone reads the catalog over GraphQL (integrationConnectors) since it\n * has no web session cookie for the workflow REST catalog.\n *\n * Pure: no RN imports, so it runs under jest as-is.\n */\n\nexport interface CatalogApp {\n id: string;\n title: string;\n description?: string | null;\n logo?: string | null;\n authMethods?: string[] | null;\n}\n\nexport interface VaultCredential {\n id: string;\n name: string;\n connector: string;\n status: string;\n owner?: string;\n lastUsedAt?: string | null;\n createdAt?: string | null;\n}\n\nexport interface ConnectionRow {\n connector: string;\n label: string;\n logo?: string;\n description?: string;\n credentials: VaultCredential[];\n}\n\n/** Web connectorNameFromRecord: which app a vault record belongs to. */\nexport function connectorNameFromRecord(record: Record<string, unknown>): string {\n const metadata = record.metadata as Record<string, unknown> | undefined;\n const formData = record.formData as Record<string, unknown> | undefined;\n const customFields = metadata?.customFields as Record<string, unknown> | undefined;\n return String(\n customFields?.connectorName ||\n customFields?.providerId ||\n metadata?.providerId ||\n formData?.providerId ||\n formData?.provider ||\n '',\n ).trim();\n}\n\nexport function toVaultCredential(r: Record<string, unknown>): VaultCredential {\n return {\n id: String(r.id),\n name: String(r.name ?? ''),\n connector: connectorNameFromRecord(r),\n status: String(r.status ?? ''),\n owner: (r.owner as { username?: string } | null | undefined)?.username,\n lastUsedAt: (r.lastUsedAt as string | null) ?? null,\n createdAt: (r.createdAt as string | null) ?? null,\n };\n}\n\n/** \"google-sheets\" -> \"Google Sheets\" (web connectorDisplayName). */\nexport function connectorDisplayName(name: string): string {\n return name\n .replace(/[-_]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/** An app needs a credential unless its only auth method is \"none\". */\nexport function requiresCredentials(app: CatalogApp): boolean {\n const methods = (app.authMethods ?? []).map((m) => m.toLowerCase());\n return !methods.length || methods.some((m) => m !== 'none');\n}\n\n/** Catalog apps that need credentials, plus any app the vault has a credential for (web buildConnectionRows). */\nexport function buildConnectionRows(\n catalog: readonly CatalogApp[],\n credentials: readonly VaultCredential[],\n): ConnectionRow[] {\n const rows = new Map<string, ConnectionRow>();\n catalog.forEach((c) => {\n if (!requiresCredentials(c)) return;\n rows.set(c.id, {\n connector: c.id,\n label: c.title && c.title !== c.id ? c.title : connectorDisplayName(c.id),\n ...(c.logo ? { logo: c.logo } : {}),\n ...(c.description ? { description: c.description } : {}),\n credentials: [],\n });\n });\n credentials.forEach((cred) => {\n const key = cred.connector || cred.name;\n if (!key) return;\n const row = rows.get(key) ?? { connector: key, label: connectorDisplayName(key), credentials: [] };\n row.credentials.push(cred);\n rows.set(key, row);\n });\n return [...rows.values()].sort(\n (a, b) => Number(b.credentials.length > 0) - Number(a.credentials.length > 0) || a.label.localeCompare(b.label),\n );\n}\n"],"names":[],"mappings":"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"}
|