import React, { useState, useEffect, useCallback } from 'react';
import { View, FlatList, Text, StyleSheet, ActivityIndicator } from 'react-native';
import { CometChatCalls } from '@cometchat/calls-sdk-react-native';
type CallLogRequest = ReturnType<InstanceType<typeof CometChatCalls.CallLogRequestBuilder>['build']>;
type CallLog = InstanceType<typeof CometChatCalls.CallLog>;
function CallLogsScreen() {
const [callLogs, setCallLogs] = useState<CallLog[]>([]);
const [loading, setLoading] = useState(true);
const [loadingMore, setLoadingMore] = useState(false);
const [callLogRequest, setCallLogRequest] = useState<CallLogRequest | null>(null);
useEffect(() => {
const request = new CometChatCalls.CallLogRequestBuilder()
.setAuthToken(CometChatCalls.getUserAuthToken() ?? '')
.setLimit(30)
.build();
setCallLogRequest(request);
fetchCallLogs(request);
}, []);
const fetchCallLogs = async (request: CallLogRequest) => {
try {
const logs = await request.fetchNext();
setCallLogs(logs);
} catch (error) {
console.error('Error fetching call logs:', error);
} finally {
setLoading(false);
}
};
const loadMore = useCallback(async () => {
if (!callLogRequest || loadingMore) return;
setLoadingMore(true);
try {
const moreLogs = await callLogRequest.fetchNext();
setCallLogs((prev) => [...prev, ...moreLogs]);
} catch (error) {
console.error('Error loading more:', error);
} finally {
setLoadingMore(false);
}
}, [callLogRequest, loadingMore]);
const formatDate = (timestamp: number) => {
return new Date(timestamp * 1000).toLocaleString();
};
const renderCallLog = ({ item }: { item: CallLog }) => (
<View style={styles.callLogItem}>
<View style={styles.callInfo}>
<Text style={styles.participantName}>
{item.getInitiator().getName()} → {item.getReceiver().getName()}
</Text>
<Text style={styles.callDetails}>
{item.getType()} • {item.getStatus()}
</Text>
<Text style={styles.callTime}>{formatDate(item.getInitiatedAt())}</Text>
</View>
<Text style={styles.duration}>
{item.getTotalDuration() || '-'}
</Text>
</View>
);
if (loading) {
return (
<View style={styles.centered}>
<ActivityIndicator size="large" />
</View>
);
}
return (
<FlatList
data={callLogs}
keyExtractor={(item) => item.getSessionID()}
renderItem={renderCallLog}
onEndReached={loadMore}
onEndReachedThreshold={0.5}
ListFooterComponent={
loadingMore ? <ActivityIndicator style={styles.footer} /> : null
}
ListEmptyComponent={
<View style={styles.centered}>
<Text style={styles.emptyText}>No call logs</Text>
</View>
}
/>
);
}
const styles = StyleSheet.create({
centered: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
callLogItem: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
padding: 16,
borderBottomWidth: 1,
borderBottomColor: '#eee',
},
callInfo: {
flex: 1,
},
participantName: {
fontSize: 16,
fontWeight: '600',
},
callDetails: {
fontSize: 14,
color: '#666',
marginTop: 4,
},
callTime: {
fontSize: 12,
color: '#999',
marginTop: 4,
},
duration: {
fontSize: 14,
color: '#333',
},
footer: {
padding: 16,
},
emptyText: {
fontSize: 16,
color: '#999',
},
});
export default CallLogsScreen;