Files
Homarr/src/widgets/media-server/TableRow.tsx
2023-09-03 16:23:40 +02:00

64 lines
1.9 KiB
TypeScript

import { Avatar, Collapse, Flex, Text, createStyles } from '@mantine/core';
import { useState } from 'react';
import { AppAvatar } from '~/components/AppAvatar';
import { GenericSessionInfo } from '~/types/api/media-server/session-info';
import { AppType } from '~/types/app';
import { DetailCollapseable } from './DetailCollapseable';
import { NowPlayingDisplay } from './NowPlayingDisplay';
interface TableRowProps {
session: GenericSessionInfo;
app: AppType | undefined;
}
export const TableRow = ({ session, app }: TableRowProps) => {
const [collapseOpen, setCollapseOpen] = useState(false);
const hasUserThumb = session.userProfilePicture !== undefined;
const { classes } = useStyles();
return (
<>
<tr className={classes.dataRow} onClick={() => setCollapseOpen(!collapseOpen)}>
<td>
<Flex wrap="nowrap" gap="xs">
{app?.appearance.iconUrl && <AppAvatar iconUrl={app.appearance.iconUrl} />}
<Text lineClamp={1}>{session.sessionName}</Text>
</Flex>
</td>
<td>
<Flex wrap="nowrap" gap="sm">
{hasUserThumb ? (
<Avatar src={session.userProfilePicture} size="sm" />
) : (
<Avatar src={null} alt={session.username} size="sm">
{session.username?.at(0)?.toUpperCase()}
</Avatar>
)}
<Text style={{ whiteSpace: 'nowrap' }}>{session.username}</Text>
</Flex>
</td>
<td>
<NowPlayingDisplay session={session} />
</td>
</tr>
<tr>
<td className={classes.collapseTableDataCell} colSpan={3}>
<Collapse in={collapseOpen} w="100%">
<DetailCollapseable session={session} />
</Collapse>
</td>
</tr>
</>
);
};
const useStyles = createStyles(() => ({
dataRow: {
cursor: 'pointer',
},
collapseTableDataCell: {
border: 'none !important',
padding: '0 !important',
},
}));