gitshark

Clone repository

git clone https://git.vilip.de/git/vilip/taskflow.git
git clone git@git.vilip.de:vilip/taskflow.git
import React from 'react';
import { FlatList, StyleSheet, View } from 'react-native';
import { Task } from '@/types/gtd';
import { TaskItem } from './task-item';
import { ThemedText } from './themed-text';
import { ThemedView } from './themed-view';
import { Colors } from '@/constants/theme';
import { useColorScheme } from '@/hooks/use-color-scheme';

interface TaskListProps {
  tasks: Task[];
  onTaskPress: (task: Task) => void;
  onToggleComplete: (taskId: string) => void;
  emptyMessage?: string;
  scrollable?: boolean;
}

export function TaskList({ tasks, onTaskPress, onToggleComplete, emptyMessage, scrollable = true }: TaskListProps) {
  const colorScheme = useColorScheme() ?? 'light';
  const colors = Colors[colorScheme];

  if (tasks.length === 0) {
    return (
      <ThemedView style={styles.emptyContainer}>
        <ThemedText style={styles.emptyText}>
          {emptyMessage || 'No tasks'}
        </ThemedText>
      </ThemedView>
    );
  }

  if (!scrollable) {
    return (
      <ThemedView style={styles.list}>
        {tasks.map((item, index) => (
          <React.Fragment key={item.id}>
            <TaskItem
              task={item}
              onPress={() => onTaskPress(item)}
              onToggleComplete={() => onToggleComplete(item.id)}
            />
            {index < tasks.length - 1 && <View style={[styles.separator, { backgroundColor: colors.border }]} />}
          </React.Fragment>
        ))}
      </ThemedView>
    );
  }

  return (
    <FlatList
      data={tasks}
      keyExtractor={(item) => item.id}
      renderItem={({ item }) => (
        <TaskItem
          task={item}
          onPress={() => onTaskPress(item)}
          onToggleComplete={() => onToggleComplete(item.id)}
        />
      )}
      ItemSeparatorComponent={() => <View style={[styles.separator, { backgroundColor: colors.border }]} />}
      contentContainerStyle={styles.list}
    />
  );
}

const styles = StyleSheet.create({
  list: {
    paddingVertical: 8,
  },
  separator: {
    height: StyleSheet.hairlineWidth,
    marginHorizontal: 16,
  },
  emptyContainer: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    paddingVertical: 60,
  },
  emptyText: {
    fontSize: 16,
    opacity: 0.5,
  },
});

Keyboard shortcuts

?Show this help
g hGo home
EscClose dialog