decap-cms-core
Version:
Decap CMS core application, see decap-cms package for the main distribution.
144 lines (134 loc) • 4.03 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import styled from '@emotion/styled';
import MediaLibrarySearch from './MediaLibrarySearch';
import MediaLibraryHeader from './MediaLibraryHeader';
import {
UploadButton,
DeleteButton,
DownloadButton,
CopyToClipBoardButton,
InsertButton,
} from './MediaLibraryButtons';
const LibraryTop = styled.div`
position: relative;
display: flex;
flex-direction: column;
`;
const RowContainer = styled.div`
display: flex;
justify-content: space-between;
`;
const ButtonsContainer = styled.div`
flex-shrink: 0;
`;
function MediaLibraryTop({
t,
onClose,
privateUpload,
forImage,
onDownload,
onUpload,
query,
onSearchChange,
onSearchKeyDown,
searchDisabled,
onDelete,
canInsert,
onInsert,
hasSelection,
isPersisting,
isDeleting,
selectedFile,
}) {
const shouldShowButtonLoader = isPersisting || isDeleting;
const uploadEnabled = !shouldShowButtonLoader;
const deleteEnabled = !shouldShowButtonLoader && hasSelection;
const uploadButtonLabel = isPersisting
? t('mediaLibrary.mediaLibraryModal.uploading')
: t('mediaLibrary.mediaLibraryModal.upload');
const deleteButtonLabel = isDeleting
? t('mediaLibrary.mediaLibraryModal.deleting')
: t('mediaLibrary.mediaLibraryModal.deleteSelected');
const downloadButtonLabel = t('mediaLibrary.mediaLibraryModal.download');
const insertButtonLabel = t('mediaLibrary.mediaLibraryModal.chooseSelected');
return (
<LibraryTop>
<RowContainer>
<MediaLibraryHeader
onClose={onClose}
title={`${privateUpload ? t('mediaLibrary.mediaLibraryModal.private') : ''}${
forImage
? t('mediaLibrary.mediaLibraryModal.images')
: t('mediaLibrary.mediaLibraryModal.mediaAssets')
}`}
isPrivate={privateUpload}
/>
<ButtonsContainer>
<CopyToClipBoardButton
disabled={!hasSelection}
path={selectedFile.path}
name={selectedFile.name}
draft={selectedFile.draft}
t={t}
/>
<DownloadButton onClick={onDownload} disabled={!hasSelection}>
{downloadButtonLabel}
</DownloadButton>
<UploadButton
label={uploadButtonLabel}
imagesOnly={forImage}
onChange={onUpload}
disabled={!uploadEnabled}
/>
</ButtonsContainer>
</RowContainer>
<RowContainer>
<MediaLibrarySearch
value={query}
onChange={onSearchChange}
onKeyDown={onSearchKeyDown}
placeholder={t('mediaLibrary.mediaLibraryModal.search')}
disabled={searchDisabled}
/>
<ButtonsContainer>
<DeleteButton onClick={onDelete} disabled={!deleteEnabled}>
{deleteButtonLabel}
</DeleteButton>
{!canInsert ? null : (
<InsertButton onClick={onInsert} disabled={!hasSelection}>
{insertButtonLabel}
</InsertButton>
)}
</ButtonsContainer>
</RowContainer>
</LibraryTop>
);
}
MediaLibraryTop.propTypes = {
t: PropTypes.func.isRequired,
onClose: PropTypes.func.isRequired,
privateUpload: PropTypes.bool,
forImage: PropTypes.bool,
onDownload: PropTypes.func.isRequired,
onUpload: PropTypes.func.isRequired,
query: PropTypes.string,
onSearchChange: PropTypes.func.isRequired,
onSearchKeyDown: PropTypes.func.isRequired,
searchDisabled: PropTypes.bool.isRequired,
onDelete: PropTypes.func.isRequired,
canInsert: PropTypes.bool,
onInsert: PropTypes.func.isRequired,
hasSelection: PropTypes.bool.isRequired,
isPersisting: PropTypes.bool,
isDeleting: PropTypes.bool,
selectedFile: PropTypes.oneOfType([
PropTypes.shape({
path: PropTypes.string.isRequired,
draft: PropTypes.bool.isRequired,
name: PropTypes.string.isRequired,
}),
PropTypes.shape({}),
]),
};
export default MediaLibraryTop;