mirror of
https://github.com/kremalicious/umami.git
synced 2024-12-25 02:36:20 +01:00
100 lines
2.9 KiB
JavaScript
100 lines
2.9 KiB
JavaScript
import { useQuery } from '@tanstack/react-query';
|
|
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
|
|
import { formatDistance } from 'date-fns';
|
|
import useApi from 'hooks/useApi';
|
|
import Link from 'next/link';
|
|
import { useEffect, useState } from 'react';
|
|
import {
|
|
Button,
|
|
Icon,
|
|
Table,
|
|
TableBody,
|
|
TableCell,
|
|
TableColumn,
|
|
TableHeader,
|
|
TableRow,
|
|
} from 'react-basics';
|
|
import styles from './UsersTable.module.css';
|
|
|
|
const defaultColumns = [
|
|
{ name: 'username', label: 'Username', style: { flex: 2 } },
|
|
{ name: 'role', label: 'Role', style: { flex: 2 } },
|
|
{ name: 'created', label: 'Created' },
|
|
{ name: 'action', label: ' ' },
|
|
];
|
|
|
|
export default function UsersTable({ columns = defaultColumns, onLoading, onAddKeyClick }) {
|
|
const [values, setValues] = useState(null);
|
|
const { get } = useApi();
|
|
const { data, isLoading, error } = useQuery(['user'], () => get(`/users`));
|
|
const hasData = data && data.length !== 0;
|
|
|
|
useEffect(() => {
|
|
if (data) {
|
|
setValues(data);
|
|
onLoading({ data, isLoading, error });
|
|
}
|
|
}, [onLoading, data, isLoading, error]);
|
|
|
|
return (
|
|
<>
|
|
{hasData && (
|
|
<Table className={styles.table} columns={columns} rows={values}>
|
|
<TableHeader>
|
|
{(column, index) => {
|
|
return (
|
|
<TableColumn key={index} className={styles.header} style={{ ...column.style }}>
|
|
{column.label}
|
|
</TableColumn>
|
|
);
|
|
}}
|
|
</TableHeader>
|
|
<TableBody>
|
|
{(row, keys, rowIndex) => {
|
|
row.created = formatDistance(new Date(row.createdAt), new Date(), {
|
|
addSuffix: true,
|
|
});
|
|
|
|
row.action = (
|
|
<div className={styles.actions}>
|
|
<Link href={`/users/${row.id}`} shallow>
|
|
<a>
|
|
<Button>
|
|
<Icon icon="arrow-right" />
|
|
Settings
|
|
</Button>
|
|
</a>
|
|
</Link>
|
|
</div>
|
|
);
|
|
|
|
return (
|
|
<TableRow key={rowIndex} data={row} keys={keys}>
|
|
{(data, key, colIndex) => {
|
|
return (
|
|
<TableCell
|
|
key={colIndex}
|
|
className={styles.cell}
|
|
style={{ ...columns[colIndex]?.style }}
|
|
>
|
|
{data[key]}
|
|
</TableCell>
|
|
);
|
|
}}
|
|
</TableRow>
|
|
);
|
|
}}
|
|
</TableBody>
|
|
</Table>
|
|
)}
|
|
{!hasData && (
|
|
<EmptyPlaceholder className={styles.empty} msg="You don't have any Users.">
|
|
<Button variant="primary" onClick={onAddKeyClick}>
|
|
<Icon icon="plus" /> Create User
|
|
</Button>
|
|
</EmptyPlaceholder>
|
|
)}
|
|
</>
|
|
);
|
|
}
|