Bluesky app fork with some witchin' additions 馃挮
at main 110 lines 3.4 kB view raw
1import {msg, Trans} from '@lingui/macro' 2import {useLingui} from '@lingui/react' 3 4import {HITSLOP_10} from '#/lib/constants' 5import {logger} from '#/logger' 6import {useEnableSquareButtons} from '#/state/preferences/enable-square-buttons' 7import {type ThreadPreferences} from '#/state/queries/preferences/useThreadPreferences' 8import {Button, ButtonIcon} from '#/components/Button' 9import {SettingsSliderVertical_Stroke2_Corner0_Rounded as SettingsSlider} from '#/components/icons/SettingsSlider' 10import * as Menu from '#/components/Menu' 11 12export function HeaderDropdown({ 13 sort, 14 view, 15 setSort, 16 setView, 17}: Pick< 18 ThreadPreferences, 19 'sort' | 'setSort' | 'view' | 'setView' 20>): React.ReactNode { 21 const {_} = useLingui() 22 23 const enableSquareButtons = useEnableSquareButtons() 24 25 return ( 26 <Menu.Root> 27 <Menu.Trigger label={_(msg`Thread options`)}> 28 {({props: {onPress, ...props}}) => ( 29 <Button 30 label={_(msg`Thread options`)} 31 size="small" 32 variant="ghost" 33 color="secondary" 34 shape={enableSquareButtons ? 'square' : 'round'} 35 hitSlop={HITSLOP_10} 36 onPress={() => { 37 logger.metric('thread:click:headerMenuOpen', {}) 38 onPress() 39 }} 40 {...props}> 41 <ButtonIcon icon={SettingsSlider} size="md" /> 42 </Button> 43 )} 44 </Menu.Trigger> 45 <Menu.Outer> 46 <Menu.LabelText> 47 <Trans>Show replies as</Trans> 48 </Menu.LabelText> 49 <Menu.Group> 50 <Menu.Item 51 label={_(msg`Linear`)} 52 onPress={() => { 53 setView('linear') 54 }}> 55 <Menu.ItemText> 56 <Trans>Linear</Trans> 57 </Menu.ItemText> 58 <Menu.ItemRadio selected={view === 'linear'} /> 59 </Menu.Item> 60 <Menu.Item 61 label={_(msg`Threaded`)} 62 onPress={() => { 63 setView('tree') 64 }}> 65 <Menu.ItemText> 66 <Trans>Threaded</Trans> 67 </Menu.ItemText> 68 <Menu.ItemRadio selected={view === 'tree'} /> 69 </Menu.Item> 70 </Menu.Group> 71 <Menu.Divider /> 72 <Menu.LabelText> 73 <Trans>Reply sorting</Trans> 74 </Menu.LabelText> 75 <Menu.Group> 76 <Menu.Item 77 label={_(msg`Top replies first`)} 78 onPress={() => { 79 setSort('top') 80 }}> 81 <Menu.ItemText> 82 <Trans>Top replies first</Trans> 83 </Menu.ItemText> 84 <Menu.ItemRadio selected={sort === 'top'} /> 85 </Menu.Item> 86 <Menu.Item 87 label={_(msg`Oldest replies first`)} 88 onPress={() => { 89 setSort('oldest') 90 }}> 91 <Menu.ItemText> 92 <Trans>Oldest replies first</Trans> 93 </Menu.ItemText> 94 <Menu.ItemRadio selected={sort === 'oldest'} /> 95 </Menu.Item> 96 <Menu.Item 97 label={_(msg`Newest replies first`)} 98 onPress={() => { 99 setSort('newest') 100 }}> 101 <Menu.ItemText> 102 <Trans>Newest replies first</Trans> 103 </Menu.ItemText> 104 <Menu.ItemRadio selected={sort === 'newest'} /> 105 </Menu.Item> 106 </Menu.Group> 107 </Menu.Outer> 108 </Menu.Root> 109 ) 110}