import React, { Fragment, useRef, useState, useEffect } from 'react'; import { Dimensions, View, Platform, StyleSheet } from 'react-native'; import Modal from 'react-native-modalbox'; import StoryListItem from './StoryListItem'; import StoryCircleListView from './StoryCircleListView'; import { isNullOrWhitespace } from './helpers'; import AndroidCubeEffect from './components/AndroidCubeEffect'; import CubeNavigationHorizontal from './components/CubeNavigationHorizontal'; import { IUserStory, NextOrPrevious, StoryProps } from './interfaces'; const { height, width } = Dimensions.get('window'); export const Story = ({ data, unPressedBorderColor, pressedBorderColor, unPressedAvatarTextColor, pressedAvatarTextColor, horizontal, numColumns, videoProps, style, onStart, onClose, duration, swipeText, avatarSize, showAvatarText, avatarTextStyle, onStorySeen, renderCloseComponent, renderSwipeUpComponent, renderTextComponent, loadedAnimationBarStyle, unloadedAnimationBarStyle, animationBarContainerStyle, storyUserContainerStyle, storyImageStyle, storyAvatarImageStyle, storyContainerStyle, avatarImageStyle, avatarWrapperStyle, avatarFlatListProps, }: StoryProps) => { const [dataState, setDataState] = useState(data); const [isModalOpen, setIsModalOpen] = useState(false); const [currentPage, setCurrentPage] = useState(0); const [selectedData, setSelectedData] = useState([]); const cube = useRef(); // Component Functions const _handleStoryItemPress = (item: IUserStory, index?: number) => { const newData = dataState.slice(index); if (onStart) { onStart(item); } setCurrentPage(0); setSelectedData(newData); setIsModalOpen(true); }; useEffect(() => { handleSeen(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [currentPage]); const handleSeen = () => { const seen = selectedData[currentPage]; const seenIndex = dataState.indexOf(seen); if (seenIndex > 0) { if (!dataState[seenIndex]?.seen) { let tempData = dataState; dataState[seenIndex] = { ...dataState[seenIndex], seen: true, }; setDataState(tempData); } } }; function onStoryFinish(state: NextOrPrevious) { if (!isNullOrWhitespace(state)) { if (state == 'next') { const newPage = currentPage + 1; if (newPage < selectedData.length) { setCurrentPage(newPage); cube?.current?.scrollTo(newPage); } else { setIsModalOpen(false); setCurrentPage(0); if (onClose) { onClose(selectedData[selectedData.length - 1]); } } } else if (state == 'previous') { const newPage = currentPage - 1; if (newPage < 0) { setIsModalOpen(false); setCurrentPage(0); } else { setCurrentPage(newPage); cube?.current?.scrollTo(newPage); } } } } const renderStoryList = () => selectedData.map((x, i) => { return ( { setIsModalOpen(false); if (onClose) { onClose(x); } }} index={i} onStorySeen={onStorySeen} unloadedAnimationBarStyle={unloadedAnimationBarStyle} animationBarContainerStyle={animationBarContainerStyle} loadedAnimationBarStyle={loadedAnimationBarStyle} storyUserContainerStyle={storyUserContainerStyle} storyImageStyle={storyImageStyle} storyAvatarImageStyle={storyAvatarImageStyle} storyContainerStyle={storyContainerStyle} /> ); }); const renderCube = () => { if (Platform.OS == 'ios') { return ( } callBackAfterSwipe={(x: any) => { if (x != currentPage) { setCurrentPage(parseInt(x)); } }} > {renderStoryList()} ); } else { return ( } callBackAfterSwipe={(x: any) => { if (x != currentPage) { setCurrentPage(parseInt(x)); } }} > {renderStoryList()} ); } }; return ( setIsModalOpen(false)} position="center" swipeToClose swipeArea={250} backButtonClose coverScreen={true} > {renderCube()} ); }; const styles = StyleSheet.create({ modal: { flex: 1, height, width, }, }); export default Story; Story.defaultProps = { showAvatarText: true, };