import React from "react";
import { Text, View, ViewStyle, ScrollView } from "react-native";
const DEFAULT_HEADERS: any[] = [];
const DEFAULT_SORTABLE_DATA: any[] = [];
const renderHeaderComponent = (component: any) => {
if (!component) return null;
if (React.isValidElement(component)) return component;
if (typeof component === "function") {
const HeaderComponent = component;
return ;
}
return null;
};
const SortableListHeader = ({
title,
style,
}: {
title?: string;
style?: ViewStyle;
}) => {
const displayTitle = typeof title === "string" ? title : String(title ?? "");
return (
{displayTitle ? {displayTitle} : null}
);
};
export type SortableListProps = {
scrollViewStyle?: ViewStyle;
contentContainerStyle?: ViewStyle;
itemStyle?: ViewStyle;
headerStyle?: ViewStyle;
columns?: number;
rowGap?: number;
columnGap?: number;
spacing?: number;
keyExtractor?: (item: any, index?: number) => string;
renderItem: ({
item,
index,
renderHandle,
}: {
item: any;
index: number;
renderHandle: (children: React.ReactElement) => React.ReactElement;
}) => React.ReactNode;
sortableData?: any[];
headers?: { index: number; title?: string; component: any }[];
onDragEnd?: (params: {
fromIndex?: number;
toIndex?: number;
from?: number;
to?: number;
data: any[];
}) => void;
};
export const SortableList = ({
scrollViewStyle,
contentContainerStyle,
itemStyle,
headerStyle,
keyExtractor = (item, index) =>
`sortable-item-${item?.id ?? item?.title ?? index}`,
renderItem,
sortableData = DEFAULT_SORTABLE_DATA,
headers = DEFAULT_HEADERS,
}: SortableListProps) => {
return (
{(headers || []).map((header, idx) => (
{header.title ? (
) : (
renderHeaderComponent(header.component)
)}
))}
{(sortableData || []).map((item, index) => (
{renderItem({
item,
index,
renderHandle: (children) => children,
})}
))}
);
};