UNPKG

@pnp/spfx-controls-react

Version:

Reusable React controls for SharePoint Framework solutions

121 lines • 7.08 kB
import { __assign, __awaiter, __generator, __spreadArray } from "tslib"; /* eslint-disable no-undef */ /* eslint-disable @typescript-eslint/explicit-function-return-type */ /* eslint-disable @typescript-eslint/no-explicit-any */ import * as React from 'react'; import strings from 'ControlStrings'; import { useAtom } from 'jotai'; import { isEqual, pullAllWith, } from 'lodash'; import { PrimaryButton } from '@fluentui/react/lib/Button'; import { Stack } from '@fluentui/react/lib/Stack'; import { ScrollablePane, ScrollbarVisibility, } from '@fluentui/react/lib/ScrollablePane'; import { DragDropFiles } from '../../../dragDropFiles'; import { globalState } from '../../jotai/atoms'; import { FileInfo } from '../File/FileInfo'; import { FileCommandBar } from '../FileCommandBar/FileCommandBar'; import { NoDocuments } from '../NoDocuments/NoDocuments'; import { useDocumentListStyles } from './useDocumentListStyles'; export var DocumentList = function (props) { var _a = useDocumentListStyles(), documentListStyles = _a.documentListStyles, scollableContainerStyles = _a.scollableContainerStyles, bootomContainerStyles = _a.bootomContainerStyles; var _b = useAtom(globalState), appGlobalState = _b[0], setGlobalState = _b[1]; var _c = React.useState([]), renderFiles = _c[0], setRenderFiles = _c[1]; var selectedFiles = appGlobalState.selectedFiles, files = appGlobalState.files, containerWidth = appGlobalState.containerWidth; var currentPage = React.useRef(0); var currentFiles = React.useRef([]); var onUploadFiles = props.onUploadFiles; var currentDivWidth = React.useRef(0); var divRef = React.useRef(); var isSelected = React.useCallback(function (file) { return selectedFiles.some(function (selectedFile) { return isEqual(selectedFile, file); }); }, [selectedFiles]); var onFileSelected = React.useCallback(function (isChecked, file) { var copySelectedFiles = selectedFiles.slice(); if (!isChecked) { var newFiles_1 = pullAllWith(copySelectedFiles, [file], isEqual); setGlobalState(function (prevState) { return __assign(__assign({}, prevState), { selectedFiles: newFiles_1 }); }); } else { setGlobalState(function (prevState) { return __assign(__assign({}, prevState), { selectedFiles: __spreadArray(__spreadArray([], copySelectedFiles, true), [file], false) }); }); } }, [setGlobalState, selectedFiles]); var renderFilesPerPage = React.useCallback(function () { var renderfiles = []; for (var i = 0; i < files.length; i++) { var file = files[i]; renderfiles.push(React.createElement(FileInfo, { key: "".concat(file.name, "-").concat(i), fileInfo: file, onSelected: onFileSelected, isSelected: isSelected(file) })); } setRenderFiles(renderfiles); }, [files, onFileSelected, isSelected]); var onDrop = React.useCallback(function (acceptedFiles) { return __awaiter(void 0, void 0, void 0, function () { var copyFiles, newsFiles; return __generator(this, function (_a) { copyFiles = files.slice(); newsFiles = __spreadArray(__spreadArray([], copyFiles, true), acceptedFiles, true); currentFiles.current = newsFiles; setGlobalState(function (prevState) { return __assign(__assign({}, prevState), { files: newsFiles }); }); return [2 /*return*/]; }); }); }, [files, setGlobalState]); var onDelete = React.useCallback(function () { currentPage.current = 0; var newFiles = pullAllWith(files, selectedFiles, isEqual); setGlobalState(function (prevState) { return __assign(__assign({}, prevState), { files: newFiles, selectedFiles: [] }); }); }, [files, selectedFiles, setGlobalState]); var onUpload = React.useCallback(function (file) { var newFiles = __spreadArray(__spreadArray([], currentFiles.current, true), [file], false); setGlobalState(function (prevState) { return __assign(__assign({}, prevState), { files: newFiles }); }); }, [setGlobalState]); var onSelectAll = React.useCallback(function (isAllSelected) { if (isAllSelected) { setGlobalState(function (prevState) { return __assign(__assign({}, prevState), { selectedFiles: files }); }); } else { setGlobalState(function (prevState) { return __assign(__assign({}, prevState), { selectedFiles: [] }); }); } }, [files, setGlobalState]); var getContainerWidth = React.useCallback(function () { var _a, _b, _c, _d; if (currentDivWidth.current !== ((_a = divRef.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) && ((_b = divRef.current) === null || _b === void 0 ? void 0 : _b.offsetWidth) !== undefined) { currentDivWidth.current = (_d = (_c = divRef.current) === null || _c === void 0 ? void 0 : _c.offsetWidth) !== null && _d !== void 0 ? _d : 0; setGlobalState(function (prevState) { return __assign(__assign({}, prevState), { containerWidth: currentDivWidth.current }); }); } }, [setGlobalState]); React.useEffect(function () { renderFilesPerPage(); document.addEventListener("change", function () { getContainerWidth(); }); window.addEventListener("resize", function () { getContainerWidth(); }); }, [files, selectedFiles, containerWidth, renderFilesPerPage, getContainerWidth]); getContainerWidth(); return (React.createElement(React.Fragment, null, React.createElement("div", { ref: divRef }, React.createElement(FileCommandBar, { onDelete: onDelete, onSelectedAll: onSelectAll, onUpload: onUpload }), React.createElement(ScrollablePane, { scrollbarVisibility: ScrollbarVisibility.auto, styles: scollableContainerStyles }, React.createElement("div", { className: documentListStyles.documentList }, React.createElement(DragDropFiles, { enable: true, onDrop: onDrop }, React.createElement(Stack, { tokens: { padding: 20 } }, renderFiles.length ? (React.createElement("div", { className: documentListStyles.filesContainerGrid }, renderFiles)) : (React.createElement(NoDocuments, null)))))), React.createElement(Stack, { styles: bootomContainerStyles, horizontalAlign: "end", tokens: { childrenGap: 20 } }, React.createElement("div", { className: documentListStyles.separator }), React.createElement(React.Fragment, null, React.createElement(PrimaryButton, { disabled: !selectedFiles.length, iconProps: { iconName: "upload" }, text: strings.UploadFilesUploadButtonLabel, onClick: function () { return onUploadFiles(selectedFiles); } })))))); }; //# sourceMappingURL=DocumentList.js.map