You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
5.0 KiB
216 lines
5.0 KiB
import React, { createContext, useMemo, useContext } from 'react';
|
|
import {
|
|
Table as ExpoTable,
|
|
THead as ExpoTHead,
|
|
TBody as ExpoTBody,
|
|
TFoot as ExpoTFoot,
|
|
TR as ExpoTR,
|
|
Caption as ExpoTCaption,
|
|
} from '@expo/html-elements';
|
|
|
|
import {
|
|
tableStyle,
|
|
tableHeaderStyle,
|
|
tableBodyStyle,
|
|
tableFooterStyle,
|
|
tableHeadStyle,
|
|
tableRowStyleStyle,
|
|
tableDataStyle,
|
|
tableCaptionStyle,
|
|
} from './styles';
|
|
import { Text, View } from 'react-native';
|
|
|
|
const TableHeaderContext = createContext<{
|
|
isHeaderRow: boolean;
|
|
}>({
|
|
isHeaderRow: false,
|
|
});
|
|
const TableFooterContext = createContext<{
|
|
isFooterRow: boolean;
|
|
}>({
|
|
isFooterRow: false,
|
|
});
|
|
|
|
type ITableProps = React.ComponentProps<typeof ExpoTable>;
|
|
type ITableHeaderProps = React.ComponentProps<typeof ExpoTHead>;
|
|
type ITableBodyProps = React.ComponentProps<typeof ExpoTBody>;
|
|
type ITableFooterProps = React.ComponentProps<typeof ExpoTFoot>;
|
|
type ITableHeadProps = React.ComponentProps<typeof View | typeof Text> & {
|
|
useRNView?: boolean;
|
|
};
|
|
type ITableRowProps = React.ComponentProps<typeof ExpoTR>;
|
|
type ITableDataProps = React.ComponentProps<typeof View | typeof Text> & {
|
|
useRNView?: boolean;
|
|
};
|
|
type ITableCaptionProps = React.ComponentProps<typeof ExpoTCaption>;
|
|
|
|
const Table = React.forwardRef<
|
|
React.ComponentRef<typeof ExpoTable>,
|
|
ITableProps
|
|
>(({ className, ...props }, ref) => {
|
|
return (
|
|
<ExpoTable
|
|
// @ts-expect-error : ref type changed
|
|
ref={ref}
|
|
className={tableStyle({ class: className })}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const TableHeader = React.forwardRef<
|
|
React.ComponentRef<typeof ExpoTHead>,
|
|
ITableHeaderProps
|
|
>(function TableHeader({ className, ...props }, ref) {
|
|
const contextValue = useMemo(() => {
|
|
return {
|
|
isHeaderRow: true,
|
|
};
|
|
}, []);
|
|
return (
|
|
<TableHeaderContext.Provider value={contextValue}>
|
|
<ExpoTHead
|
|
// @ts-expect-error : ref type changed
|
|
ref={ref}
|
|
className={tableHeaderStyle({ class: className })}
|
|
{...props}
|
|
/>
|
|
</TableHeaderContext.Provider>
|
|
);
|
|
});
|
|
|
|
const TableBody = React.forwardRef<
|
|
React.ComponentRef<typeof ExpoTBody>,
|
|
ITableBodyProps
|
|
>(function TableBody({ className, ...props }, ref) {
|
|
return (
|
|
<ExpoTBody
|
|
// @ts-expect-error : ref type changed
|
|
ref={ref}
|
|
className={tableBodyStyle({ class: className })}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const TableFooter = React.forwardRef<
|
|
React.ComponentRef<typeof ExpoTFoot>,
|
|
ITableFooterProps
|
|
>(function TableFooter({ className, ...props }, ref) {
|
|
const contextValue = useMemo(() => {
|
|
return {
|
|
isFooterRow: true,
|
|
};
|
|
}, []);
|
|
return (
|
|
<TableFooterContext.Provider value={contextValue}>
|
|
<ExpoTFoot
|
|
// @ts-expect-error : ref type changed
|
|
ref={ref}
|
|
className={tableFooterStyle({ class: className })}
|
|
{...props}
|
|
/>
|
|
</TableFooterContext.Provider>
|
|
);
|
|
});
|
|
|
|
const TableHead = React.forwardRef<
|
|
React.ComponentRef<typeof View | typeof Text>,
|
|
ITableHeadProps
|
|
>(function TableHead({ useRNView = false, className, ...props }, ref) {
|
|
if (useRNView) {
|
|
return (
|
|
<View
|
|
ref={ref}
|
|
className={tableHeadStyle({ class: className })}
|
|
{...props}
|
|
/>
|
|
);
|
|
} else {
|
|
return (
|
|
<Text
|
|
ref={ref}
|
|
className={tableHeadStyle({ class: className })}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
});
|
|
|
|
const TableRow = React.forwardRef<
|
|
React.ComponentRef<typeof ExpoTR>,
|
|
ITableRowProps
|
|
>(function TableRow({ className, ...props }, ref) {
|
|
const { isHeaderRow } = useContext(TableHeaderContext);
|
|
const { isFooterRow } = useContext(TableFooterContext);
|
|
|
|
return (
|
|
<ExpoTR
|
|
// @ts-expect-error : ref type changed
|
|
ref={ref}
|
|
className={tableRowStyleStyle({
|
|
isHeaderRow,
|
|
isFooterRow,
|
|
class: className,
|
|
})}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const TableData = React.forwardRef<
|
|
React.ComponentRef<typeof View | typeof Text>,
|
|
ITableDataProps
|
|
>(function TableData({ useRNView = false, className, ...props }, ref) {
|
|
if (useRNView) {
|
|
return (
|
|
<View
|
|
ref={ref}
|
|
className={tableDataStyle({ class: className })}
|
|
{...props}
|
|
/>
|
|
);
|
|
} else {
|
|
return (
|
|
<Text
|
|
ref={ref}
|
|
className={tableDataStyle({ class: className })}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
});
|
|
|
|
const TableCaption = React.forwardRef<
|
|
React.ComponentRef<typeof ExpoTCaption>,
|
|
ITableCaptionProps
|
|
>(({ className, ...props }, ref) => {
|
|
return (
|
|
<ExpoTCaption
|
|
// @ts-expect-error : ref type changed
|
|
ref={ref}
|
|
className={tableCaptionStyle({ class: className })}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
Table.displayName = 'Table';
|
|
TableHeader.displayName = 'TableHeader';
|
|
TableBody.displayName = 'TableBody';
|
|
TableFooter.displayName = 'TableFooter';
|
|
TableHead.displayName = 'TableHead';
|
|
TableRow.displayName = 'TableRow';
|
|
TableData.displayName = 'TableData';
|
|
TableCaption.displayName = 'TableCaption';
|
|
|
|
export {
|
|
Table,
|
|
TableHeader,
|
|
TableBody,
|
|
TableFooter,
|
|
TableHead,
|
|
TableRow,
|
|
TableData,
|
|
TableCaption,
|
|
};
|