diff --git a/src/screens/presence/index.js b/src/screens/presence/index.js index 6dfd34d..0810927 100644 --- a/src/screens/presence/index.js +++ b/src/screens/presence/index.js @@ -1,75 +1,176 @@ import { TouchableRipple, TextInput, Card, Text, Appbar } from 'react-native-paper'; -import { View, StyleSheet, ScrollView } from 'react-native'; -import React, { useState } from 'react'; +import { View, StyleSheet, ScrollView, RefreshControl, StatusBar, Image } from 'react-native'; +import React, { useState, useEffect, useCallback, useRef, useMemo } from 'react'; import { colors } from '../../utils/color' import Icon from 'react-native-vector-icons/AntDesign'; import moment from 'moment'; import 'moment/locale/id'; +import RequestModule from '../../services/api/request'; +import renderSkeleton from '../../components/renderSkeleton' +import { + BottomSheetModal, + BottomSheetModalProvider, + BottomSheetView +} from '@gorhom/bottom-sheet'; + moment.locale('id'); +const PAGE_SIZE = 25; export default function PresenceScreen({ route, navigation }) { + const request = new RequestModule('presence'); + const [refreshing, setRefreshing] = useState(false); + const [page, setPage] = useState(0); + const [dataPresence, setDataPresence] = useState([]); + const [loading, setLoading] = useState(false); + const bottomSheetImage = useRef(null); + const [selectedImageUri, setSelectedImageUri] = useState(null); + const handleOpenSheetImage = useCallback((uri) => { + console.log('URI received:', uri); + setSelectedImageUri(uri); + bottomSheetImage.current?.present(); + }, []); + + const onRefresh = useCallback(() => { + setRefreshing(true); + setPage(0); + getPresenceHistory(0); + }, []); + + useEffect(() => { + getPresenceHistory(page); + }, [page]); + + const getPresenceHistory = async (pageNum) => { + if (loading) return; + setLoading(true); + const payload = { + paging: { start: pageNum * PAGE_SIZE, length: PAGE_SIZE }, + columns: [ + { name: 'deleted_at', logic_operator: 'IS NULL', operator: 'AND' }, + ], + orders: { columns: ['created_at', 'id'], ascending: false }, + }; + const result = await request.getDataSearch(payload); + setDataPresence((prevData) => + pageNum === 0 ? result.data.data : [...prevData, ...result.data.data] + ); + setPage(pageNum + 1); + setRefreshing(false); + setLoading(false); + }; + // console.log("uri", dataPresence[0].attachments); + const convertDuration = (data) => { + const hours = Math.floor(data / 60); + const minutes = data % 60; + return `${hours} jam ${minutes} menit`; + } - const dummyData = [ - { id: '1', date: '2024-02-09', timeIn: '08:00', timeOut: '17:00', shift: "Pagi", duration: new Date(0, 0, 0, 8, 0, 0) }, - { id: '2', date: '2024-02-10', timeIn: '08:15', timeOut: '17:30', shift: "Pagi", duration: new Date(0, 0, 0, 8, 30, 0) }, - { id: '3', date: '2024-02-11', timeIn: '08:10', timeOut: '17:20', shift: "Pagi", duration: new Date(0, 0, 0, 9, 0, 0) }, - { id: '4', date: '2024-02-12', timeIn: '08:10', timeOut: '17:20', shift: "Pagi", duration: new Date(0, 0, 0, 10, 0, 0) }, - { id: '5', date: '2024-02-13', timeIn: '08:10', timeOut: '17:20', shift: "Pagi", duration: new Date(0, 0, 0, 11, 0, 0) }, - { id: '6', date: '2024-02-14', timeIn: '08:10', timeOut: '17:20', shift: "Pagi", duration: new Date(0, 0, 0, 9, 30, 0) }, - { id: '7', date: '2024-02-15', timeIn: '08:10', timeOut: '17:20', shift: "Pagi", duration: new Date(0, 0, 0, 12, 0, 0) }, - ]; + const handleScroll = ({ nativeEvent }) => { + if (isCloseToBottom(nativeEvent)) { + getPresenceHistory(page); + } + }; + + const isCloseToBottom = ({ layoutMeasurement, contentOffset, contentSize }) => { + return layoutMeasurement.height + contentOffset.y >= contentSize.height - 20; + }; + const renderImage = useMemo(() => { + console.log('Rendering image with URI:', selectedImageUri); + return ( + + ); + }, [selectedImageUri]); return ( <> + { navigation.goBack() }} /> - - {dummyData.map((item) => ( - - - - - - - {moment(item.date).format('dddd, DD MMMM - YYYY')} - - - - - Shift {item.shift} - - - + + } + onScroll={handleScroll} + scrollEventThrottle={400} + > + {loading ? ( + // renderSkeleton(10) + null + ) : ( + dataPresence.map((item) => ( + item.attachments && item.attachments[0] && handleOpenSheetImage(item.attachments[0].url)} key={item.id}> + + + + + + + + {moment(item.datePresence).format('dddd, DD MMMM - YYYY')} + + + + + Shift {item.shift} + + + - - - - - Durasi Kerja - - - - Masuk - - Keluar - - - - - {item.timeIn} Jam - - - {item.timeIn} - - {item.timeOut} - - - - - ))} + + + + + Durasi Kerja + + + + Masuk + + Keluar + + + + + {item.duration ? convertDuration(item.duration) : ''} + + + {moment(item.in_time).format('HH:mm')} + + {item.out_time ? moment(item.out_time).format('HH:mm') : ''} + + + {item.attachments && item.attachments.length > 0 ? item.attachments[0].url : 'No attachments'} + + + + + )) + )} + + + + + {renderImage} + + + ) }