From 8a9c802dcbf47520644a6bc7ba61f933e75aff52 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 24 Feb 2023 14:33:15 +0000 Subject: [PATCH] improve `PostCreator` uploader --- .../app/src/components/PostCreator/index.jsx | 169 +++++++++------ .../app/src/components/PostCreator/index.less | 193 ++++++++++-------- 2 files changed, 209 insertions(+), 153 deletions(-) diff --git a/packages/app/src/components/PostCreator/index.jsx b/packages/app/src/components/PostCreator/index.jsx index cccb0b91..50d5b36d 100755 --- a/packages/app/src/components/PostCreator/index.jsx +++ b/packages/app/src/components/PostCreator/index.jsx @@ -18,14 +18,13 @@ const DEFAULT_POST_POLICY = { } export default (props) => { - const api = window.app.api.withEndpoints("main") + const api = window.app.cores.api.withEndpoints("main") const creatorRef = React.useRef(null) const [pending, setPending] = React.useState([]) const [loading, setLoading] = React.useState(false) const [uploaderVisible, setUploaderVisible] = React.useState(false) - const [focused, setFocused] = React.useState(false) const [postMessage, setPostMessage] = React.useState("") const [postAttachments, setPostAttachments] = React.useState([]) @@ -45,12 +44,25 @@ export default (props) => { setPostingPolicy(policy) } + const canSubmit = () => { + const messageLengthValid = postMessage.length !== 0 && postMessage.length < postingPolicy.maxMessageLength + + if (pending.length !== 0) { + return false + } + + if (!messageLengthValid && postAttachments.length === 0) { + return false + } + + return true + } + const submit = async () => { if (!canSubmit()) return setLoading(true) setUploaderVisible(false) - setFocused(false) const payload = { message: postMessage, @@ -78,7 +90,7 @@ export default (props) => { const onUploadFile = async (req) => { // hide uploader - //setUploaderVisible(false) + toogleUploaderVisibility(false) // get file data const file = req.file @@ -103,20 +115,6 @@ export default (props) => { } } - const canSubmit = () => { - const messageLengthValid = postMessage.length !== 0 && postMessage.length < postingPolicy.maxMessageLength - - if (pending.length !== 0) { - return false - } - - if (!messageLengthValid && postAttachments.length === 0) { - return false - } - - return true - } - const removeAttachment = (file_uid) => { setPostAttachments(postAttachments.filter((file) => file.uid !== file_uid)) } @@ -145,22 +143,13 @@ export default (props) => { } } - const onDrop = (event) => { - event.preventDefault() - setUploaderVisible(true) - - console.log(event) - - const files = event.dataTransfer.files - - console.log(files) - } - const onUploaderChange = (change) => { setFileList(change.fileList) switch (change.file.status) { case "uploading": { + toogleUploaderVisibility(false) + setPending([...pending, change.file.uid]) uploaderScrollToEnd() @@ -175,6 +164,7 @@ export default (props) => { // update post data addAttachment(change.file.response.files) + // scroll to end uploaderScrollToEnd() break @@ -200,12 +190,14 @@ export default (props) => { setPostMessage(event.target.value) } - const toggleUploader = (to) => { - setUploaderVisible(to ?? !uploaderVisible) - } + const toogleUploaderVisibility = (to) => { + to = to ?? !uploaderVisible - const toggleFocus = (to) => { - setFocused(to ?? !focused) + if (to === uploaderVisible) { + return + } + + setUploaderVisible(to ?? !uploaderVisible) } const handleKeyDown = (e) => { @@ -221,7 +213,6 @@ export default (props) => { const handlePaste = ({ clipboardData }) => { if (clipboardData && clipboardData.items.length > 0) { const isValidFormat = (fileType) => DEFAULT_ACCEPTED_FILES.includes(fileType) - toggleUploader(true) for (let index = 0; index < clipboardData.items.length; index++) { if (!isValidFormat(clipboardData.items[index].type)) { @@ -276,13 +267,50 @@ export default (props) => { } + const handleDrag = (event) => { + event.preventDefault() + event.stopPropagation() + + console.log(event) + + if (event.type === "dragenter") { + toogleUploaderVisibility(true) + } else if (event.type === "dragleave") { + // check if mouse is over the uploader or outside the creatorRef + if (uploaderVisible && !creatorRef.current.contains(event.target)) { + toogleUploaderVisibility(false) + } + } + } + + const handleUploadClick = () => { + // create a new dialog + const dialog = document.createElement("input") + + // set the dialog type to file + dialog.type = "file" + + // set the dialog accept to the accepted files + dialog.accept = postingPolicy.acceptedMimeTypes + + dialog.multiple = true + + // add a listener to the dialog + dialog.addEventListener("change", (event) => { + console.log(event) + }) + + // click the dialog + dialog.click() + } + React.useEffect(() => { fetchUploadPolicy() - creatorRef.current.addEventListener("paste", handlePaste) + document.addEventListener("paste", handlePaste) return () => { - creatorRef.current.removeEventListener("paste", handlePaste) + document.removeEventListener("paste", handlePaste) } }, []) @@ -292,15 +320,10 @@ export default (props) => { }, [pending]) return
{ - toggleFocus(true) - }} - onMouseLeave={() => { - toggleFocus(false) - }} + onDragEnter={handleDrag} + onDragLeave={handleDrag} >
@@ -327,36 +350,46 @@ export default (props) => {
-
-
- { - toggleUploader() - }} - icon={} - /> -
-
- -
- + - - +
+

Drag and drop files here

+ Max {humanSize.fromBytes(postingPolicy.maximumFileSize)} +
+ +
-
- Max {humanSize.fromBytes(postingPolicy.maximumFileSize)} -
+
+ } + /> + + } + /> + + } + />
-} \ No newline at end of file +} + + diff --git a/packages/app/src/components/PostCreator/index.less b/packages/app/src/components/PostCreator/index.less index 3bffe28f..65cdb349 100755 --- a/packages/app/src/components/PostCreator/index.less +++ b/packages/app/src/components/PostCreator/index.less @@ -1,28 +1,35 @@ .postCreator { + position: relative; + display: flex; flex-direction: column; + align-items: center; + width: 100%; - padding: 15px; - background-color: var(--background-color-accent); + z-index: 55; max-width: 600px; border-radius: 7px; + background-color: var(--background-color-accent); + padding: 15px; + + transition: all 250ms ease-in-out; + .actions { display: inline-flex; flex-direction: row; + align-items: center; justify-content: flex-start; - height: 40px; - - overflow: hidden; + width: 100%; transition: all 150ms ease-in-out; color: var(--text-color) !important; - >div { + .ant-btn { margin-left: 10px; font-size: 1rem; @@ -31,75 +38,112 @@ color: var(--text-color) !important; } } - - &.hided { - height: 0; - } } .uploader { + position: relative; + display: flex; flex-direction: row; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + + padding: 10px; overflow: hidden; + overflow-x: scroll; transition: all 150ms ease-in-out; - border: 1px solid var(--border-color); - padding: 10px; + &.visible { + position: absolute; + top: 0; + left: 0; - opacity: 1; + width: 100%; + height: 100%; - >div { - margin-left: 10px; - font-size: 1rem; + z-index: 150; - svg { - margin: 0 !important; - } - } - - &.hided { - height: 0px; - opacity: 0; - } - - - .ant-upload { - span { - width: 100%; - - } - - svg { - margin: 0 !important; - } - - - .ant-upload-select-picture-card { - background-color: transparent !important; - } - } - - .ant-upload.ant-upload-select-picture-card { display: flex; - align-self: center; + + padding: 0; + + align-items: center; justify-content: center; - width: 10vw; - height: 10vw; + border: 0; - margin-bottom: 0; + .ant-upload-drag { + width: 100%; + height: 100%; - border-color: var(--border-color); - background-color: transparent !important; + opacity: 1; + } + .ant-upload-list { + opacity: 0; + } } - .ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item { + .ant-upload-drag { + opacity: 0; + width: 0; + height: 0; + background-color: transparent !important; + border: 0; + } + + .ant-upload-wrapper { + position: relative; + + display: flex; + flex-direction: column; + + justify-content: center; + + background-color: transparent; + backdrop-filter: blur(8px); + + width: 100%; + height: 100%; + + overflow: hidden; + + .ant-upload-list { + display: flex; + flex-direction: row; + + width: 100%; + + overflow-x: auto; + overflow-y: hidden; + + white-space: nowrap; + + align-items: center; + justify-content: flex-start; + + border-radius: 10px; + + .ant-upload-list-item-container { + background-color: black; + + width: 10vw; + height: 10vw; + + margin-left: 10px; + + border-radius: 7px; + + } + } + } .ant-upload-list-item-actions { @@ -113,30 +157,7 @@ font-size: 2rem; } - .ant-upload-list { - display: flex; - flex-direction: row; - - width: 100%; - - overflow-x: auto; - overflow-y: hidden; - - white-space: nowrap; - - align-items: center; - justify-content: flex-start; - - border-radius: 10px; - } - - .ant-upload-list-picture-card-container { - width: 10vw; - height: 10vw; - } - .hint { - display: flex; flex-direction: column; @@ -144,9 +165,6 @@ justify-content: center; align-self: center; - width: 10vw; - height: 10vw; - text-align: center; background-color: transparent; @@ -235,9 +253,10 @@ .textInput { display: flex; + width: 100%; - transition: height 150ms ease-in-out; - background-color: var(--background-color-accent); + + transition: all 150ms ease-in-out; svg { margin: 0 !important; @@ -256,8 +275,12 @@ } } - .ant-input { - color: var(--background-color-contrast); + textarea { + color: var(--text-color); + } + + textarea::placeholder { + color: rgb(var(--bg_color_4)); } .textArea { @@ -301,12 +324,12 @@ background-color: var(--background-color-accent); } - .ant-input:hover { - border-color: #1890ff; - } - .ant-input-affix-wrapper { height: 100%; + + border: 0; + outline: 0; + box-shadow: none; } } } \ No newline at end of file