jellyfish-web/src/components/dashboard/users/UserCardBox.tsx

98 lines
3.3 KiB
TypeScript
Raw Normal View History

2022-09-16 12:47:59 -04:00
import type { UserDto } from '@jellyfin/sdk/lib/generated-client';
2021-10-02 16:46:46 +03:00
import React, { FunctionComponent } from 'react';
import { formatDistanceToNow } from 'date-fns';
2021-10-07 21:08:21 +03:00
import { localeWithSuffix } from '../../../scripts/dfnshelper';
import globalize from '../../../scripts/globalize';
import cardBuilder from '../../cardbuilder/cardBuilder';
2022-06-29 18:26:33 +03:00
import IconButtonElement from '../../../elements/IconButtonElement';
2022-06-29 02:17:10 +03:00
import escapeHTML from 'escape-html';
2021-10-02 16:46:46 +03:00
2022-02-18 14:27:39 +03:00
const createLinkElement = ({ user, renderImgUrl }: { user: UserDto, renderImgUrl: string }) => ({
2021-10-02 16:46:46 +03:00
__html: `<a
is="emby-linkbutton"
class="cardContent"
2022-06-09 14:54:39 -04:00
href="#/useredit.html?userId=${user.Id}"
2021-10-02 16:46:46 +03:00
>
${renderImgUrl}
</a>`
});
type IProps = {
2022-02-28 09:58:52 -05:00
user?: UserDto;
2021-10-02 16:46:46 +03:00
}
2022-02-28 09:58:52 -05:00
const getLastSeenText = (lastActivityDate?: string | null) => {
2021-10-02 16:46:46 +03:00
if (lastActivityDate) {
return globalize.translate('LastSeen', formatDistanceToNow(Date.parse(lastActivityDate), localeWithSuffix));
}
return '';
};
2022-02-28 09:58:52 -05:00
const UserCardBox: FunctionComponent<IProps> = ({ user = {} }: IProps) => {
2021-10-02 16:46:46 +03:00
let cssClass = 'card squareCard scalableCard squareCard-scalable';
2022-02-28 09:58:52 -05:00
if (user.Policy?.IsDisabled) {
2021-10-02 16:46:46 +03:00
cssClass += ' grayscale';
}
let imgUrl;
2022-02-28 09:58:52 -05:00
if (user.PrimaryImageTag && user.Id) {
2021-10-02 16:46:46 +03:00
imgUrl = window.ApiClient.getUserImageUrl(user.Id, {
width: 300,
tag: user.PrimaryImageTag,
type: 'Primary'
});
}
let imageClass = 'cardImage';
2022-02-28 09:58:52 -05:00
if (user.Policy?.IsDisabled) {
2021-10-02 16:46:46 +03:00
imageClass += ' disabledUser';
}
const lastSeen = getLastSeenText(user.LastActivityDate);
const renderImgUrl = imgUrl ?
`<div class='${imageClass}' style='background-image:url(${imgUrl})'></div>` :
`<div class='${imageClass} ${cardBuilder.getDefaultBackgroundClass(user.Name)} flex align-items-center justify-content-center'>
2022-02-24 20:15:24 +03:00
<span class='material-icons cardImageIcon person' aria-hidden='true'></span>
2021-10-02 16:46:46 +03:00
</div>`;
return (
<div data-userid={user.Id} className={cssClass}>
<div className='cardBox visualCardBox'>
<div className='cardScalable visualCardBox-cardScalable'>
<div className='cardPadder cardPadder-square'></div>
<div
dangerouslySetInnerHTML={createLinkElement({
user: user,
renderImgUrl: renderImgUrl
})}
/>
</div>
<div className='cardFooter visualCardBox-cardFooter'>
2022-06-29 02:17:10 +03:00
<div
style={{textAlign: 'right', float: 'right', paddingTop: '5px'}}
>
<IconButtonElement
is='paper-icon-button-light'
className='btnUserMenu flex-shrink-zero'
icon='more_vert'
2021-10-02 16:46:46 +03:00
/>
</div>
2022-06-29 02:17:10 +03:00
<div className='cardText'>
<span>{escapeHTML(user.Name)}</span>
</div>
2021-10-02 16:46:46 +03:00
<div className='cardText cardText-secondary'>
2022-06-29 02:17:10 +03:00
<span>{lastSeen != '' ? lastSeen : ''}</span>
2021-10-02 16:46:46 +03:00
</div>
</div>
</div>
</div>
);
};
export default UserCardBox;