-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Expand file tree
/
Copy pathDayAnimatedExample.tsx
More file actions
111 lines (100 loc) · 3.55 KB
/
Copy pathDayAnimatedExample.tsx
File metadata and controls
111 lines (100 loc) · 3.55 KB
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import React, { useCallback, useMemo, useState } from 'react'
import { StyleSheet, View, useColorScheme } from 'react-native'
import { GiftedChat, IMessage } from 'react-native-gifted-chat'
import { useKeyboardVerticalOffset } from '../../hooks/useKeyboardVerticalOffset'
import { getColorSchemeStyle } from '../../utils/styleUtils'
// Generates a labelled chat spanning several days so the floating/animated day
// header and the inline day separators can be exercised. Each "day" is a fixed
// number of days before today with a handful of messages, alternating sides.
const MESSAGES_PER_DAY = 6
const INITIAL_DAYS = 4
const LOAD_EARLIER_DAYS = 3
const generateDay = (dayOffset: number): IMessage[] => {
const messages: IMessage[] = []
for (let m = MESSAGES_PER_DAY - 1; m >= 0; m--) {
const createdAt = new Date()
createdAt.setDate(createdAt.getDate() - dayOffset)
createdAt.setHours(10, m, 0, 0)
const fromMe = m % 2 === 0
messages.push({
_id: `day-${dayOffset}-msg-${m}`,
text: `Day -${dayOffset} · message ${m}`,
createdAt,
user: fromMe
? { _id: 1, name: 'Developer' }
: { _id: 2, name: 'John Doe' },
})
}
return messages
}
// Inclusive range of day offsets, newest message first (descending createdAt).
const generateRange = (fromDayOffset: number, toDayOffset: number): IMessage[] => {
let messages: IMessage[] = []
for (let day = fromDayOffset; day <= toDayOffset; day++)
messages = messages.concat(generateDay(day))
return messages.sort(
(a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()
)
}
export default function DayAnimatedExample () {
const [messages, setMessages] = useState<IMessage[]>(() => generateRange(0, INITIAL_DAYS - 1))
const [oldestDayOffset, setOldestDayOffset] = useState(INITIAL_DAYS - 1)
const [isLoadingEarlier, setIsLoadingEarlier] = useState(false)
const colorScheme = useColorScheme()
const keyboardVerticalOffset = useKeyboardVerticalOffset()
const user = useMemo(() => ({
_id: 1,
name: 'Developer',
}), [])
const onSend = useCallback((newMessages: IMessage[] = []) => {
setMessages(previousMessages => GiftedChat.append(previousMessages, newMessages))
}, [])
const onPressLoadEarlierMessages = useCallback(() => {
setIsLoadingEarlier(true)
setTimeout(() => {
const from = oldestDayOffset + 1
const to = oldestDayOffset + LOAD_EARLIER_DAYS
setMessages(previousMessages =>
GiftedChat.prepend(previousMessages, generateRange(from, to))
)
setOldestDayOffset(to)
setIsLoadingEarlier(false)
}, 1500)
}, [oldestDayOffset])
return (
<View style={[styles.container, getColorSchemeStyle(styles, 'container', colorScheme)]}>
<GiftedChat
messages={messages}
onSend={onSend}
user={user}
loadEarlierMessagesProps={{
isAvailable: true,
isLoading: isLoadingEarlier,
onPress: onPressLoadEarlierMessages,
}}
messagesContainerStyle={getColorSchemeStyle(styles, 'messagesContainer', colorScheme)}
textInputProps={{
style: getColorSchemeStyle(styles, 'composer', colorScheme),
}}
keyboardAvoidingViewProps={{ keyboardVerticalOffset }}
isScrollToBottomEnabled
/>
</View>
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
},
container_dark: {
backgroundColor: '#000',
},
messagesContainer_dark: {
backgroundColor: '#000',
},
composer_dark: {
backgroundColor: '#1a1a1a',
color: '#fff',
},
})