-
Notifications
You must be signed in to change notification settings - Fork 3k
/
Copy pathRadioListItem.tsx
87 lines (82 loc) · 3.69 KB
/
RadioListItem.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import React from 'react';
import {View} from 'react-native';
import TextWithTooltip from '@components/TextWithTooltip';
import useThemeStyles from '@hooks/useThemeStyles';
import variables from '@styles/variables';
import CONST from '@src/CONST';
import BaseListItem from './BaseListItem';
import type {ListItem, RadioListItemProps} from './types';
function RadioListItem<TItem extends ListItem>({
item,
isFocused,
showTooltip,
isDisabled,
onSelectRow,
onDismissError,
shouldPreventEnterKeySubmit,
rightHandSideComponent,
isMultilineSupported = false,
isAlternateTextMultilineSupported = false,
alternateTextNumberOfLines = 2,
onFocus,
shouldSyncFocus,
}: RadioListItemProps<TItem>) {
const styles = useThemeStyles();
const fullTitle = isMultilineSupported ? item.text?.trimStart() : item.text;
const indentsLength = (item.text?.length ?? 0) - (fullTitle?.length ?? 0);
const paddingLeft = Math.floor(indentsLength / CONST.INDENTS.length) * styles.ml3.marginLeft;
const alternateTextMaxWidth = variables.sideBarWidth - styles.ph5.paddingHorizontal * 2 - styles.ml3.marginLeft - variables.iconSizeNormal;
return (
<BaseListItem
item={item}
wrapperStyle={[styles.flex1, styles.justifyContentBetween, styles.sidebarLinkInner, styles.userSelectNone, styles.optionRow, isFocused && styles.sidebarLinkActive]}
isFocused={isFocused}
isDisabled={isDisabled}
showTooltip={showTooltip}
onSelectRow={onSelectRow}
onDismissError={onDismissError}
shouldPreventEnterKeySubmit={shouldPreventEnterKeySubmit}
rightHandSideComponent={rightHandSideComponent}
keyForList={item.keyForList}
onFocus={onFocus}
shouldSyncFocus={shouldSyncFocus}
pendingAction={item.pendingAction}
>
<>
{!!item.leftElement && item.leftElement}
<View style={[styles.flex1, styles.alignItemsStart]}>
<TextWithTooltip
shouldShowTooltip={showTooltip}
text={fullTitle ?? ''}
style={[
styles.optionDisplayName,
isFocused ? styles.sidebarLinkActiveText : styles.sidebarLinkText,
styles.sidebarLinkTextBold,
isMultilineSupported ? styles.preWrap : styles.pre,
item.alternateText ? styles.mb1 : null,
isDisabled && styles.colorMuted,
isMultilineSupported ? {paddingLeft} : null,
]}
numberOfLines={isMultilineSupported ? 2 : 1}
/>
{!!item.alternateText && (
<TextWithTooltip
shouldShowTooltip={showTooltip}
text={item.alternateText}
style={[
styles.textLabelSupporting,
styles.lh16,
isAlternateTextMultilineSupported ? styles.preWrap : styles.pre,
isAlternateTextMultilineSupported ? {maxWidth: alternateTextMaxWidth} : null,
]}
numberOfLines={isAlternateTextMultilineSupported ? alternateTextNumberOfLines : 1}
/>
)}
</View>
{!!item.rightElement && item.rightElement}
</>
</BaseListItem>
);
}
RadioListItem.displayName = 'RadioListItem';
export default RadioListItem;