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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/dictate/DictateExperience.js +59 -7
  12. package/lib/features/dictate/DictateExperience.js.map +1 -1
  13. package/lib/features/dictate/components/NoteView.js +227 -12
  14. package/lib/features/dictate/components/NoteView.js.map +1 -1
  15. package/lib/features/dictate/dictateClient.js +93 -23
  16. package/lib/features/dictate/dictateClient.js.map +1 -1
  17. package/lib/features/dictate/dictatePreference.js +19 -0
  18. package/lib/features/dictate/dictatePreference.js.map +1 -0
  19. package/lib/features/dictate/noteText.js +17 -2
  20. package/lib/features/dictate/noteText.js.map +1 -1
  21. package/lib/features/dictate/privacy.js +96 -0
  22. package/lib/features/dictate/privacy.js.map +1 -0
  23. package/lib/features/dictate/shownNote.js +24 -0
  24. package/lib/features/dictate/shownNote.js.map +1 -0
  25. package/lib/features/discover/DiscoverArticle.js +105 -92
  26. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  27. package/lib/features/discover/DiscoverFeed.js +97 -48
  28. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  29. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  30. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  31. package/lib/features/discover/DiscoverSidebar.js +555 -0
  32. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  33. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  34. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  35. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  36. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  37. package/lib/features/discover/followUpQuery.js +42 -0
  38. package/lib/features/discover/followUpQuery.js.map +1 -0
  39. package/lib/features/discover/markets.js +37 -0
  40. package/lib/features/discover/markets.js.map +1 -0
  41. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  42. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  43. package/lib/features/discover/weather.js +42 -0
  44. package/lib/features/discover/weather.js.map +1 -0
  45. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  46. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  47. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  48. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  49. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  50. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  51. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  52. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  53. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  54. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  55. package/lib/features/notion/NotionBlockSheets.js +206 -0
  56. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  57. package/lib/features/notion/NotionBlockView.js +36 -0
  58. package/lib/features/notion/NotionBlockView.js.map +1 -0
  59. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  60. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  61. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  62. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  63. package/lib/features/notion/NotionHistorySheet.js +439 -0
  64. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  65. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  66. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  67. package/lib/features/notion/NotionMentionSheet.js +279 -0
  68. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  69. package/lib/features/notion/NotionPageMenu.js +585 -0
  70. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  71. package/lib/features/notion/NotionPageTree.js +220 -0
  72. package/lib/features/notion/NotionPageTree.js.map +1 -0
  73. package/lib/features/notion/NotionPageView.js +1253 -152
  74. package/lib/features/notion/NotionPageView.js.map +1 -1
  75. package/lib/features/notion/NotionShareSheet.js +606 -0
  76. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  77. package/lib/features/notion/NotionSheets.js +87 -15
  78. package/lib/features/notion/NotionSheets.js.map +1 -1
  79. package/lib/features/notion/NotionSidebarSections.js +492 -0
  80. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  81. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  82. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  83. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  84. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  85. package/lib/features/notion/database/DatabaseCells.js +554 -0
  86. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  87. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  88. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  89. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  90. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  91. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  92. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  93. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  94. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  95. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  96. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  97. package/lib/features/notion/database/chartData.js +89 -0
  98. package/lib/features/notion/database/chartData.js.map +1 -0
  99. package/lib/features/notion/database/chartView.js +112 -0
  100. package/lib/features/notion/database/chartView.js.map +1 -0
  101. package/lib/features/notion/database/connectorButton.js +33 -0
  102. package/lib/features/notion/database/connectorButton.js.map +1 -0
  103. package/lib/features/notion/database/databaseCalc.js +208 -0
  104. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  105. package/lib/features/notion/database/databaseCalendar.js +157 -0
  106. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  107. package/lib/features/notion/database/databaseCsv.js +98 -0
  108. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  109. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  110. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  111. package/lib/features/notion/database/databaseFilter.js +473 -0
  112. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  113. package/lib/features/notion/database/databaseFormula.js +1072 -0
  114. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  115. package/lib/features/notion/database/databaseGroup.js +151 -0
  116. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  117. package/lib/features/notion/database/databaseRollup.js +58 -0
  118. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  119. package/lib/features/notion/database/databaseTimeline.js +156 -0
  120. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  121. package/lib/features/notion/database/databaseView.js +1188 -0
  122. package/lib/features/notion/database/databaseView.js.map +1 -0
  123. package/lib/features/notion/database/databaseViews.js +310 -0
  124. package/lib/features/notion/database/databaseViews.js.map +1 -0
  125. package/lib/features/notion/database/relationSource.js +92 -0
  126. package/lib/features/notion/database/relationSource.js.map +1 -0
  127. package/lib/features/notion/database/uniqueId.js +17 -0
  128. package/lib/features/notion/database/uniqueId.js.map +1 -0
  129. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  130. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  131. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  132. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  133. package/lib/features/notion/notionCodeLanguages.js +112 -0
  134. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  135. package/lib/features/notion/notionComments.js +86 -0
  136. package/lib/features/notion/notionComments.js.map +1 -0
  137. package/lib/features/notion/notionConnections.js +74 -0
  138. package/lib/features/notion/notionConnections.js.map +1 -0
  139. package/lib/features/notion/notionDocuments.js +453 -1
  140. package/lib/features/notion/notionDocuments.js.map +1 -1
  141. package/lib/features/notion/notionEditorModel.js +142 -7
  142. package/lib/features/notion/notionEditorModel.js.map +1 -1
  143. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  144. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  145. package/lib/features/notion/notionMedia.js +119 -0
  146. package/lib/features/notion/notionMedia.js.map +1 -0
  147. package/lib/features/notion/notionMentionDate.js +32 -0
  148. package/lib/features/notion/notionMentionDate.js.map +1 -0
  149. package/lib/features/notion/notionMentionOptions.js +162 -0
  150. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  151. package/lib/features/notion/notionNotesAgent.js +445 -0
  152. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  153. package/lib/features/notion/notionPageAccess.js +168 -0
  154. package/lib/features/notion/notionPageAccess.js.map +1 -0
  155. package/lib/features/notion/notionPageActions.js +138 -0
  156. package/lib/features/notion/notionPageActions.js.map +1 -0
  157. package/lib/features/notion/notionPageHistory.js +154 -0
  158. package/lib/features/notion/notionPageHistory.js.map +1 -0
  159. package/lib/features/notion/notionPageKinds.js +200 -0
  160. package/lib/features/notion/notionPageKinds.js.map +1 -0
  161. package/lib/features/notion/notionRecents.js +48 -0
  162. package/lib/features/notion/notionRecents.js.map +1 -0
  163. package/lib/features/notion/notionRichText.js +177 -0
  164. package/lib/features/notion/notionRichText.js.map +1 -0
  165. package/lib/features/notion/notionRichTitle.js +336 -0
  166. package/lib/features/notion/notionRichTitle.js.map +1 -0
  167. package/lib/features/notion/useNotionWorkspace.js +272 -13
  168. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  169. package/lib/features/notion/usePageActions.js +155 -0
  170. package/lib/features/notion/usePageActions.js.map +1 -0
  171. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  172. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  173. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  174. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  175. package/lib/features/study/StudyAgentChatPane.js +1 -1
  176. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  177. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  178. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  179. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  180. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  181. package/lib/features/webbuilder/buildFragments.js +1 -1
  182. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  183. package/lib/features/webbuilder/codeFiles.js +302 -0
  184. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  185. package/lib/features/webbuilder/codeHighlight.js +209 -0
  186. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  187. package/lib/features/webbuilder/components/CodeView.js +682 -52
  188. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  189. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  190. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  191. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  192. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  193. package/lib/features/webbuilder/stepLabels.js +68 -0
  194. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  195. package/lib/hooks/useHostChatSteering.js +45 -0
  196. package/lib/hooks/useHostChatSteering.js.map +1 -0
  197. package/lib/screens/Chat/index.js +2 -12
  198. package/lib/screens/Chat/index.js.map +1 -1
  199. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  200. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  201. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  202. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  203. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  204. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  205. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  206. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  207. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  208. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  209. package/lib/screens/NotionPage/index.js +2 -2
  210. package/lib/screens/NotionPage/index.js.map +1 -1
  211. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  212. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  213. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  214. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  215. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  216. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  217. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  218. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  219. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  220. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  221. package/lib/screens/WebBuilderNative/index.js +1 -1
  222. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  223. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  224. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  225. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  226. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  227. package/package.json +3 -3
@@ -0,0 +1,461 @@
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useState}from'react';import {Modal,KeyboardAvoidingView,View,Text,Pressable,StyleSheet,ActivityIndicator,FlatList,TextInput,Platform,Alert}from'react-native';import {Ionicons}from'@expo/vector-icons';import {useQuery,useApolloClient}from'@apollo/client/index.js';import {NATIVE_NOTION_COMMENTS,NATIVE_NOTION_EDIT_COMMENT,NATIVE_NOTION_TOGGLE_REACTION,NATIVE_NOTION_RESOLVE_THREAD,NATIVE_NOTION_DELETE_COMMENT,NATIVE_NOTION_ADD_COMMENT}from'./notionDocuments.js';import {groupThreads,textToBody,authorName,commentTimeLabel,commentText,reactionCount,COMMENT_REACTIONS}from'./notionComments.js';import {serverErrorText}from'./notionPageActions.js';import {ui}from'./notionUi.js';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 usePageComments(pageId) {
21
+ const query = useQuery(NATIVE_NOTION_COMMENTS, {
22
+ variables: {
23
+ pageId: pageId != null ? pageId : "",
24
+ includeResolved: true
25
+ },
26
+ skip: !pageId,
27
+ fetchPolicy: "cache-and-network"
28
+ });
29
+ const threads = useMemo(() => {
30
+ var _a, _b;
31
+ return groupThreads((_b = (_a = query.data) == null ? void 0 : _a.notionComments) != null ? _b : []);
32
+ }, [query.data]);
33
+ const openCounts = useMemo(() => {
34
+ const out = /* @__PURE__ */ new Map();
35
+ threads.filter((t) => !t.resolved).forEach((t) => {
36
+ var _a, _b, _c;
37
+ return out.set((_a = t.blockId) != null ? _a : "", ((_c = out.get((_b = t.blockId) != null ? _b : "")) != null ? _c : 0) + 1);
38
+ });
39
+ return out;
40
+ }, [threads]);
41
+ return {
42
+ threads,
43
+ openCounts,
44
+ refetch: query.refetch,
45
+ loading: query.loading && !query.data,
46
+ error: query.error
47
+ };
48
+ }
49
+ function CommentsSheet({
50
+ visible,
51
+ palette,
52
+ pageId,
53
+ blockId,
54
+ blockLabel,
55
+ onClose
56
+ }) {
57
+ const client = useApolloClient();
58
+ const {
59
+ threads,
60
+ refetch,
61
+ loading,
62
+ error
63
+ } = usePageComments(visible ? pageId : null);
64
+ const [tab, setTab] = useState("open");
65
+ const [draft, setDraft] = useState("");
66
+ const [sending, setSending] = useState(false);
67
+ const [message, setMessage] = useState(null);
68
+ const [editing, setEditing] = useState(null);
69
+ const shown = threads.filter((t) => (tab === "open" ? !t.resolved : t.resolved) && (blockId ? t.blockId === blockId : true));
70
+ const resolvedCount = threads.filter((t) => t.resolved && (blockId ? t.blockId === blockId : true)).length;
71
+ const mutate = async (mutation, variables, reload = false) => {
72
+ setMessage(null);
73
+ try {
74
+ await client.mutate({
75
+ mutation,
76
+ variables,
77
+ errorPolicy: "none"
78
+ });
79
+ if (reload) await refetch();
80
+ return true;
81
+ } catch (err) {
82
+ setMessage(serverErrorText(err));
83
+ return false;
84
+ }
85
+ };
86
+ const send = async (text, parentId) => {
87
+ const body = textToBody(text.trim());
88
+ if (!body.length) return false;
89
+ return mutate(NATIVE_NOTION_ADD_COMMENT, {
90
+ input: __spreadProps(__spreadValues(__spreadValues({
91
+ pageId
92
+ }, blockId && !parentId ? {
93
+ blockId
94
+ } : {}), parentId ? {
95
+ parentId
96
+ } : {}), {
97
+ body
98
+ })
99
+ }, true);
100
+ };
101
+ const submit = async () => {
102
+ if (sending) return;
103
+ setSending(true);
104
+ if (await send(draft)) setDraft("");
105
+ setSending(false);
106
+ };
107
+ const commentMenu = (c) => {
108
+ if (!c.mine || c.deleted) return;
109
+ Alert.alert("Comment", commentText(c.body).slice(0, 80), [{
110
+ text: "Edit",
111
+ onPress: () => setEditing({
112
+ id: c.id,
113
+ text: commentText(c.body)
114
+ })
115
+ }, {
116
+ text: "Delete",
117
+ style: "destructive",
118
+ onPress: () => mutate(NATIVE_NOTION_DELETE_COMMENT, {
119
+ id: c.id
120
+ }, true)
121
+ }, {
122
+ text: "Cancel",
123
+ style: "cancel"
124
+ }]);
125
+ };
126
+ return /* @__PURE__ */ jsx(Modal, { visible, animationType: "slide", presentationStyle: "pageSheet", onRequestClose: onClose, children: /* @__PURE__ */ jsxs(KeyboardAvoidingView, { style: [ui.flex, {
127
+ backgroundColor: palette.bg
128
+ }], behavior: Platform.OS === "ios" ? "padding" : void 0, children: [
129
+ /* @__PURE__ */ jsxs(View, { style: [ui.sheetHeader, {
130
+ borderBottomColor: palette.hairline
131
+ }], children: [
132
+ /* @__PURE__ */ jsx(View, { style: [ui.sheetHeaderSide, ui.sheetHeaderLeft] }),
133
+ /* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [ui.sheetHeaderTitle, {
134
+ color: palette.text
135
+ }], children: blockId ? "Block comments" : "Comments" }),
136
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: onClose, hitSlop: 8, style: ui.sheetHeaderSide, children: /* @__PURE__ */ jsx(Text, { style: [ui.sheetHeaderDone, {
137
+ color: palette.primary
138
+ }], children: "Done" }) })
139
+ ] }),
140
+ blockLabel ? /* @__PURE__ */ jsx(Text, { numberOfLines: 2, style: [styles.quote, {
141
+ color: palette.textMuted,
142
+ borderLeftColor: palette.hairline
143
+ }], children: blockLabel }) : null,
144
+ /* @__PURE__ */ jsx(View, { style: [styles.tabs, {
145
+ backgroundColor: palette.fill
146
+ }], children: ["open", "resolved"].map((t) => /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "tab", accessibilityState: {
147
+ selected: tab === t
148
+ }, onPress: () => setTab(t), style: [styles.tab, tab === t && {
149
+ backgroundColor: palette.card
150
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.tabLabel, {
151
+ color: tab === t ? palette.text : palette.textMuted
152
+ }], children: t === "open" ? "Open" : `Resolved${resolvedCount ? ` (${resolvedCount})` : ""}` }) }, t)) }),
153
+ message || error ? /* @__PURE__ */ jsx(Text, { style: [styles.message, {
154
+ color: palette.danger
155
+ }], children: message != null ? message : serverErrorText(error) }) : null,
156
+ loading ? /* @__PURE__ */ jsx(View, { style: styles.loading, children: /* @__PURE__ */ jsx(ActivityIndicator, { color: palette.textMuted }) }) : /* @__PURE__ */ jsx(FlatList, { data: shown, keyExtractor: (t) => t.id, contentContainerStyle: styles.list, keyboardShouldPersistTaps: "handled", ListEmptyComponent: /* @__PURE__ */ jsx(Text, { style: [styles.empty, {
157
+ color: palette.textMuted
158
+ }], children: tab === "open" ? "No open comments. Start one below." : "No resolved comments." }), renderItem: ({
159
+ item
160
+ }) => /* @__PURE__ */ jsx(ThreadCard, { thread: item, palette, onReply: (text) => send(text, item.root.id), onResolve: () => mutate(NATIVE_NOTION_RESOLVE_THREAD, {
161
+ threadId: item.id,
162
+ resolved: !item.resolved
163
+ }), onReact: (c, emoji) => mutate(NATIVE_NOTION_TOGGLE_REACTION, {
164
+ id: c.id,
165
+ emoji
166
+ }), onMenu: commentMenu, editing, onEditChange: (text) => setEditing((e) => e ? __spreadProps(__spreadValues({}, e), {
167
+ text
168
+ }) : e), onEditSave: async () => {
169
+ if (!(editing == null ? void 0 : editing.text.trim())) return;
170
+ const ok = await mutate(NATIVE_NOTION_EDIT_COMMENT, {
171
+ input: {
172
+ id: editing.id,
173
+ body: textToBody(editing.text.trim())
174
+ }
175
+ });
176
+ if (ok) setEditing(null);
177
+ }, onEditCancel: () => setEditing(null) }) }),
178
+ /* @__PURE__ */ jsxs(View, { style: [styles.composer, {
179
+ borderTopColor: palette.hairline,
180
+ backgroundColor: palette.card
181
+ }], children: [
182
+ /* @__PURE__ */ jsx(TextInput, { value: draft, onChangeText: setDraft, placeholder: blockId ? "Comment on this block\u2026" : "Add a comment\u2026", placeholderTextColor: palette.textFaint, multiline: true, style: [styles.composerInput, {
183
+ color: palette.text,
184
+ backgroundColor: palette.fill
185
+ }] }),
186
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: "Send comment", onPress: submit, disabled: !draft.trim() || sending, style: [styles.send, {
187
+ backgroundColor: palette.primary
188
+ }, (!draft.trim() || sending) && styles.disabled], children: sending ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: palette.onPrimary }) : /* @__PURE__ */ jsx(Ionicons, { name: "arrow-up", size: 18, color: palette.onPrimary }) })
189
+ ] })
190
+ ] }) });
191
+ }
192
+ function ThreadCard({
193
+ thread,
194
+ palette,
195
+ onReply,
196
+ onResolve,
197
+ onReact,
198
+ onMenu,
199
+ editing,
200
+ onEditChange,
201
+ onEditSave,
202
+ onEditCancel
203
+ }) {
204
+ const [replying, setReplying] = useState(false);
205
+ const [reply, setReply] = useState("");
206
+ const [picking, setPicking] = useState(null);
207
+ const comments = [thread.root, ...thread.replies];
208
+ return /* @__PURE__ */ jsxs(View, { style: [styles.thread, {
209
+ backgroundColor: palette.card
210
+ }, ui.cardShadow], children: [
211
+ comments.map((c, i) => /* @__PURE__ */ jsxs(Pressable, { onLongPress: () => onMenu(c), delayLongPress: 350, style: [styles.comment, i > 0 && styles.reply], children: [
212
+ /* @__PURE__ */ jsxs(View, { style: styles.commentHead, children: [
213
+ /* @__PURE__ */ jsx(View, { style: [styles.avatar, {
214
+ backgroundColor: c.author.kind === "agent" ? "#ede9fe" : palette.primarySoft
215
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.avatarText, {
216
+ color: c.author.kind === "agent" ? "#7c3aed" : palette.primary
217
+ }], children: c.author.kind === "agent" ? "\u2726" : authorName(c.author, {
218
+ mine: c.mine
219
+ }).charAt(0).toUpperCase() }) }),
220
+ /* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.author, {
221
+ color: palette.text
222
+ }], children: authorName(c.author, {
223
+ mine: c.mine
224
+ }) }),
225
+ /* @__PURE__ */ jsxs(Text, { style: [styles.time, {
226
+ color: palette.textFaint
227
+ }], children: [
228
+ commentTimeLabel(c.createdTime),
229
+ c.editedTime ? " \xB7 edited" : ""
230
+ ] })
231
+ ] }),
232
+ (editing == null ? void 0 : editing.id) === c.id ? /* @__PURE__ */ jsxs(View, { style: styles.replyBox, children: [
233
+ /* @__PURE__ */ jsx(TextInput, { value: editing.text, onChangeText: onEditChange, autoFocus: true, multiline: true, style: [styles.replyInput, {
234
+ color: palette.text,
235
+ backgroundColor: palette.fill
236
+ }] }),
237
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: onEditSave, style: [styles.smallBtn, {
238
+ backgroundColor: palette.primary
239
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.smallBtnLabel, {
240
+ color: palette.onPrimary
241
+ }], children: "Save" }) }),
242
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: onEditCancel, hitSlop: 6, children: /* @__PURE__ */ jsx(Ionicons, { name: "close", size: 20, color: palette.textMuted }) })
243
+ ] }) : /* @__PURE__ */ jsx(Text, { style: [styles.body, {
244
+ color: c.deleted ? palette.textFaint : palette.text
245
+ }], children: c.deleted ? "This comment was deleted." : commentText(c.body) }),
246
+ !c.deleted ? /* @__PURE__ */ jsxs(View, { style: styles.reactions, children: [
247
+ c.reactions.filter((r) => reactionCount(r) > 0).map((r) => /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: () => onReact(c, r.emoji), style: [styles.reaction, {
248
+ backgroundColor: r.reacted ? palette.primarySoft : palette.fill
249
+ }], children: /* @__PURE__ */ jsx(Text, { style: styles.reactionText, children: `${r.emoji} ${reactionCount(r)}` }) }, r.emoji)),
250
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: "Add reaction", onPress: () => setPicking(picking === c.id ? null : c.id), hitSlop: 6, style: [styles.reaction, {
251
+ backgroundColor: palette.fill
252
+ }], children: /* @__PURE__ */ jsx(Ionicons, { name: "happy-outline", size: 14, color: palette.textMuted }) })
253
+ ] }) : null,
254
+ picking === c.id ? /* @__PURE__ */ jsx(View, { style: styles.picker, children: COMMENT_REACTIONS.map((e) => /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: () => {
255
+ setPicking(null);
256
+ onReact(c, e);
257
+ }, style: styles.pickerCell, children: /* @__PURE__ */ jsx(Text, { style: styles.pickerEmoji, children: e }) }, e)) }) : null
258
+ ] }, c.id)),
259
+ replying ? /* @__PURE__ */ jsxs(View, { style: styles.replyBox, children: [
260
+ /* @__PURE__ */ jsx(TextInput, { value: reply, onChangeText: setReply, placeholder: "Reply\u2026", placeholderTextColor: palette.textFaint, autoFocus: true, multiline: true, style: [styles.replyInput, {
261
+ color: palette.text,
262
+ backgroundColor: palette.fill
263
+ }] }),
264
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: async () => {
265
+ if (await onReply(reply)) {
266
+ setReply("");
267
+ setReplying(false);
268
+ }
269
+ }, disabled: !reply.trim(), style: [styles.smallBtn, {
270
+ backgroundColor: palette.primary
271
+ }, !reply.trim() && styles.disabled], children: /* @__PURE__ */ jsx(Text, { style: [styles.smallBtnLabel, {
272
+ color: palette.onPrimary
273
+ }], children: "Reply" }) })
274
+ ] }) : null,
275
+ /* @__PURE__ */ jsxs(View, { style: [styles.threadActions, {
276
+ borderTopColor: palette.hairline
277
+ }], children: [
278
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: () => setReplying((v) => !v), hitSlop: 6, children: /* @__PURE__ */ jsx(Text, { style: [styles.action, {
279
+ color: palette.primary
280
+ }], children: replying ? "Cancel" : "Reply" }) }),
281
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: onResolve, hitSlop: 6, children: /* @__PURE__ */ jsx(Text, { style: [styles.action, {
282
+ color: palette.textMuted
283
+ }], children: thread.resolved ? "Re-open" : "Resolve" }) })
284
+ ] })
285
+ ] });
286
+ }
287
+ const styles = StyleSheet.create({
288
+ quote: {
289
+ fontSize: 14,
290
+ marginHorizontal: 16,
291
+ marginTop: 12,
292
+ paddingLeft: 10,
293
+ borderLeftWidth: 3
294
+ },
295
+ tabs: {
296
+ flexDirection: "row",
297
+ margin: 16,
298
+ marginBottom: 4,
299
+ padding: 3,
300
+ borderRadius: 12
301
+ },
302
+ tab: {
303
+ flex: 1,
304
+ alignItems: "center",
305
+ paddingVertical: 8,
306
+ borderRadius: 9
307
+ },
308
+ tabLabel: {
309
+ fontSize: 14,
310
+ fontWeight: "600"
311
+ },
312
+ message: {
313
+ fontSize: 13,
314
+ marginHorizontal: 16,
315
+ marginTop: 8
316
+ },
317
+ loading: {
318
+ paddingVertical: 48,
319
+ alignItems: "center"
320
+ },
321
+ list: {
322
+ padding: 16,
323
+ paddingBottom: 24,
324
+ gap: 12
325
+ },
326
+ empty: {
327
+ fontSize: 15,
328
+ textAlign: "center",
329
+ paddingVertical: 40
330
+ },
331
+ thread: {
332
+ borderRadius: 16,
333
+ overflow: "hidden"
334
+ },
335
+ comment: {
336
+ padding: 14,
337
+ gap: 6
338
+ },
339
+ reply: {
340
+ paddingLeft: 30
341
+ },
342
+ commentHead: {
343
+ flexDirection: "row",
344
+ alignItems: "center",
345
+ gap: 8
346
+ },
347
+ avatar: {
348
+ width: 24,
349
+ height: 24,
350
+ borderRadius: 12,
351
+ alignItems: "center",
352
+ justifyContent: "center"
353
+ },
354
+ avatarText: {
355
+ fontSize: 12,
356
+ fontWeight: "800"
357
+ },
358
+ author: {
359
+ flexShrink: 1,
360
+ fontSize: 14,
361
+ fontWeight: "700"
362
+ },
363
+ time: {
364
+ fontSize: 12
365
+ },
366
+ body: {
367
+ fontSize: 15,
368
+ lineHeight: 21
369
+ },
370
+ reactions: {
371
+ flexDirection: "row",
372
+ flexWrap: "wrap",
373
+ gap: 6
374
+ },
375
+ reaction: {
376
+ flexDirection: "row",
377
+ alignItems: "center",
378
+ paddingHorizontal: 8,
379
+ paddingVertical: 3,
380
+ borderRadius: 999,
381
+ minHeight: 24
382
+ },
383
+ reactionText: {
384
+ fontSize: 13
385
+ },
386
+ picker: {
387
+ flexDirection: "row",
388
+ gap: 4
389
+ },
390
+ pickerCell: {
391
+ padding: 4
392
+ },
393
+ pickerEmoji: {
394
+ fontSize: 22
395
+ },
396
+ replyBox: {
397
+ flexDirection: "row",
398
+ alignItems: "flex-end",
399
+ gap: 8,
400
+ paddingHorizontal: 14,
401
+ paddingBottom: 10
402
+ },
403
+ replyInput: {
404
+ flex: 1,
405
+ minHeight: 38,
406
+ maxHeight: 120,
407
+ paddingHorizontal: 12,
408
+ paddingVertical: 8,
409
+ borderRadius: 10,
410
+ fontSize: 15
411
+ },
412
+ smallBtn: {
413
+ paddingHorizontal: 14,
414
+ height: 38,
415
+ borderRadius: 10,
416
+ alignItems: "center",
417
+ justifyContent: "center"
418
+ },
419
+ smallBtnLabel: {
420
+ fontSize: 14,
421
+ fontWeight: "700"
422
+ },
423
+ threadActions: {
424
+ flexDirection: "row",
425
+ gap: 20,
426
+ paddingHorizontal: 14,
427
+ paddingVertical: 10,
428
+ borderTopWidth: StyleSheet.hairlineWidth
429
+ },
430
+ action: {
431
+ fontSize: 14,
432
+ fontWeight: "700"
433
+ },
434
+ composer: {
435
+ flexDirection: "row",
436
+ alignItems: "flex-end",
437
+ gap: 8,
438
+ padding: 12,
439
+ paddingBottom: 28,
440
+ borderTopWidth: StyleSheet.hairlineWidth
441
+ },
442
+ composerInput: {
443
+ flex: 1,
444
+ minHeight: 40,
445
+ maxHeight: 140,
446
+ paddingHorizontal: 12,
447
+ paddingVertical: 10,
448
+ borderRadius: 12,
449
+ fontSize: 16
450
+ },
451
+ send: {
452
+ width: 40,
453
+ height: 40,
454
+ borderRadius: 20,
455
+ alignItems: "center",
456
+ justifyContent: "center"
457
+ },
458
+ disabled: {
459
+ opacity: 0.45
460
+ }
461
+ });export{CommentsSheet,usePageComments};//# sourceMappingURL=NotionCommentsSheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotionCommentsSheet.js","sources":["../../../src/features/notion/NotionCommentsSheet.tsx"],"sourcesContent":["/**\n * Page comments - the web comments panel + block thread popover on a phone:\n * Open / Resolved tabs, threads (author, time, text, replies), reply, resolve / re-open,\n * reactions (the web's six), edit / delete your own comment, and a composer that starts a\n * page comment - or a block comment when opened from a block.\n * Same GraphQL as the web (components/api/comments); thread grouping is the web's\n * (notionComments.groupThreads).\n */\nimport React, { useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n Alert,\n FlatList,\n KeyboardAvoidingView,\n Modal,\n Platform,\n Pressable,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useApolloClient, useQuery } from '@apollo/client';\nimport {\n NATIVE_NOTION_ADD_COMMENT,\n NATIVE_NOTION_COMMENTS,\n NATIVE_NOTION_DELETE_COMMENT,\n NATIVE_NOTION_EDIT_COMMENT,\n NATIVE_NOTION_RESOLVE_THREAD,\n NATIVE_NOTION_TOGGLE_REACTION,\n} from './notionDocuments';\nimport {\n COMMENT_REACTIONS,\n authorName,\n commentText,\n commentTimeLabel,\n groupThreads,\n reactionCount,\n textToBody,\n type NotesComment,\n type NotesCommentThread,\n} from './notionComments';\nimport { serverErrorText } from './notionPageActions';\nimport type { NotionPalette } from './notionTheme';\nimport { ui } from './notionUi';\n\ntype Palette = NotionPalette;\n\n/** A page's comments, shared by the sheet and the editor's counts. */\nexport function usePageComments(pageId: string | null) {\n const query = useQuery<{ notionComments?: NotesComment[] | null }>(NATIVE_NOTION_COMMENTS, {\n variables: { pageId: pageId ?? '', includeResolved: true },\n skip: !pageId,\n fetchPolicy: 'cache-and-network',\n });\n const threads = useMemo(() => groupThreads(query.data?.notionComments ?? []), [query.data]);\n /** Open threads per block ('' = page-level), like the web's margin markers. */\n const openCounts = useMemo(() => {\n const out = new Map<string, number>();\n threads\n .filter((t) => !t.resolved)\n .forEach((t) => out.set(t.blockId ?? '', (out.get(t.blockId ?? '') ?? 0) + 1));\n return out;\n }, [threads]);\n return { threads, openCounts, refetch: query.refetch, loading: query.loading && !query.data, error: query.error };\n}\n\nexport function CommentsSheet({\n visible,\n palette,\n pageId,\n blockId,\n blockLabel,\n onClose,\n}: {\n visible: boolean;\n palette: Palette;\n pageId: string;\n /** Opened from a block: show its threads and start new ones on it. */\n blockId: string | null;\n blockLabel?: string;\n onClose: () => void;\n}) {\n const client = useApolloClient();\n const { threads, refetch, loading, error } = usePageComments(visible ? pageId : null);\n const [tab, setTab] = useState<'open' | 'resolved'>('open');\n const [draft, setDraft] = useState('');\n const [sending, setSending] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n /** The comment being edited inline (Alert.prompt is iOS-only). */\n const [editing, setEditing] = useState<{ id: string; text: string } | null>(null);\n\n const shown = threads.filter(\n (t) => (tab === 'open' ? !t.resolved : t.resolved) && (blockId ? t.blockId === blockId : true),\n );\n const resolvedCount = threads.filter((t) => t.resolved && (blockId ? t.blockId === blockId : true)).length;\n\n const mutate = async (\n mutation: Parameters<typeof client.mutate>[0]['mutation'],\n variables: object,\n reload = false,\n ) => {\n setMessage(null);\n try {\n await client.mutate({ mutation, variables, errorPolicy: 'none' });\n if (reload) await refetch();\n return true;\n } catch (err) {\n setMessage(serverErrorText(err));\n return false;\n }\n };\n\n const send = async (text: string, parentId?: string) => {\n const body = textToBody(text.trim());\n if (!body.length) return false;\n return mutate(\n NATIVE_NOTION_ADD_COMMENT,\n {\n input: {\n pageId,\n ...(blockId && !parentId ? { blockId } : {}),\n ...(parentId ? { parentId } : {}),\n body,\n },\n },\n true,\n );\n };\n\n const submit = async () => {\n if (sending) return;\n setSending(true);\n if (await send(draft)) setDraft('');\n setSending(false);\n };\n\n const commentMenu = (c: NotesComment) => {\n if (!c.mine || c.deleted) return;\n Alert.alert('Comment', commentText(c.body).slice(0, 80), [\n { text: 'Edit', onPress: () => setEditing({ id: c.id, text: commentText(c.body) }) },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: () => mutate(NATIVE_NOTION_DELETE_COMMENT, { id: c.id }, true),\n },\n { text: 'Cancel', style: 'cancel' },\n ]);\n };\n\n return (\n <Modal visible={visible} animationType=\"slide\" presentationStyle=\"pageSheet\" onRequestClose={onClose}>\n <KeyboardAvoidingView\n style={[ui.flex, { backgroundColor: palette.bg }]}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={[ui.sheetHeader, { borderBottomColor: palette.hairline }]}>\n <View style={[ui.sheetHeaderSide, ui.sheetHeaderLeft]} />\n <Text numberOfLines={1} style={[ui.sheetHeaderTitle, { color: palette.text }]}>\n {blockId ? 'Block comments' : 'Comments'}\n </Text>\n <Pressable accessibilityRole=\"button\" onPress={onClose} hitSlop={8} style={ui.sheetHeaderSide}>\n <Text style={[ui.sheetHeaderDone, { color: palette.primary }]}>Done</Text>\n </Pressable>\n </View>\n {blockLabel ? (\n <Text\n numberOfLines={2}\n style={[styles.quote, { color: palette.textMuted, borderLeftColor: palette.hairline }]}\n >\n {blockLabel}\n </Text>\n ) : null}\n <View style={[styles.tabs, { backgroundColor: palette.fill }]}>\n {(['open', 'resolved'] as const).map((t) => (\n <Pressable\n key={t}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: tab === t }}\n onPress={() => setTab(t)}\n style={[styles.tab, tab === t && { backgroundColor: palette.card }]}\n >\n <Text style={[styles.tabLabel, { color: tab === t ? palette.text : palette.textMuted }]}>\n {t === 'open' ? 'Open' : `Resolved${resolvedCount ? ` (${resolvedCount})` : ''}`}\n </Text>\n </Pressable>\n ))}\n </View>\n {message || error ? (\n <Text style={[styles.message, { color: palette.danger }]}>{message ?? serverErrorText(error)}</Text>\n ) : null}\n {loading ? (\n <View style={styles.loading}>\n <ActivityIndicator color={palette.textMuted} />\n </View>\n ) : (\n <FlatList\n data={shown}\n keyExtractor={(t) => t.id}\n contentContainerStyle={styles.list}\n keyboardShouldPersistTaps=\"handled\"\n ListEmptyComponent={\n <Text style={[styles.empty, { color: palette.textMuted }]}>\n {tab === 'open' ? 'No open comments. Start one below.' : 'No resolved comments.'}\n </Text>\n }\n renderItem={({ item }) => (\n <ThreadCard\n thread={item}\n palette={palette}\n onReply={(text) => send(text, item.root.id)}\n onResolve={() =>\n mutate(NATIVE_NOTION_RESOLVE_THREAD, {\n threadId: item.id,\n resolved: !item.resolved,\n })\n }\n onReact={(c, emoji) => mutate(NATIVE_NOTION_TOGGLE_REACTION, { id: c.id, emoji })}\n onMenu={commentMenu}\n editing={editing}\n onEditChange={(text) => setEditing((e) => (e ? { ...e, text } : e))}\n onEditSave={async () => {\n if (!editing?.text.trim()) return;\n const ok = await mutate(NATIVE_NOTION_EDIT_COMMENT, {\n input: { id: editing.id, body: textToBody(editing.text.trim()) },\n });\n if (ok) setEditing(null);\n }}\n onEditCancel={() => setEditing(null)}\n />\n )}\n />\n )}\n <View style={[styles.composer, { borderTopColor: palette.hairline, backgroundColor: palette.card }]}>\n <TextInput\n value={draft}\n onChangeText={setDraft}\n placeholder={blockId ? 'Comment on this block…' : 'Add a comment…'}\n placeholderTextColor={palette.textFaint}\n multiline\n style={[styles.composerInput, { color: palette.text, backgroundColor: palette.fill }]}\n />\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send comment\"\n onPress={submit}\n disabled={!draft.trim() || sending}\n style={[\n styles.send,\n { backgroundColor: palette.primary },\n (!draft.trim() || sending) && styles.disabled,\n ]}\n >\n {sending ? (\n <ActivityIndicator size=\"small\" color={palette.onPrimary} />\n ) : (\n <Ionicons name=\"arrow-up\" size={18} color={palette.onPrimary} />\n )}\n </Pressable>\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nfunction ThreadCard({\n thread,\n palette,\n onReply,\n onResolve,\n onReact,\n onMenu,\n editing,\n onEditChange,\n onEditSave,\n onEditCancel,\n}: {\n editing: { id: string; text: string } | null;\n onEditChange: (text: string) => void;\n onEditSave: () => void;\n onEditCancel: () => void;\n thread: NotesCommentThread;\n palette: Palette;\n onReply: (text: string) => Promise<boolean>;\n onResolve: () => void;\n onReact: (c: NotesComment, emoji: string) => void;\n onMenu: (c: NotesComment) => void;\n}) {\n const [replying, setReplying] = useState(false);\n const [reply, setReply] = useState('');\n const [picking, setPicking] = useState<string | null>(null);\n const comments = [thread.root, ...thread.replies];\n return (\n <View style={[styles.thread, { backgroundColor: palette.card }, ui.cardShadow]}>\n {comments.map((c, i) => (\n <Pressable\n key={c.id}\n onLongPress={() => onMenu(c)}\n delayLongPress={350}\n style={[styles.comment, i > 0 && styles.reply]}\n >\n <View style={styles.commentHead}>\n <View\n style={[\n styles.avatar,\n { backgroundColor: c.author.kind === 'agent' ? '#ede9fe' : palette.primarySoft },\n ]}\n >\n <Text\n style={[\n styles.avatarText,\n { color: c.author.kind === 'agent' ? '#7c3aed' : palette.primary },\n ]}\n >\n {c.author.kind === 'agent'\n ? '✦'\n : authorName(c.author, { mine: c.mine }).charAt(0).toUpperCase()}\n </Text>\n </View>\n <Text numberOfLines={1} style={[styles.author, { color: palette.text }]}>\n {authorName(c.author, { mine: c.mine })}\n </Text>\n <Text style={[styles.time, { color: palette.textFaint }]}>\n {commentTimeLabel(c.createdTime)}\n {c.editedTime ? ' · edited' : ''}\n </Text>\n </View>\n {editing?.id === c.id ? (\n <View style={styles.replyBox}>\n <TextInput\n value={editing.text}\n onChangeText={onEditChange}\n autoFocus\n multiline\n style={[styles.replyInput, { color: palette.text, backgroundColor: palette.fill }]}\n />\n <Pressable\n accessibilityRole=\"button\"\n onPress={onEditSave}\n style={[styles.smallBtn, { backgroundColor: palette.primary }]}\n >\n <Text style={[styles.smallBtnLabel, { color: palette.onPrimary }]}>Save</Text>\n </Pressable>\n <Pressable accessibilityRole=\"button\" onPress={onEditCancel} hitSlop={6}>\n <Ionicons name=\"close\" size={20} color={palette.textMuted} />\n </Pressable>\n </View>\n ) : (\n <Text style={[styles.body, { color: c.deleted ? palette.textFaint : palette.text }]}>\n {c.deleted ? 'This comment was deleted.' : commentText(c.body)}\n </Text>\n )}\n {!c.deleted ? (\n <View style={styles.reactions}>\n {c.reactions\n .filter((r) => reactionCount(r) > 0)\n .map((r) => (\n <Pressable\n key={r.emoji}\n accessibilityRole=\"button\"\n onPress={() => onReact(c, r.emoji)}\n style={[\n styles.reaction,\n { backgroundColor: r.reacted ? palette.primarySoft : palette.fill },\n ]}\n >\n <Text style={styles.reactionText}>{`${r.emoji} ${reactionCount(r)}`}</Text>\n </Pressable>\n ))}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add reaction\"\n onPress={() => setPicking(picking === c.id ? null : c.id)}\n hitSlop={6}\n style={[styles.reaction, { backgroundColor: palette.fill }]}\n >\n <Ionicons name=\"happy-outline\" size={14} color={palette.textMuted} />\n </Pressable>\n </View>\n ) : null}\n {picking === c.id ? (\n <View style={styles.picker}>\n {COMMENT_REACTIONS.map((e) => (\n <Pressable\n key={e}\n accessibilityRole=\"button\"\n onPress={() => {\n setPicking(null);\n onReact(c, e);\n }}\n style={styles.pickerCell}\n >\n <Text style={styles.pickerEmoji}>{e}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n </Pressable>\n ))}\n {replying ? (\n <View style={styles.replyBox}>\n <TextInput\n value={reply}\n onChangeText={setReply}\n placeholder=\"Reply…\"\n placeholderTextColor={palette.textFaint}\n autoFocus\n multiline\n style={[styles.replyInput, { color: palette.text, backgroundColor: palette.fill }]}\n />\n <Pressable\n accessibilityRole=\"button\"\n onPress={async () => {\n if (await onReply(reply)) {\n setReply('');\n setReplying(false);\n }\n }}\n disabled={!reply.trim()}\n style={[\n styles.smallBtn,\n { backgroundColor: palette.primary },\n !reply.trim() && styles.disabled,\n ]}\n >\n <Text style={[styles.smallBtnLabel, { color: palette.onPrimary }]}>Reply</Text>\n </Pressable>\n </View>\n ) : null}\n <View style={[styles.threadActions, { borderTopColor: palette.hairline }]}>\n <Pressable accessibilityRole=\"button\" onPress={() => setReplying((v) => !v)} hitSlop={6}>\n <Text style={[styles.action, { color: palette.primary }]}>{replying ? 'Cancel' : 'Reply'}</Text>\n </Pressable>\n <Pressable accessibilityRole=\"button\" onPress={onResolve} hitSlop={6}>\n <Text style={[styles.action, { color: palette.textMuted }]}>\n {thread.resolved ? 'Re-open' : 'Resolve'}\n </Text>\n </Pressable>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n quote: { fontSize: 14, marginHorizontal: 16, marginTop: 12, paddingLeft: 10, borderLeftWidth: 3 },\n tabs: { flexDirection: 'row', margin: 16, marginBottom: 4, padding: 3, borderRadius: 12 },\n tab: { flex: 1, alignItems: 'center', paddingVertical: 8, borderRadius: 9 },\n tabLabel: { fontSize: 14, fontWeight: '600' },\n message: { fontSize: 13, marginHorizontal: 16, marginTop: 8 },\n loading: { paddingVertical: 48, alignItems: 'center' },\n list: { padding: 16, paddingBottom: 24, gap: 12 },\n empty: { fontSize: 15, textAlign: 'center', paddingVertical: 40 },\n thread: { borderRadius: 16, overflow: 'hidden' },\n comment: { padding: 14, gap: 6 },\n reply: { paddingLeft: 30 },\n commentHead: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n avatar: { width: 24, height: 24, borderRadius: 12, alignItems: 'center', justifyContent: 'center' },\n avatarText: { fontSize: 12, fontWeight: '800' },\n author: { flexShrink: 1, fontSize: 14, fontWeight: '700' },\n time: { fontSize: 12 },\n body: { fontSize: 15, lineHeight: 21 },\n reactions: { flexDirection: 'row', flexWrap: 'wrap', gap: 6 },\n reaction: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 8,\n paddingVertical: 3,\n borderRadius: 999,\n minHeight: 24,\n },\n reactionText: { fontSize: 13 },\n picker: { flexDirection: 'row', gap: 4 },\n pickerCell: { padding: 4 },\n pickerEmoji: { fontSize: 22 },\n replyBox: { flexDirection: 'row', alignItems: 'flex-end', gap: 8, paddingHorizontal: 14, paddingBottom: 10 },\n replyInput: {\n flex: 1,\n minHeight: 38,\n maxHeight: 120,\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 10,\n fontSize: 15,\n },\n smallBtn: { paddingHorizontal: 14, height: 38, borderRadius: 10, alignItems: 'center', justifyContent: 'center' },\n smallBtnLabel: { fontSize: 14, fontWeight: '700' },\n threadActions: {\n flexDirection: 'row',\n gap: 20,\n paddingHorizontal: 14,\n paddingVertical: 10,\n borderTopWidth: StyleSheet.hairlineWidth,\n },\n action: { fontSize: 14, fontWeight: '700' },\n composer: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 8,\n padding: 12,\n paddingBottom: 28,\n borderTopWidth: StyleSheet.hairlineWidth,\n },\n composerInput: {\n flex: 1,\n minHeight: 40,\n maxHeight: 140,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderRadius: 12,\n fontSize: 16,\n },\n send: { width: 40, height: 40, borderRadius: 20, alignItems: 'center', justifyContent: 'center' },\n disabled: { opacity: 0.45 },\n});\n"],"names":[],"mappings":"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"}