import { Page } from 'web/components/page' import { Grid, _ as r } from 'gridjs-react' import 'gridjs/dist/theme/mermaid.css' import { html } from 'gridjs' import dayjs from 'dayjs' import { usePrivateUsers, useUsers } from 'web/hooks/use-users' import Custom404 from './404' import { useContracts } from 'web/hooks/use-contracts' import { mapKeys } from 'lodash' import { useAdmin } from 'web/hooks/use-admin' import { contractPath } from 'web/lib/firebase/contracts' function avatarHtml(avatarUrl: string) { return `` } function UsersTable() { const users = useUsers() const privateUsers = usePrivateUsers() // Map private users by user id const privateUsersById = mapKeys(privateUsers, 'id') console.log('private users by id', privateUsersById) // For each user, set their email from the PrivateUser const fullUsers = users .map((user) => { return { email: privateUsersById[user.id]?.email, ...user } }) .sort((a, b) => b.createdTime - a.createdTime) function exportCsv() { const csv = fullUsers.map((u) => [u.email, u.name].join(', ')).join('\n') const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = 'manifold-users.csv' a.click() URL.revokeObjectURL(url) } return ( <> html(avatarHtml(cell as string)), }, { id: 'username', name: 'Username', formatter: (cell) => html(`@${cell}`), }, { id: 'email', name: 'Email', }, { id: 'createdTime', name: 'Created Time', formatter: (cell) => html( `${dayjs(cell as number).format( 'MMM D, h:mma' )}` ), }, { id: 'balance', name: 'Balance', formatter: (cell) => (cell as number).toFixed(0), }, { id: 'id', name: 'ID', formatter: (cell) => html(`${cell}`), }, ]} search={true} sort={true} pagination={{ enabled: true, limit: 25, }} /> ) } function ContractsTable() { const contracts = useContracts() ?? [] // Sort users by createdTime descending, by default const displayContracts = contracts .sort((a, b) => b.createdTime - a.createdTime) .map((contract) => { // Render a clickable question. See https://gridjs.io/docs/examples/react-cells for docs const questionLink = r(
{contract.question}
) return { questionLink, ...contract } }) return ( html(`@${cell}`), }, { id: 'questionLink', name: 'Question', }, { id: 'volume24Hours', name: '24h vol', formatter: (cell) => (cell as number).toFixed(0), }, { id: 'createdTime', name: 'Created time', formatter: (cell) => html( `${dayjs(cell as number).format( 'MMM D, h:mma' )}` ), }, { id: 'closeTime', name: 'Close time', formatter: (cell) => html( `${dayjs(cell as number).format( 'MMM D, h:mma' )}` ), }, { id: 'resolvedTime', name: 'Resolved time', formatter: (cell) => html( `${dayjs(cell as number).format( 'MMM D, h:mma' )}` ), }, { id: 'visibility', name: 'Visibility', formatter: (cell) => cell, }, { id: 'id', name: 'ID', formatter: (cell) => html(`${cell}`), }, ]} search={true} sort={true} pagination={{ enabled: true, limit: 25, }} /> ) } export default function Admin() { return useAdmin() ? ( ) : ( ) }