mattermost-mobile/app/screens/channel_files/header.tsx
Daniel Espino García 0c4a42a06a
Remove tand prevent double tap (#9078)
* Remove the t function and all wrong uses of preventDoubleTap

* Fix existing typo

* Fix tests

* Address comments

* Fix test
2025-08-25 12:03:01 +02:00

128 lines
4.1 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {useCallback, useMemo} from 'react';
import {defineMessage, useIntl} from 'react-intl';
import {Text, View} from 'react-native';
import Badge from '@components/badge';
import CompassIcon from '@components/compass_icon';
import Filter, {DIVIDERS_HEIGHT, FILTER_ITEM_HEIGHT, FilterData, NUMBER_FILTER_ITEMS} from '@components/files/file_filter';
import {useTheme} from '@context/theme';
import {useIsTablet} from '@hooks/device';
import {TITLE_SEPARATOR_MARGIN, TITLE_SEPARATOR_MARGIN_TABLET, TITLE_HEIGHT} from '@screens/bottom_sheet/content';
import {bottomSheet} from '@screens/navigation';
import {type FileFilter, FileFilters} from '@utils/file';
import {bottomSheetSnapPoint} from '@utils/helpers';
import {changeOpacity, makeStyleSheetFromTheme} from '@utils/theme';
import {typography} from '@utils/typography';
const TEST_ID = 'channel_files';
type Props = {
onFilterChanged: (filter: FileFilter) => void;
selectedFilter: FileFilter;
}
const getStyleFromTheme = makeStyleSheetFromTheme((theme: Theme) => {
return {
container: {
flexDirection: 'row',
justifyContent: 'space-between',
paddingHorizontal: 20,
paddingTop: 20,
backgroundColor: theme.centerChannelBg,
},
title: {
color: theme.centerChannelColor,
...typography('Heading', 300, 'SemiBold'),
},
badge: {
backgroundColor: theme.buttonBg,
borderColor: theme.centerChannelBg,
marginTop: 2,
},
iconsContainer: {
alignItems: 'center',
flexDirection: 'row',
marginLeft: 'auto',
},
};
});
const Header = ({
onFilterChanged,
selectedFilter,
}: Props) => {
const theme = useTheme();
const styles = getStyleFromTheme(theme);
const intl = useIntl();
const isTablet = useIsTablet();
const hasFilters = selectedFilter !== FileFilters.ALL;
const messageObject = hasFilters ? {
id: FilterData[selectedFilter].id,
defaultMessage: FilterData[selectedFilter].defaultMessage,
} : defineMessage({
id: 'screen.channel_files.header.recent_files',
defaultMessage: 'Recent Files',
});
const messagesText = intl.formatMessage(messageObject);
const title = intl.formatMessage({id: 'screen.channel_files.results.filter.title', defaultMessage: 'Filter by file type'});
const snapPoints = useMemo(() => {
return [
1,
bottomSheetSnapPoint(
NUMBER_FILTER_ITEMS,
FILTER_ITEM_HEIGHT,
) + TITLE_HEIGHT + DIVIDERS_HEIGHT + (isTablet ? TITLE_SEPARATOR_MARGIN_TABLET : TITLE_SEPARATOR_MARGIN),
];
}, [isTablet]);
const handleFilterPress = useCallback(() => {
const renderContent = () => {
return (
<Filter
initialFilter={selectedFilter}
setFilter={onFilterChanged}
title={title}
/>
);
};
bottomSheet({
closeButtonId: 'close-search-filters',
renderContent,
snapPoints,
theme,
title,
});
}, [onFilterChanged, selectedFilter, snapPoints, theme, title]);
return (
<View style={styles.container}>
<Text
style={styles.title}
testID={`${TEST_ID}.title`}
>
{messagesText}
</Text>
<View>
<CompassIcon
name={'filter-variant'}
size={24}
color={changeOpacity(theme.centerChannelColor, 0.56)}
onPress={handleFilterPress}
/>
<Badge
style={styles.badge}
visible={hasFilters}
testID={`${TEST_ID}.filters.badge`}
value={-1}
/>
</View>
</View>
);
};
export default Header;