/**
* @flow
* @file Versions Item component
* @author Box
*/
import * as React from 'react';
import { FormattedMessage } from 'react-intl';
import messages from './messages';
import selectors from '../../common/selectors/version';
import sizeUtil from '../../../utils/size';
import VersionsItemActions from './VersionsItemActions';
import VersionsItemButton from './VersionsItemButton';
import VersionsItemBadge from './VersionsItemBadge';
import VersionsItemRetention from './VersionsItemRetention';
import { ReadableTime } from '../../../components/time';
import {
FILE_REQUEST_NAME,
VERSION_DELETE_ACTION,
VERSION_PROMOTE_ACTION,
VERSION_RESTORE_ACTION,
VERSION_UPLOAD_ACTION,
} from '../../../constants';
import type { BoxItemVersion } from '../../../common/types/core';
import type { VersionActionCallback } from './flowTypes';
import './VersionsItem.scss';
type Props = {
fileId: string,
isArchived?: boolean,
isCurrent?: boolean,
isSelected?: boolean,
isWatermarked?: boolean,
onDelete?: VersionActionCallback,
onDownload?: VersionActionCallback,
onPreview?: VersionActionCallback,
onPromote?: VersionActionCallback,
onRestore?: VersionActionCallback,
version: BoxItemVersion,
versionCount: number,
versionLimit: number,
};
const ACTION_MAP = {
[VERSION_DELETE_ACTION]: messages.versionDeletedBy,
[VERSION_RESTORE_ACTION]: messages.versionRestoredBy,
[VERSION_PROMOTE_ACTION]: messages.versionPromotedBy,
[VERSION_UPLOAD_ACTION]: messages.versionUploadedBy,
};
const FILE_EXTENSIONS_OFFICE = ['xlsb', 'xlsm', 'xlsx'];
const FIVE_MINUTES_MS = 5 * 60 * 1000;
const VersionsItem = ({
fileId,
isArchived = false,
isCurrent = false,
isSelected = false,
isWatermarked = false,
onDelete,
onDownload,
onPreview,
onPromote,
onRestore,
version,
versionCount,
versionLimit,
}: Props) => {
const {
created_at: createdAt,
extension,
id: versionId,
is_download_available,
permissions = {},
restored_at: restoredAt,
retention,
size,
trashed_at: trashedAt,
version_number: versionNumber,
version_promoted: versionPromoted,
} = version;
const { can_delete, can_download, can_preview, can_upload } = permissions;
const { applied_at: retentionAppliedAt, disposition_at: retentionDispositionAt } = retention || {};
const retentionDispositionAtDate = retentionDispositionAt && new Date(retentionDispositionAt);
// Version info helpers
const versionAction = selectors.getVersionAction(version);
const versionInteger = versionNumber ? parseInt(versionNumber, 10) : 1;
const versionTime = restoredAt || trashedAt || createdAt;
const versionTimestamp = versionTime && new Date(versionTime).getTime();
const versionUserName = selectors.getVersionUser(version).name || (