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 && (