You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.9 KiB
TypeScript
100 lines
2.9 KiB
TypeScript
// Copyright (C) 2022 CVAT.ai Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import React, { useEffect } from 'react';
|
|
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
import { PictureOutlined } from '@ant-design/icons';
|
|
import Spin from 'antd/lib/spin';
|
|
import { getJobPreviewAsync } from 'actions/jobs-actions';
|
|
import { getTaskPreviewAsync } from 'actions/tasks-actions';
|
|
import { getProjectsPreviewAsync } from 'actions/projects-actions';
|
|
import { getCloudStoragePreviewAsync } from 'actions/cloud-storage-actions';
|
|
import {
|
|
CombinedState, Job, Task, Project, CloudStorage,
|
|
} from 'reducers';
|
|
|
|
interface Props {
|
|
job?: Job | undefined;
|
|
task?: Task | undefined;
|
|
project?: Project | undefined;
|
|
cloudStorage?: CloudStorage | undefined;
|
|
onClick?: (event: React.MouseEvent) => void;
|
|
loadingClassName?: string;
|
|
emptyPreviewClassName?: string;
|
|
previewWrapperClassName?: string;
|
|
previewClassName?: string;
|
|
}
|
|
|
|
export default function Preview(props: Props): JSX.Element {
|
|
const dispatch = useDispatch();
|
|
|
|
const {
|
|
job,
|
|
task,
|
|
project,
|
|
cloudStorage,
|
|
onClick,
|
|
loadingClassName,
|
|
emptyPreviewClassName,
|
|
previewWrapperClassName,
|
|
previewClassName,
|
|
} = props;
|
|
|
|
const preview = useSelector((state: CombinedState) => {
|
|
if (job !== undefined) {
|
|
return state.jobs.previews[job.id];
|
|
} if (project !== undefined) {
|
|
return state.projects.previews[project.id];
|
|
} if (task !== undefined) {
|
|
return state.tasks.previews[task.id];
|
|
} if (cloudStorage !== undefined) {
|
|
return state.cloudStorages.previews[cloudStorage.id];
|
|
}
|
|
return '';
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (preview === undefined) {
|
|
if (job !== undefined) {
|
|
dispatch(getJobPreviewAsync(job));
|
|
} else if (project !== undefined) {
|
|
dispatch(getProjectsPreviewAsync(project));
|
|
} else if (task !== undefined) {
|
|
dispatch(getTaskPreviewAsync(task));
|
|
} else if (cloudStorage !== undefined) {
|
|
dispatch(getCloudStoragePreviewAsync(cloudStorage));
|
|
}
|
|
}
|
|
}, [preview]);
|
|
|
|
if (!preview || (preview && preview.fetching)) {
|
|
return (
|
|
<div className={loadingClassName || ''} aria-hidden>
|
|
<Spin size='default' />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (preview.initialized && !preview.preview) {
|
|
return (
|
|
<div className={emptyPreviewClassName || ''} aria-hidden>
|
|
<PictureOutlined />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div className={previewWrapperClassName || ''} aria-hidden>
|
|
<img
|
|
className={previewClassName || ''}
|
|
src={preview.preview}
|
|
onClick={onClick}
|
|
alt='Preview image'
|
|
aria-hidden
|
|
/>
|
|
</div>
|
|
);
|
|
}
|