diff --git a/assets/icons/eye_stroke2_corner0_rounded.svg b/assets/icons/eye_stroke2_corner0_rounded.svg
new file mode 100644
index 0000000000..035daa6e1c
--- /dev/null
+++ b/assets/icons/eye_stroke2_corner0_rounded.svg
@@ -0,0 +1 @@
+
diff --git a/src/components/Menu/index.tsx b/src/components/Menu/index.tsx
index 3be69b3486..b0b9d1cda7 100644
--- a/src/components/Menu/index.tsx
+++ b/src/components/Menu/index.tsx
@@ -138,7 +138,7 @@ export function Item({children, label, style, onPress, ...rest}: ItemProps) {
t.atoms.border_contrast_low,
{minHeight: 44, paddingVertical: 10},
style,
- (focused || pressed) && [t.atoms.bg_contrast_50],
+ (focused || pressed) && !rest.disabled && [t.atoms.bg_contrast_50],
]}>
{children}
diff --git a/src/components/Menu/index.web.tsx b/src/components/Menu/index.web.tsx
index 031250ddef..bf6b6d7b4a 100644
--- a/src/components/Menu/index.web.tsx
+++ b/src/components/Menu/index.web.tsx
@@ -239,12 +239,13 @@ export function Item({children, label, onPress, ...rest}: ItemProps) {
a.rounded_xs,
{minHeight: 32, paddingHorizontal: 10},
web({outline: 0}),
- (hovered || focused) && [
- web({outline: '0 !important'}),
- t.name === 'light'
- ? t.atoms.bg_contrast_25
- : t.atoms.bg_contrast_50,
- ],
+ (hovered || focused) &&
+ !rest.disabled && [
+ web({outline: '0 !important'}),
+ t.name === 'light'
+ ? t.atoms.bg_contrast_25
+ : t.atoms.bg_contrast_50,
+ ],
])}
{...web({
onMouseEnter,
@@ -268,9 +269,7 @@ export function ItemText({children, style}: ItemTextProps) {
export function ItemIcon({icon: Comp, position = 'left'}: ItemIconProps) {
const t = useTheme()
return (
-
+ ]}>
+
+
)
}
diff --git a/src/components/icons/Eye.tsx b/src/components/icons/Eye.tsx
new file mode 100644
index 0000000000..afa772e1d7
--- /dev/null
+++ b/src/components/icons/Eye.tsx
@@ -0,0 +1,5 @@
+import {createSinglePathSVG} from './TEMPLATE'
+
+export const Eye_Stroke2_Corner0_Rounded = createSinglePathSVG({
+ path: 'M3.135 12C5.413 16.088 8.77 18 12 18s6.587-1.912 8.865-6C18.587 7.912 15.23 6 12 6c-3.228 0-6.587 1.912-8.865 6ZM12 4c4.24 0 8.339 2.611 10.888 7.54a1 1 0 0 1 0 .92C20.338 17.388 16.24 20 12 20c-4.24 0-8.339-2.611-10.888-7.54a1 1 0 0 1 0-.92C3.662 6.612 7.76 4 12 4Zm0 6a2 2 0 1 0 0 4 2 2 0 0 0 0-4Zm-4 2a4 4 0 1 1 8 0 4 4 0 0 1-8 0Z',
+})
diff --git a/src/state/queries/postgate/index.ts b/src/state/queries/postgate/index.ts
index 5f9d5011bb..b7b4abe9fc 100644
--- a/src/state/queries/postgate/index.ts
+++ b/src/state/queries/postgate/index.ts
@@ -6,7 +6,7 @@ import {
} from '@atproto/api'
import {useMutation, useQueryClient} from '@tanstack/react-query'
-import {networkRetry} from '#/lib/async/retry'
+import {networkRetry, retry} from '#/lib/async/retry'
import {logger} from '#/logger'
import {updatePostShadow} from '#/state/cache/post-shadow'
import {useGetPosts} from '#/state/queries/post'
@@ -36,12 +36,20 @@ export async function getPostgateRecord({
try {
// TODO don't retry on 404
- const {data} = await networkRetry(2, () =>
- agent.api.com.atproto.repo.getRecord({
- repo: urip.host,
- collection: POSTGATE_COLLECTION,
- rkey: urip.rkey,
- }),
+ const {data} = await retry(
+ 2,
+ e => {
+ if (e.message.includes(`Could not locate record:`)) {
+ return false
+ }
+ return true
+ },
+ () =>
+ agent.api.com.atproto.repo.getRecord({
+ repo: urip.host,
+ collection: POSTGATE_COLLECTION,
+ rkey: urip.rkey,
+ }),
)
if (data.value && AppBskyFeedPostgate.isRecord(data.value)) {
diff --git a/src/view/com/util/forms/PostDropdownBtn.tsx b/src/view/com/util/forms/PostDropdownBtn.tsx
index f8de5cfb4b..0c35f07dd0 100644
--- a/src/view/com/util/forms/PostDropdownBtn.tsx
+++ b/src/view/com/util/forms/PostDropdownBtn.tsx
@@ -54,6 +54,7 @@ import {
EmojiSad_Stroke2_Corner0_Rounded as EmojiSad,
EmojiSmile_Stroke2_Corner0_Rounded as EmojiSmile,
} from '#/components/icons/Emoji'
+import {Eye_Stroke2_Corner0_Rounded as Eye} from '#/components/icons/Eye'
import {EyeSlash_Stroke2_Corner0_Rounded as EyeSlash} from '#/components/icons/EyeSlash'
import {Filter_Stroke2_Corner0_Rounded as Filter} from '#/components/icons/Filter'
import {Mute_Stroke2_Corner0_Rounded as Mute} from '#/components/icons/Mute'
@@ -61,6 +62,7 @@ import {PaperPlane_Stroke2_Corner0_Rounded as Send} from '#/components/icons/Pap
import {SpeakerVolumeFull_Stroke2_Corner0_Rounded as Unmute} from '#/components/icons/Speaker'
import {Trash_Stroke2_Corner0_Rounded as Trash} from '#/components/icons/Trash'
import {Warning_Stroke2_Corner0_Rounded as Warning} from '#/components/icons/Warning'
+import {Loader} from '#/components/Loader'
import * as Menu from '#/components/Menu'
import * as Prompt from '#/components/Prompt'
import {ReportDialog, useReportDialogControl} from '#/components/ReportDialog'
@@ -138,7 +140,7 @@ let PostDropdownBtn = ({
})
const isReplyHiddenByThreadgate = threadgate?.hiddenReplies?.includes(postUri)
- const {mutateAsync: toggleQuoteDetachment} =
+ const {mutateAsync: toggleQuoteDetachment, isPending} =
useToggleQuoteDetachmentMutation()
const href = React.useMemo(() => {
@@ -440,7 +442,14 @@ let PostDropdownBtn = ({
)}
+
+ >
+ )}
+ {hasSession && (
+ <>
+
+
{!isAuthor && !isPostHidden && rootPostUri && isReply && (
-
+
)}
{quoteEmbed && quoteEmbed.isOwnedByViewer && (