Files
2026-05-19 18:46:16 +02:00

83 lines
2.7 KiB
TypeScript

import { memo } from "react";
import { Text, View, TouchableOpacity } from "react-native";
import { Card, Divider } from "react-native-paper";
import { SearchResult } from "@/store/api/searchApi";
import { normalizeEnumLike } from "@/utils/formattingUtils";
interface ResultRowProps {
item: SearchResult;
expanded: boolean;
onToggle: (id: string) => void;
}
const ResultRowComponent = ({ item, expanded, onToggle }: ResultRowProps) => {
return (
<Card className="mb-4 overflow-hidden">
<TouchableOpacity onPress={() => onToggle(item.id)}>
<View className="p-3">
<Text className="font-semibold text-base" numberOfLines={1}>
{item.title}
</Text>
{item.subtitle ? (
<Text className="text-sm text-gray-600" numberOfLines={1}>
{normalizeEnumLike(item.subtitle)}
</Text>
) : null}
{item.description ? (
<Text className="text-xs text-gray-500" numberOfLines={2}>
{normalizeEnumLike(item.description)}
</Text>
) : null}
</View>
</TouchableOpacity>
{expanded && (
<View className="px-3 pb-3">
<Divider />
<View className="mt-3">
<Text className="text-xs text-gray-500 mb-1">
Type:{" "}
{item.type.charAt(0).toUpperCase() +
item.type.slice(1).toLowerCase()}
</Text>
{item.createdAt ? (
<Text className="text-xs text-gray-500 mb-1">
Created: {new Date(item.createdAt).toLocaleString()}
</Text>
) : null}
{item.meta ? (
<>
{item.type !== "todo" ? (
<>
{item.meta?.isLocked !== undefined ? (
<Text className="text-xs text-gray-500 mb-1">
Locked: {item.meta.isLocked ? "Yes" : "No"}
</Text>
) : null}
</>
) : (
<>
{item.meta?.createdBy ? (
<Text className="text-xs text-gray-500 mb-1">
Created by: {item.meta.createdBy}
</Text>
) : null}
{item.meta?.assignees ? (
<Text className="text-xs text-gray-500 mb-1">
Assignees: {item.meta.assignees}
</Text>
) : null}
</>
)}
</>
) : null}
</View>
</View>
)}
</Card>
);
};
export const ResultRow = memo(ResultRowComponent);
ResultRow.displayName = "ResultRow";