|
1 | 1 | import type { FeedViewType } from "@follow/constants"
|
2 |
| -import { useCallback } from "react" |
| 2 | +import { useCallback, useMemo } from "react" |
3 | 3 |
|
4 | 4 | import {
|
5 | 5 | getReadabilityStatus,
|
@@ -72,107 +72,120 @@ export const useEntryActions = ({ entryId, view }: { entryId: string; view?: Fee
|
72 | 72 | const isShowSourceContent = useShowSourceContent()
|
73 | 73 | const getCmd = useGetCommand()
|
74 | 74 | const runCmdFn = useRunCommandFn()
|
75 |
| - if (!entryId) return [] |
76 |
| - const actionConfigs = [ |
77 |
| - { |
78 |
| - id: COMMAND_ID.integration.saveToEagle, |
79 |
| - onClick: runCmdFn(COMMAND_ID.integration.saveToEagle, [{ entryId }]), |
80 |
| - }, |
81 |
| - { |
82 |
| - id: COMMAND_ID.integration.saveToReadwise, |
83 |
| - onClick: runCmdFn(COMMAND_ID.integration.saveToReadwise, [{ entryId }]), |
84 |
| - }, |
85 |
| - { |
86 |
| - id: COMMAND_ID.integration.saveToInstapaper, |
87 |
| - onClick: runCmdFn(COMMAND_ID.integration.saveToInstapaper, [{ entryId }]), |
88 |
| - }, |
89 |
| - { |
90 |
| - id: COMMAND_ID.integration.saveToOmnivore, |
91 |
| - onClick: runCmdFn(COMMAND_ID.integration.saveToOmnivore, [{ entryId }]), |
92 |
| - }, |
93 |
| - { |
94 |
| - id: COMMAND_ID.integration.saveToObsidian, |
95 |
| - onClick: runCmdFn(COMMAND_ID.integration.saveToObsidian, [{ entryId }]), |
96 |
| - }, |
97 |
| - { |
98 |
| - id: COMMAND_ID.integration.saveToOutline, |
99 |
| - onClick: runCmdFn(COMMAND_ID.integration.saveToOutline, [{ entryId }]), |
100 |
| - }, |
101 |
| - { |
102 |
| - id: COMMAND_ID.entry.tip, |
103 |
| - onClick: runCmdFn(COMMAND_ID.entry.tip, [{ entryId, feedId: feed?.id }]), |
104 |
| - hide: isInbox || feed?.ownerUserId === whoami()?.id, |
105 |
| - shortcut: shortcuts.entry.tip.key, |
106 |
| - }, |
107 |
| - { |
108 |
| - id: COMMAND_ID.entry.unstar, |
109 |
| - onClick: runCmdFn(COMMAND_ID.entry.unstar, [{ entryId }]), |
110 |
| - hide: !entry?.collections, |
111 |
| - shortcut: shortcuts.entry.toggleStarred.key, |
112 |
| - }, |
113 |
| - { |
114 |
| - id: COMMAND_ID.entry.star, |
115 |
| - onClick: runCmdFn(COMMAND_ID.entry.star, [{ entryId, view }]), |
116 |
| - hide: !!entry?.collections, |
117 |
| - shortcut: shortcuts.entry.toggleStarred.key, |
118 |
| - }, |
119 |
| - { |
120 |
| - id: COMMAND_ID.entry.delete, |
121 |
| - onClick: runCmdFn(COMMAND_ID.entry.delete, [{ entryId }]), |
122 |
| - hide: !isInbox, |
123 |
| - shortcut: shortcuts.entry.copyLink.key, |
124 |
| - }, |
125 |
| - { |
126 |
| - id: COMMAND_ID.entry.copyLink, |
127 |
| - onClick: runCmdFn(COMMAND_ID.entry.copyLink, [{ entryId }]), |
128 |
| - hide: !entry?.entries.url, |
129 |
| - shortcut: shortcuts.entry.copyTitle.key, |
130 |
| - }, |
131 |
| - { |
132 |
| - id: COMMAND_ID.entry.openInBrowser, |
133 |
| - onClick: runCmdFn(COMMAND_ID.entry.openInBrowser, [{ entryId }]), |
134 |
| - }, |
135 |
| - { |
136 |
| - id: COMMAND_ID.entry.viewSourceContent, |
137 |
| - onClick: runCmdFn(COMMAND_ID.entry.viewSourceContent, [{ entryId }]), |
138 |
| - hide: isShowSourceContent || !entry?.entries.url, |
139 |
| - }, |
140 |
| - { |
141 |
| - id: COMMAND_ID.entry.viewEntryContent, |
142 |
| - onClick: runCmdFn(COMMAND_ID.entry.viewEntryContent, []), |
143 |
| - hide: !isShowSourceContent, |
144 |
| - active: true, |
145 |
| - }, |
146 |
| - { |
147 |
| - id: COMMAND_ID.entry.share, |
148 |
| - onClick: runCmdFn(COMMAND_ID.entry.share, [{ entryId }]), |
149 |
| - hide: !entry?.entries.url || !("share" in navigator), |
150 |
| - shortcut: shortcuts.entry.share.key, |
151 |
| - }, |
152 |
| - { |
153 |
| - id: COMMAND_ID.entry.read, |
154 |
| - onClick: runCmdFn(COMMAND_ID.entry.read, [{ entryId }]), |
155 |
| - hide: !entry || !!entry.read || !!entry.collections || !!inList, |
156 |
| - shortcut: shortcuts.entry.toggleRead.key, |
157 |
| - }, |
158 |
| - { |
159 |
| - id: COMMAND_ID.entry.unread, |
160 |
| - onClick: runCmdFn(COMMAND_ID.entry.unread, [{ entryId }]), |
161 |
| - hide: !entry || !entry.read || !!entry.collections || !!inList, |
162 |
| - shortcut: shortcuts.entry.toggleRead.key, |
163 |
| - }, |
164 |
| - ] |
165 |
| - .filter((config) => !config.hide) |
166 |
| - .map((config) => { |
167 |
| - const cmd = getCmd(config.id) |
168 |
| - if (!cmd) return null |
169 |
| - return { |
170 |
| - ...config, |
171 |
| - name: cmd.label.title, |
172 |
| - icon: cmd.icon, |
173 |
| - } |
174 |
| - }) |
175 |
| - .filter((i) => i !== null) |
| 75 | + const actionConfigs = useMemo(() => { |
| 76 | + if (!entryId) return [] |
| 77 | + return [ |
| 78 | + { |
| 79 | + id: COMMAND_ID.integration.saveToEagle, |
| 80 | + onClick: runCmdFn(COMMAND_ID.integration.saveToEagle, [{ entryId }]), |
| 81 | + }, |
| 82 | + { |
| 83 | + id: COMMAND_ID.integration.saveToReadwise, |
| 84 | + onClick: runCmdFn(COMMAND_ID.integration.saveToReadwise, [{ entryId }]), |
| 85 | + }, |
| 86 | + { |
| 87 | + id: COMMAND_ID.integration.saveToInstapaper, |
| 88 | + onClick: runCmdFn(COMMAND_ID.integration.saveToInstapaper, [{ entryId }]), |
| 89 | + }, |
| 90 | + { |
| 91 | + id: COMMAND_ID.integration.saveToOmnivore, |
| 92 | + onClick: runCmdFn(COMMAND_ID.integration.saveToOmnivore, [{ entryId }]), |
| 93 | + }, |
| 94 | + { |
| 95 | + id: COMMAND_ID.integration.saveToObsidian, |
| 96 | + onClick: runCmdFn(COMMAND_ID.integration.saveToObsidian, [{ entryId }]), |
| 97 | + }, |
| 98 | + { |
| 99 | + id: COMMAND_ID.integration.saveToOutline, |
| 100 | + onClick: runCmdFn(COMMAND_ID.integration.saveToOutline, [{ entryId }]), |
| 101 | + }, |
| 102 | + { |
| 103 | + id: COMMAND_ID.entry.tip, |
| 104 | + onClick: runCmdFn(COMMAND_ID.entry.tip, [{ entryId, feedId: feed?.id }]), |
| 105 | + hide: isInbox || feed?.ownerUserId === whoami()?.id, |
| 106 | + shortcut: shortcuts.entry.tip.key, |
| 107 | + }, |
| 108 | + { |
| 109 | + id: COMMAND_ID.entry.unstar, |
| 110 | + onClick: runCmdFn(COMMAND_ID.entry.unstar, [{ entryId }]), |
| 111 | + hide: !entry?.collections, |
| 112 | + shortcut: shortcuts.entry.toggleStarred.key, |
| 113 | + }, |
| 114 | + { |
| 115 | + id: COMMAND_ID.entry.star, |
| 116 | + onClick: runCmdFn(COMMAND_ID.entry.star, [{ entryId, view }]), |
| 117 | + hide: !!entry?.collections, |
| 118 | + shortcut: shortcuts.entry.toggleStarred.key, |
| 119 | + }, |
| 120 | + { |
| 121 | + id: COMMAND_ID.entry.delete, |
| 122 | + onClick: runCmdFn(COMMAND_ID.entry.delete, [{ entryId }]), |
| 123 | + hide: !isInbox, |
| 124 | + shortcut: shortcuts.entry.copyLink.key, |
| 125 | + }, |
| 126 | + { |
| 127 | + id: COMMAND_ID.entry.copyLink, |
| 128 | + onClick: runCmdFn(COMMAND_ID.entry.copyLink, [{ entryId }]), |
| 129 | + hide: !entry?.entries.url, |
| 130 | + shortcut: shortcuts.entry.copyTitle.key, |
| 131 | + }, |
| 132 | + { |
| 133 | + id: COMMAND_ID.entry.openInBrowser, |
| 134 | + onClick: runCmdFn(COMMAND_ID.entry.openInBrowser, [{ entryId }]), |
| 135 | + }, |
| 136 | + { |
| 137 | + id: COMMAND_ID.entry.viewSourceContent, |
| 138 | + onClick: runCmdFn(COMMAND_ID.entry.viewSourceContent, [{ entryId }]), |
| 139 | + hide: isShowSourceContent || !entry?.entries.url, |
| 140 | + }, |
| 141 | + { |
| 142 | + id: COMMAND_ID.entry.viewEntryContent, |
| 143 | + onClick: runCmdFn(COMMAND_ID.entry.viewEntryContent, []), |
| 144 | + hide: !isShowSourceContent, |
| 145 | + active: true, |
| 146 | + }, |
| 147 | + { |
| 148 | + id: COMMAND_ID.entry.share, |
| 149 | + onClick: runCmdFn(COMMAND_ID.entry.share, [{ entryId }]), |
| 150 | + hide: !entry?.entries.url || !("share" in navigator), |
| 151 | + shortcut: shortcuts.entry.share.key, |
| 152 | + }, |
| 153 | + { |
| 154 | + id: COMMAND_ID.entry.read, |
| 155 | + onClick: runCmdFn(COMMAND_ID.entry.read, [{ entryId }]), |
| 156 | + hide: !entry || !!entry.read || !!entry.collections || !!inList, |
| 157 | + shortcut: shortcuts.entry.toggleRead.key, |
| 158 | + }, |
| 159 | + { |
| 160 | + id: COMMAND_ID.entry.unread, |
| 161 | + onClick: runCmdFn(COMMAND_ID.entry.unread, [{ entryId }]), |
| 162 | + hide: !entry || !entry.read || !!entry.collections || !!inList, |
| 163 | + shortcut: shortcuts.entry.toggleRead.key, |
| 164 | + }, |
| 165 | + ] |
| 166 | + .filter((config) => !config.hide) |
| 167 | + .map((config) => { |
| 168 | + const cmd = getCmd(config.id) |
| 169 | + if (!cmd) return null |
| 170 | + return { |
| 171 | + ...config, |
| 172 | + name: cmd.label.title, |
| 173 | + icon: cmd.icon, |
| 174 | + } |
| 175 | + }) |
| 176 | + .filter((i) => i !== null) |
| 177 | + }, [ |
| 178 | + entry, |
| 179 | + entryId, |
| 180 | + feed?.id, |
| 181 | + feed?.ownerUserId, |
| 182 | + getCmd, |
| 183 | + inList, |
| 184 | + isInbox, |
| 185 | + isShowSourceContent, |
| 186 | + runCmdFn, |
| 187 | + view, |
| 188 | + ]) |
176 | 189 |
|
177 | 190 | return actionConfigs
|
178 | 191 | }
|
0 commit comments