2025-07-21 15:10:39 +08:00
|
|
|
import React from 'react';
|
2025-07-21 15:36:11 +08:00
|
|
|
import { StyleSheet } from 'react-native';
|
|
|
|
import { Card, Text, Chip, useTheme } from 'react-native-paper';
|
|
|
|
import { Task, TaskStatus } from '../types/task';
|
2025-07-21 15:10:39 +08:00
|
|
|
|
|
|
|
interface TaskCardProps {
|
|
|
|
task: Task;
|
|
|
|
onPress: (id: string) => void;
|
|
|
|
}
|
|
|
|
|
2025-07-21 15:36:11 +08:00
|
|
|
const statusColors: Record<TaskStatus, string> = {
|
|
|
|
IDLE: 'grey',
|
|
|
|
RUNNING: 'blue',
|
|
|
|
COMPLETED: 'green',
|
|
|
|
ERROR: 'red',
|
|
|
|
};
|
|
|
|
|
2025-07-21 15:10:39 +08:00
|
|
|
const TaskCard: React.FC<TaskCardProps> = ({ task, onPress }) => {
|
2025-07-21 15:36:11 +08:00
|
|
|
const theme = useTheme();
|
|
|
|
|
2025-07-21 15:10:39 +08:00
|
|
|
return (
|
2025-07-21 15:36:11 +08:00
|
|
|
<Card style={styles.card} onPress={() => onPress(task.id)}>
|
|
|
|
<Card.Content>
|
|
|
|
<Text variant="titleMedium" style={styles.title}>{task.name}</Text>
|
|
|
|
<Chip
|
|
|
|
icon="information"
|
|
|
|
mode="outlined"
|
|
|
|
selectedColor={statusColors[task.status]}
|
|
|
|
style={[styles.chip, {backgroundColor: theme.colors.surface}]}
|
|
|
|
>
|
|
|
|
{task.status}
|
|
|
|
</Chip>
|
|
|
|
</Card.Content>
|
|
|
|
</Card>
|
2025-07-21 15:10:39 +08:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
const styles = StyleSheet.create({
|
|
|
|
card: {
|
|
|
|
margin: 8,
|
|
|
|
width: '45%',
|
|
|
|
},
|
|
|
|
title: {
|
2025-07-21 15:36:11 +08:00
|
|
|
marginBottom: 12,
|
|
|
|
minHeight: 50, // Ensure cards have similar height
|
2025-07-21 15:10:39 +08:00
|
|
|
},
|
2025-07-21 15:36:11 +08:00
|
|
|
chip: {
|
|
|
|
alignSelf: 'flex-start',
|
|
|
|
}
|
2025-07-21 15:10:39 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
export default TaskCard;
|