From 2ef7bd9778c1669e907ffe798915a860bb31399c Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Thu, 8 Dec 2022 11:15:16 +0000 Subject: [PATCH 01/17] fix `draggable` prop --- packages/app/src/components/PostCreator/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/components/PostCreator/index.jsx b/packages/app/src/components/PostCreator/index.jsx index 88c12c18..92f26027 100755 --- a/packages/app/src/components/PostCreator/index.jsx +++ b/packages/app/src/components/PostCreator/index.jsx @@ -312,7 +312,7 @@ export default (props) => { onChange={onChangeMessageInput} onKeyDown={handleKeyDown} disabled={loading} - dragable={false} + draggable={false} allowClear />
From 7768832f728f3bf8bdb97901cb64c001a98a511c Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Thu, 8 Dec 2022 11:15:28 +0000 Subject: [PATCH 02/17] handle open dev tool showing a warning --- packages/app/src/App.jsx | 20 ++++++++++++++++--- .../app/src/utils/handleOpenDevTools/index.js | 17 ++++++++++++++++ packages/app/src/utils/index.js | 3 ++- 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 packages/app/src/utils/handleOpenDevTools/index.js diff --git a/packages/app/src/App.jsx b/packages/app/src/App.jsx index f5af5326..8349212d 100755 --- a/packages/app/src/App.jsx +++ b/packages/app/src/App.jsx @@ -271,6 +271,18 @@ class App extends React.Component { {(t) => t("You have been disconnected from the server, trying to reconnect.")} }) + }, + "devtool-opened": () => { + // show warning + antd.notification.open({ + message: + {(t) => t("Devtool opened")} + , + description: + {(t) => t("You have opened the devtool for the first time, please be aware that this is a security risk and you should close it as soon as possible.")} + , + icon: , + }) } } @@ -452,12 +464,14 @@ class App extends React.Component { }, () => { App.publicMethods.openCreator() }) - + app.eventBus.emit("app.initialization.start") - + await this.initialization() - + app.eventBus.emit("app.initialization.finish") + + Utils.handleOpenDevTools() } initialization = async () => { diff --git a/packages/app/src/utils/handleOpenDevTools/index.js b/packages/app/src/utils/handleOpenDevTools/index.js new file mode 100644 index 00000000..f717e3c8 --- /dev/null +++ b/packages/app/src/utils/handleOpenDevTools/index.js @@ -0,0 +1,17 @@ +export default () => { + var devtools = function () { } + + devtools.toString = function () { + console.log( + "%cStop!\n", + "color: red; font-size: 40px; font-weight: bold;", + ) + + console.log( + `%cYou have opened the devtools. This is a browser feature intended for developers. If someone told you to copy and paste something here to enable a feature or "hack" someone's account, it is a scam and will give them access to your account and data.`, + "color: black; font-size: 20px; font-weight: bold;" + ) + } + + console.log('%c', devtools) +} \ No newline at end of file diff --git a/packages/app/src/utils/index.js b/packages/app/src/utils/index.js index 1d545630..7d692c95 100755 --- a/packages/app/src/utils/index.js +++ b/packages/app/src/utils/index.js @@ -4,4 +4,5 @@ export { default as cursorPosition } from "./cursorPosition" export { default as getBase64 } from "./getBase64" export { default as Haptics } from "./haptics" export { default as processString } from "./processString" -export { default as deleteInternalStorage } from "./deleteInternalStorage" \ No newline at end of file +export { default as deleteInternalStorage } from "./deleteInternalStorage" +export { default as handleOpenDevTools } from "./handleOpenDevTools" \ No newline at end of file From e676c91f6f0196120b41d6307162f3bfc0349ec5 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Thu, 8 Dec 2022 11:19:41 +0000 Subject: [PATCH 03/17] bump version --- .corenode | 2 +- package.json | 2 +- packages/app/package.json | 2 +- packages/server/package.json | 2 +- packages/wrapper/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.corenode b/.corenode index 6ad21024..9b83849d 100755 --- a/.corenode +++ b/.corenode @@ -1,3 +1,3 @@ { - "version": "0.33.0" + "version": "0.33.1" } diff --git a/package.json b/package.json index 243c2d0b..2dd106d0 100755 --- a/package.json +++ b/package.json @@ -22,5 +22,5 @@ "devDependencies": { "concurrently": "^7.5.0" }, - "version": "0.33.0" + "version": "0.33.1" } diff --git a/packages/app/package.json b/packages/app/package.json index 14423f06..5ceec593 100755 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "comty", - "version": "0.33.0", + "version": "0.33.1", "license": "LGPL-2.1", "main": "electron/main", "author": "RageStudio", diff --git a/packages/server/package.json b/packages/server/package.json index e110b4ad..19c5cda9 100755 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@comty/server", - "version": "0.33.0", + "version": "0.33.1", "main": "dist/index.js", "scripts": { "build": "corenode-cli build", diff --git a/packages/wrapper/package.json b/packages/wrapper/package.json index 3fe3d881..f24e13e7 100755 --- a/packages/wrapper/package.json +++ b/packages/wrapper/package.json @@ -1,6 +1,6 @@ { "name": "wrapper", - "version": "0.33.0", + "version": "0.33.1", "main": "./src/index.js", "license": "MIT", "scripts": { From d7d6be44a1aeab5800d080544bca076425a13622 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Thu, 8 Dec 2022 13:26:17 +0000 Subject: [PATCH 04/17] fix gramm --- packages/app/constants/settings/apparence/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/constants/settings/apparence/index.jsx b/packages/app/constants/settings/apparence/index.jsx index e9a67dd0..e0c8144d 100755 --- a/packages/app/constants/settings/apparence/index.jsx +++ b/packages/app/constants/settings/apparence/index.jsx @@ -19,7 +19,7 @@ export default [ { "id": "sidebar.floating", "title": "Floating Sidebar", - "description": "Make the sidebar floats over layout content.", + "description": "Make the sidebar float over layout content.", "component": "Switch", "icon": "MdOutlineLastPage", "group": "layout", From 19d2fe6689649c2f446e2a19004ffa7f8eef3036 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Thu, 8 Dec 2022 13:51:26 +0000 Subject: [PATCH 05/17] use routes to generate sidebar items --- packages/app/constants/defaultSettings.json | 11 +----- packages/app/constants/routes.json | 28 --------------- .../src/components/Layout/sidebar/index.jsx | 34 ++++++------------- 3 files changed, 11 insertions(+), 62 deletions(-) diff --git a/packages/app/constants/defaultSettings.json b/packages/app/constants/defaultSettings.json index d0b0873d..d7600dd1 100755 --- a/packages/app/constants/defaultSettings.json +++ b/packages/app/constants/defaultSettings.json @@ -16,14 +16,5 @@ "feed_max_fetch": 20, "style.compactMode": false, "sidebar.floating": false, - "language": "en", - "sidebarKeys": [ - "home", - "tv", - "music", - "events", - "groups", - "marketplace", - "dev" - ] + "language": "en" } \ No newline at end of file diff --git a/packages/app/constants/routes.json b/packages/app/constants/routes.json index e278adf9..caa243e1 100755 --- a/packages/app/constants/routes.json +++ b/packages/app/constants/routes.json @@ -13,13 +13,6 @@ "icon": "Home", "reachable": true }, - { - "id": "events", - "path": "/events", - "title": "Events", - "icon": "MdLocalActivity", - "reachable": true - }, { "id": "tv", "path": "/tv", @@ -33,26 +26,5 @@ "title": "Music", "icon": "MdMusicVideo", "reachable": true - }, - { - "id": "groups", - "path": "/groups", - "title": "Groups", - "icon": "Users", - "reachable": true - }, - { - "id": "marketplace", - "path": "/marketplace", - "title": "Marketplace", - "icon": "Package", - "reachable": true - }, - { - "id": "dev", - "path": "/dev", - "title": "Development", - "icon": "MdOutlineCode", - "reachable": true } ] \ No newline at end of file diff --git a/packages/app/src/components/Layout/sidebar/index.jsx b/packages/app/src/components/Layout/sidebar/index.jsx index 449cf49c..8a44498d 100755 --- a/packages/app/src/components/Layout/sidebar/index.jsx +++ b/packages/app/src/components/Layout/sidebar/index.jsx @@ -5,7 +5,6 @@ import classnames from "classnames" import config from "config" import { Icons, createIconRender } from "components/Icons" -import { sidebarKeys as defaultSidebarItems } from "schemas/defaultSettings" import sidebarItems from "schemas/routes.json" @@ -21,6 +20,10 @@ const getSidebarComponents = () => { const items = {} sidebarItems.forEach((item, index) => { + if (!item.reachable) { + return + } + items[item.id] = { ...item, index, @@ -37,35 +40,18 @@ const getSidebarComponents = () => { const generateItems = () => { const components = getSidebarComponents() + const itemsMap = [] const pathResolvers = {} - const keys = window.app?.settings.get("sidebarKeys") ?? defaultSidebarItems - - // filter undefined components to avoid error - keys.filter((key) => { - if (typeof components[key] !== "undefined") { - return true - } - }) - - keys.forEach((key, index) => { + Object.keys(components).forEach((key, index) => { const component = components[key] - try { - // avoid if item is duplicated - if (itemsMap.includes(component)) { - return false - } - - if (typeof component.path !== "undefined") { - pathResolvers[component.id] = component.path - } - - itemsMap.push(component) - } catch (error) { - return console.log(error) + if (typeof component.path !== "undefined") { + pathResolvers[component.id] = component.path } + + itemsMap.push(component) }) return { From 847700bb9b9de414af4e95fdc6f6bc47fc5f355b Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 09:17:13 +0000 Subject: [PATCH 06/17] fix `a` elements selection --- packages/app/src/theme/index.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/theme/index.less b/packages/app/src/theme/index.less index de39e472..c5e01310 100755 --- a/packages/app/src/theme/index.less +++ b/packages/app/src/theme/index.less @@ -46,7 +46,7 @@ html { font-family: var(--fontFamily); } - *:not(input):not(textarea) { + *:not(input):not(textarea):not(a) { -webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; From d5ba75fee3d9525e5ecd949e2409fa22308ef1e5 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 09:17:29 +0000 Subject: [PATCH 07/17] pass ctx prop --- .../src/cores/contextMenu/components/contextMenu/index.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app/src/cores/contextMenu/components/contextMenu/index.jsx b/packages/app/src/cores/contextMenu/components/contextMenu/index.jsx index 5f64d9a7..6ee2faca 100755 --- a/packages/app/src/cores/contextMenu/components/contextMenu/index.jsx +++ b/packages/app/src/cores/contextMenu/components/contextMenu/index.jsx @@ -5,11 +5,11 @@ import { createIconRender } from "components/Icons" import "./index.less" export default (props) => { - const { items = [], cords, clickedComponent } = props + const { items = [], cords, clickedComponent, ctx } = props const handleItemClick = async (item) => { if (typeof item.action === "function") { - await item.action(clickedComponent) + await item.action(clickedComponent, ctx) } } From 91fe890c61b0b733ff6cffdfaef16b35d780588b Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 09:17:42 +0000 Subject: [PATCH 08/17] improve `generateItems` --- packages/app/src/cores/contextMenu/index.js | 69 +++++++++++++-------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/packages/app/src/cores/contextMenu/index.js b/packages/app/src/cores/contextMenu/index.js index 1dfeb5f2..f1456f62 100755 --- a/packages/app/src/cores/contextMenu/index.js +++ b/packages/app/src/cores/contextMenu/index.js @@ -4,22 +4,37 @@ import Core from "evite/src/core" import { DOMWindow } from "components/RenderWindow" import ContextMenu from "./components/contextMenu" -import Contexts from "schemas/menu-contexts" +import InternalContexts from "schemas/menu-contexts" +import { copyToClipboard } from "utils" export default class ContextMenuCore extends Core { static namespace = "ContextMenu" static public = ["show", "hide", "registerContext"] contexts = Object() + defaultContext = [ + { + label: "Copy", + icon: "Copy", + action: (clickedItem, ctx) => { + // get selected text + const selectedText = window.getSelection().toString() + + copyToClipboard(selectedText) + + ctx.close() + } + }, { label: "Report a bug", icon: "AlertTriangle", - action: (parent, element) => { + action: (clickedItem, ctx) => { app.eventBus.emit("app.reportBug", { - parent, - element + clickedItem, }) + + ctx.close() } } ] @@ -38,7 +53,7 @@ export default class ContextMenuCore extends Core { this.contexts[element] = context } - generateItems = (element) => { + generateItems = async (element) => { let items = [] // find the closest context with attribute (context-menu) @@ -46,28 +61,28 @@ export default class ContextMenuCore extends Core { const parentElement = element.closest("[context-menu]") if (parentElement) { - const context = parentElement.getAttribute("context-menu") + let contexts = parentElement.getAttribute("context-menu") - // if context is not registered, try to fetch it from the constants contexts object - if (!this.contexts[context]) { - items = Contexts[context] || [] - } else { - items = this.contexts[context] ?? [] + if (!contexts) { + return } - if (typeof items === "function") { - items = items( - parentElement, - element, - { - close: this.hide - } - ) - } - } + contexts = contexts.split(",").map((context) => context.trim()) - if (!items) { - return null + // generate items + contexts.forEach(async (context) => { + let contextObject = this.contexts[context] || InternalContexts[context] + + if (typeof contextObject === "function") { + contextObject = await contextObject(element, parentElement, { + close: this.hide() + }) + } + + if (contextObject) { + items.push(...contextObject) + } + }) } // fullfill each item with a correspondent index if missing declared @@ -82,6 +97,7 @@ export default class ContextMenuCore extends Core { // short items (if has declared index) items = items.sort((a, b) => a.index - b.index) + // push default items if (items.length > 0) { items.push({ type: "separator" @@ -93,7 +109,7 @@ export default class ContextMenuCore extends Core { return items } - handleEvent = (event) => { + handleEvent = async (event) => { event.preventDefault() // get the cords of the mouse @@ -108,7 +124,7 @@ export default class ContextMenuCore extends Core { return } - const items = this.generateItems(component) + const items = await this.generateItems(component) if (!items) { console.warn("No context menu items found, aborting") @@ -122,6 +138,9 @@ export default class ContextMenuCore extends Core { }, clickedComponent: component, items: items, + ctx: { + close: this.hide + } }) } From 7b56bd04f1fc2319f3dd9304a06c9c974413fab3 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 09:17:56 +0000 Subject: [PATCH 09/17] use `copyToClipboard` util --- packages/app/constants/menu-contexts.js | 11 +---------- packages/app/src/utils/copyToClipboard/index.js | 8 ++++++++ packages/app/src/utils/index.js | 3 ++- 3 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 packages/app/src/utils/copyToClipboard/index.js diff --git a/packages/app/constants/menu-contexts.js b/packages/app/constants/menu-contexts.js index 58dc679f..6fa4507b 100755 --- a/packages/app/constants/menu-contexts.js +++ b/packages/app/constants/menu-contexts.js @@ -1,14 +1,5 @@ import download from "utils/download" - -function copyToClipboard(text) { - if (!navigator.clipboard?.writeText) { - control.close() - return app.message.error("Clipboard API not supported") - } - - navigator.clipboard.writeText(text) - app.message.success("Copied to clipboard") -} +import { copyToClipboard } from "utils" export default { "ignore": () => { diff --git a/packages/app/src/utils/copyToClipboard/index.js b/packages/app/src/utils/copyToClipboard/index.js new file mode 100644 index 00000000..253d315a --- /dev/null +++ b/packages/app/src/utils/copyToClipboard/index.js @@ -0,0 +1,8 @@ +export default (text) => { + if (!navigator.clipboard?.writeText) { + return app.message.error("Clipboard API not supported") + } + + navigator.clipboard.writeText(text) + app.message.success("Copied to clipboard") +} \ No newline at end of file diff --git a/packages/app/src/utils/index.js b/packages/app/src/utils/index.js index 7d692c95..8fb59bc7 100755 --- a/packages/app/src/utils/index.js +++ b/packages/app/src/utils/index.js @@ -5,4 +5,5 @@ export { default as getBase64 } from "./getBase64" export { default as Haptics } from "./haptics" export { default as processString } from "./processString" export { default as deleteInternalStorage } from "./deleteInternalStorage" -export { default as handleOpenDevTools } from "./handleOpenDevTools" \ No newline at end of file +export { default as handleOpenDevTools } from "./handleOpenDevTools" +export { default as copyToClipboard } from "./copyToClipboard" \ No newline at end of file From c3219aed124ea0d1ec9104ba4f67a763c2e5414f Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 10:11:05 +0000 Subject: [PATCH 10/17] fix context-menu generation --- packages/app/constants/menu-contexts.js | 32 ++++++++- packages/app/src/cores/contextMenu/index.js | 77 +++++++++------------ 2 files changed, 61 insertions(+), 48 deletions(-) diff --git a/packages/app/constants/menu-contexts.js b/packages/app/constants/menu-contexts.js index 6fa4507b..599bbfc4 100755 --- a/packages/app/constants/menu-contexts.js +++ b/packages/app/constants/menu-contexts.js @@ -2,8 +2,36 @@ import download from "utils/download" import { copyToClipboard } from "utils" export default { - "ignore": () => { - return false + "default-context": () => { + const items = [] + + const text = window.getSelection().toString() + + if (text) { + items.push({ + label: "Copy", + icon: "Copy", + action: (clickedItem, ctx) => { + copyToClipboard(text) + + ctx.close() + } + }) + } + + items.push({ + label: "Report a bug", + icon: "AlertTriangle", + action: (clickedItem, ctx) => { + app.eventBus.emit("app.reportBug", { + clickedItem, + }) + + ctx.close() + } + }) + + return items }, "postCard-context": (parent, element, control) => { const items = [ diff --git a/packages/app/src/cores/contextMenu/index.js b/packages/app/src/cores/contextMenu/index.js index f1456f62..e111ffec 100755 --- a/packages/app/src/cores/contextMenu/index.js +++ b/packages/app/src/cores/contextMenu/index.js @@ -5,7 +5,6 @@ import { DOMWindow } from "components/RenderWindow" import ContextMenu from "./components/contextMenu" import InternalContexts from "schemas/menu-contexts" -import { copyToClipboard } from "utils" export default class ContextMenuCore extends Core { static namespace = "ContextMenu" @@ -13,32 +12,6 @@ export default class ContextMenuCore extends Core { contexts = Object() - defaultContext = [ - { - label: "Copy", - icon: "Copy", - action: (clickedItem, ctx) => { - // get selected text - const selectedText = window.getSelection().toString() - - copyToClipboard(selectedText) - - ctx.close() - } - }, - { - label: "Report a bug", - icon: "AlertTriangle", - action: (clickedItem, ctx) => { - app.eventBus.emit("app.reportBug", { - clickedItem, - }) - - ctx.close() - } - } - ] - DOMWindow = new DOMWindow({ id: "contextMenu", className: "contextMenuWrapper", @@ -61,28 +34,46 @@ export default class ContextMenuCore extends Core { const parentElement = element.closest("[context-menu]") if (parentElement) { - let contexts = parentElement.getAttribute("context-menu") + let contexts = parentElement.getAttribute("context-menu") ?? [] - if (!contexts) { - return + if (typeof contexts === "string") { + contexts = contexts.split(",").map((context) => context.trim()) } - contexts = contexts.split(",").map((context) => context.trim()) + // if context includes ignore, return null + if (contexts.includes("ignore")) { + return null + } - // generate items - contexts.forEach(async (context) => { + // check if context includes no-default, if not, push default context and remove no-default + if (contexts.includes("no-default")) { + contexts = contexts.filter((context) => context !== "no-default") + } else { + contexts.push("default-context") + } + + for await (const context of contexts) { let contextObject = this.contexts[context] || InternalContexts[context] if (typeof contextObject === "function") { - contextObject = await contextObject(element, parentElement, { - close: this.hide() + contextObject = await contextObject(parentElement, element, { + close: this.hide, }) } - if (contextObject) { - items.push(...contextObject) + // push divider + if (items.length > 0) { + items.push({ + type: "separator" + }) } - }) + + if (Array.isArray(contextObject)) { + items.push(...contextObject) + } else { + items.push(contextObject) + } + } } // fullfill each item with a correspondent index if missing declared @@ -97,14 +88,8 @@ export default class ContextMenuCore extends Core { // short items (if has declared index) items = items.sort((a, b) => a.index - b.index) - // push default items - if (items.length > 0) { - items.push({ - type: "separator" - }) - } - - items.push(...this.defaultContext) + // remove undefined items + items = items.filter((item) => item !== undefined) return items } From 4c06f1648f51fa099232dae85b20f55f9068ae41 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 10:11:57 +0000 Subject: [PATCH 11/17] increase `timeAgo` calculation interval to 5 minutes --- .../app/src/components/PostCard/components/header/index.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app/src/components/PostCard/components/header/index.jsx b/packages/app/src/components/PostCard/components/header/index.jsx index 73ba123f..0b1ff554 100755 --- a/packages/app/src/components/PostCard/components/header/index.jsx +++ b/packages/app/src/components/PostCard/components/header/index.jsx @@ -27,12 +27,12 @@ export default (props) => { const interval = setInterval(() => { updateTimeAgo() - }, 10000) + }, 1000 * 60 * 5) return () => { clearInterval(interval) } - }, [props.postData.created_at]) + }, []) return
From dab7853779ac6d68acde46d72e39f8a55c3054a5 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 10:12:35 +0000 Subject: [PATCH 12/17] return empty page on `/music` --- packages/app/src/pages/music/index.jsx | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 packages/app/src/pages/music/index.jsx diff --git a/packages/app/src/pages/music/index.jsx b/packages/app/src/pages/music/index.jsx new file mode 100644 index 00000000..b7f42752 --- /dev/null +++ b/packages/app/src/pages/music/index.jsx @@ -0,0 +1,7 @@ +import React from "react" + +export default (props) => { + return
+ +
+} \ No newline at end of file From 9a420bc4be671906ecc89ebfe850be99a36e630b Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 10:29:39 +0000 Subject: [PATCH 13/17] handle `download` erros --- packages/app/constants/menu-contexts.js | 1 - packages/app/src/utils/download/index.js | 9 ++++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/app/constants/menu-contexts.js b/packages/app/constants/menu-contexts.js index 599bbfc4..699d4419 100755 --- a/packages/app/constants/menu-contexts.js +++ b/packages/app/constants/menu-contexts.js @@ -98,7 +98,6 @@ export default { label: "Download media", icon: "Download", action: () => { - app.message.info("Downloading media...") download(media.src) control.close() } diff --git a/packages/app/src/utils/download/index.js b/packages/app/src/utils/download/index.js index 33f7de85..beae9755 100755 --- a/packages/app/src/utils/download/index.js +++ b/packages/app/src/utils/download/index.js @@ -1,9 +1,8 @@ export default (uri, filename) => { + app.message.info("Downloading media...") + fetch(uri, { method: "GET", - headers: { - "Content-Type": "application/pdf", - }, }) .then((response) => response.blob()) .then((blob) => { @@ -29,4 +28,8 @@ export default (uri, filename) => { // Clean up and remove the link link.parentNode.removeChild(link) }) + .catch((error) => { + console.error(error) + app.message.error("Failed to download media") + }) } \ No newline at end of file From 802be5837b605eb0f59a7027e7533f17fbf0e870 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 10:36:30 +0000 Subject: [PATCH 14/17] improve empty `parentElement` behavior --- packages/app/src/cores/contextMenu/index.js | 64 +++++++++++---------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/packages/app/src/cores/contextMenu/index.js b/packages/app/src/cores/contextMenu/index.js index e111ffec..6a665012 100755 --- a/packages/app/src/cores/contextMenu/index.js +++ b/packages/app/src/cores/contextMenu/index.js @@ -33,46 +33,48 @@ export default class ContextMenuCore extends Core { // if not found, use default context const parentElement = element.closest("[context-menu]") + let contexts = [] + if (parentElement) { - let contexts = parentElement.getAttribute("context-menu") ?? [] + contexts = parentElement.getAttribute("context-menu") ?? [] if (typeof contexts === "string") { contexts = contexts.split(",").map((context) => context.trim()) } + } - // if context includes ignore, return null - if (contexts.includes("ignore")) { - return null + // if context includes ignore, return null + if (contexts.includes("ignore")) { + return null + } + + // check if context includes no-default, if not, push default context and remove no-default + if (contexts.includes("no-default")) { + contexts = contexts.filter((context) => context !== "no-default") + } else { + contexts.push("default-context") + } + + for await (const context of contexts) { + let contextObject = this.contexts[context] || InternalContexts[context] + + if (typeof contextObject === "function") { + contextObject = await contextObject(parentElement, element, { + close: this.hide, + }) } - // check if context includes no-default, if not, push default context and remove no-default - if (contexts.includes("no-default")) { - contexts = contexts.filter((context) => context !== "no-default") + // push divider + if (items.length > 0) { + items.push({ + type: "separator" + }) + } + + if (Array.isArray(contextObject)) { + items.push(...contextObject) } else { - contexts.push("default-context") - } - - for await (const context of contexts) { - let contextObject = this.contexts[context] || InternalContexts[context] - - if (typeof contextObject === "function") { - contextObject = await contextObject(parentElement, element, { - close: this.hide, - }) - } - - // push divider - if (items.length > 0) { - items.push({ - type: "separator" - }) - } - - if (Array.isArray(contextObject)) { - items.push(...contextObject) - } else { - items.push(contextObject) - } + items.push(contextObject) } } From 25d963d353c0ba4ced4698f7ac09bc0aeb82afac Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 10:40:01 +0000 Subject: [PATCH 15/17] use random id to generate id --- .../controllers/FilesController/methods/uploadBodyFiles.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/server/src/controllers/FilesController/methods/uploadBodyFiles.js b/packages/server/src/controllers/FilesController/methods/uploadBodyFiles.js index f5015f02..043783d5 100644 --- a/packages/server/src/controllers/FilesController/methods/uploadBodyFiles.js +++ b/packages/server/src/controllers/FilesController/methods/uploadBodyFiles.js @@ -1,5 +1,6 @@ import path from "path" import fs from "fs" +import { nanoid } from 'nanoid' import pmap from "../../../utils/pMap" @@ -41,9 +42,7 @@ export default async (payload) => { maxFileSize: params.maxFileSize, maxFields: params.maxFields, filename: (name, ext) => { - name = name.trim() - name = name.replace(/ /g, "_") - name = name.normalize("NFD").replace(/[\u0300-\u036f]/g, "") + name = nanoid() return name + ext }, From b5bbe261a47fedd0ef6af99b883f1b42fdf7782e Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 11:07:14 +0000 Subject: [PATCH 16/17] added `jimp` --- packages/server/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server/package.json b/packages/server/package.json index 19c5cda9..7516b92d 100755 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -19,6 +19,7 @@ "dotenv": "16.0.1", "fluent-ffmpeg": "2.1.2", "formidable": "2.0.1", + "jimp": "^0.16.2", "jsonwebtoken": "8.5.1", "linebridge": "0.13.0", "luxon": "^3.0.4", From ef20900e20048bd79d54926211dd36b61f09bc66 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Fri, 9 Dec 2022 11:08:49 +0000 Subject: [PATCH 17/17] handle image quality restrictions --- .../methods/uploadBodyFiles.js | 77 ++++++++++++++++++- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/packages/server/src/controllers/FilesController/methods/uploadBodyFiles.js b/packages/server/src/controllers/FilesController/methods/uploadBodyFiles.js index 043783d5..1d49a9f0 100644 --- a/packages/server/src/controllers/FilesController/methods/uploadBodyFiles.js +++ b/packages/server/src/controllers/FilesController/methods/uploadBodyFiles.js @@ -1,11 +1,62 @@ import path from "path" import fs from "fs" -import { nanoid } from 'nanoid' +import { videoTranscode } from "../../../lib/videoTranscode" +import { nanoid } from "nanoid" +import Jimp from "jimp" import pmap from "../../../utils/pMap" const formidable = require("formidable") +const maximuns = { + imageResolution: { + width: 3840, + height: 2160, + }, + imageQuality: 80, +} + +const handleUploadVideo = async (file, params) => { + file.filepath = await videoTranscode(file.filepath, global.uploadCachePath) + file.newFilename = path.basename(file.filepath) + + return file +} + +const handleImage = async (file, params) => { + const { width, height } = await new Promise((resolve, reject) => { + Jimp.read(file.filepath) + .then((image) => { + resolve({ + width: image.bitmap.width, + height: image.bitmap.height, + }) + }) + .catch((err) => { + reject(err) + }) + }) + + if (width > maximuns.imageResolution.width || height > maximuns.imageResolution.height) { + await new Promise((resolve, reject) => { + Jimp.read(file.filepath) + .then((image) => { + image + .resize(maximuns.imageResolution.width, maximuns.imageResolution.height) + .quality(maximuns.imageQuality) + .write(file.filepath, resolve) + }) + .catch((err) => { + reject(err) + }) + }) + } + + file.newFilename = path.basename(file.filepath) + + return file +} + export default async (payload) => { if (!payload) { throw new Error("Missing payload") @@ -86,11 +137,29 @@ export default async (payload) => { // check if is video need to transcode switch (file.mimetype) { case "video/quicktime": { - file.filepath = await videoTranscode(file.filepath, global.uploadCachePath) - file.newFilename = path.basename(file.filepath) + file = await handleUploadVideo(file, params) + break + } + case "image/jpeg": { + file = await handleImage(file, params) + break + } + case "image/png": { + file = await handleImage(file, params) + break + } + case "image/gif": { + file = await handleImage(file, params) + break + } + case "image/bmp": { + file = await handleImage(file, params) + break + } + case "image/tiff": { + file = await handleImage(file, params) break } - default: { // do nothing }