import React, { createRef } from "react"; import { NgIf, Icon, Input } from "../../components/"; import { Share } from "../../model/"; import { randomString, notify, absoluteToRelative, copyToClipboard, filetype, pathBuilder, } from "../../helpers/"; import { t } from "../../locales/"; import "./share.scss"; export class ShareComponent extends React.Component { constructor(props) { super(props); this.state = this.resetState(); this.state.existings = []; this.$input = createRef(); } resetState() { return { role: null, path: null, id: randomString(7), url: null, users: null, password: null, expire: null, can_manage_own: null, can_share: null, can_read: null, can_write: null, can_upload: null, show_advanced: false, }; } componentDidMount() { Share.all(this.props.path).then((existings) => { this.refreshModal(); this.setState({ existings: existings.sort((a, b) => { return a.path.split("/").length > b.path.split("/").length; }), role: existings.length === 0 ? window.CONFIG["share_default_access"] : null, }); }); } updateState(key, value) { if (key === "role") { this.setState(this.resetState()); } if (this.state[key] === value) { this.setState({ [key]: null }); } else { this.setState({ [key]: value }); } if ((key === "role" && value) || (key === "show_advanced")) { this.refreshModal(); } } refreshModal() { window.dispatchEvent(new Event("resize")); } onLoad(link) { const st = Object.assign({}, link); st.show_advanced = false; st.link_id = st.id; st.role = (st.role || "").toLowerCase(); this.setState(st); } onDeleteLink(link_id) { let removed = null; let i = 0; for (i=0; i < this.state.existings.length; i++) { if (this.state.existings[i].id === link_id) { removed = Object.assign({}, this.state.existings[i]); break; } } if (removed !== null) { this.state.existings.splice(i, 1); this.setState({ existings: this.state.existings }); } return Share.remove(link_id).catch((err) => { this.setState({ existings: [removed].concat(this.state.existings) }); notify.send(err, "error"); }); } copyLinkInClipboard(link) { copyToClipboard(link); notify.send(t("The link was copied in the clipboard"), "INFO"); } onRegisterLink(e) { this.copyLinkInClipboard(this.$input.current.value); const link = { role: this.state.role, path: this.props.path, id: this.state.url || this.state.id, url: this.state.url, users: this.state.users || null, password: this.state.password || null, expire: function(e) { if (typeof e === "string") { return new Date(e).getTime(); } return null; }(this.state.expire), can_manage_own: this.state.can_manage_own, can_share: this.state.can_share, can_read: function(r) { if (r === "viewer") return true; else if (r === "editor") return true; return false; }(this.state.role), can_write: function(r) { if (r === "editor") return true; return false; }(this.state.role), can_upload: function(r) { if (r === "uploader") return true; else if (r === "editor") return true; return false; }(this.state.role), }; const links = [{...link, path: "" }]; for (let i=0; i { if (this.state.url !== null && this.state.url !== this.state.id) { this.onDeleteLink(this.state.id); } return Promise.resolve(); }) .then(() => this.setState(this.resetState())) .catch((err) => { notify.send(err, "error"); const validLinks = this.state.existings.slice(1, this.state.existings.length); this.setState({ existings: validLinks }); }); } render() { const urlify = function(str) { if (typeof str !== "string") return ""; str = str.replace(/\s+/g, "+"); str = str.replace(/[^a-zA-Z0-9\+-_]/g, "_"); str = str.replace(/_+/g, "_"); return str; }; const datify = function(str) { if (!str) return str; const d = new Date(str); // old browser not implementing input[type=date] elements // may return invalid date, if (isNaN(d.getDate())) return str; const pad2 = (a) => ("00"+a).slice(-2); const pad4 = (a) => ("0000"+a).slice(-4); return [pad4(d.getFullYear()), pad2(d.getMonth()+1), pad2(d.getDate())].join("-"); }; return (

{ t("Create a New Link") }

{ t("Viewer") }
{ t("Editor") }
{ this.props.type === "file" ? null :
{ t("Uploader") }
}
0}>

{ t("Existing Links") }

5 ? "90px" : "inherit" }}> { this.state.existings && this.state.existings.map((link, i) => { return (
{ t(link.role) } { pathBuilder(this.props.path, link.path.replace(/^\//, ""), this.props.type) }
); }) }

{ t("Restrictions") }

{ t("Advanced") }

{ t("Advanced") }

this.updateState("url", urlify(val))} inputType="text" />
); } } const SuperCheckbox = (props) => { const onCheckboxTick = (e) => { if (props.inputType === undefined) { return props.onChange(e.target.checked ? true : false); } return props.onChange(e.target.checked ? "" : null); }; const onValueChange = (e) => { props.onChange(e.target.value); }; const _is_expended = function(val) { return val === null || val === undefined || val === false ? false : true; }(props.value); return (
); };