@helpwave/hightide-native 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/src/components/card/Card.tsx +2 -4
- package/src/components/chat/ChatAttachmentMessageBubble.tsx +155 -94
- package/src/components/chat/ChatConversationList.tsx +4 -12
- package/src/components/chat/ChatConversationRow.tsx +159 -164
- package/src/components/chat/ChatDateDivider.tsx +3 -8
- package/src/components/chat/ChatMessageBubble.tsx +54 -52
- package/src/components/chat/ChatMessageComposer.tsx +4 -12
- package/src/components/chat/ChatMessageList.tsx +3 -9
- package/src/components/chat/ChatQuickReplyChip.tsx +41 -27
- package/src/components/chat/ChatSystemLine.tsx +4 -12
- package/src/components/chat/ChatThreadHeader.tsx +136 -101
- package/src/components/layout/Divider.tsx +2 -4
- package/src/components/list/ListActionItem.tsx +57 -65
- package/src/components/list/ListItem.tsx +8 -28
- package/src/components/list/ListItemTextContent.tsx +4 -2
- package/src/components/list/ListNavigationItem.tsx +55 -63
- package/src/components/user-interaction/Button.tsx +43 -49
- package/src/components/user-interaction/Checkbox.tsx +47 -48
- package/src/components/user-interaction/IconButton.tsx +40 -42
- package/src/components/user-interaction/Input.tsx +70 -67
- package/src/components/user-interaction/MultiSelect/MultiSelect.tsx +40 -0
- package/src/components/user-interaction/MultiSelect/MultiSelectContext.tsx +70 -0
- package/src/components/user-interaction/MultiSelect/MultiSelectMenu.tsx +87 -0
- package/src/components/user-interaction/MultiSelect/MultiSelectOption.tsx +87 -0
- package/src/components/user-interaction/MultiSelect/MultiSelectRoot.tsx +194 -0
- package/src/components/user-interaction/MultiSelect/MultiSelectTrigger.tsx +123 -0
- package/src/components/user-interaction/MultiSelect/index.ts +6 -0
- package/src/components/user-interaction/SearchBar.tsx +11 -17
- package/src/components/user-interaction/Select/Select.tsx +40 -0
- package/src/components/user-interaction/Select/SelectContext.tsx +69 -0
- package/src/components/user-interaction/Select/SelectMenu.tsx +87 -0
- package/src/components/user-interaction/Select/SelectOption.tsx +77 -0
- package/src/components/user-interaction/Select/SelectRoot.tsx +186 -0
- package/src/components/user-interaction/Select/SelectTrigger.tsx +92 -0
- package/src/components/user-interaction/Select/index.ts +6 -0
- package/src/components/user-interaction/Switch.tsx +46 -98
- package/src/components/user-interaction/Textarea.tsx +179 -0
- package/src/components/user-interaction/ThemedPressable.tsx +48 -49
- package/src/components/user-interaction/index.ts +1 -0
- package/src/components/visualization-and-display/Avatar.tsx +19 -17
- package/src/components/visualization-and-display/Chip.tsx +4 -12
- package/src/components/visualization-and-display/ThemedText.tsx +12 -5
- package/src/enums/chatMessageDirection.ts +18 -0
- package/src/enums/chatMessageStatus.ts +18 -0
- package/src/enums/hightideThemeModes.ts +18 -0
- package/src/enums/index.ts +7 -0
- package/src/enums/listItemContentOrder.ts +18 -0
- package/src/enums/themedTextAppearance.ts +18 -0
- package/src/enums/useMultiSelectFirstHighlightBehavior.ts +18 -0
- package/src/enums/useSelectFirstHighlightBehavior.ts +18 -0
- package/src/global-contexts/content-theme/ContentThemeProvider.tsx +9 -5
- package/src/global-contexts/theme/ThemeProvider.tsx +4 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useAnimatedStyleTransition.ts +460 -0
- package/src/hooks/useMemoizedTheme.ts +23 -0
- package/src/hooks/useMultiSelect.ts +3 -1
- package/src/hooks/useSelect.ts +3 -1
- package/src/icons/HightideIconRegistry.ts +2 -0
- package/src/theme/adapters/style-adapter-utils.ts +121 -27
- package/src/theme/resolvers/avatar.ts +48 -39
- package/src/theme/resolvers/button.ts +7 -17
- package/src/theme/resolvers/chat/attachment-message-bubble.ts +5 -6
- package/src/theme/resolvers/chat/conversation-row.ts +4 -6
- package/src/theme/resolvers/chat/message-bubble.ts +1 -2
- package/src/theme/resolvers/chat/message-composer.ts +1 -2
- package/src/theme/resolvers/chat/quick-reply-chip.ts +2 -3
- package/src/theme/resolvers/chat/system-line.ts +1 -2
- package/src/theme/resolvers/chat/thread-header.ts +3 -4
- package/src/theme/resolvers/checkbox.ts +2 -2
- package/src/theme/resolvers/chip.ts +1 -2
- package/src/theme/resolvers/iconButton.ts +4 -13
- package/src/theme/resolvers/index.ts +1 -0
- package/src/theme/resolvers/input.ts +30 -14
- package/src/theme/resolvers/listItem.ts +2 -3
- package/src/theme/resolvers/multiSelect.ts +1 -3
- package/src/theme/resolvers/searchBar.ts +1 -2
- package/src/theme/resolvers/select.ts +1 -2
- package/src/theme/resolvers/textarea.ts +14 -0
- package/src/theme/resolvers/themedPressable.ts +4 -15
- package/src/theme/themes/createHightideTheme.ts +6 -0
- package/src/theme/themes/hightideThemes.ts +3 -1
- package/src/theme/types/components/chat.ts +6 -21
- package/src/theme/types/components/hightide.ts +2 -0
- package/src/theme/types/components/index.ts +1 -0
- package/src/theme/types/components/input.ts +3 -0
- package/src/theme/types/components/textarea.ts +9 -0
- package/src/theme/types/resolver.ts +4 -27
- package/src/utils/index.ts +1 -0
- package/src/utils/pressableInteraction.ts +7 -0
- package/src/components/user-interaction/MultiSelect.tsx +0 -281
- package/src/components/user-interaction/Select.tsx +0 -242
package/package.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"access": "public"
|
|
11
11
|
},
|
|
12
12
|
"license": "AGPL-3.0-only",
|
|
13
|
-
"version": "0.
|
|
13
|
+
"version": "0.7.0",
|
|
14
14
|
"type": "module",
|
|
15
15
|
"files": [
|
|
16
16
|
"src"
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"lucide-react-native": "0.561.0",
|
|
50
|
-
"@helpwave/hightide-
|
|
51
|
-
"@helpwave/hightide-
|
|
50
|
+
"@helpwave/hightide-utils": "0.1.1",
|
|
51
|
+
"@helpwave/hightide-design": "0.7.0"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
54
|
"@react-native-async-storage/async-storage": ">=2.0.0",
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from 'react-native'
|
|
11
11
|
|
|
12
12
|
import { useTheme } from '../../global-contexts/theme/ThemeContext'
|
|
13
|
+
import { useMemoizedTheme } from '../../hooks/useMemoizedTheme'
|
|
13
14
|
import type { CardStyle } from '../../theme/types/components/card'
|
|
14
15
|
import type { StyleOverwrite } from '../../theme/types/resolver'
|
|
15
16
|
|
|
@@ -28,10 +29,7 @@ export const Card = ({
|
|
|
28
29
|
const { theme } = useTheme()
|
|
29
30
|
const state = useMemo(() => ({}), [])
|
|
30
31
|
|
|
31
|
-
const resolvedCardStyle =
|
|
32
|
-
() => theme.components.card.container(state, cardStyle),
|
|
33
|
-
[theme, state, cardStyle]
|
|
34
|
-
)
|
|
32
|
+
const resolvedCardStyle = useMemoizedTheme(theme.components.card.container, state, cardStyle)
|
|
35
33
|
|
|
36
34
|
return (
|
|
37
35
|
<View {...props} style={[resolvedCardStyle, style]}>
|
|
@@ -3,16 +3,20 @@ import {
|
|
|
3
3
|
type ReactNode
|
|
4
4
|
} from 'react'
|
|
5
5
|
import {
|
|
6
|
+
Pressable,
|
|
7
|
+
StyleSheet,
|
|
6
8
|
View,
|
|
7
9
|
type StyleProp,
|
|
8
10
|
type ViewStyle
|
|
9
11
|
} from 'react-native'
|
|
10
|
-
import { HightideIconRegistry } from '../../icons/HightideIconRegistry'
|
|
11
|
-
import { ThemedIcon } from '../visualization-and-display/ThemedIcon'
|
|
12
|
-
import { ThemedText } from '../visualization-and-display/ThemedText'
|
|
13
|
-
import { ThemedPressable } from '../user-interaction/ThemedPressable'
|
|
14
12
|
import { useTheme } from '../../global-contexts/theme/ThemeContext'
|
|
13
|
+
import { HightideIconRegistry } from '../../icons/HightideIconRegistry'
|
|
14
|
+
import {
|
|
15
|
+
useMemoizedTheme,
|
|
16
|
+
useMemoizedThemeFactory
|
|
17
|
+
} from '../../hooks/useMemoizedTheme'
|
|
15
18
|
import type {
|
|
19
|
+
ChatAttachmentMessageBubbleFileIconStyle,
|
|
16
20
|
ChatAttachmentMessageBubbleFileMetadataTextStyle,
|
|
17
21
|
ChatAttachmentMessageBubbleFileNameTextStyle,
|
|
18
22
|
ChatAttachmentMessageBubbleState,
|
|
@@ -24,9 +28,15 @@ import type {
|
|
|
24
28
|
ChatMessageBubbleMetaDataTextStyle,
|
|
25
29
|
ChatMessageBubbleState,
|
|
26
30
|
PressableContainerStyle,
|
|
27
|
-
|
|
31
|
+
PressableIconStyle,
|
|
32
|
+
PressableState,
|
|
33
|
+
PressableStateLayerStyle,
|
|
34
|
+
PressableTextStyle
|
|
28
35
|
} from '../../theme/types/components/chat'
|
|
29
|
-
import type { StyleOverwrite } from '../../theme/types/resolver'
|
|
36
|
+
import type { StyleOverwrite, StyleResolverFunction } from '../../theme/types/resolver'
|
|
37
|
+
import type { PressableInteractionState } from '../../utils/pressableInteraction'
|
|
38
|
+
import { ThemedIcon } from '../visualization-and-display/ThemedIcon'
|
|
39
|
+
import { ThemedText } from '../visualization-and-display/ThemedText'
|
|
30
40
|
import {
|
|
31
41
|
ChatMessageBubble,
|
|
32
42
|
type ChatMessageBubbleProps
|
|
@@ -39,6 +49,7 @@ export type ChatAttachmentMessageBubbleProps = Omit<ChatMessageBubbleProps, 'chi
|
|
|
39
49
|
icon?: ReactNode,
|
|
40
50
|
downloadLabel?: string,
|
|
41
51
|
onDownload?: () => void,
|
|
52
|
+
style?: ChatMessageBubbleProps['style'],
|
|
42
53
|
contentContainerStyle?: StyleOverwrite<
|
|
43
54
|
PressableState,
|
|
44
55
|
PressableContainerStyle
|
|
@@ -53,6 +64,20 @@ export type ChatAttachmentMessageBubbleProps = Omit<ChatMessageBubbleProps, 'chi
|
|
|
53
64
|
>,
|
|
54
65
|
}
|
|
55
66
|
|
|
67
|
+
type AttachmentContentPressableResolvers = {
|
|
68
|
+
container: StyleResolverFunction<PressableState, PressableContainerStyle>,
|
|
69
|
+
stateLayer: StyleResolverFunction<PressableState, PressableStateLayerStyle>,
|
|
70
|
+
text: StyleResolverFunction<PressableState, PressableTextStyle>,
|
|
71
|
+
icon: StyleResolverFunction<PressableState, PressableIconStyle>,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const toPressableThemeState = (interaction: PressableInteractionState): PressableState => ({
|
|
75
|
+
isPressed: interaction.pressed,
|
|
76
|
+
isHovered: !!interaction.hovered,
|
|
77
|
+
isFocused: !!interaction.focused,
|
|
78
|
+
isFocusVisible: !!interaction.focusVisible,
|
|
79
|
+
})
|
|
80
|
+
|
|
56
81
|
const mergeBubbleStyleOverwrite = <TStyle extends StyleProp<ViewStyle> | object>(
|
|
57
82
|
tokenOverride: TStyle,
|
|
58
83
|
userOverwrite?: StyleOverwrite<ChatMessageBubbleState, TStyle>
|
|
@@ -78,6 +103,85 @@ const mergeBubbleStyleOverwrite = <TStyle extends StyleProp<ViewStyle> | object>
|
|
|
78
103
|
}
|
|
79
104
|
)
|
|
80
105
|
|
|
106
|
+
type AttachmentDownloadContentProps = {
|
|
107
|
+
pressableState: PressableInteractionState,
|
|
108
|
+
contentResolvers: AttachmentContentPressableResolvers,
|
|
109
|
+
contentContainerStyle?: StyleOverwrite<PressableState, PressableContainerStyle>,
|
|
110
|
+
name: ReactNode,
|
|
111
|
+
metadata?: ReactNode,
|
|
112
|
+
icon?: ReactNode,
|
|
113
|
+
resolvedFileIconContainerStyle: StyleProp<ViewStyle>,
|
|
114
|
+
resolvedFileIcon: ChatAttachmentMessageBubbleFileIconStyle,
|
|
115
|
+
resolvedDownloadIconContainerStyle: StyleProp<ViewStyle>,
|
|
116
|
+
resolvedDownloadIcon: ChatAttachmentMessageBubbleFileIconStyle,
|
|
117
|
+
resolvedFileNameTextStyle: StyleProp<ViewStyle>,
|
|
118
|
+
resolvedFileMetadataTextStyle: StyleProp<ViewStyle>,
|
|
119
|
+
spacingXs: number,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const AttachmentDownloadContent = ({
|
|
123
|
+
pressableState,
|
|
124
|
+
contentResolvers,
|
|
125
|
+
contentContainerStyle,
|
|
126
|
+
name,
|
|
127
|
+
metadata,
|
|
128
|
+
icon,
|
|
129
|
+
resolvedFileIconContainerStyle,
|
|
130
|
+
resolvedFileIcon,
|
|
131
|
+
resolvedDownloadIconContainerStyle,
|
|
132
|
+
resolvedDownloadIcon,
|
|
133
|
+
resolvedFileNameTextStyle,
|
|
134
|
+
resolvedFileMetadataTextStyle,
|
|
135
|
+
spacingXs,
|
|
136
|
+
}: AttachmentDownloadContentProps) => {
|
|
137
|
+
const pressableThemeState = useMemo(() => toPressableThemeState(pressableState),
|
|
138
|
+
[pressableState])
|
|
139
|
+
|
|
140
|
+
const resolvedContainerStyle = useMemoizedTheme(contentResolvers.container, pressableThemeState, contentContainerStyle)
|
|
141
|
+
const resolvedStateLayerStyle = useMemoizedTheme(contentResolvers.stateLayer, pressableThemeState)
|
|
142
|
+
const resolvedTextStyle = useMemoizedTheme(contentResolvers.text, pressableThemeState)
|
|
143
|
+
|
|
144
|
+
return (
|
|
145
|
+
<View style={resolvedContainerStyle}>
|
|
146
|
+
<View pointerEvents="none" style={resolvedStateLayerStyle} />
|
|
147
|
+
<View style={resolvedFileIconContainerStyle}>
|
|
148
|
+
{icon ?? (
|
|
149
|
+
<ThemedIcon
|
|
150
|
+
icon={HightideIconRegistry.FileText}
|
|
151
|
+
size={resolvedFileIcon.size}
|
|
152
|
+
strokeWidth={resolvedFileIcon.strokeWidth}
|
|
153
|
+
color={resolvedFileIcon.color}
|
|
154
|
+
/>
|
|
155
|
+
)}
|
|
156
|
+
</View>
|
|
157
|
+
<View style={{ gap: spacingXs }}>
|
|
158
|
+
{typeof name === 'string' || typeof name === 'number' ? (
|
|
159
|
+
<ThemedText style={[resolvedFileNameTextStyle, resolvedTextStyle]} numberOfLines={1}>{name}</ThemedText>
|
|
160
|
+
) : (
|
|
161
|
+
name
|
|
162
|
+
)}
|
|
163
|
+
{metadata != null && (
|
|
164
|
+
typeof metadata === 'string' || typeof metadata === 'number' ? (
|
|
165
|
+
<ThemedText appearance="description" style={[resolvedFileMetadataTextStyle, resolvedTextStyle]}>
|
|
166
|
+
{metadata}
|
|
167
|
+
</ThemedText>
|
|
168
|
+
) : (
|
|
169
|
+
metadata
|
|
170
|
+
)
|
|
171
|
+
)}
|
|
172
|
+
</View>
|
|
173
|
+
<View style={resolvedDownloadIconContainerStyle}>
|
|
174
|
+
<ThemedIcon
|
|
175
|
+
icon={HightideIconRegistry.Download}
|
|
176
|
+
size={resolvedDownloadIcon.size}
|
|
177
|
+
strokeWidth={resolvedDownloadIcon.strokeWidth}
|
|
178
|
+
color={resolvedDownloadIcon.color}
|
|
179
|
+
/>
|
|
180
|
+
</View>
|
|
181
|
+
</View>
|
|
182
|
+
)
|
|
183
|
+
}
|
|
184
|
+
|
|
81
185
|
export const ChatAttachmentMessageBubble = ({
|
|
82
186
|
children,
|
|
83
187
|
name,
|
|
@@ -87,9 +191,8 @@ export const ChatAttachmentMessageBubble = ({
|
|
|
87
191
|
downloadLabel = 'Download',
|
|
88
192
|
onDownload,
|
|
89
193
|
timestamp,
|
|
90
|
-
|
|
194
|
+
messageStatus,
|
|
91
195
|
style,
|
|
92
|
-
containerStyle,
|
|
93
196
|
bodyStyle,
|
|
94
197
|
bodyTextStyle,
|
|
95
198
|
metaDataContainerStyle,
|
|
@@ -104,74 +207,62 @@ export const ChatAttachmentMessageBubble = ({
|
|
|
104
207
|
const state = useMemo(() => ({ direction }), [direction])
|
|
105
208
|
const attachment = theme.components.chat.attachmentMessageBubble
|
|
106
209
|
const bubbleOverrides = attachment.chatMessageBubbleOverrides
|
|
107
|
-
const contentResolvers =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
)
|
|
210
|
+
const contentResolvers = useMemoizedThemeFactory<
|
|
211
|
+
ChatAttachmentMessageBubbleState,
|
|
212
|
+
AttachmentContentPressableResolvers
|
|
213
|
+
>(attachment.contentContainer, state)
|
|
111
214
|
|
|
112
|
-
const resolvedFileIconContainerStyle =
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
)
|
|
124
|
-
const resolvedDownloadIcon = useMemo(
|
|
125
|
-
() => attachment.downloadIcon(state),
|
|
126
|
-
[attachment, state]
|
|
127
|
-
)
|
|
128
|
-
const resolvedFileNameTextStyle = useMemo(
|
|
129
|
-
() => attachment.fileNameText(state, fileNameTextStyle),
|
|
130
|
-
[attachment, state, fileNameTextStyle]
|
|
131
|
-
)
|
|
132
|
-
const resolvedFileMetadataTextStyle = useMemo(
|
|
133
|
-
() => attachment.fileMetadataText(state, fileMetadataTextStyle),
|
|
134
|
-
[attachment, state, fileMetadataTextStyle]
|
|
135
|
-
)
|
|
215
|
+
const resolvedFileIconContainerStyle = useMemoizedTheme(attachment.fileIconContainer, state)
|
|
216
|
+
const resolvedFileIcon = useMemoizedTheme<
|
|
217
|
+
ChatAttachmentMessageBubbleState,
|
|
218
|
+
ChatAttachmentMessageBubbleFileIconStyle
|
|
219
|
+
>(attachment.fileIcon, state)
|
|
220
|
+
const resolvedDownloadIconContainerStyle = useMemoizedTheme(attachment.downloadIconContainer, state)
|
|
221
|
+
const resolvedDownloadIcon = useMemoizedTheme<
|
|
222
|
+
ChatAttachmentMessageBubbleState,
|
|
223
|
+
ChatAttachmentMessageBubbleFileIconStyle
|
|
224
|
+
>(attachment.downloadIcon, state)
|
|
225
|
+
const resolvedFileNameTextStyle = useMemoizedTheme(attachment.fileNameText, state, fileNameTextStyle)
|
|
226
|
+
const resolvedFileMetadataTextStyle = useMemoizedTheme(attachment.fileMetadataText, state, fileMetadataTextStyle)
|
|
136
227
|
|
|
137
228
|
const resolvedContainerStyle = useMemo(
|
|
138
229
|
() => mergeBubbleStyleOverwrite<ChatMessageBubbleContainerStyle>(
|
|
139
|
-
bubbleOverrides.container(state),
|
|
140
|
-
|
|
230
|
+
StyleSheet.flatten(bubbleOverrides.container(state)) as ChatMessageBubbleContainerStyle,
|
|
231
|
+
style
|
|
141
232
|
),
|
|
142
|
-
[bubbleOverrides, state,
|
|
233
|
+
[bubbleOverrides, state, style]
|
|
143
234
|
)
|
|
144
235
|
const resolvedBodyStyle = useMemo(
|
|
145
236
|
() => mergeBubbleStyleOverwrite<ChatMessageBubbleBodyStyle>(
|
|
146
|
-
bubbleOverrides.body(state),
|
|
237
|
+
StyleSheet.flatten(bubbleOverrides.body(state)) as ChatMessageBubbleBodyStyle,
|
|
147
238
|
bodyStyle
|
|
148
239
|
),
|
|
149
240
|
[bubbleOverrides, state, bodyStyle]
|
|
150
241
|
)
|
|
151
242
|
const resolvedBodyTextStyle = useMemo(
|
|
152
243
|
() => mergeBubbleStyleOverwrite<ChatMessageBubbleBodyTextStyle>(
|
|
153
|
-
bubbleOverrides.bodyText(state),
|
|
244
|
+
StyleSheet.flatten(bubbleOverrides.bodyText(state)) as ChatMessageBubbleBodyTextStyle,
|
|
154
245
|
bodyTextStyle
|
|
155
246
|
),
|
|
156
247
|
[bubbleOverrides, state, bodyTextStyle]
|
|
157
248
|
)
|
|
158
249
|
const resolvedMetaDataContainerStyle = useMemo(
|
|
159
250
|
() => mergeBubbleStyleOverwrite<ChatMessageBubbleMetaDataContainerStyle>(
|
|
160
|
-
bubbleOverrides.metaDataContainer(state),
|
|
251
|
+
StyleSheet.flatten(bubbleOverrides.metaDataContainer(state)) as ChatMessageBubbleMetaDataContainerStyle,
|
|
161
252
|
metaDataContainerStyle
|
|
162
253
|
),
|
|
163
254
|
[bubbleOverrides, state, metaDataContainerStyle]
|
|
164
255
|
)
|
|
165
256
|
const resolvedMetaDataStatusContainerStyle = useMemo(
|
|
166
257
|
() => mergeBubbleStyleOverwrite<ChatMessageBubbleMetaDataStatusContainerStyle>(
|
|
167
|
-
bubbleOverrides.metaDataStatusContainer(state),
|
|
258
|
+
StyleSheet.flatten(bubbleOverrides.metaDataStatusContainer(state)) as ChatMessageBubbleMetaDataStatusContainerStyle,
|
|
168
259
|
metaDataStatusContainerStyle
|
|
169
260
|
),
|
|
170
261
|
[bubbleOverrides, state, metaDataStatusContainerStyle]
|
|
171
262
|
)
|
|
172
263
|
const resolvedMetaDataTextStyle = useMemo(
|
|
173
264
|
() => mergeBubbleStyleOverwrite<ChatMessageBubbleMetaDataTextStyle>(
|
|
174
|
-
bubbleOverrides.metaDataText(state),
|
|
265
|
+
StyleSheet.flatten(bubbleOverrides.metaDataText(state)) as ChatMessageBubbleMetaDataTextStyle,
|
|
175
266
|
metaDataTextStyle
|
|
176
267
|
),
|
|
177
268
|
[bubbleOverrides, state, metaDataTextStyle]
|
|
@@ -182,9 +273,8 @@ export const ChatAttachmentMessageBubble = ({
|
|
|
182
273
|
{...props}
|
|
183
274
|
direction={direction}
|
|
184
275
|
timestamp={timestamp}
|
|
185
|
-
|
|
186
|
-
style={
|
|
187
|
-
containerStyle={resolvedContainerStyle}
|
|
276
|
+
messageStatus={messageStatus}
|
|
277
|
+
style={resolvedContainerStyle}
|
|
188
278
|
bodyStyle={resolvedBodyStyle}
|
|
189
279
|
bodyTextStyle={resolvedBodyTextStyle}
|
|
190
280
|
metaDataContainerStyle={resolvedMetaDataContainerStyle}
|
|
@@ -192,58 +282,29 @@ export const ChatAttachmentMessageBubble = ({
|
|
|
192
282
|
metaDataTextStyle={resolvedMetaDataTextStyle}
|
|
193
283
|
>
|
|
194
284
|
{children}
|
|
195
|
-
<
|
|
285
|
+
<Pressable
|
|
196
286
|
accessibilityLabel={downloadLabel}
|
|
197
287
|
disabled={onDownload == null}
|
|
198
288
|
onPress={onDownload}
|
|
199
|
-
style={(pressableState) => (
|
|
200
|
-
contentResolvers.container(pressableState, contentContainerStyle)
|
|
201
|
-
)}
|
|
202
|
-
stateLayerStyle={(pressableState) => (
|
|
203
|
-
contentResolvers.stateLayer(pressableState)
|
|
204
|
-
)}
|
|
205
|
-
textStyle={(pressableState) => (
|
|
206
|
-
contentResolvers.text(pressableState)
|
|
207
|
-
)}
|
|
208
|
-
iconStyle={(pressableState) => (
|
|
209
|
-
contentResolvers.icon(pressableState)
|
|
210
|
-
)}
|
|
211
289
|
>
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
)}
|
|
228
|
-
{metadata != null && (
|
|
229
|
-
typeof metadata === 'string' || typeof metadata === 'number' ? (
|
|
230
|
-
<ThemedText appearance="description" style={resolvedFileMetadataTextStyle}>
|
|
231
|
-
{metadata}
|
|
232
|
-
</ThemedText>
|
|
233
|
-
) : (
|
|
234
|
-
metadata
|
|
235
|
-
)
|
|
236
|
-
)}
|
|
237
|
-
</View>
|
|
238
|
-
<View style={resolvedDownloadIconContainerStyle}>
|
|
239
|
-
<ThemedIcon
|
|
240
|
-
icon={HightideIconRegistry.Download}
|
|
241
|
-
size={resolvedDownloadIcon.size}
|
|
242
|
-
strokeWidth={resolvedDownloadIcon.strokeWidth}
|
|
243
|
-
color={resolvedDownloadIcon.color}
|
|
290
|
+
{(pressableState) => (
|
|
291
|
+
<AttachmentDownloadContent
|
|
292
|
+
pressableState={pressableState as PressableInteractionState}
|
|
293
|
+
contentResolvers={contentResolvers}
|
|
294
|
+
contentContainerStyle={contentContainerStyle}
|
|
295
|
+
name={name}
|
|
296
|
+
metadata={metadata}
|
|
297
|
+
icon={icon}
|
|
298
|
+
resolvedFileIconContainerStyle={resolvedFileIconContainerStyle}
|
|
299
|
+
resolvedFileIcon={resolvedFileIcon}
|
|
300
|
+
resolvedDownloadIconContainerStyle={resolvedDownloadIconContainerStyle}
|
|
301
|
+
resolvedDownloadIcon={resolvedDownloadIcon}
|
|
302
|
+
resolvedFileNameTextStyle={resolvedFileNameTextStyle}
|
|
303
|
+
resolvedFileMetadataTextStyle={resolvedFileMetadataTextStyle}
|
|
304
|
+
spacingXs={theme.spacing.xs}
|
|
244
305
|
/>
|
|
245
|
-
|
|
246
|
-
</
|
|
306
|
+
)}
|
|
307
|
+
</Pressable>
|
|
247
308
|
</ChatMessageBubble>
|
|
248
309
|
)
|
|
249
310
|
}
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from 'react-native'
|
|
12
12
|
|
|
13
13
|
import { useTheme } from '../../global-contexts/theme/ThemeContext'
|
|
14
|
+
import { useMemoizedTheme } from '../../hooks/useMemoizedTheme'
|
|
14
15
|
import type {
|
|
15
16
|
ChatConversationListFooterStyle,
|
|
16
17
|
ChatConversationListHeaderStyle,
|
|
@@ -43,18 +44,9 @@ export const ChatConversationList = ({
|
|
|
43
44
|
const { theme } = useTheme()
|
|
44
45
|
const state = useMemo(() => ({}), [])
|
|
45
46
|
|
|
46
|
-
const resolvedListStyle =
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
)
|
|
50
|
-
const resolvedHeaderStyle = useMemo(
|
|
51
|
-
() => theme.components.chat.conversationList.header(state, headerStyle),
|
|
52
|
-
[theme, state, headerStyle]
|
|
53
|
-
)
|
|
54
|
-
const resolvedFooterStyle = useMemo(
|
|
55
|
-
() => theme.components.chat.conversationList.footer(state, footerStyle),
|
|
56
|
-
[theme, state, footerStyle]
|
|
57
|
-
)
|
|
47
|
+
const resolvedListStyle = useMemoizedTheme(theme.components.chat.conversationList.container, state, listStyle)
|
|
48
|
+
const resolvedHeaderStyle = useMemoizedTheme(theme.components.chat.conversationList.header, state, headerStyle)
|
|
49
|
+
const resolvedFooterStyle = useMemoizedTheme(theme.components.chat.conversationList.footer, state, footerStyle)
|
|
58
50
|
|
|
59
51
|
return (
|
|
60
52
|
<View {...props} style={[resolvedListStyle, style]}>
|