diff options
author | Hailey <me@haileyok.com> | 2024-10-17 09:42:19 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-17 11:42:19 -0500 |
commit | c3e510788298a79e2886dd6ef2e9ce5630c89eba (patch) | |
tree | 64542cc92ba17c56b9f339bfd7ea2bc044d76c2a /src | |
parent | 59f9cd916e23005a6123f8eb3f5c1cbb47b91344 (diff) | |
download | voidsky-c3e510788298a79e2886dd6ef2e9ce5630c89eba.tar.zst |
Move self-label button (#5780)
* move self label button? * rm * make sure its usable on large font sizes * tweak wording * update icon * tweaks * change button label and change opacity when no media (#5794) * Tweak it moar (#5807) * Tweak it moar * Pluralize * Labels --------- Co-authored-by: Samuel Newman <mozzius@protonmail.com> Co-authored-by: Eric Bailey <git@esb.lol>
Diffstat (limited to 'src')
-rw-r--r-- | src/view/com/composer/Composer.tsx | 114 | ||||
-rw-r--r-- | src/view/com/composer/labels/LabelsBtn.tsx | 44 | ||||
-rw-r--r-- | src/view/com/composer/threadgate/ThreadgateBtn.tsx | 43 |
3 files changed, 106 insertions, 95 deletions
diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 2f28b9665..126addd1c 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -13,6 +13,7 @@ import { Keyboard, KeyboardAvoidingView, LayoutChangeEvent, + ScrollView, StyleProp, StyleSheet, View, @@ -559,45 +560,30 @@ export const ComposePost = ({ <ActivityIndicator /> </View> </> + ) : canPost ? ( + <Button + testID="composerPublishBtn" + label={replyTo ? _(msg`Publish reply`) : _(msg`Publish post`)} + variant="solid" + color="primary" + shape="default" + size="small" + style={[a.rounded_full, a.py_sm]} + onPress={() => onPressPublish()} + disabled={videoState.status !== 'idle' && publishOnUpload}> + <ButtonText style={[a.text_md]}> + {replyTo ? ( + <Trans context="action">Reply</Trans> + ) : ( + <Trans context="action">Post</Trans> + )} + </ButtonText> + </Button> ) : ( - <View style={[styles.postBtnWrapper]}> - <LabelsBtn - labels={draft.labels} - onChange={nextLabels => { - dispatch({type: 'update_labels', labels: nextLabels}) - }} - hasMedia={hasMedia || Boolean(extLink)} - /> - {canPost ? ( - <Button - testID="composerPublishBtn" - label={ - replyTo ? _(msg`Publish reply`) : _(msg`Publish post`) - } - variant="solid" - color="primary" - shape="default" - size="small" - style={[a.rounded_full, a.py_sm]} - onPress={() => onPressPublish()} - disabled={ - videoState.status !== 'idle' && publishOnUpload - }> - <ButtonText style={[a.text_md]}> - {replyTo ? ( - <Trans context="action">Reply</Trans> - ) : ( - <Trans context="action">Post</Trans> - )} - </ButtonText> - </Button> - ) : ( - <View style={[styles.postBtn, pal.btn]}> - <Text style={[pal.textLight, s.f16, s.bold]}> - <Trans context="action">Post</Trans> - </Text> - </View> - )} + <View style={[styles.postBtn, pal.btn]}> + <Text style={[pal.textLight, s.f16, s.bold]}> + <Trans context="action">Post</Trans> + </Text> </View> )} </View> @@ -758,22 +744,38 @@ export const ComposePost = ({ </Animated.ScrollView> <SuggestedLanguage text={richtext.text} /> - {replyTo ? null : ( - <ThreadgateBtn - postgate={draft.postgate} - onChangePostgate={nextPostgate => { - dispatch({type: 'update_postgate', postgate: nextPostgate}) - }} - threadgateAllowUISettings={draft.threadgate} - onChangeThreadgateAllowUISettings={nextThreadgate => { - dispatch({ - type: 'update_threadgate', - threadgate: nextThreadgate, - }) - }} - style={bottomBarAnimatedStyle} - /> - )} + <Animated.View + style={[a.flex_row, a.p_sm, t.atoms.bg, bottomBarAnimatedStyle]}> + <ScrollView + contentContainerStyle={[a.gap_sm]} + horizontal={true} + bounces={false} + showsHorizontalScrollIndicator={false}> + {replyTo ? null : ( + <ThreadgateBtn + postgate={draft.postgate} + onChangePostgate={nextPostgate => { + dispatch({type: 'update_postgate', postgate: nextPostgate}) + }} + threadgateAllowUISettings={draft.threadgate} + onChangeThreadgateAllowUISettings={nextThreadgate => { + dispatch({ + type: 'update_threadgate', + threadgate: nextThreadgate, + }) + }} + style={bottomBarAnimatedStyle} + /> + )} + <LabelsBtn + labels={draft.labels} + onChange={nextLabels => { + dispatch({type: 'update_labels', labels: nextLabels}) + }} + hasMedia={hasMedia || Boolean(extLink)} + /> + </ScrollView> + </Animated.View> <View style={[ a.flex_row, @@ -988,10 +990,6 @@ const styles = StyleSheet.create({ paddingVertical: 6, marginLeft: 12, }, - postBtnWrapper: { - flexDirection: 'row', - gap: 14, - }, errorLine: { flexDirection: 'row', alignItems: 'center', diff --git a/src/view/com/composer/labels/LabelsBtn.tsx b/src/view/com/composer/labels/LabelsBtn.tsx index a176426dc..bac2d756a 100644 --- a/src/view/com/composer/labels/LabelsBtn.tsx +++ b/src/view/com/composer/labels/LabelsBtn.tsx @@ -3,7 +3,6 @@ import {Keyboard, View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {ShieldExclamation} from '#/lib/icons' import { ADULT_CONTENT_LABELS, AdultSelfLabel, @@ -12,12 +11,14 @@ import { SelfLabel, } from '#/lib/moderation' import {isWeb} from '#/platform/detection' -import {atoms as a, useTheme} from '#/alf' -import {Button, ButtonText} from '#/components/Button' +import {atoms as a, native, useTheme, web} from '#/alf' +import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import * as Toggle from '#/components/forms/Toggle' import {Check_Stroke2_Corner0_Rounded as Check} from '#/components/icons/Check' +import {Shield_Stroke2_Corner0_Rounded} from '#/components/icons/Shield' import {Text} from '#/components/Typography' + export function LabelsBtn({ labels, hasMedia, @@ -28,7 +29,6 @@ export function LabelsBtn({ onChange: (v: SelfLabel[]) => void }) { const control = Dialog.useDialogControl() - const t = useTheme() const {_} = useLingui() const hasLabel = labels.length > 0 @@ -52,20 +52,33 @@ export function LabelsBtn({ return ( <> <Button + variant="solid" + color="secondary" + size="small" testID="labelsBtn" - style={!hasMedia && {opacity: 0.4}} + onPress={() => { + Keyboard.dismiss() + control.open() + }} label={_(msg`Content warnings`)} accessibilityHint={_( msg`Opens a dialog to add a content warning to your post`, )} - onPress={() => { - Keyboard.dismiss() - control.open() - }}> - <ShieldExclamation style={{color: t.palette.primary_500}} size={24} /> - {labels.length > 0 ? ( - <Check size="sm" fill={t.palette.primary_500} /> - ) : null} + style={[ + !hasMedia && {opacity: 0.5}, + native({ + paddingHorizontal: 8, + paddingVertical: 6, + }), + ]}> + <ButtonIcon icon={hasLabel ? Check : Shield_Stroke2_Corner0_Rounded} /> + <ButtonText numberOfLines={1}> + {labels.length > 0 ? ( + <Trans>Labels added</Trans> + ) : ( + <Trans>Labels</Trans> + )} + </ButtonText> </Button> <Dialog.Outer control={control} nativeOptions={{preventExpansion: true}}> @@ -114,7 +127,8 @@ function DialogInner({ </Trans> ) : ( <Trans> - There are no self-labels that can be applied to this post. + No self-labels can be applied to this post because it contains + no media. </Trans> )} </Text> @@ -235,7 +249,7 @@ function DialogInner({ </View> </View> - <View style={[a.mt_sm]}> + <View style={[a.mt_sm, web([a.flex_row, a.ml_auto])]}> <Button label={_(msg`Done`)} onPress={() => control.close()} diff --git a/src/view/com/composer/threadgate/ThreadgateBtn.tsx b/src/view/com/composer/threadgate/ThreadgateBtn.tsx index c3bcf345b..78bf8c06f 100644 --- a/src/view/com/composer/threadgate/ThreadgateBtn.tsx +++ b/src/view/com/composer/threadgate/ThreadgateBtn.tsx @@ -1,13 +1,13 @@ import React from 'react' import {Keyboard, StyleProp, ViewStyle} from 'react-native' -import Animated, {AnimatedStyle} from 'react-native-reanimated' +import {AnimatedStyle} from 'react-native-reanimated' import {AppBskyFeedPostgate} from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {isNative} from '#/platform/detection' import {ThreadgateAllowUISetting} from '#/state/queries/threadgate' -import {atoms as a, useTheme} from '#/alf' +import {native} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import {PostInteractionSettingsControlledDialog} from '#/components/dialogs/PostInteractionSettingsDialog' @@ -19,7 +19,6 @@ export function ThreadgateBtn({ onChangePostgate, threadgateAllowUISettings, onChangeThreadgateAllowUISettings, - style, }: { postgate: AppBskyFeedPostgate.Record onChangePostgate: (v: AppBskyFeedPostgate.Record) => void @@ -30,7 +29,6 @@ export function ThreadgateBtn({ style?: StyleProp<AnimatedStyle<ViewStyle>> }) { const {_} = useLingui() - const t = useTheme() const control = Dialog.useDialogControl() const onPress = () => { @@ -53,24 +51,25 @@ export function ThreadgateBtn({ return ( <> - <Animated.View style={[a.flex_row, a.p_sm, t.atoms.bg, style]}> - <Button - variant="solid" - color="secondary" - size="small" - testID="openReplyGateButton" - onPress={onPress} - label={label} - accessibilityHint={_( - msg`Opens a dialog to choose who can reply to this thread`, - )} - style={ - !isNative ? {paddingVertical: 6, paddingHorizontal: 8} : undefined - }> - <ButtonIcon icon={anyoneCanInteract ? Earth : Group} /> - <ButtonText numberOfLines={1}>{label}</ButtonText> - </Button> - </Animated.View> + <Button + variant="solid" + color="secondary" + size="small" + testID="openReplyGateButton" + onPress={onPress} + label={label} + accessibilityHint={_( + msg`Opens a dialog to choose who can reply to this thread`, + )} + style={[ + native({ + paddingHorizontal: 8, + paddingVertical: 6, + }), + ]}> + <ButtonIcon icon={anyoneCanInteract ? Earth : Group} /> + <ButtonText numberOfLines={1}>{label}</ButtonText> + </Button> <PostInteractionSettingsControlledDialog control={control} onSave={() => { |