2023-07-21 18:08:40 +09:00
|
|
|
import { Avatar, Collapse, Flex, Text, createStyles } from '@mantine/core';
|
2023-02-15 22:12:49 +01:00
|
|
|
import { useState } from 'react';
|
2023-07-21 18:08:40 +09:00
|
|
|
|
2023-09-03 16:23:40 +02:00
|
|
|
import { AppAvatar } from '~/components/AppAvatar';
|
|
|
|
|
import { GenericSessionInfo } from '~/types/api/media-server/session-info';
|
|
|
|
|
import { AppType } from '~/types/app';
|
2023-02-15 22:12:49 +01:00
|
|
|
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>
|
|
|
|
|
)}
|
2023-06-10 00:08:50 +02:00
|
|
|
<Text style={{ whiteSpace: 'nowrap' }}>{session.username}</Text>
|
2023-02-15 22:12:49 +01:00
|
|
|
</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',
|
|
|
|
|
},
|
|
|
|
|
}));
|