react-native#ViewToken TypeScript Examples
The following examples show how to use
react-native#ViewToken.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: IterableInAppMessage.ts From react-native-sdk with MIT License | 6 votes |
static fromViewToken(viewToken: ViewToken) {
var inAppMessage = viewToken.item["inAppMessage"] as IterableInAppMessage
return new IterableInAppMessage(
inAppMessage.messageId,
inAppMessage.campaignId,
inAppMessage.trigger,
inAppMessage.createdAt,
inAppMessage.expiresAt,
inAppMessage.saveToInbox,
inAppMessage.inboxMetadata,
inAppMessage.customPayload,
inAppMessage.read,
inAppMessage.priorityLevel
)
}
Example #2
Source File: IterableInboxMessageList.tsx From react-native-sdk with MIT License | 5 votes |
IterableInboxMessageList = ({
dataModel,
rowViewModels,
customizations,
messageListItemLayout,
deleteRow,
handleMessageSelect,
updateVisibleMessageImpressions,
contentWidth,
isPortrait
}: MessageListProps) => {
const [swiping, setSwiping] = useState<boolean>(false)
const flatListRef = useRef<FlatList>(null)
function renderRowViewModel(rowViewModel: InboxRowViewModel, index: number, last: boolean) {
return (
<IterableInboxMessageCell
key={rowViewModel.inAppMessage.messageId}
index={index}
last={last}
dataModel={dataModel}
rowViewModel={rowViewModel}
customizations={customizations}
swipingCheck={(swiping: boolean) => setSwiping(swiping)}
messageListItemLayout={messageListItemLayout}
deleteRow={(messageId: string) => deleteRow(messageId)}
handleMessageSelect={(messageId: string, index: number) => handleMessageSelect(messageId, index)}
contentWidth={contentWidth}
isPortrait={isPortrait}
/>
)
}
function getRowInfosFromViewTokens(viewTokens: Array<ViewToken>): Array<InboxImpressionRowInfo> {
return viewTokens.map(
function(viewToken) {
var inAppMessage = IterableInAppMessage.fromViewToken(viewToken)
const impression = {
messageId: inAppMessage.messageId,
silentInbox: inAppMessage.isSilentInbox()
} as InboxImpressionRowInfo
return impression
}
)
}
const inboxSessionViewabilityConfig: ViewabilityConfig = {
minimumViewTime: 500,
itemVisiblePercentThreshold: 100,
waitForInteraction: false
}
const inboxSessionItemsChanged = useCallback((
(info: {viewableItems: Array<ViewToken>, changed: Array<ViewToken>}) => {
const rowInfos = getRowInfosFromViewTokens(info.viewableItems)
updateVisibleMessageImpressions(rowInfos)
}
), [])
return (
<FlatList
ref={flatListRef}
scrollEnabled={!swiping}
data={rowViewModels}
renderItem={({ item, index }: { item: InboxRowViewModel, index: number }) => renderRowViewModel(item, index, index === rowViewModels.length - 1)}
keyExtractor={(item: InboxRowViewModel) => item.inAppMessage.messageId}
viewabilityConfig={inboxSessionViewabilityConfig}
onViewableItemsChanged={inboxSessionItemsChanged}
onLayout={() => {flatListRef.current?.recordInteraction()}}
/>
)
}
Example #3
Source File: DayStrip.tsx From nyxo-app with GNU General Public License v3.0 | 4 votes |
CalendarStrip: FC = () => {
const { selectDate, selectedDate } = useCalendar()
const flatListRef = useRef<FlatList>(null)
const [init, setInit] = useState(true)
const dispatch = useAppDispatch()
const startDate = new Date()
const days = Array.from(Array(365 * 3)).map((_, index) =>
startOfDay(sub(startDate, { days: index }))
)
const toggleCalendar = () => {
dispatch(toggleCalendarModal(true))
}
const renderItem: ListRenderItem<Date> = ({ item, index }) => (
<PressableContainer key={item.toISOString()} onPress={toggleCalendar}>
<Day isFirst={index === 0}>
<DateContainer isFirst={index === 0}>
{localizedFormat(item, 'EEE d. LLL')}
</DateContainer>
</Day>
</PressableContainer>
)
const handleViewableItemsChanged = ({
viewableItems
}: {
viewableItems: Array<ViewToken>
}) => {
if (viewableItems.length === 1) {
const date = viewableItems[0].item
selectDate(date)
}
}
const handleViewableItemsChangedRef = useRef(handleViewableItemsChanged)
const viewabilityConfig = {
itemVisiblePercentThreshold: 85,
minimumViewTime: 750
}
const keyExtractor = (item: Date) => item.toISOString()
const scrollToItem = (index: number) => {
return flatListRef?.current?.scrollToIndex({
index,
animated: true,
viewPosition: 0.5
})
}
useEffect(() => {
if (!init) {
const index = days.findIndex((date) =>
isSameDay(date, new Date(selectedDate))
)
if (index >= 0) {
scrollToItem(index)
}
} else {
setInit(false)
}
}, [days, init, selectedDate])
const getItemLayout = (_: unknown, index: number) => {
if (index === 0) {
return {
index,
length: FIRST_DAY_WIDTH,
offset: 0
}
}
return {
index,
length: DAY_WIDTH,
offset: FIRST_DAY_WIDTH + DAY_WIDTH * index - DAY_WIDTH
}
}
const snapOffsets = days.map((_, index) => {
if (index === 0) {
return DAY_WIDTH
}
return DAY_WIDTH * (index + 1)
})
return (
<Container>
<FlatList
ref={flatListRef}
showsHorizontalScrollIndicator={false}
inverted
snapToStart
horizontal
getItemLayout={getItemLayout}
keyExtractor={keyExtractor}
viewabilityConfig={viewabilityConfig}
onViewableItemsChanged={handleViewableItemsChangedRef.current}
decelerationRate="fast"
snapToOffsets={snapOffsets}
data={days}
renderItem={renderItem}
/>
<Gradient pointerEvents="box-none" />
</Container>
)
}