@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.
Files changed (213) 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/discover/DiscoverArticle.js +105 -92
  12. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  13. package/lib/features/discover/DiscoverFeed.js +97 -48
  14. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  15. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  16. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  17. package/lib/features/discover/DiscoverSidebar.js +555 -0
  18. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  19. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  20. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  21. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  22. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  23. package/lib/features/discover/followUpQuery.js +42 -0
  24. package/lib/features/discover/followUpQuery.js.map +1 -0
  25. package/lib/features/discover/markets.js +37 -0
  26. package/lib/features/discover/markets.js.map +1 -0
  27. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  28. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  29. package/lib/features/discover/weather.js +42 -0
  30. package/lib/features/discover/weather.js.map +1 -0
  31. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  32. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  33. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  34. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  35. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  36. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  37. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  38. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  39. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  40. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  41. package/lib/features/notion/NotionBlockSheets.js +206 -0
  42. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  43. package/lib/features/notion/NotionBlockView.js +36 -0
  44. package/lib/features/notion/NotionBlockView.js.map +1 -0
  45. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  46. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  47. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  48. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  49. package/lib/features/notion/NotionHistorySheet.js +439 -0
  50. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  51. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  52. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  53. package/lib/features/notion/NotionMentionSheet.js +279 -0
  54. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  55. package/lib/features/notion/NotionPageMenu.js +585 -0
  56. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  57. package/lib/features/notion/NotionPageTree.js +220 -0
  58. package/lib/features/notion/NotionPageTree.js.map +1 -0
  59. package/lib/features/notion/NotionPageView.js +1253 -152
  60. package/lib/features/notion/NotionPageView.js.map +1 -1
  61. package/lib/features/notion/NotionShareSheet.js +606 -0
  62. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  63. package/lib/features/notion/NotionSheets.js +87 -15
  64. package/lib/features/notion/NotionSheets.js.map +1 -1
  65. package/lib/features/notion/NotionSidebarSections.js +492 -0
  66. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  67. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  68. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  69. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  70. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  71. package/lib/features/notion/database/DatabaseCells.js +554 -0
  72. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  73. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  74. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  75. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  76. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  77. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  78. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  79. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  80. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  81. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  82. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  83. package/lib/features/notion/database/chartData.js +89 -0
  84. package/lib/features/notion/database/chartData.js.map +1 -0
  85. package/lib/features/notion/database/chartView.js +112 -0
  86. package/lib/features/notion/database/chartView.js.map +1 -0
  87. package/lib/features/notion/database/connectorButton.js +33 -0
  88. package/lib/features/notion/database/connectorButton.js.map +1 -0
  89. package/lib/features/notion/database/databaseCalc.js +208 -0
  90. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  91. package/lib/features/notion/database/databaseCalendar.js +157 -0
  92. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  93. package/lib/features/notion/database/databaseCsv.js +98 -0
  94. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  95. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  96. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  97. package/lib/features/notion/database/databaseFilter.js +473 -0
  98. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  99. package/lib/features/notion/database/databaseFormula.js +1072 -0
  100. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  101. package/lib/features/notion/database/databaseGroup.js +151 -0
  102. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  103. package/lib/features/notion/database/databaseRollup.js +58 -0
  104. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  105. package/lib/features/notion/database/databaseTimeline.js +156 -0
  106. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  107. package/lib/features/notion/database/databaseView.js +1188 -0
  108. package/lib/features/notion/database/databaseView.js.map +1 -0
  109. package/lib/features/notion/database/databaseViews.js +310 -0
  110. package/lib/features/notion/database/databaseViews.js.map +1 -0
  111. package/lib/features/notion/database/relationSource.js +92 -0
  112. package/lib/features/notion/database/relationSource.js.map +1 -0
  113. package/lib/features/notion/database/uniqueId.js +17 -0
  114. package/lib/features/notion/database/uniqueId.js.map +1 -0
  115. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  116. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  117. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  118. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  119. package/lib/features/notion/notionCodeLanguages.js +112 -0
  120. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  121. package/lib/features/notion/notionComments.js +86 -0
  122. package/lib/features/notion/notionComments.js.map +1 -0
  123. package/lib/features/notion/notionConnections.js +74 -0
  124. package/lib/features/notion/notionConnections.js.map +1 -0
  125. package/lib/features/notion/notionDocuments.js +453 -1
  126. package/lib/features/notion/notionDocuments.js.map +1 -1
  127. package/lib/features/notion/notionEditorModel.js +142 -7
  128. package/lib/features/notion/notionEditorModel.js.map +1 -1
  129. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  130. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  131. package/lib/features/notion/notionMedia.js +119 -0
  132. package/lib/features/notion/notionMedia.js.map +1 -0
  133. package/lib/features/notion/notionMentionDate.js +32 -0
  134. package/lib/features/notion/notionMentionDate.js.map +1 -0
  135. package/lib/features/notion/notionMentionOptions.js +162 -0
  136. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  137. package/lib/features/notion/notionNotesAgent.js +445 -0
  138. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  139. package/lib/features/notion/notionPageAccess.js +168 -0
  140. package/lib/features/notion/notionPageAccess.js.map +1 -0
  141. package/lib/features/notion/notionPageActions.js +138 -0
  142. package/lib/features/notion/notionPageActions.js.map +1 -0
  143. package/lib/features/notion/notionPageHistory.js +154 -0
  144. package/lib/features/notion/notionPageHistory.js.map +1 -0
  145. package/lib/features/notion/notionPageKinds.js +200 -0
  146. package/lib/features/notion/notionPageKinds.js.map +1 -0
  147. package/lib/features/notion/notionRecents.js +48 -0
  148. package/lib/features/notion/notionRecents.js.map +1 -0
  149. package/lib/features/notion/notionRichText.js +177 -0
  150. package/lib/features/notion/notionRichText.js.map +1 -0
  151. package/lib/features/notion/notionRichTitle.js +336 -0
  152. package/lib/features/notion/notionRichTitle.js.map +1 -0
  153. package/lib/features/notion/useNotionWorkspace.js +272 -13
  154. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  155. package/lib/features/notion/usePageActions.js +155 -0
  156. package/lib/features/notion/usePageActions.js.map +1 -0
  157. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  158. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  159. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  160. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  161. package/lib/features/study/StudyAgentChatPane.js +1 -1
  162. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  163. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  164. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  165. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  166. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  167. package/lib/features/webbuilder/buildFragments.js +1 -1
  168. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  169. package/lib/features/webbuilder/codeFiles.js +302 -0
  170. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  171. package/lib/features/webbuilder/codeHighlight.js +209 -0
  172. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  173. package/lib/features/webbuilder/components/CodeView.js +682 -52
  174. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  175. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  176. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  177. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  178. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  179. package/lib/features/webbuilder/stepLabels.js +68 -0
  180. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  181. package/lib/hooks/useHostChatSteering.js +45 -0
  182. package/lib/hooks/useHostChatSteering.js.map +1 -0
  183. package/lib/screens/Chat/index.js +2 -12
  184. package/lib/screens/Chat/index.js.map +1 -1
  185. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  186. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  187. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  188. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  189. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  190. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  191. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  192. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  193. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  194. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  195. package/lib/screens/NotionPage/index.js +2 -2
  196. package/lib/screens/NotionPage/index.js.map +1 -1
  197. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  198. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  199. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  200. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  201. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  202. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  203. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  204. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  205. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  206. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  207. package/lib/screens/WebBuilderNative/index.js +1 -1
  208. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  209. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  210. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  211. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  212. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  213. package/package.json +3 -3
@@ -0,0 +1,439 @@
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {useState,useMemo}from'react';import {Modal,View,Text,Pressable,StyleSheet,ScrollView,Alert,ActivityIndicator}from'react-native';import {Ionicons}from'@expo/vector-icons';import {useQuery,useApolloClient}from'@apollo/client/index.js';import {NATIVE_NOTES_VIEWER,NATIVE_NOTION_VERSION_HISTORY,NATIVE_NOTION_PAGE_HISTORY,NATIVE_NOTES_USERS,NATIVE_NOTION_RESTORE_VERSION,NATIVE_NOTION_PAGE_SNAPSHOT,NATIVE_NOTION_RESTORE_SNAPSHOT}from'./notionDocuments.js';import {buildHistoryGroups,describeItem,formatItemTime,canRestoreItem,toDate,outlineOf}from'./notionPageHistory.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
+ const REASON_LABEL = {
21
+ edit: "Edited",
22
+ "before-restore": "Before a restore",
23
+ restore: "Restored"
24
+ };
25
+ function useNames(ids, viewerId) {
26
+ const {
27
+ data
28
+ } = useQuery(NATIVE_NOTES_USERS, {
29
+ variables: {
30
+ ids
31
+ },
32
+ skip: !ids.length,
33
+ fetchPolicy: "cache-first"
34
+ });
35
+ return (id) => {
36
+ var _a, _b;
37
+ if (!id) return "Someone";
38
+ if (viewerId && id === viewerId) return "You";
39
+ const u = ((_a = data == null ? void 0 : data.notesUsers) != null ? _a : []).find((x) => x.id === id);
40
+ return ((_b = u == null ? void 0 : u.name) == null ? void 0 : _b.trim()) || (u == null ? void 0 : u.email) || id.slice(0, 8);
41
+ };
42
+ }
43
+ function HistorySheet({
44
+ visible,
45
+ palette,
46
+ pageId,
47
+ createdTime,
48
+ createdBy,
49
+ locked,
50
+ onRestored,
51
+ onClose
52
+ }) {
53
+ var _a, _b, _c;
54
+ const [tab, setTab] = useState("activity");
55
+ const viewer = useQuery(NATIVE_NOTES_VIEWER, {
56
+ skip: !visible,
57
+ fetchPolicy: "cache-first"
58
+ });
59
+ const viewerId = (_c = (_b = (_a = viewer.data) == null ? void 0 : _a.notesViewer) == null ? void 0 : _b.id) != null ? _c : null;
60
+ return /* @__PURE__ */ jsx(Modal, { visible, animationType: "slide", presentationStyle: "pageSheet", onRequestClose: onClose, children: /* @__PURE__ */ jsxs(View, { style: [ui.flex, {
61
+ backgroundColor: palette.bg
62
+ }], children: [
63
+ /* @__PURE__ */ jsxs(View, { style: [ui.sheetHeader, {
64
+ borderBottomColor: palette.hairline
65
+ }], children: [
66
+ /* @__PURE__ */ jsx(View, { style: [ui.sheetHeaderSide, ui.sheetHeaderLeft] }),
67
+ /* @__PURE__ */ jsx(Text, { style: [ui.sheetHeaderTitle, {
68
+ color: palette.text
69
+ }], children: "Page history" }),
70
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: onClose, hitSlop: 8, style: ui.sheetHeaderSide, children: /* @__PURE__ */ jsx(Text, { style: [ui.sheetHeaderDone, {
71
+ color: palette.primary
72
+ }], children: "Done" }) })
73
+ ] }),
74
+ /* @__PURE__ */ jsx(View, { style: [styles.tabs, {
75
+ backgroundColor: palette.fill
76
+ }], children: ["activity", "versions"].map((t) => /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "tab", accessibilityState: {
77
+ selected: tab === t
78
+ }, onPress: () => setTab(t), style: [styles.tab, tab === t && {
79
+ backgroundColor: palette.card
80
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.tabLabel, {
81
+ color: tab === t ? palette.text : palette.textMuted
82
+ }], children: t === "activity" ? "Activity" : "Versions" }) }, t)) }),
83
+ locked ? /* @__PURE__ */ jsx(Text, { style: [styles.note, {
84
+ color: palette.textMuted
85
+ }], children: "This page is locked \u2014 unlock it to restore." }) : null,
86
+ visible ? tab === "activity" ? /* @__PURE__ */ jsx(ActivityTab, { palette, pageId, createdTime, createdBy, viewerId, locked, onRestored }) : /* @__PURE__ */ jsx(VersionsTab, { palette, pageId, viewerId, locked, onRestored }) : null
87
+ ] }) });
88
+ }
89
+ function ActivityTab({
90
+ palette,
91
+ pageId,
92
+ createdTime,
93
+ createdBy,
94
+ viewerId,
95
+ locked,
96
+ onRestored
97
+ }) {
98
+ var _a;
99
+ const client = useApolloClient();
100
+ const {
101
+ data,
102
+ loading,
103
+ error,
104
+ refetch
105
+ } = useQuery(NATIVE_NOTION_VERSION_HISTORY, {
106
+ variables: {
107
+ blockId: pageId,
108
+ limit: 100
109
+ },
110
+ fetchPolicy: "network-only"
111
+ });
112
+ const entries = (_a = data == null ? void 0 : data.getVersionHistory) != null ? _a : [];
113
+ const groups = useMemo(() => buildHistoryGroups(entries, {
114
+ createdTime,
115
+ createdBy
116
+ }), [entries, createdTime, createdBy]);
117
+ const newest = entries.reduce((n, e) => typeof e.version === "number" && (n === null || e.version > n) ? e.version : n, null);
118
+ const ids = useMemo(() => [...new Set(groups.flatMap((g) => g.items.map((i) => i.userId)).filter(Boolean))], [groups]);
119
+ const nameOf = useNames(ids, viewerId);
120
+ const [busy, setBusy] = useState(null);
121
+ const [message, setMessage] = useState(null);
122
+ const restore = (version) => Alert.alert("Restore this version?", "The page's title, icon and cover go back to it. Your current version stays in the history.", [{
123
+ text: "Cancel",
124
+ style: "cancel"
125
+ }, {
126
+ text: "Restore",
127
+ onPress: async () => {
128
+ setBusy(version);
129
+ setMessage(null);
130
+ try {
131
+ await client.mutate({
132
+ mutation: NATIVE_NOTION_RESTORE_VERSION,
133
+ variables: {
134
+ blockId: pageId,
135
+ version
136
+ },
137
+ errorPolicy: "none"
138
+ });
139
+ await refetch();
140
+ onRestored();
141
+ setMessage("Restored");
142
+ } catch (err) {
143
+ setMessage(serverErrorText(err));
144
+ } finally {
145
+ setBusy(null);
146
+ }
147
+ }
148
+ }]);
149
+ if (loading && !data) return /* @__PURE__ */ jsx(Busy, { palette });
150
+ return /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.content, children: [
151
+ /* @__PURE__ */ jsx(Text, { style: [styles.note, styles.noteInline, {
152
+ color: palette.textMuted
153
+ }], children: "Edits to the page itself: title, icon and cover. Block changes are in Versions." }),
154
+ message || error ? /* @__PURE__ */ jsx(Text, { style: [styles.message, {
155
+ color: palette.textMuted
156
+ }], children: message != null ? message : serverErrorText(error) }) : null,
157
+ !groups.length ? /* @__PURE__ */ jsx(Text, { style: [styles.empty, {
158
+ color: palette.textMuted
159
+ }], children: "No history yet." }) : null,
160
+ groups.map((g) => /* @__PURE__ */ jsxs(View, { children: [
161
+ /* @__PURE__ */ jsx(Text, { style: [styles.day, {
162
+ color: palette.textMuted
163
+ }], children: g.label }),
164
+ /* @__PURE__ */ jsx(View, { style: [ui.group, {
165
+ backgroundColor: palette.card
166
+ }], children: g.items.map((item, i) => /* @__PURE__ */ jsxs(View, { style: styles.row, children: [
167
+ /* @__PURE__ */ jsx(View, { style: [styles.avatar, {
168
+ backgroundColor: palette.primarySoft
169
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.avatarText, {
170
+ color: palette.primary
171
+ }], children: nameOf(item.userId).charAt(0).toUpperCase() }) }),
172
+ /* @__PURE__ */ jsxs(View, { style: [styles.rowBody, i < g.items.length - 1 && ui.hairline, {
173
+ borderBottomColor: palette.hairline
174
+ }], children: [
175
+ /* @__PURE__ */ jsxs(View, { style: ui.flex, children: [
176
+ /* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.rowTitle, {
177
+ color: palette.text
178
+ }], children: `${nameOf(item.userId)} ${describeItem(item).toLowerCase()}` }),
179
+ /* @__PURE__ */ jsx(Text, { style: [styles.rowMeta, {
180
+ color: palette.textMuted
181
+ }], children: formatItemTime(item.latest) })
182
+ ] }),
183
+ !locked && canRestoreItem(item, newest) && typeof item.version === "number" ? /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: () => restore(item.version), disabled: busy !== null, style: [styles.pill, {
184
+ backgroundColor: palette.primarySoft
185
+ }], children: busy === item.version ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: palette.primary }) : /* @__PURE__ */ jsx(Text, { style: [styles.pillLabel, {
186
+ color: palette.primary
187
+ }], children: "Restore" }) }) : null
188
+ ] })
189
+ ] }, item.key)) })
190
+ ] }, g.key))
191
+ ] });
192
+ }
193
+ function VersionsTab({
194
+ palette,
195
+ pageId,
196
+ viewerId,
197
+ locked,
198
+ onRestored
199
+ }) {
200
+ var _a;
201
+ const client = useApolloClient();
202
+ const {
203
+ data,
204
+ loading,
205
+ error,
206
+ refetch
207
+ } = useQuery(NATIVE_NOTION_PAGE_HISTORY, {
208
+ variables: {
209
+ pageId,
210
+ limit: 50
211
+ },
212
+ fetchPolicy: "network-only"
213
+ });
214
+ const versions = (_a = data == null ? void 0 : data.getPageHistory) != null ? _a : [];
215
+ const ids = useMemo(() => [...new Set(versions.flatMap((v) => v.userIds))], [versions]);
216
+ const nameOf = useNames(ids, viewerId);
217
+ const [open, setOpen] = useState(null);
218
+ const [outline, setOutline] = useState({});
219
+ const [busy, setBusy] = useState(null);
220
+ const [message, setMessage] = useState(null);
221
+ const preview = async (id) => {
222
+ setOpen(open === id ? null : id);
223
+ if (outline[id]) return;
224
+ try {
225
+ const res = await client.query({
226
+ query: NATIVE_NOTION_PAGE_SNAPSHOT,
227
+ variables: {
228
+ snapshotId: id
229
+ },
230
+ fetchPolicy: "network-only"
231
+ });
232
+ setOutline((o) => {
233
+ var _a2, _b, _c;
234
+ return __spreadProps(__spreadValues({}, o), {
235
+ [id]: outlineOf((_c = (_b = (_a2 = res.data) == null ? void 0 : _a2.getPageSnapshot) == null ? void 0 : _b.blocks) != null ? _c : [])
236
+ });
237
+ });
238
+ } catch (err) {
239
+ setMessage(serverErrorText(err));
240
+ }
241
+ };
242
+ const restore = (id) => Alert.alert("Restore this version?", "The whole page goes back to it. The current page is saved as a version first.", [{
243
+ text: "Cancel",
244
+ style: "cancel"
245
+ }, {
246
+ text: "Restore",
247
+ onPress: async () => {
248
+ setBusy(id);
249
+ setMessage(null);
250
+ try {
251
+ await client.mutate({
252
+ mutation: NATIVE_NOTION_RESTORE_SNAPSHOT,
253
+ variables: {
254
+ pageId,
255
+ snapshotId: id
256
+ },
257
+ errorPolicy: "none"
258
+ });
259
+ await refetch();
260
+ onRestored();
261
+ setMessage("Restored");
262
+ } catch (err) {
263
+ setMessage(serverErrorText(err));
264
+ } finally {
265
+ setBusy(null);
266
+ }
267
+ }
268
+ }]);
269
+ if (loading && !data) return /* @__PURE__ */ jsx(Busy, { palette });
270
+ return /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.content, children: [
271
+ message || error ? /* @__PURE__ */ jsx(Text, { style: [styles.message, {
272
+ color: palette.textMuted
273
+ }], children: message != null ? message : serverErrorText(error) }) : null,
274
+ !versions.length ? /* @__PURE__ */ jsx(Text, { style: [styles.empty, {
275
+ color: palette.textMuted
276
+ }], children: "No saved versions yet." }) : null,
277
+ versions.map((v) => {
278
+ var _a2;
279
+ const at = toDate(v.createdAt);
280
+ return /* @__PURE__ */ jsxs(View, { style: [styles.version, {
281
+ backgroundColor: palette.card
282
+ }], children: [
283
+ /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", onPress: () => preview(v.id), style: styles.versionHead, children: [
284
+ /* @__PURE__ */ jsxs(View, { style: ui.flex, children: [
285
+ /* @__PURE__ */ jsx(Text, { style: [styles.rowTitle, {
286
+ color: palette.text
287
+ }], children: at ? formatItemTime(at) : v.createdAt }),
288
+ /* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.rowMeta, {
289
+ color: palette.textMuted
290
+ }], children: [(_a2 = REASON_LABEL[v.reason]) != null ? _a2 : v.reason, v.userIds.map(nameOf).join(", "), `${v.blockCount} blocks`].filter(Boolean).join(" \xB7 ") })
291
+ ] }),
292
+ /* @__PURE__ */ jsx(Ionicons, { name: open === v.id ? "chevron-up" : "chevron-down", size: 16, color: palette.textFaint })
293
+ ] }),
294
+ open === v.id ? /* @__PURE__ */ jsxs(View, { style: [styles.outline, {
295
+ borderTopColor: palette.hairline
296
+ }], children: [
297
+ outline[v.id] ? outline[v.id].slice(0, 40).map((line) => /* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.outlineLine, {
298
+ color: line.depth === 0 ? palette.text : palette.textMuted,
299
+ marginLeft: Math.min(line.depth, 4) * 12
300
+ }, line.depth === 0 && styles.outlineTitle], children: line.text || (line.type === "divider" ? "\u2014\u2014\u2014" : line.type.replace(/_/g, " ")) }, line.id)) : /* @__PURE__ */ jsx(ActivityIndicator, { color: palette.textMuted }),
301
+ !locked ? /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: () => restore(v.id), disabled: busy !== null, style: [ui.primaryButton, styles.restore, {
302
+ backgroundColor: palette.primary
303
+ }], children: busy === v.id ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: palette.onPrimary }) : /* @__PURE__ */ jsx(Text, { style: [ui.primaryButtonLabel, {
304
+ color: palette.onPrimary
305
+ }], children: "Restore this version" }) }) : null
306
+ ] }) : null
307
+ ] }, v.id);
308
+ })
309
+ ] });
310
+ }
311
+ function Busy({
312
+ palette
313
+ }) {
314
+ return /* @__PURE__ */ jsx(View, { style: styles.loading, children: /* @__PURE__ */ jsx(ActivityIndicator, { color: palette.textMuted }) });
315
+ }
316
+ const styles = StyleSheet.create({
317
+ tabs: {
318
+ flexDirection: "row",
319
+ margin: 16,
320
+ marginBottom: 4,
321
+ padding: 3,
322
+ borderRadius: 12
323
+ },
324
+ tab: {
325
+ flex: 1,
326
+ alignItems: "center",
327
+ paddingVertical: 8,
328
+ borderRadius: 9
329
+ },
330
+ tabLabel: {
331
+ fontSize: 14,
332
+ fontWeight: "600"
333
+ },
334
+ note: {
335
+ fontSize: 13,
336
+ marginHorizontal: 20,
337
+ marginTop: 8
338
+ },
339
+ noteInline: {
340
+ marginHorizontal: 4,
341
+ marginTop: 0,
342
+ marginBottom: 4
343
+ },
344
+ loading: {
345
+ paddingVertical: 48,
346
+ alignItems: "center"
347
+ },
348
+ content: {
349
+ padding: 16,
350
+ paddingBottom: 48,
351
+ gap: 8
352
+ },
353
+ message: {
354
+ fontSize: 13
355
+ },
356
+ empty: {
357
+ fontSize: 15,
358
+ textAlign: "center",
359
+ paddingVertical: 32
360
+ },
361
+ day: {
362
+ fontSize: 13,
363
+ fontWeight: "600",
364
+ marginTop: 12,
365
+ marginBottom: 6,
366
+ marginLeft: 4
367
+ },
368
+ row: {
369
+ flexDirection: "row",
370
+ alignItems: "center",
371
+ paddingLeft: 14
372
+ },
373
+ rowBody: {
374
+ flex: 1,
375
+ flexDirection: "row",
376
+ alignItems: "center",
377
+ gap: 8,
378
+ marginLeft: 12,
379
+ paddingRight: 14,
380
+ minHeight: 56
381
+ },
382
+ rowTitle: {
383
+ fontSize: 15,
384
+ fontWeight: "600"
385
+ },
386
+ rowMeta: {
387
+ fontSize: 12,
388
+ marginTop: 2
389
+ },
390
+ avatar: {
391
+ width: 30,
392
+ height: 30,
393
+ borderRadius: 15,
394
+ alignItems: "center",
395
+ justifyContent: "center"
396
+ },
397
+ avatarText: {
398
+ fontSize: 13,
399
+ fontWeight: "800"
400
+ },
401
+ pill: {
402
+ minWidth: 70,
403
+ alignItems: "center",
404
+ paddingHorizontal: 10,
405
+ paddingVertical: 6,
406
+ borderRadius: 999
407
+ },
408
+ pillLabel: {
409
+ fontSize: 13,
410
+ fontWeight: "700"
411
+ },
412
+ version: {
413
+ borderRadius: 14,
414
+ overflow: "hidden"
415
+ },
416
+ versionHead: {
417
+ flexDirection: "row",
418
+ alignItems: "center",
419
+ gap: 8,
420
+ padding: 14
421
+ },
422
+ outline: {
423
+ padding: 14,
424
+ borderTopWidth: StyleSheet.hairlineWidth,
425
+ gap: 4
426
+ },
427
+ outlineLine: {
428
+ fontSize: 13
429
+ },
430
+ outlineTitle: {
431
+ fontSize: 15,
432
+ fontWeight: "700",
433
+ marginBottom: 4
434
+ },
435
+ restore: {
436
+ alignSelf: "stretch",
437
+ marginTop: 12
438
+ }
439
+ });export{HistorySheet};//# sourceMappingURL=NotionHistorySheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotionHistorySheet.js","sources":["../../../src/features/notion/NotionHistorySheet.tsx"],"sourcesContent":["/**\n * Page history - the web PageHistoryPanel + PageVersionsSection on a phone.\n * Activity: the page's edit log (getVersionHistory) grouped by day with same-person bursts\n * collapsed (web utils/pageHistory), names via notesUsers, and \"Restore\" for earlier edits\n * (restoreBlockVersion: title / icon / cover go back; recorded as a new version).\n * Versions: whole-page snapshots (getPageHistory) - preview an outline (getPageSnapshot) and\n * restore one (restorePageSnapshot keeps the current page as a version first).\n * Restoring is hidden while the page is locked, like the web.\n */\nimport React, { useMemo, useState } from 'react';\nimport { ActivityIndicator, Alert, Modal, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useApolloClient, useQuery } from '@apollo/client';\nimport {\n NATIVE_NOTES_USERS,\n NATIVE_NOTES_VIEWER,\n NATIVE_NOTION_PAGE_HISTORY,\n NATIVE_NOTION_PAGE_SNAPSHOT,\n NATIVE_NOTION_RESTORE_SNAPSHOT,\n NATIVE_NOTION_RESTORE_VERSION,\n NATIVE_NOTION_VERSION_HISTORY,\n} from './notionDocuments';\nimport {\n buildHistoryGroups,\n canRestoreItem,\n describeItem,\n formatItemTime,\n outlineOf,\n toDate,\n type HistoryEntryLike,\n type PageVersion,\n type PageVersionBlock,\n} from './notionPageHistory';\nimport { serverErrorText } from './notionPageActions';\nimport type { NotionPalette } from './notionTheme';\nimport { ui } from './notionUi';\n\ntype Palette = NotionPalette;\n\nconst REASON_LABEL: Record<string, string> = {\n edit: 'Edited',\n 'before-restore': 'Before a restore',\n restore: 'Restored',\n};\n\nfunction useNames(ids: string[], viewerId: string | null) {\n const { data } = useQuery<{\n notesUsers?: Array<{ id: string; name?: string | null; email?: string | null }> | null;\n }>(NATIVE_NOTES_USERS, { variables: { ids }, skip: !ids.length, fetchPolicy: 'cache-first' });\n return (id: string | null | undefined) => {\n if (!id) return 'Someone';\n if (viewerId && id === viewerId) return 'You';\n const u = (data?.notesUsers ?? []).find((x) => x.id === id);\n return u?.name?.trim() || u?.email || id.slice(0, 8);\n };\n}\n\nexport function HistorySheet({\n visible,\n palette,\n pageId,\n createdTime,\n createdBy,\n locked,\n onRestored,\n onClose,\n}: {\n visible: boolean;\n palette: Palette;\n pageId: string;\n createdTime?: string | null;\n createdBy?: string | null;\n locked: boolean;\n /** A restore landed: the editor reloads the page. */\n onRestored: () => void;\n onClose: () => void;\n}) {\n const [tab, setTab] = useState<'activity' | 'versions'>('activity');\n const viewer = useQuery<{ notesViewer?: { id: string } | null }>(NATIVE_NOTES_VIEWER, {\n skip: !visible,\n fetchPolicy: 'cache-first',\n });\n const viewerId = viewer.data?.notesViewer?.id ?? null;\n return (\n <Modal visible={visible} animationType=\"slide\" presentationStyle=\"pageSheet\" onRequestClose={onClose}>\n <View style={[ui.flex, { backgroundColor: palette.bg }]}>\n <View style={[ui.sheetHeader, { borderBottomColor: palette.hairline }]}>\n <View style={[ui.sheetHeaderSide, ui.sheetHeaderLeft]} />\n <Text style={[ui.sheetHeaderTitle, { color: palette.text }]}>Page history</Text>\n <Pressable accessibilityRole=\"button\" onPress={onClose} hitSlop={8} style={ui.sheetHeaderSide}>\n <Text style={[ui.sheetHeaderDone, { color: palette.primary }]}>Done</Text>\n </Pressable>\n </View>\n <View style={[styles.tabs, { backgroundColor: palette.fill }]}>\n {(['activity', 'versions'] 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 === 'activity' ? 'Activity' : 'Versions'}\n </Text>\n </Pressable>\n ))}\n </View>\n {locked ? (\n <Text style={[styles.note, { color: palette.textMuted }]}>\n This page is locked — unlock it to restore.\n </Text>\n ) : null}\n {visible ? (\n tab === 'activity' ? (\n <ActivityTab\n palette={palette}\n pageId={pageId}\n createdTime={createdTime}\n createdBy={createdBy}\n viewerId={viewerId}\n locked={locked}\n onRestored={onRestored}\n />\n ) : (\n <VersionsTab\n palette={palette}\n pageId={pageId}\n viewerId={viewerId}\n locked={locked}\n onRestored={onRestored}\n />\n )\n ) : null}\n </View>\n </Modal>\n );\n}\n\nfunction ActivityTab({\n palette,\n pageId,\n createdTime,\n createdBy,\n viewerId,\n locked,\n onRestored,\n}: {\n palette: Palette;\n pageId: string;\n createdTime?: string | null;\n createdBy?: string | null;\n viewerId: string | null;\n locked: boolean;\n onRestored: () => void;\n}) {\n const client = useApolloClient();\n const { data, loading, error, refetch } = useQuery<{ getVersionHistory?: HistoryEntryLike[] | null }>(\n NATIVE_NOTION_VERSION_HISTORY,\n { variables: { blockId: pageId, limit: 100 }, fetchPolicy: 'network-only' },\n );\n const entries = data?.getVersionHistory ?? [];\n const groups = useMemo(\n () => buildHistoryGroups(entries, { createdTime, createdBy }),\n [entries, createdTime, createdBy],\n );\n const newest = entries.reduce<number | null>(\n (n, e) => (typeof e.version === 'number' && (n === null || e.version > n) ? e.version : n),\n null,\n );\n const ids = useMemo(\n () => [...new Set(groups.flatMap((g) => g.items.map((i) => i.userId)).filter(Boolean))],\n [groups],\n );\n const nameOf = useNames(ids, viewerId);\n const [busy, setBusy] = useState<number | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n\n const restore = (version: number) =>\n Alert.alert(\n 'Restore this version?',\n \"The page's title, icon and cover go back to it. Your current version stays in the history.\",\n [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Restore',\n onPress: async () => {\n setBusy(version);\n setMessage(null);\n try {\n await client.mutate({\n mutation: NATIVE_NOTION_RESTORE_VERSION,\n variables: { blockId: pageId, version },\n errorPolicy: 'none',\n });\n await refetch();\n onRestored();\n setMessage('Restored');\n } catch (err) {\n setMessage(serverErrorText(err));\n } finally {\n setBusy(null);\n }\n },\n },\n ],\n );\n\n if (loading && !data) return <Busy palette={palette} />;\n return (\n <ScrollView contentContainerStyle={styles.content}>\n <Text style={[styles.note, styles.noteInline, { color: palette.textMuted }]}>\n Edits to the page itself: title, icon and cover. Block changes are in Versions.\n </Text>\n {message || error ? (\n <Text style={[styles.message, { color: palette.textMuted }]}>{message ?? serverErrorText(error)}</Text>\n ) : null}\n {!groups.length ? <Text style={[styles.empty, { color: palette.textMuted }]}>No history yet.</Text> : null}\n {groups.map((g) => (\n <View key={g.key}>\n <Text style={[styles.day, { color: palette.textMuted }]}>{g.label}</Text>\n <View style={[ui.group, { backgroundColor: palette.card }]}>\n {g.items.map((item, i) => (\n <View key={item.key} style={styles.row}>\n <View style={[styles.avatar, { backgroundColor: palette.primarySoft }]}>\n <Text style={[styles.avatarText, { color: palette.primary }]}>\n {nameOf(item.userId).charAt(0).toUpperCase()}\n </Text>\n </View>\n <View\n style={[\n styles.rowBody,\n i < g.items.length - 1 && ui.hairline,\n { borderBottomColor: palette.hairline },\n ]}\n >\n <View style={ui.flex}>\n <Text numberOfLines={1} style={[styles.rowTitle, { color: palette.text }]}>\n {`${nameOf(item.userId)} ${describeItem(item).toLowerCase()}`}\n </Text>\n <Text style={[styles.rowMeta, { color: palette.textMuted }]}>\n {formatItemTime(item.latest)}\n </Text>\n </View>\n {!locked && canRestoreItem(item, newest) && typeof item.version === 'number' ? (\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => restore(item.version as number)}\n disabled={busy !== null}\n style={[styles.pill, { backgroundColor: palette.primarySoft }]}\n >\n {busy === item.version ? (\n <ActivityIndicator size=\"small\" color={palette.primary} />\n ) : (\n <Text style={[styles.pillLabel, { color: palette.primary }]}>\n Restore\n </Text>\n )}\n </Pressable>\n ) : null}\n </View>\n </View>\n ))}\n </View>\n </View>\n ))}\n </ScrollView>\n );\n}\n\nfunction VersionsTab({\n palette,\n pageId,\n viewerId,\n locked,\n onRestored,\n}: {\n palette: Palette;\n pageId: string;\n viewerId: string | null;\n locked: boolean;\n onRestored: () => void;\n}) {\n const client = useApolloClient();\n const { data, loading, error, refetch } = useQuery<{ getPageHistory?: PageVersion[] | null }>(\n NATIVE_NOTION_PAGE_HISTORY,\n {\n variables: { pageId, limit: 50 },\n fetchPolicy: 'network-only',\n },\n );\n const versions = data?.getPageHistory ?? [];\n const ids = useMemo(() => [...new Set(versions.flatMap((v) => v.userIds))], [versions]);\n const nameOf = useNames(ids, viewerId);\n const [open, setOpen] = useState<string | null>(null);\n const [outline, setOutline] = useState<Record<string, ReturnType<typeof outlineOf>>>({});\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n\n const preview = async (id: string) => {\n setOpen(open === id ? null : id);\n if (outline[id]) return;\n try {\n const res = await client.query<{ getPageSnapshot?: { blocks?: PageVersionBlock[] } | null }>({\n query: NATIVE_NOTION_PAGE_SNAPSHOT,\n variables: { snapshotId: id },\n fetchPolicy: 'network-only',\n });\n setOutline((o) => ({ ...o, [id]: outlineOf(res.data?.getPageSnapshot?.blocks ?? []) }));\n } catch (err) {\n setMessage(serverErrorText(err));\n }\n };\n\n const restore = (id: string) =>\n Alert.alert(\n 'Restore this version?',\n 'The whole page goes back to it. The current page is saved as a version first.',\n [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Restore',\n onPress: async () => {\n setBusy(id);\n setMessage(null);\n try {\n await client.mutate({\n mutation: NATIVE_NOTION_RESTORE_SNAPSHOT,\n variables: { pageId, snapshotId: id },\n errorPolicy: 'none',\n });\n await refetch();\n onRestored();\n setMessage('Restored');\n } catch (err) {\n setMessage(serverErrorText(err));\n } finally {\n setBusy(null);\n }\n },\n },\n ],\n );\n\n if (loading && !data) return <Busy palette={palette} />;\n return (\n <ScrollView contentContainerStyle={styles.content}>\n {message || error ? (\n <Text style={[styles.message, { color: palette.textMuted }]}>{message ?? serverErrorText(error)}</Text>\n ) : null}\n {!versions.length ? (\n <Text style={[styles.empty, { color: palette.textMuted }]}>No saved versions yet.</Text>\n ) : null}\n {versions.map((v) => {\n const at = toDate(v.createdAt);\n return (\n <View key={v.id} style={[styles.version, { backgroundColor: palette.card }]}>\n <Pressable accessibilityRole=\"button\" onPress={() => preview(v.id)} style={styles.versionHead}>\n <View style={ui.flex}>\n <Text style={[styles.rowTitle, { color: palette.text }]}>\n {at ? formatItemTime(at) : v.createdAt}\n </Text>\n <Text numberOfLines={1} style={[styles.rowMeta, { color: palette.textMuted }]}>\n {[\n REASON_LABEL[v.reason] ?? v.reason,\n v.userIds.map(nameOf).join(', '),\n `${v.blockCount} blocks`,\n ]\n .filter(Boolean)\n .join(' · ')}\n </Text>\n </View>\n <Ionicons\n name={open === v.id ? 'chevron-up' : 'chevron-down'}\n size={16}\n color={palette.textFaint}\n />\n </Pressable>\n {open === v.id ? (\n <View style={[styles.outline, { borderTopColor: palette.hairline }]}>\n {outline[v.id] ? (\n outline[v.id].slice(0, 40).map((line) => (\n <Text\n key={line.id}\n numberOfLines={1}\n style={[\n styles.outlineLine,\n {\n color: line.depth === 0 ? palette.text : palette.textMuted,\n marginLeft: Math.min(line.depth, 4) * 12,\n },\n line.depth === 0 && styles.outlineTitle,\n ]}\n >\n {line.text ||\n (line.type === 'divider' ? '———' : line.type.replace(/_/g, ' '))}\n </Text>\n ))\n ) : (\n <ActivityIndicator color={palette.textMuted} />\n )}\n {!locked ? (\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => restore(v.id)}\n disabled={busy !== null}\n style={[ui.primaryButton, styles.restore, { backgroundColor: palette.primary }]}\n >\n {busy === v.id ? (\n <ActivityIndicator size=\"small\" color={palette.onPrimary} />\n ) : (\n <Text style={[ui.primaryButtonLabel, { color: palette.onPrimary }]}>\n Restore this version\n </Text>\n )}\n </Pressable>\n ) : null}\n </View>\n ) : null}\n </View>\n );\n })}\n </ScrollView>\n );\n}\n\nfunction Busy({ palette }: { palette: Palette }) {\n return (\n <View style={styles.loading}>\n <ActivityIndicator color={palette.textMuted} />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n tabs: { flexDirection: 'row', margin: 16, marginBottom: 4, padding: 3, borderRadius: 12 },\n tab: { flex: 1, alignItems: 'center', paddingVertical: 8, borderRadius: 9 },\n tabLabel: { fontSize: 14, fontWeight: '600' },\n note: { fontSize: 13, marginHorizontal: 20, marginTop: 8 },\n noteInline: { marginHorizontal: 4, marginTop: 0, marginBottom: 4 },\n loading: { paddingVertical: 48, alignItems: 'center' },\n content: { padding: 16, paddingBottom: 48, gap: 8 },\n message: { fontSize: 13 },\n empty: { fontSize: 15, textAlign: 'center', paddingVertical: 32 },\n day: { fontSize: 13, fontWeight: '600', marginTop: 12, marginBottom: 6, marginLeft: 4 },\n row: { flexDirection: 'row', alignItems: 'center', paddingLeft: 14 },\n rowBody: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginLeft: 12,\n paddingRight: 14,\n minHeight: 56,\n },\n rowTitle: { fontSize: 15, fontWeight: '600' },\n rowMeta: { fontSize: 12, marginTop: 2 },\n avatar: { width: 30, height: 30, borderRadius: 15, alignItems: 'center', justifyContent: 'center' },\n avatarText: { fontSize: 13, fontWeight: '800' },\n pill: { minWidth: 70, alignItems: 'center', paddingHorizontal: 10, paddingVertical: 6, borderRadius: 999 },\n pillLabel: { fontSize: 13, fontWeight: '700' },\n version: { borderRadius: 14, overflow: 'hidden' },\n versionHead: { flexDirection: 'row', alignItems: 'center', gap: 8, padding: 14 },\n outline: { padding: 14, borderTopWidth: StyleSheet.hairlineWidth, gap: 4 },\n outlineLine: { fontSize: 13 },\n outlineTitle: { fontSize: 15, fontWeight: '700', marginBottom: 4 },\n restore: { alignSelf: 'stretch', marginTop: 12 },\n});\n"],"names":["_a"],"mappings":"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"}