import * as React from "react"; import * as Constants from "~/common/constants"; import * as Strings from "~/common/strings"; import * as System from "~/components/system"; import * as Store from "~/common/store"; import * as SVG from "~/common/svg"; import * as Events from "~/common/custom-events"; import { css } from "@emotion/react"; import { DataMeterBar } from "~/components/core/DataMeter"; import { SidebarWarningMessage } from "~/components/core/WarningMessage"; import { FileTypeGroup } from "~/components/core/FileTypeIcon"; const STYLES_FILE_HIDDEN = css` height: 1px; width: 1px; opacity: 0; visibility: hidden; position: fixed; top: -1px; left: -1px; `; const STYLES_FILE_LINE = css` display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 12px 16px; background-color: ${Constants.system.white}; border-bottom: 1px solid ${Constants.system.foreground}; `; const STYLES_FILE_NAME = css` min-width: 10%; width: 100%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; font-size: 0.9rem; font-family: ${Constants.font.medium}; `; const STYLES_LEFT = css` width: 100%; min-width: 10%; display: flex; align-items: center; `; const STYLES_RIGHT = css` flex-shrink: 0; display: flex; align-items: center; `; const STYLES_FILE_STATUS = css` flex-shrink: 0; margin-right: 16px; display: flex; align-items: center; `; const STYLES_BAR_CONTAINER = css` background: ${Constants.system.white}; border-radius: 4px; padding: 16px; margin-top: 48px; `; const STYLES_PERFORMANCE = css` font-family: ${Constants.font.code}; font-size: 12px; display: block; margin: 0 0 8px 0; `; export default class SidebarAddFileToBucket extends React.Component { _handleUpload = (e) => { this.props.onUpload({ files: e.target.files, slate: this.props.current && this.props.current.slateId ? { id: this.props.current.slateId } : null, }); this.props.onCancel(); }; _handleCancel = (e, key) => { e.preventDefault(); e.stopPropagation(); Events.dispatchCustomEvent({ name: `cancel-${key}` }); //NOTE(martina): so that will cancel if is in the middle of uploading Store.setCancelled(key); //NOTE(martina): so that will cancel if hasn't started uploading yet this.props.onAction({ type: "REGISTER_FILE_CANCELLED", value: key }); //NOTE(martina): so that fileLoading registers it }; render() { let loaded = 0; let total = 0; if (this.props.fileLoading) { for (let file of Object.values(this.props.fileLoading)) { if (typeof file.loaded === "number" && typeof file.total === "number") { total += file.total; loaded += file.loaded; } } } return ( {this.props.fileLoading && Object.keys(this.props.fileLoading).length ? "Upload progress" : "Upload data"} {this.props.fileLoading && Object.keys(this.props.fileLoading).length ? null : ( Click below or drop a file anywhere on the page to upload a file {this.props.current && (this.props.current.slatename || (this.props.current.data && this.props.current.data.name)) ? ( {" "} to {Strings.getPresentationSlateName(this.props.current)} ) : ( "" )} . Add file
)} {this.props.fileLoading && Object.keys(this.props.fileLoading).length ? (
{Strings.bytesToSize(loaded)} / {Strings.bytesToSize(total)}
) : null}
{this.props.fileLoading ? Object.entries(this.props.fileLoading).map((entry) => { let file = entry[1]; return (
{file.failed ? ( ) : file.cancelled ? ( ) : file.loaded === file.total ? ( ) : ( )}
{file.name}
{file.loaded === file.total || file.failed || file.cancelled ? (
) : ( this._handleCancel(e, entry[0])} > )}
); }) : null}
); } }