···33import {msg} from '@lingui/macro'
44import {useLingui} from '@lingui/react'
5566-import {useTheme, atoms as a, useBreakpoints} from '#/alf'
77-import {Text} from '#/components/Typography'
66+import {atoms as a, useBreakpoints, useTheme} from '#/alf'
87import {Button, ButtonColor, ButtonText} from '#/components/Button'
99-108import * as Dialog from '#/components/Dialog'
99+import {Text} from '#/components/Typography'
11101211export {useDialogControl as usePromptControl} from '#/components/Dialog'
1312···8079 <View
8180 style={[
8281 a.w_full,
8383- a.gap_sm,
8282+ a.gap_md,
8483 a.justify_end,
8584 gtMobile
8685 ? [a.flex_row, a.flex_row_reverse, a.justify_start]
+26-26
src/view/com/util/forms/PostDropdownBtn.tsx
···11import React, {memo} from 'react'
22-import {StyleProp, ViewStyle, Pressable, PressableProps} from 'react-native'
33-import Clipboard from '@react-native-clipboard/clipboard'
44-import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
55-import {useNavigation} from '@react-navigation/native'
22+import {Pressable, PressableProps, StyleProp, ViewStyle} from 'react-native'
63import {
74 AppBskyActorDefs,
85 AppBskyFeedPost,
96 AtUri,
107 RichText as RichTextAPI,
118} from '@atproto/api'
1212-import {toShareUrl} from 'lib/strings/url-helpers'
1313-import {useTheme} from 'lib/ThemeContext'
1414-import {shareUrl} from 'lib/sharing'
1515-import * as Toast from '../Toast'
1616-import {EventStopper} from '../EventStopper'
1717-import {useDialogControl} from '#/components/Dialog'
1818-import * as Prompt from '#/components/Prompt'
99+import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
1010+import {msg} from '@lingui/macro'
1111+import {useLingui} from '@lingui/react'
1212+import Clipboard from '@react-native-clipboard/clipboard'
1313+import {useNavigation} from '@react-navigation/native'
1414+1915import {makeProfileLink} from '#/lib/routes/links'
2016import {CommonNavigatorParams} from '#/lib/routes/types'
2121-import {getCurrentRoute} from 'lib/routes/helpers'
1717+import {richTextToString} from '#/lib/strings/rich-text-helpers'
2218import {getTranslatorLink} from '#/locale/helpers'
2323-import {usePostDeleteMutation} from '#/state/queries/post'
1919+import {logger} from '#/logger'
2020+import {isWeb} from '#/platform/detection'
2421import {useMutedThreads, useToggleThreadMute} from '#/state/muted-threads'
2522import {useLanguagePrefs} from '#/state/preferences'
2623import {useHiddenPosts, useHiddenPostsApi} from '#/state/preferences'
2724import {useOpenLink} from '#/state/preferences/in-app-browser'
2828-import {logger} from '#/logger'
2929-import {msg} from '@lingui/macro'
3030-import {useLingui} from '@lingui/react'
2525+import {usePostDeleteMutation} from '#/state/queries/post'
3126import {useSession} from '#/state/session'
3232-import {isWeb} from '#/platform/detection'
3333-import {richTextToString} from '#/lib/strings/rich-text-helpers'
3434-import {useGlobalDialogsControlContext} from '#/components/dialogs/Context'
3535-import {ReportDialog, useReportDialogControl} from '#/components/ReportDialog'
3636-2727+import {getCurrentRoute} from 'lib/routes/helpers'
2828+import {shareUrl} from 'lib/sharing'
2929+import {toShareUrl} from 'lib/strings/url-helpers'
3030+import {useTheme} from 'lib/ThemeContext'
3731import {atoms as a, useTheme as useAlf} from '#/alf'
3838-import * as Menu from '#/components/Menu'
3939-import {Clipboard_Stroke2_Corner2_Rounded as ClipboardIcon} from '#/components/icons/Clipboard'
4040-import {Filter_Stroke2_Corner0_Rounded as Filter} from '#/components/icons/Filter'
3232+import {useDialogControl} from '#/components/Dialog'
3333+import {useGlobalDialogsControlContext} from '#/components/dialogs/Context'
4134import {ArrowOutOfBox_Stroke2_Corner0_Rounded as Share} from '#/components/icons/ArrowOutOfBox'
3535+import {BubbleQuestion_Stroke2_Corner0_Rounded as Translate} from '#/components/icons/Bubble'
3636+import {Clipboard_Stroke2_Corner2_Rounded as ClipboardIcon} from '#/components/icons/Clipboard'
4237import {EyeSlash_Stroke2_Corner0_Rounded as EyeSlash} from '#/components/icons/EyeSlash'
3838+import {Filter_Stroke2_Corner0_Rounded as Filter} from '#/components/icons/Filter'
4339import {Mute_Stroke2_Corner0_Rounded as Mute} from '#/components/icons/Mute'
4440import {SpeakerVolumeFull_Stroke2_Corner0_Rounded as Unmute} from '#/components/icons/Speaker'
4545-import {BubbleQuestion_Stroke2_Corner0_Rounded as Translate} from '#/components/icons/Bubble'
4141+import {Trash_Stroke2_Corner0_Rounded as Trash} from '#/components/icons/Trash'
4642import {Warning_Stroke2_Corner0_Rounded as Warning} from '#/components/icons/Warning'
4747-import {Trash_Stroke2_Corner0_Rounded as Trash} from '#/components/icons/Trash'
4343+import * as Menu from '#/components/Menu'
4444+import * as Prompt from '#/components/Prompt'
4545+import {ReportDialog, useReportDialogControl} from '#/components/ReportDialog'
4646+import {EventStopper} from '../EventStopper'
4747+import * as Toast from '../Toast'
48484949let PostDropdownBtn = ({
5050 testID,
+58-28
src/view/com/util/post-ctrls/PostCtrls.tsx
···1212 AtUri,
1313 RichText as RichTextAPI,
1414} from '@atproto/api'
1515-import {Text} from '../text/Text'
1616-import {PostDropdownBtn} from '../forms/PostDropdownBtn'
1717-import {HeartIcon, HeartIconSolid, CommentBottomArrow} from 'lib/icons'
1818-import {s} from 'lib/styles'
1919-import {pluralize} from 'lib/strings/helpers'
2020-import {useTheme} from 'lib/ThemeContext'
2121-import {RepostButton} from './RepostButton'
2222-import {Haptics} from 'lib/haptics'
2323-import {HITSLOP_10, HITSLOP_20} from 'lib/constants'
1515+import {msg} from '@lingui/macro'
1616+import {useLingui} from '@lingui/react'
1717+1818+import {HITSLOP_10, HITSLOP_20} from '#/lib/constants'
1919+import {Haptics} from '#/lib/haptics'
2020+import {CommentBottomArrow, HeartIcon, HeartIconSolid} from '#/lib/icons'
2121+import {makeProfileLink} from '#/lib/routes/links'
2222+import {shareUrl} from '#/lib/sharing'
2323+import {pluralize} from '#/lib/strings/helpers'
2424+import {toShareUrl} from '#/lib/strings/url-helpers'
2525+import {s} from '#/lib/styles'
2626+import {useTheme} from '#/lib/ThemeContext'
2727+import {Shadow} from '#/state/cache/types'
2428import {useModalControls} from '#/state/modals'
2529import {
2630 usePostLikeMutationQueue,
2731 usePostRepostMutationQueue,
2832} from '#/state/queries/post'
2929-import {useComposerControls} from '#/state/shell/composer'
3030-import {Shadow} from '#/state/cache/types'
3133import {useRequireAuth} from '#/state/session'
3232-import {msg} from '@lingui/macro'
3333-import {useLingui} from '@lingui/react'
3434+import {useComposerControls} from '#/state/shell/composer'
3535+import {useDialogControl} from '#/components/Dialog'
3436import {ArrowOutOfBox_Stroke2_Corner0_Rounded as ArrowOutOfBox} from '#/components/icons/ArrowOutOfBox'
3535-import {toShareUrl} from 'lib/strings/url-helpers'
3636-import {shareUrl} from 'lib/sharing'
3737-import {makeProfileLink} from 'lib/routes/links'
3737+import * as Prompt from '#/components/Prompt'
3838+import {PostDropdownBtn} from '../forms/PostDropdownBtn'
3939+import {Text} from '../text/Text'
4040+import {RepostButton} from './RepostButton'
38413942let PostCtrls = ({
4043 big,
···6366 logContext,
6467 )
6568 const requireAuth = useRequireAuth()
6969+ const loggedOutWarningPromptControl = useDialogControl()
7070+7171+ const shouldShowLoggedOutWarning = React.useMemo(() => {
7272+ return !!post.author.labels?.find(
7373+ label => label.val === '!no-unauthenticated',
7474+ )
7575+ }, [post])
66766777 const defaultCtrlColor = React.useMemo(
6878 () => ({
···209219 </TouchableOpacity>
210220 </View>
211221 {big && (
212212- <View style={styles.ctrlBig}>
213213- <TouchableOpacity
214214- testID="shareBtn"
215215- style={[styles.btn]}
216216- onPress={onShare}
217217- accessibilityRole="button"
218218- accessibilityLabel={`${_(msg`Share`)}`}
219219- accessibilityHint=""
220220- hitSlop={big ? HITSLOP_20 : HITSLOP_10}>
221221- <ArrowOutOfBox style={[defaultCtrlColor, styles.mt1]} width={22} />
222222- </TouchableOpacity>
223223- </View>
222222+ <>
223223+ <View style={styles.ctrlBig}>
224224+ <TouchableOpacity
225225+ testID="shareBtn"
226226+ style={[styles.btn]}
227227+ onPress={() => {
228228+ if (shouldShowLoggedOutWarning) {
229229+ loggedOutWarningPromptControl.open()
230230+ } else {
231231+ onShare()
232232+ }
233233+ }}
234234+ accessibilityRole="button"
235235+ accessibilityLabel={`${_(msg`Share`)}`}
236236+ accessibilityHint=""
237237+ hitSlop={big ? HITSLOP_20 : HITSLOP_10}>
238238+ <ArrowOutOfBox
239239+ style={[defaultCtrlColor, styles.mt1]}
240240+ width={22}
241241+ />
242242+ </TouchableOpacity>
243243+ </View>
244244+ <Prompt.Basic
245245+ control={loggedOutWarningPromptControl}
246246+ title={_(msg`Note about sharing`)}
247247+ description={_(
248248+ msg`This post is only visible to logged-in users. It won't be visible to people who aren't logged in.`,
249249+ )}
250250+ onConfirm={onShare}
251251+ confirmButtonCta={_(msg`Share anyway`)}
252252+ />
253253+ </>
224254 )}
225255 <View style={big ? styles.ctrlBig : styles.ctrl}>
226256 <PostDropdownBtn