Fix vite build release version

Also, make sure "export" strings are not removed (rename to "room_export") and import quotes in the QuoteView correctly.
This commit is contained in:
N-Pex 2025-04-22 13:01:18 +02:00
parent 4c364f93e6
commit ec992bb14d
34 changed files with 621 additions and 284 deletions

319
package-lock.json generated
View file

@ -17,20 +17,19 @@
"clean-insights-sdk": "^2.4", "clean-insights-sdk": "^2.4",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"crypto-browserify": "^3.12.1", "crypto-browserify": "^3.12.1",
"data-uri-to-buffer": "^3.0.1",
"dayjs": "^1.10.3", "dayjs": "^1.10.3",
"deepmerge": "^4.3.1",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"fix-webm-duration": "^1.0.0", "fix-webm-duration": "^1.0.0",
"image-resize": "^1.4.1", "image-resize": "^1.4.1",
"image-size": "^1.0.0", "image-size": "^2.0.2",
"intersection-observer": "^0.12", "intersection-observer": "^0.12",
"js-sha256": "^0.9.0",
"json-web-key": "^0.4.0", "json-web-key": "^0.4.0",
"jszip": "^3.10.1", "jszip": "^3.10.1",
"linkify-html": "^4.1.0", "linkify-html": "^4.1.0",
"linkifyjs": "^4.1.0", "linkifyjs": "^4.1.0",
"material-design-icons-iconfont": "^6.7.0", "material-design-icons-iconfont": "^6.7.0",
"matrix-js-sdk": "^37.2.0", "matrix-js-sdk": "^37.3.0",
"md-gum-polyfill": "^1.0.0", "md-gum-polyfill": "^1.0.0",
"mic-recorder-to-mp3": "^2.2.2", "mic-recorder-to-mp3": "^2.2.2",
"path-browserify": "^1.0.1", "path-browserify": "^1.0.1",
@ -54,6 +53,8 @@
"vuex-persist": "^3.1.3" "vuex-persist": "^3.1.3"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-commonjs": "^28.0.3",
"@types/jszip": "^3.4.0",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"copy-webpack-plugin": "^11.0.0", "copy-webpack-plugin": "^11.0.0",
"eslint": "^7.0", "eslint": "^7.0",
@ -1117,6 +1118,61 @@
"url": "https://opencollective.com/parcel" "url": "https://opencollective.com/parcel"
} }
}, },
"node_modules/@rollup/plugin-commonjs": {
"version": "28.0.3",
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz",
"integrity": "sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^5.0.1",
"commondir": "^1.0.1",
"estree-walker": "^2.0.2",
"fdir": "^6.2.0",
"is-reference": "1.2.1",
"magic-string": "^0.30.3",
"picomatch": "^4.0.2"
},
"engines": {
"node": ">=16.0.0 || 14 >= 14.17"
},
"peerDependencies": {
"rollup": "^2.68.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/plugin-commonjs/node_modules/fdir": {
"version": "6.4.3",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
"integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
"picomatch": {
"optional": true
}
}
},
"node_modules/@rollup/plugin-commonjs/node_modules/picomatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/@rollup/plugin-inject": { "node_modules/@rollup/plugin-inject": {
"version": "5.0.5", "version": "5.0.5",
"resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz",
@ -1473,6 +1529,16 @@
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
}, },
"node_modules/@types/jszip": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.4.0.tgz",
"integrity": "sha512-GFHqtQQP3R4NNuvZH3hNCYD0NbyBZ42bkN7kO3NDrU/SnvIZWMS8Bp38XCsRKBT5BXvgm0y1zqpZWp/ZkRzBzg==",
"dev": true,
"license": "MIT",
"dependencies": {
"jszip": "*"
}
},
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.13.12", "version": "22.13.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.12.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.12.tgz",
@ -2369,6 +2435,13 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"peer": true "peer": true
}, },
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true,
"license": "MIT"
},
"node_modules/concat-map": { "node_modules/concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -2628,14 +2701,6 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/data-uri-to-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
"integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==",
"engines": {
"node": ">= 6"
}
},
"node_modules/dayjs": { "node_modules/dayjs": {
"version": "1.10.7", "version": "1.10.7",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz",
@ -2690,9 +2755,10 @@
"dev": true "dev": true
}, },
"node_modules/deepmerge": { "node_modules/deepmerge": {
"version": "4.2.2", "version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"license": "MIT",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@ -3889,18 +3955,6 @@
"node": ">=0.8.0" "node": ">=0.8.0"
} }
}, },
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-flag": { "node_modules/has-flag": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@ -4073,17 +4127,15 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/image-size": { "node_modules/image-size": {
"version": "1.0.0", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz",
"integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==",
"dependencies": { "license": "MIT",
"queue": "6.0.2"
},
"bin": { "bin": {
"image-size": "bin/image-size.js" "image-size": "bin/image-size.js"
}, },
"engines": { "engines": {
"node": ">=12.0.0" "node": ">=16.x"
} }
}, },
"node_modules/immediate": { "node_modules/immediate": {
@ -4207,12 +4259,16 @@
} }
}, },
"node_modules/is-core-module": { "node_modules/is-core-module": {
"version": "2.6.0", "version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
"integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"has": "^1.0.3" "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
@ -4281,6 +4337,16 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/is-reference": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
"integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "*"
}
},
"node_modules/is-regex": { "node_modules/is-regex": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
@ -4325,11 +4391,6 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true "dev": true
}, },
"node_modules/js-sha256": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
"integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="
},
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -4827,9 +4888,9 @@
"integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA=="
}, },
"node_modules/matrix-js-sdk": { "node_modules/matrix-js-sdk": {
"version": "37.2.0", "version": "37.3.0",
"resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-37.2.0.tgz", "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-37.3.0.tgz",
"integrity": "sha512-6JUnm2sorHxeTcL9wlHCSdn1q7Nk198Fk5//gsiy2txJK8oa08OOgiomAi98YeQiwqA+omm99Km3m3dgcFyFVw==", "integrity": "sha512-uYpXEucA+y9b116Hn+zG+X+u2GE2dACh+aN0BhiJDL/LtvhQgrXT4ZLG/N7OizomoHHF+i/WetDhi+rzDJQdDw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.12.5", "@babel/runtime": "^7.12.5",
@ -5521,14 +5582,6 @@
], ],
"license": "MIT" "license": "MIT"
}, },
"node_modules/queue": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
"integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
"dependencies": {
"inherits": "~2.0.3"
}
},
"node_modules/queue-microtask": { "node_modules/queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@ -5677,13 +5730,21 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/resolve": { "node_modules/resolve": {
"version": "1.20.0", "version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"is-core-module": "^2.2.0", "is-core-module": "^2.16.0",
"path-parse": "^1.0.6" "path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"engines": {
"node": ">= 0.4"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
@ -6270,6 +6331,19 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/table": { "node_modules/table": {
"version": "6.7.1", "version": "6.7.1",
"resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
@ -7918,6 +7992,36 @@
"integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
"optional": true "optional": true
}, },
"@rollup/plugin-commonjs": {
"version": "28.0.3",
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz",
"integrity": "sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==",
"dev": true,
"requires": {
"@rollup/pluginutils": "^5.0.1",
"commondir": "^1.0.1",
"estree-walker": "^2.0.2",
"fdir": "^6.2.0",
"is-reference": "1.2.1",
"magic-string": "^0.30.3",
"picomatch": "^4.0.2"
},
"dependencies": {
"fdir": {
"version": "6.4.3",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
"integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
"dev": true,
"requires": {}
},
"picomatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true
}
}
},
"@rollup/plugin-inject": { "@rollup/plugin-inject": {
"version": "5.0.5", "version": "5.0.5",
"resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz",
@ -8103,6 +8207,15 @@
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
}, },
"@types/jszip": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.4.0.tgz",
"integrity": "sha512-GFHqtQQP3R4NNuvZH3hNCYD0NbyBZ42bkN7kO3NDrU/SnvIZWMS8Bp38XCsRKBT5BXvgm0y1zqpZWp/ZkRzBzg==",
"dev": true,
"requires": {
"jszip": "*"
}
},
"@types/node": { "@types/node": {
"version": "22.13.12", "version": "22.13.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.12.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.12.tgz",
@ -8814,6 +8927,12 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"peer": true "peer": true
}, },
"commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true
},
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -9010,11 +9129,6 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
}, },
"data-uri-to-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
"integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og=="
},
"dayjs": { "dayjs": {
"version": "1.10.7", "version": "1.10.7",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz",
@ -9056,9 +9170,9 @@
"dev": true "dev": true
}, },
"deepmerge": { "deepmerge": {
"version": "4.2.2", "version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
}, },
"deferred-leveldown": { "deferred-leveldown": {
"version": "0.2.0", "version": "0.2.0",
@ -9938,15 +10052,6 @@
"resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
"integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE="
}, },
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
},
"has-flag": { "has-flag": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@ -10062,12 +10167,9 @@
"integrity": "sha512-2QQkTdMvRGkbcfeKs3OCA7g8CNRqa3ISo+8OHhMTmsHvjfaxBrvGsZ/fNTroAhh8M+9xesU4FMcoJUBMDArYzA==" "integrity": "sha512-2QQkTdMvRGkbcfeKs3OCA7g8CNRqa3ISo+8OHhMTmsHvjfaxBrvGsZ/fNTroAhh8M+9xesU4FMcoJUBMDArYzA=="
}, },
"image-size": { "image-size": {
"version": "1.0.0", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz",
"integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="
"requires": {
"queue": "6.0.2"
}
}, },
"immediate": { "immediate": {
"version": "3.0.6", "version": "3.0.6",
@ -10156,12 +10258,12 @@
"integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="
}, },
"is-core-module": { "is-core-module": {
"version": "2.6.0", "version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
"integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"dev": true, "dev": true,
"requires": { "requires": {
"has": "^1.0.3" "hasown": "^2.0.2"
} }
}, },
"is-extglob": { "is-extglob": {
@ -10206,6 +10308,15 @@
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
}, },
"is-reference": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
"integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
"dev": true,
"requires": {
"@types/estree": "*"
}
},
"is-regex": { "is-regex": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
@ -10236,11 +10347,6 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true "dev": true
}, },
"js-sha256": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
"integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="
},
"js-tokens": { "js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -10669,9 +10775,9 @@
"integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA=="
}, },
"matrix-js-sdk": { "matrix-js-sdk": {
"version": "37.2.0", "version": "37.3.0",
"resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-37.2.0.tgz", "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-37.3.0.tgz",
"integrity": "sha512-6JUnm2sorHxeTcL9wlHCSdn1q7Nk198Fk5//gsiy2txJK8oa08OOgiomAi98YeQiwqA+omm99Km3m3dgcFyFVw==", "integrity": "sha512-uYpXEucA+y9b116Hn+zG+X+u2GE2dACh+aN0BhiJDL/LtvhQgrXT4ZLG/N7OizomoHHF+i/WetDhi+rzDJQdDw==",
"requires": { "requires": {
"@babel/runtime": "^7.12.5", "@babel/runtime": "^7.12.5",
"@matrix-org/matrix-sdk-crypto-wasm": "^14.0.1", "@matrix-org/matrix-sdk-crypto-wasm": "^14.0.1",
@ -11168,14 +11274,6 @@
"integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==",
"dev": true "dev": true
}, },
"queue": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
"integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
"requires": {
"inherits": "~2.0.3"
}
},
"queue-microtask": { "queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@ -11277,13 +11375,14 @@
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
}, },
"resolve": { "resolve": {
"version": "1.20.0", "version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
"dev": true, "dev": true,
"requires": { "requires": {
"is-core-module": "^2.2.0", "is-core-module": "^2.16.0",
"path-parse": "^1.0.6" "path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
} }
}, },
"resolve-from": { "resolve-from": {
@ -11694,6 +11793,12 @@
"has-flag": "^3.0.0" "has-flag": "^3.0.0"
} }
}, },
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"table": { "table": {
"version": "6.7.1", "version": "6.7.1",
"resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",

View file

@ -18,20 +18,19 @@
"clean-insights-sdk": "^2.4", "clean-insights-sdk": "^2.4",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"crypto-browserify": "^3.12.1", "crypto-browserify": "^3.12.1",
"data-uri-to-buffer": "^3.0.1",
"dayjs": "^1.10.3", "dayjs": "^1.10.3",
"deepmerge": "^4.3.1",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"fix-webm-duration": "^1.0.0", "fix-webm-duration": "^1.0.0",
"image-resize": "^1.4.1", "image-resize": "^1.4.1",
"image-size": "^1.0.0", "image-size": "^2.0.2",
"intersection-observer": "^0.12", "intersection-observer": "^0.12",
"js-sha256": "^0.9.0",
"json-web-key": "^0.4.0", "json-web-key": "^0.4.0",
"jszip": "^3.10.1", "jszip": "^3.10.1",
"linkify-html": "^4.1.0", "linkify-html": "^4.1.0",
"linkifyjs": "^4.1.0", "linkifyjs": "^4.1.0",
"material-design-icons-iconfont": "^6.7.0", "material-design-icons-iconfont": "^6.7.0",
"matrix-js-sdk": "^37.2.0", "matrix-js-sdk": "^37.3.0",
"md-gum-polyfill": "^1.0.0", "md-gum-polyfill": "^1.0.0",
"mic-recorder-to-mp3": "^2.2.2", "mic-recorder-to-mp3": "^2.2.2",
"path-browserify": "^1.0.1", "path-browserify": "^1.0.1",
@ -55,6 +54,8 @@
"vuex-persist": "^3.1.3" "vuex-persist": "^3.1.3"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-commonjs": "^28.0.3",
"@types/jszip": "^3.4.0",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"copy-webpack-plugin": "^11.0.0", "copy-webpack-plugin": "^11.0.0",
"eslint": "^7.0", "eslint": "^7.0",

View file

@ -0,0 +1,7 @@
{
"quotes": [
{
"quote":"Je suis un programmeur","author":"Mickey Mouse"}
]
}

View file

@ -115,7 +115,7 @@
"tip_text": "سيتمكن الأعضاء من رؤية نتائج الاستطلاع بعد الإجابة. أغلق الاستطلاع عندما تنتهي لعرض النتائج على الجميع في الغرفة.", "tip_text": "سيتمكن الأعضاء من رؤية نتائج الاستطلاع بعد الإجابة. أغلق الاستطلاع عندما تنتهي لعرض النتائج على الجميع في الغرفة.",
"create_poll_menu_option": "إنشاء استطلاع للرأي" "create_poll_menu_option": "إنشاء استطلاع للرأي"
}, },
"export": { "room_export": {
"exported_date": "‫تم التصدير بتاريخ {date}", "exported_date": "‫تم التصدير بتاريخ {date}",
"fetched_n_events": "تم جلب {count} من الأحداث", "fetched_n_events": "تم جلب {count} من الأحداث",
"fetched_n_of_total_events": "تم جلب {count} من أصل {total} من الأحداث", "fetched_n_of_total_events": "تم جلب {count} من أصل {total} من الأحداث",

View file

@ -395,7 +395,7 @@
"num_answered": "{count} টি উত্তর", "num_answered": "{count} টি উত্তর",
"results_shared": "ফলাফল রুমে প্রকাশ করা হয়েছে।" "results_shared": "ফলাফল রুমে প্রকাশ করা হয়েছে।"
}, },
"export": { "room_export": {
"exported_date": "{date} এ এক্সপোর্ট করা হয়েছে", "exported_date": "{date} এ এক্সপোর্ট করা হয়েছে",
"fetched_n_events": "{count} ইভেন্ট জড় করা হয়েছে", "fetched_n_events": "{count} ইভেন্ট জড় করা হয়েছে",
"fetched_n_of_total_events": "{total} টির মধ্যে {count} টি ইভেন্ট জড় করা হয়েছে", "fetched_n_of_total_events": "{total} টির মধ্যে {count} টি ইভেন্ট জড় করা হয়েছে",

View file

@ -385,7 +385,7 @@
"view_results": "གྲུབ་འབྲས་ལ་གཟིགས།", "view_results": "གྲུབ་འབྲས་ལ་གཟིགས།",
"results_shared": "གྲུབ་འབྲས་ཁ་བརྡ་ཁང་དུ་བརྒྱུད་སྤེལ་བྱེད་ངེས།" "results_shared": "གྲུབ་འབྲས་ཁ་བརྡ་ཁང་དུ་བརྒྱུད་སྤེལ་བྱེད་ངེས།"
}, },
"export": { "room_export": {
"exported_date": "{date} ཉིན་ལ་ཕྱིར་འདྲེན་བྱས།", "exported_date": "{date} ཉིན་ལ་ཕྱིར་འདྲེན་བྱས།",
"export_filename": "{date} ཉིན་ཕྱིར་འདྲེན་བྱས་པའི་ཁ་བརྡ།", "export_filename": "{date} ཉིན་ཕྱིར་འདྲེན་བྱས་པའི་ཁ་བརྡ།",
"processed_n_of_total_events": "བྱུང་བ་{total}ཁོངས་ནས་ལས་སྣོན་བྱས་ཟིན་པའི་སྨྱན་སྦྱོར་གྱི་གྲངས {count}", "processed_n_of_total_events": "བྱུང་བ་{total}ཁོངས་ནས་ལས་སྣོན་བྱས་ཟིན་པའི་སྨྱན་སྦྱོར་གྱི་གྲངས {count}",

View file

@ -363,7 +363,7 @@
"results_shared": "Die Ergebnisse werden dem Raum mitgeteilt.", "results_shared": "Die Ergebnisse werden dem Raum mitgeteilt.",
"tip_text": "Die Mitglieder sehen die Umfrageergebnisse, nachdem sie geantwortet haben. Schließe die Umfrage, wenn du fertig bist, um die Ergebnisse für alle im Raum anzuzeigen." "tip_text": "Die Mitglieder sehen die Umfrageergebnisse, nachdem sie geantwortet haben. Schließe die Umfrage, wenn du fertig bist, um die Ergebnisse für alle im Raum anzuzeigen."
}, },
"export": { "room_export": {
"fetched_n_of_total_events": "{count} von {total} Ereignissen geladen", "fetched_n_of_total_events": "{count} von {total} Ereignissen geladen",
"exported_date": "Am {date} exportiert", "exported_date": "Am {date} exportiert",
"processed_n_of_total_events": "Medien für {count} von {total} Ereignissen verarbeitet", "processed_n_of_total_events": "Medien für {count} von {total} Ereignissen verarbeitet",

View file

@ -426,7 +426,7 @@
"num_answered": "{count} answers", "num_answered": "{count} answers",
"results_shared": "Results shared to the room." "results_shared": "Results shared to the room."
}, },
"export": { "room_export": {
"exported_date": "Exported on {date}", "exported_date": "Exported on {date}",
"fetched_n_events": "Fetched {count} events", "fetched_n_events": "Fetched {count} events",
"fetched_n_of_total_events": "Fetched {count} of {total} events", "fetched_n_of_total_events": "Fetched {count} of {total} events",

View file

@ -426,7 +426,7 @@
"not_supported": "La notificación aún no es compatible con dispositivos móviles", "not_supported": "La notificación aún no es compatible con dispositivos móviles",
"periodicSync_new_msg_reminder": "Es posible que tengas nuevos mensajes" "periodicSync_new_msg_reminder": "Es posible que tengas nuevos mensajes"
}, },
"export": { "room_export": {
"fetched_n_of_total_events": "{count} de {total} eventos recuperados", "fetched_n_of_total_events": "{count} de {total} eventos recuperados",
"export_filename": "Chat exportado el {date}", "export_filename": "Chat exportado el {date}",
"exported_date": "Exportado el {date}", "exported_date": "Exportado el {date}",

View file

@ -418,7 +418,7 @@
"num_answered": "{count} respuestas", "num_answered": "{count} respuestas",
"results_shared": "Resultados compartidos a la sala." "results_shared": "Resultados compartidos a la sala."
}, },
"export": { "room_export": {
"exported_date": "Exportado el {date}", "exported_date": "Exportado el {date}",
"fetched_n_events": "Se obtuvieron {count} eventos", "fetched_n_events": "Se obtuvieron {count} eventos",
"processed_n_of_total_events": "Medios procesados para {count} de {total} eventos", "processed_n_of_total_events": "Medios procesados para {count} de {total} eventos",

View file

@ -144,7 +144,7 @@
"message_history_warning": "Advertencia: el historial completo de mensajes será visible para los nuevos participantes.", "message_history_warning": "Advertencia: el historial completo de mensajes será visible para los nuevos participantes.",
"message_history": "Historial de mensajes" "message_history": "Historial de mensajes"
}, },
"export": { "room_export": {
"exported_date": "Exportado en {date}", "exported_date": "Exportado en {date}",
"fetched_n_events": "Eventos{count} recuperados", "fetched_n_events": "Eventos{count} recuperados",
"fetched_n_of_total_events": "Se recuperaron {count} de {total} eventos", "fetched_n_of_total_events": "Se recuperaron {count} de {total} eventos",

View file

@ -423,7 +423,7 @@
"places": "مکان ها" "places": "مکان ها"
} }
}, },
"export": { "room_export": {
"exported_date": "خروجی گرفته شد در {date}", "exported_date": "خروجی گرفته شد در {date}",
"fetched_n_events": "{count} رویداد بازیابی شد", "fetched_n_events": "{count} رویداد بازیابی شد",
"fetched_n_of_total_events": "{count} از {total} رویداد بازیابی شد", "fetched_n_of_total_events": "{count} از {total} رویداد بازیابی شد",

View file

@ -195,7 +195,7 @@
"poll_submit": "تسلیم کردن", "poll_submit": "تسلیم کردن",
"num_answered": "{count} جواب" "num_answered": "{count} جواب"
}, },
"export": { "room_export": {
"exported_date": "خروجی گرفته شد در {date}", "exported_date": "خروجی گرفته شد در {date}",
"fetched_n_events": "{count} رویداد بازیابی شد", "fetched_n_events": "{count} رویداد بازیابی شد",
"fetched_n_of_total_events": "{count} از {total} رویداد بازیابی شد", "fetched_n_of_total_events": "{count} از {total} رویداد بازیابی شد",

View file

@ -445,7 +445,7 @@
"download_name": "Íoslódáil", "download_name": "Íoslódáil",
"original_text": "<buntéacs>" "original_text": "<buntéacs>"
}, },
"export": { "room_export": {
"exported_date": "Onnmhairithe ar {date}", "exported_date": "Onnmhairithe ar {date}",
"fetched_n_events": "Imeachtaí {count} faighte", "fetched_n_events": "Imeachtaí {count} faighte",
"fetched_n_of_total_events": "Fuarthas {count} de {total} imeacht", "fetched_n_of_total_events": "Fuarthas {count} de {total} imeacht",

View file

@ -56,7 +56,7 @@
"info_auto_join": "بەخێر بێیت بۆ {room}.\nتۆ وەکوو {you} بەشداری دەکەیت.", "info_auto_join": "بەخێر بێیت بۆ {room}.\nتۆ وەکوو {you} بەشداری دەکەیت.",
"change": "گۆڕین" "change": "گۆڕین"
}, },
"export": { "room_export": {
"export_filename": "چەت لە {date} دەرهێنرا", "export_filename": "چەت لە {date} دەرهێنرا",
"exported_date": "لە {date} دەرهێنرا", "exported_date": "لە {date} دەرهێنرا",
"fetched_n_events": "{count} ڕووداو هێنرا", "fetched_n_events": "{count} ڕووداو هێنرا",

View file

@ -407,7 +407,7 @@
"poll_submit": "ສົ່ງ", "poll_submit": "ສົ່ງ",
"num_answered": "{count} ຄຳຕອບ" "num_answered": "{count} ຄຳຕອບ"
}, },
"export": { "room_export": {
"exported_date": "ສົ່ງອອກໃນວັນທີ {date}", "exported_date": "ສົ່ງອອກໃນວັນທີ {date}",
"fetched_n_events": "ໄດ້ຮັບ {count} ກິດຈະກຳ", "fetched_n_events": "ໄດ້ຮັບ {count} ກິດຈະກຳ",
"fetched_n_of_total_events": "ໄດ້ຮັບ {count}ຈາກ {total} ກິດຈະກຳ", "fetched_n_of_total_events": "ໄດ້ຮັບ {count}ຈາກ {total} ກິດຈະກຳ",

View file

@ -242,7 +242,7 @@
"num_answered": "အဖြေ {count}ခု", "num_answered": "အဖြေ {count}ခု",
"results_shared": "ရလဒ်များကို အခန်းသို့ မျှဝေခဲ့သည်။" "results_shared": "ရလဒ်များကို အခန်းသို့ မျှဝေခဲ့သည်။"
}, },
"export": { "room_export": {
"fetched_n_events": "ပွဲအစီအစဉ် {count} ခု ရရှိခဲ့သည်", "fetched_n_events": "ပွဲအစီအစဉ် {count} ခု ရရှိခဲ့သည်",
"fetched_n_of_total_events": "ပွဲအစီအစဉ် {total} တွင် {count} ခု ရရှိခဲ့သည်", "fetched_n_of_total_events": "ပွဲအစီအစဉ် {total} တွင် {count} ခု ရရှိခဲ့သည်",
"processed_n_of_total_events": "ပွဲအစီအစဉ် {total} တွင် {count} ခုအတွက် မီဒီယာကို စီမံဆောင်ရွက်ခဲ့သည်", "processed_n_of_total_events": "ပွဲအစီအစဉ် {total} တွင် {count} ခုအတွက် မီဒီယာကို စီမံဆောင်ရွက်ခဲ့သည်",

View file

@ -421,7 +421,7 @@
"original_text": "<original text>", "original_text": "<original text>",
"download_name": "ډانلوډ" "download_name": "ډانلوډ"
}, },
"export": { "room_export": {
"exported_date": "{date} نېټه خروجې اخیستل شوې ده", "exported_date": "{date} نېټه خروجې اخیستل شوې ده",
"fetched_n_events": "{count} پېښې بېرته تر لاسه شوې دي", "fetched_n_events": "{count} پېښې بېرته تر لاسه شوې دي",
"fetched_n_of_total_events": "له {total} پېښو څخه {count} یې بېرته تر لاسه شوې دي", "fetched_n_of_total_events": "له {total} پېښو څخه {count} یې بېرته تر لاسه شوې دي",

View file

@ -385,7 +385,7 @@
"view_results": "Ver os resultados", "view_results": "Ver os resultados",
"results_shared": "Resultados compartilhados com a sala." "results_shared": "Resultados compartilhados com a sala."
}, },
"export": { "room_export": {
"exported_date": "Foi exportado em {date}", "exported_date": "Foi exportado em {date}",
"fetched_n_events": "{count} eventos buscados", "fetched_n_events": "{count} eventos buscados",
"fetched_n_of_total_events": "Obteve {count} de {total} eventos", "fetched_n_of_total_events": "Obteve {count} de {total} eventos",

View file

@ -434,7 +434,7 @@
"channel_topic": "Опишите его", "channel_topic": "Опишите его",
"error_channel": "Не удалось создать канал" "error_channel": "Не удалось создать канал"
}, },
"export": { "room_export": {
"fetched_n_events": "Найдено {count} событий", "fetched_n_events": "Найдено {count} событий",
"fetched_n_of_total_events": "Получено {count} из {total} событий", "fetched_n_of_total_events": "Получено {count} из {total} событий",
"export_filename": "Экспортированный чат {date}", "export_filename": "Экспортированный чат {date}",

View file

@ -434,7 +434,7 @@
"close_tab": "Tarayıcı sekmesini kapat", "close_tab": "Tarayıcı sekmesini kapat",
"view_other_rooms": "Diğer odaları görüntüle" "view_other_rooms": "Diğer odaları görüntüle"
}, },
"export": { "room_export": {
"exported_date": "{date} tarihinde dışarı aktarıldı", "exported_date": "{date} tarihinde dışarı aktarıldı",
"fetched_n_events": "{count} eylem toplandı", "fetched_n_events": "{count} eylem toplandı",
"fetched_n_of_total_events": "{total} eylemden {count}tanesi toplandı", "fetched_n_of_total_events": "{total} eylemden {count}tanesi toplandı",

View file

@ -385,7 +385,7 @@
"answer_required": "答案不能为空。 请输入一些文本或删除此选项。", "answer_required": "答案不能为空。 请输入一些文本或删除此选项。",
"num_answered": "{count} 答案" "num_answered": "{count} 答案"
}, },
"export": { "room_export": {
"fetched_n_events": "获取了 {count} 个事件", "fetched_n_events": "获取了 {count} 个事件",
"exported_date": "于 {date} 导出", "exported_date": "于 {date} 导出",
"fetched_n_of_total_events": "已获取 {count} 个事件,共 {total} 个事件", "fetched_n_of_total_events": "已获取 {count} 个事件,共 {total} 个事件",

View file

@ -383,7 +383,7 @@ import MessageOperationsBottomSheet from "./MessageOperationsBottomSheet";
import StickerPickerBottomSheet from "./StickerPickerBottomSheet"; import StickerPickerBottomSheet from "./StickerPickerBottomSheet";
import UserProfileDialog from "./UserProfileDialog.vue" import UserProfileDialog from "./UserProfileDialog.vue"
import BottomSheet from "./BottomSheet.vue"; import BottomSheet from "./BottomSheet.vue";
import ImageResize from "image-resize"; import imageResize from "image-resize";
import CreatePollDialog from "./CreatePollDialog.vue"; import CreatePollDialog from "./CreatePollDialog.vue";
import chatMixin, { ROOM_READ_MARKER_EVENT_PLACEHOLDER } from "./chatMixin"; import chatMixin, { ROOM_READ_MARKER_EVENT_PLACEHOLDER } from "./chatMixin";
import sendAttachmentsMixin from "./sendAttachmentsMixin"; import sendAttachmentsMixin from "./sendAttachmentsMixin";
@ -394,8 +394,7 @@ import roomMembersMixin from "./roomMembersMixin";
import PurgeRoomDialog from "../components/PurgeRoomDialog"; import PurgeRoomDialog from "../components/PurgeRoomDialog";
import MessageErrorHandler from "./MessageErrorHandler"; import MessageErrorHandler from "./MessageErrorHandler";
import MessageOperationsChannel from './messages/channel/MessageOperationsChannel.vue'; import MessageOperationsChannel from './messages/channel/MessageOperationsChannel.vue';
import sizeOf from "image-size"; import { imageSize } from "image-size";
import dataUriToBuffer from "data-uri-to-buffer";
import prettyBytes from "pretty-bytes"; import prettyBytes from "pretty-bytes";
import RoomExport from "./RoomExport.vue"; import RoomExport from "./RoomExport.vue";
import { VEmojiPicker } from 'v-emoji-picker'; import { VEmojiPicker } from 'v-emoji-picker';
@ -1470,8 +1469,9 @@ export default {
fileObj.actualSize = file.size; fileObj.actualSize = file.size;
fileObj.actualFile = file fileObj.actualFile = file
try { try {
fileObj.dimensions = sizeOf(dataUriToBuffer(evt.target.result)); const buffer = Uint8Array.from(window.atob(evt.target.result.replace(/^data[^,]+,/,'')), v => v.charCodeAt(0));
fileObj.dimensions = imageSize(buffer);
// Need to resize? // Need to resize?
const w = fileObj.dimensions.width; const w = fileObj.dimensions.width;
const h = fileObj.dimensions.height; const h = fileObj.dimensions.height;
@ -1479,14 +1479,12 @@ export default {
var aspect = w / h; var aspect = w / h;
var newWidth = parseInt((w > h ? 640 : 640 * aspect).toFixed()); var newWidth = parseInt((w > h ? 640 : 640 * aspect).toFixed());
var newHeight = parseInt((w > h ? 640 / aspect : 640).toFixed()); var newHeight = parseInt((w > h ? 640 / aspect : 640).toFixed());
var imageResize = new ImageResize({ imageResize(evt.target.result, {
format: "png", format: "png",
width: newWidth, width: newWidth,
height: newHeight, height: newHeight,
outputType: "blob", outputType: "blob",
}); })
imageResize
.play(evt.target.result)
.then((img) => { .then((img) => {
Vue.set( Vue.set(
fileObj, fileObj,

View file

@ -43,7 +43,7 @@
</template> </template>
<script> <script>
import RoomList from "../components/RoomList"; import RoomList from "../components/RoomList.vue";
import YouAre from "../components/YouAre.vue"; import YouAre from "../components/YouAre.vue";
import logoMixin from "../components/logoMixin"; import logoMixin from "../components/logoMixin";
export default { export default {

View file

@ -99,21 +99,26 @@ export default {
}; };
}, },
mounted() { mounted() {
var quotes;
try { try {
quotes = require("@/assets/quotes/" + this.$i18n.locale + "/quotes"); const quotes = import.meta.glob('@/assets/quotes/*/*.json', {eager: false});
let quoteImport = undefined;
Object.keys(quotes).forEach(path => {
// Remove"./"
const parts = path.split("/");
const locale = parts[parts.length - 2];
if (locale == this.$i18n.locale) {
quoteImport = quotes[path];
}
});
if (quoteImport) {
quoteImport().then((quotes) => this.selectQuote(quotes));
return;
}
} catch (error) { } catch (error) {
console.error("No quotes for language"); console.error("No quotes for language");
quotes = undefined;
} }
if (!quotes) { import("@/assets/quotes/en/quotes") // Default fallback
quotes = require("@/assets/quotes/en/quotes"); // Default fallback .then((quotes) => this.selectQuote(quotes));
}
const n = quotes.quotes.length;
const quote = quotes.quotes[Math.floor(Math.random() * n)];
this.quote = quote.quote;
this.author = quote.author;
this.mounted = true;
}, },
computed: { computed: {
@ -127,6 +132,17 @@ export default {
}, },
methods: { methods: {
selectQuote(quotes) {
const n = quotes.quotes.length;
if (n > 0) {
const quote = quotes.quotes[Math.floor(Math.random() * n)];
this.quote = quote.quote;
this.author = quote.author;
this.mounted = true;
} else {
this.mounted = true;
}
},
closeBrowserTab() { closeBrowserTab() {
window.location.href = "about:blank"; window.location.href = "about:blank";
}, },

View file

@ -94,10 +94,10 @@ import BottomSheet from "./BottomSheet.vue";
import CreatePollDialog from "./CreatePollDialog.vue"; import CreatePollDialog from "./CreatePollDialog.vue";
import chatMixin from "./chatMixin"; import chatMixin from "./chatMixin";
import util from "../plugins/utils"; import util from "../plugins/utils";
import JSZip from "jszip";
import { saveAs } from "file-saver";
import { EventTimelineSet } from "matrix-js-sdk"; import { EventTimelineSet } from "matrix-js-sdk";
import axios from 'axios'; import axios from 'axios';
import "../services/jszip.min";
import "../services/filesaver.cjs";
export default { export default {
name: "RoomExport", name: "RoomExport",
@ -168,7 +168,7 @@ export default {
}, },
watch: { watch: {
processedEvents() { processedEvents() {
this.statusText = this.$t("export.processed_n_of_total_events", { this.statusText = this.$t("room_export.processed_n_of_total_events", {
count: this.processedEvents, count: this.processedEvents,
total: this.totalEvents, total: this.totalEvents,
}); });
@ -176,7 +176,7 @@ export default {
}, },
computed: { computed: {
exportDate() { exportDate() {
return this.$t("export.exported_date", { date: util.formatDay(Date.now().valueOf()) }); return this.$t("room_export.exported_date", { date: util.formatDay(Date.now().valueOf()) });
}, },
}, },
methods: { methods: {
@ -214,13 +214,13 @@ export default {
if (result.chunk.length === 0) break; if (result.chunk.length === 0) break;
if (nToFetch != null) { if (nToFetch != null) {
nToFetch -= result.chunk.length; nToFetch -= result.chunk.length;
this.statusText = this.$t("export.fetched_n_of_total_events", { this.statusText = this.$t("room_export.fetched_n_of_total_events", {
count: this.totalEvents - nToFetch, count: this.totalEvents - nToFetch,
total: this.totalEvents, total: this.totalEvents,
}); });
} else { } else {
this.totalEvents += result.chunk.length; this.totalEvents += result.chunk.length;
this.statusText = this.$t("export.fetched_n_events", { count: this.totalEvents }); this.statusText = this.$t("room_export.fetched_n_events", { count: this.totalEvents });
} }
fetchedEvents.push(...result.chunk.map(eventMapper)); fetchedEvents.push(...result.chunk.map(eventMapper));
@ -254,7 +254,7 @@ export default {
.then((events) => { .then((events) => {
// Create a timeline and add the events to that, so that relations etc are aggregated correctly! // Create a timeline and add the events to that, so that relations etc are aggregated correctly!
this.timelineSet = new EventTimelineSet(null, { unstableClientRelationAggregation: true }); this.timelineSet = new EventTimelineSet(null, { unstableClientRelationAggregation: true });
this.timelineSet.addEventsToTimeline(events.reverse(), true, this.timelineSet.getLiveTimeline(), ""); this.timelineSet.addEventsToTimeline(events.reverse(), true, false, this.timelineSet.getLiveTimeline(), "");
this.events = events; this.events = events;
// Need to set thread root events and replyEvents so stuff is rendered correctly. // Need to set thread root events and replyEvents so stuff is rendered correctly.
@ -538,7 +538,7 @@ export default {
zip.generateAsync({ type: "blob" }).then((content) => { zip.generateAsync({ type: "blob" }).then((content) => {
saveAs( saveAs(
content, content,
this.$t("export.export_filename", { date: util.formatDay(Date.now().valueOf()) }) + ".zip" this.$t("room_export.export_filename", { date: util.formatDay(Date.now().valueOf()) }) + ".zip"
); );
this.status = ""; this.status = "";
this.$emit("close"); this.$emit("close");

View file

@ -15,6 +15,8 @@ import 'vue-resize/dist/vue-resize.css';
import VueClipboard from 'vue-clipboard2' import VueClipboard from 'vue-clipboard2'
import VueSanitize from "vue-sanitize"; import VueSanitize from "vue-sanitize";
import createVuetify from './plugins/vuetify'; import createVuetify from './plugins/vuetify';
import { Buffer } from 'buffer/'
globalThis.Buffer = Buffer;
var defaultOptions = VueSanitize.defaults; var defaultOptions = VueSanitize.defaults;
defaultOptions.disallowedTagsMode = "recursiveEscape"; defaultOptions.disallowedTagsMode = "recursiveEscape";

View file

@ -1,21 +1,16 @@
import axios from 'axios'; import axios from 'axios';
import * as ContentHelpers from "matrix-js-sdk/lib/content-helpers"; import * as ContentHelpers from "matrix-js-sdk/lib/content-helpers";
import dataUriToBuffer from "data-uri-to-buffer"; import imageResize from "image-resize";
import ImageResize from "image-resize";
import { AutoDiscovery } from 'matrix-js-sdk'; import { AutoDiscovery } from 'matrix-js-sdk';
import User from '../models/user'; import User from '../models/user';
import prettyBytes from "pretty-bytes"; import prettyBytes from "pretty-bytes";
import Hammer from "hammerjs"; import Hammer from "hammerjs";
import { Thread } from 'matrix-js-sdk/lib/models/thread'; import { Thread } from 'matrix-js-sdk/lib/models/thread';
import sizeOf from "image-size"; import { imageSize } from "image-size";
import dayjs from "dayjs"; import dayjs from "dayjs";
import jssha256 from "js-sha256";
import aesjs from "aes-js"; import aesjs from "aes-js";
import { encode, decode } from 'json-web-key/lib/base64url';
import localizedFormat from 'dayjs/plugin/localizedFormat'; import localizedFormat from 'dayjs/plugin/localizedFormat';
import duration from 'dayjs/plugin/duration'; import duration from 'dayjs/plugin/duration';
import { Buffer } from 'buffer/'
window.Buffer = Buffer;
export const STATE_EVENT_ROOM_DELETION_NOTICE = "im.keanu.room_deletion_notice"; export const STATE_EVENT_ROOM_DELETION_NOTICE = "im.keanu.room_deletion_notice";
export const STATE_EVENT_ROOM_DELETED = "im.keanu.room_deleted"; export const STATE_EVENT_ROOM_DELETED = "im.keanu.room_deleted";
@ -27,9 +22,6 @@ export const ROOM_TYPE_CHANNEL = "im.keanu.room_type_channel";
export const STATE_EVENT_ROOM_TYPE = "im.keanu.room_type"; export const STATE_EVENT_ROOM_TYPE = "im.keanu.room_type";
var sha256 = jssha256.sha256;
// Install extended localized format // Install extended localized format
dayjs.extend(localizedFormat) dayjs.extend(localizedFormat)
dayjs.extend(duration); dayjs.extend(duration);
@ -97,11 +89,27 @@ class Util {
var file = null; var file = null;
let decrypt = true; let decrypt = true;
if (content.url != null) { if (content.url != null) {
url = matrixClient.mxcUrlToHttp(content.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia); url = matrixClient.mxcUrlToHttp(
content.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
decrypt = false; decrypt = false;
} else if (content.file && content.file.url) { } else if (content.file && content.file.url) {
file = content.file; file = content.file;
url = matrixClient.mxcUrlToHttp(file.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia); url = matrixClient.mxcUrlToHttp(
file.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
} }
if (url == null) { if (url == null) {
@ -123,7 +131,7 @@ class Util {
}, },
}) })
.then((response) => { .then((response) => {
return decrypt ? this.decryptIfNeeded(file, response) : Promise.resolve({buffer:response.data}); return decrypt ? this.decryptIfNeeded(file, response) : Promise.resolve({ buffer: response.data });
}) })
.then((bytes) => { .then((bytes) => {
if (asBlob) { if (asBlob) {
@ -151,7 +159,15 @@ class Util {
var file = null; var file = null;
let decrypt = true; let decrypt = true;
if (content.url != null) { if (content.url != null) {
url = matrixClient.mxcUrlToHttp(content.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia); url = matrixClient.mxcUrlToHttp(
content.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
decrypt = false; decrypt = false;
} else if (content && content.info && content.info.thumbnail_file && content.info.thumbnail_file.url) { } else if (content && content.info && content.info.thumbnail_file && content.info.thumbnail_file.url) {
file = content.info.thumbnail_file; file = content.info.thumbnail_file;
@ -167,7 +183,15 @@ class Util {
// "scale", // "scale",
// true // true
// ); // );
url = matrixClient.mxcUrlToHttp(file.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia); url = matrixClient.mxcUrlToHttp(
file.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
} else if ( } else if (
content.file && content.file &&
content.file.url && content.file.url &&
@ -176,7 +200,15 @@ class Util {
) { ) {
// No thumb, use real url // No thumb, use real url
file = content.file; file = content.file;
url = matrixClient.mxcUrlToHttp(file.url, undefined, undefined, undefined, undefined, undefined, useAuthedMedia); url = matrixClient.mxcUrlToHttp(
file.url,
undefined,
undefined,
undefined,
undefined,
undefined,
useAuthedMedia
);
} }
if (url == null) { if (url == null) {
@ -185,11 +217,14 @@ class Util {
} }
axios axios
.get(url, { responseType: "arraybuffer", headers: { .get(url, {
Authorization: `Bearer ${matrixClient.getAccessToken()}`, responseType: "arraybuffer",
}}) headers: {
Authorization: `Bearer ${matrixClient.getAccessToken()}`,
},
})
.then((response) => { .then((response) => {
return decrypt ? this.decryptIfNeeded(file, response) : Promise.resolve({buffer:response.data}); return decrypt ? this.decryptIfNeeded(file, response) : Promise.resolve({ buffer: response.data });
}) })
.then((bytes) => { .then((bytes) => {
resolve(URL.createObjectURL(new Blob([bytes.buffer], { type: file.mimetype }))); resolve(URL.createObjectURL(new Blob([bytes.buffer], { type: file.mimetype })));
@ -201,27 +236,34 @@ class Util {
}); });
} }
b64toBuffer(val) {
const baseValue = val.replaceAll("-", "+").replaceAll("_", "/");
return Buffer.from(baseValue, "base64");
}
decryptIfNeeded(file, response) { decryptIfNeeded(file, response) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var key = decode(file.key.k); const key = this.b64toBuffer(file.key.k);
var iv = decode(file.iv); const iv = this.b64toBuffer(file.iv);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(iv)); const originalHash = this.b64toBuffer(file.hashes.sha256);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(iv));
const data = new Uint8Array(response.data); const data = new Uint8Array(response.data);
// const areEqual = (first, second) => crypto.subtle
// first.length === second.length && first.every((value, index) => value === second[index]); .digest("SHA-256", data)
.then((hash) => {
// Calculate sha256 and compare hashes // Calculate sha256 and compare hashes
var hash = new Uint8Array(sha256.create().update(data).arrayBuffer()); if (Buffer.compare(Buffer.from(hash), originalHash) != 0) {
const originalHash = decode(file.hashes.sha256); reject("Hashes don't match!");
if (Buffer.compare(Buffer.from(hash), Buffer.from(originalHash.buffer)) != 0) { return;
reject("Hashes don't match!"); }
return; var decryptedBytes = aesCtr.decrypt(data);
} resolve(decryptedBytes);
})
var decryptedBytes = aesCtr.decrypt(data); .catch((err) => {
resolve(decryptedBytes); reject("Failed to calculate hash value");
});
}); });
} }
@ -466,7 +508,7 @@ class Util {
kty: "oct", kty: "oct",
key_ops: ["encrypt", "decrypt"], key_ops: ["encrypt", "decrypt"],
alg: "A256CTR", alg: "A256CTR",
k: encode(key), k: key.toString("base64").replaceAll(/\//g, "_").replaceAll(/\+/g, "-"),
ext: true, ext: true,
}; };
@ -814,8 +856,8 @@ class Util {
return matrixClient.sendStateEvent(roomId, "m.room.avatar", messageContent); return matrixClient.sendStateEvent(roomId, "m.room.avatar", messageContent);
}) })
.then((result) => { .then((result) => {
resolve(matrixClient.mxcUrlToHttp(messageContent.url, 80, 80, "scale", undefined, undefined, true)) resolve(matrixClient.mxcUrlToHttp(messageContent.url, 80, 80, "scale", undefined, undefined, true));
// resolve(result); // resolve(result);
}) })
.catch((err) => { .catch((err) => {
reject(err); reject(err);
@ -837,7 +879,10 @@ class Util {
try { try {
var image = e.target.result; var image = e.target.result;
var dimens = sizeOf(dataUriToBuffer(e.target.result)); const buffer = Uint8Array.from(window.atob(e.target.result.replace(/^data[^,]+,/, "")), (v) =>
v.charCodeAt(0)
);
var dimens = imageSize(buffer);
// Need to resize? // Need to resize?
const w = dimens.width; const w = dimens.width;
@ -846,14 +891,12 @@ class Util {
var aspect = w / h; var aspect = w / h;
var newWidth = parseInt((w > h ? 640 : 640 * aspect).toFixed()); var newWidth = parseInt((w > h ? 640 : 640 * aspect).toFixed());
var newHeight = parseInt((w > h ? 640 / aspect : 640).toFixed()); var newHeight = parseInt((w > h ? 640 / aspect : 640).toFixed());
var imageResize = new ImageResize({ imageResize(image, {
format: "png", format: "png",
width: newWidth, width: newWidth,
height: newHeight, height: newHeight,
outputType: "blob", outputType: "blob",
}); })
imageResize
.play(event.target)
.then((img) => { .then((img) => {
var resizedImageFile = new File([img], file.name, { var resizedImageFile = new File([img], file.name, {
type: img.type, type: img.type,

171
src/services/filesaver.cjs Normal file
View file

@ -0,0 +1,171 @@
/*
* FileSaver.js
* A saveAs() FileSaver implementation.
*
* By Eli Grey, http://eligrey.com
*
* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)
* source : http://purl.eligrey.com/github/FileSaver.js
*/
// The one and only way of getting global scope in all environments
// https://stackoverflow.com/q/3277182/1008999
var _global = typeof window === 'object' && window.window === window
? window : typeof self === 'object' && self.self === self
? self : typeof global === 'object' && global.global === global
? global
: this
function bom (blob, opts) {
if (typeof opts === 'undefined') opts = { autoBom: false }
else if (typeof opts !== 'object') {
console.warn('Deprecated: Expected third argument to be a object')
opts = { autoBom: !opts }
}
// prepend BOM for UTF-8 XML and text/* types (including HTML)
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type })
}
return blob
}
function download (url, name, opts) {
var xhr = new XMLHttpRequest()
xhr.open('GET', url)
xhr.responseType = 'blob'
xhr.onload = function () {
saveAs(xhr.response, name, opts)
}
xhr.onerror = function () {
console.error('could not download file')
}
xhr.send()
}
function corsEnabled (url) {
var xhr = new XMLHttpRequest()
// use sync to avoid popup blocker
xhr.open('HEAD', url, false)
try {
xhr.send()
} catch (e) {}
return xhr.status >= 200 && xhr.status <= 299
}
// `a.click()` doesn't work for all browsers (#465)
function click (node) {
try {
node.dispatchEvent(new MouseEvent('click'))
} catch (e) {
var evt = document.createEvent('MouseEvents')
evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80,
20, false, false, false, false, 0, null)
node.dispatchEvent(evt)
}
}
// Detect WebView inside a native macOS app by ruling out all browsers
// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too
// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos
var isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent)
var saveAs = _global.saveAs || (
// probably in some web worker
(typeof window !== 'object' || window !== _global)
? function saveAs () { /* noop */ }
// Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView
: ('download' in HTMLAnchorElement.prototype && !isMacOSWebView)
? function saveAs (blob, name, opts) {
var URL = _global.URL || _global.webkitURL
var a = document.createElement('a')
name = name || blob.name || 'download'
a.download = name
a.rel = 'noopener' // tabnabbing
// TODO: detect chrome extensions & packaged apps
// a.target = '_blank'
if (typeof blob === 'string') {
// Support regular links
a.href = blob
if (a.origin !== location.origin) {
corsEnabled(a.href)
? download(blob, name, opts)
: click(a, a.target = '_blank')
} else {
click(a)
}
} else {
// Support blobs
a.href = URL.createObjectURL(blob)
setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s
setTimeout(function () { click(a) }, 0)
}
}
// Use msSaveOrOpenBlob as a second approach
: 'msSaveOrOpenBlob' in navigator
? function saveAs (blob, name, opts) {
name = name || blob.name || 'download'
if (typeof blob === 'string') {
if (corsEnabled(blob)) {
download(blob, name, opts)
} else {
var a = document.createElement('a')
a.href = blob
a.target = '_blank'
setTimeout(function () { click(a) })
}
} else {
navigator.msSaveOrOpenBlob(bom(blob, opts), name)
}
}
// Fallback to using FileReader and a popup
: function saveAs (blob, name, opts, popup) {
// Open a popup immediately do go around popup blocker
// Mostly only available on user interaction and the fileReader is async so...
popup = popup || open('', '_blank')
if (popup) {
popup.document.title =
popup.document.body.innerText = 'downloading...'
}
if (typeof blob === 'string') return download(blob, name, opts)
var force = blob.type === 'application/octet-stream'
var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari
var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent)
if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') {
// Safari doesn't allow downloading of blob URLs
var reader = new FileReader()
reader.onloadend = function () {
var url = reader.result
url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;')
if (popup) popup.location.href = url
else location = url
popup = null // reverse-tabnabbing #460
}
reader.readAsDataURL(blob)
} else {
var URL = _global.URL || _global.webkitURL
var url = URL.createObjectURL(blob)
if (popup) popup.location = url
else location.href = url
popup = null // reverse-tabnabbing #460
setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s
}
}
)
_global.saveAs = saveAs.saveAs = saveAs
if (typeof module !== 'undefined') {
module.exports = saveAs;
}

13
src/services/jszip.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,3 @@
import olm from "@matrix-org/olm/olm";
global.Olm = olm;
import * as sdk from "matrix-js-sdk"; import * as sdk from "matrix-js-sdk";
import { TimelineWindow, EventTimeline, EventStatus } from "matrix-js-sdk"; import { TimelineWindow, EventTimeline, EventStatus } from "matrix-js-sdk";
import util, { STATE_EVENT_ROOM_DELETED, STATE_EVENT_ROOM_TYPE, ROOM_TYPE_CHANNEL, ROOM_TYPE_FILE_MODE, ROOM_TYPE_VOICE_MODE, ROOM_TYPE_DEFAULT } from "../plugins/utils"; import util, { STATE_EVENT_ROOM_DELETED, STATE_EVENT_ROOM_TYPE, ROOM_TYPE_CHANNEL, ROOM_TYPE_FILE_MODE, ROOM_TYPE_VOICE_MODE, ROOM_TYPE_DEFAULT } from "../plugins/utils";
@ -530,7 +528,7 @@ export default {
const resolvedId = const resolvedId =
this.currentRoomId && this.currentRoomId.startsWith("#") this.currentRoomId && this.currentRoomId.startsWith("#")
? this.matrixClient.resolveRoomAlias(this.currentRoomId).then((r) => r.room_id) ? this.matrixClient.getRoomIdForAlias(this.currentRoomId).then((r) => r.room_id)
: Promise.resolve(this.currentRoomId); : Promise.resolve(this.currentRoomId);
resolvedId resolvedId
.then((roomId) => { .then((roomId) => {
@ -690,7 +688,7 @@ export default {
if (roomIdOrAlias && this.matrixClient) { if (roomIdOrAlias && this.matrixClient) {
try { try {
const resolvedRoomId = roomIdOrAlias.startsWith("#") const resolvedRoomId = roomIdOrAlias.startsWith("#")
? this.matrixClient.resolveRoomAlias(roomIdOrAlias).then((res) => res.room_id) ? this.matrixClient.getRoomIdForAlias(roomIdOrAlias).then((res) => res.room_id)
: Promise.resolve(roomIdOrAlias); : Promise.resolve(roomIdOrAlias);
return resolvedRoomId.then((roomId) => { return resolvedRoomId.then((roomId) => {
return this.matrixClient.getJoinedRooms().then((rooms) => { return this.matrixClient.getJoinedRooms().then((rooms) => {

View file

@ -1,6 +1,6 @@
import Vue from 'vue' import Vue from 'vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import VuexPersist from 'vuex-persist' import VuexPersistence from 'vuex-persist'
Vue.use(Vuex) Vue.use(Vuex)
const USER = `convene_${ window.location.hostname }_user` const USER = `convene_${ window.location.hostname }_user`
@ -32,7 +32,7 @@ const persistUserPlugin = store => {
} }
const vuexPersistLocalStorage = new VuexPersist({ const vuexPersistLocalStorage = new VuexPersistence({
key: SETTINGS, key: SETTINGS,
storage: localStorage, storage: localStorage,
reducer: state => { reducer: state => {
@ -49,7 +49,7 @@ const vuexPersistLocalStorage = new VuexPersist({
} }
}) })
const vuexPersistSessionStorage = new VuexPersist({ const vuexPersistSessionStorage = new VuexPersistence({
key: SETTINGS, key: SETTINGS,
storage: sessionStorage, storage: sessionStorage,
reducer: state => { reducer: state => {

View file

@ -4,6 +4,8 @@ import { fileURLToPath, URL } from "node:url";
import Components from "unplugin-vue-components/vite"; import Components from "unplugin-vue-components/vite";
import { viteStaticCopy } from 'vite-plugin-static-copy'; import { viteStaticCopy } from 'vite-plugin-static-copy';
import nodePolyfills from 'rollup-plugin-polyfill-node'; import nodePolyfills from 'rollup-plugin-polyfill-node';
import { resolve } from "path";
import commonjs from '@rollup/plugin-commonjs';
function VuetifyResolver() { function VuetifyResolver() {
return { return {
@ -16,8 +18,15 @@ function VuetifyResolver() {
} }
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig(({mode}) => ({
plugins: [ plugins: [
// commonjs({
// include: /node_modules/,
// requireReturnsDefault: 'auto', // <---- this solves default issue
// }),
// commonjs({
// exclude: ["*vuex-persist*", "*deepmerge*"]
// }),
vue(), vue(),
Components({ Components({
resolvers: [VuetifyResolver()], resolvers: [VuetifyResolver()],
@ -34,22 +43,23 @@ export default defineConfig({
}, },
{ {
src: 'node_modules/@matrix-org/matrix-sdk-crypto-wasm/pkg/matrix_sdk_crypto_wasm_bg.wasm', src: 'node_modules/@matrix-org/matrix-sdk-crypto-wasm/pkg/matrix_sdk_crypto_wasm_bg.wasm',
dest: '/node_modules/.vite/deps/pkg' dest: mode == "development" ? '/node_modules/.vite/deps/pkg' : ''
} }
] ]
}), }),
nodePolyfills() //nodePolyfills(),
], ],
resolve: { resolve: {
extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue", ".wasm"], extensions: ['.vue','.mjs', '.js', '.ts', '.jsx', '.tsx', '.json','.wasm'],
alias: { alias: [
"@": fileURLToPath(new URL("./src", import.meta.url)), { find: "@", replacement: fileURLToPath(new URL("./src", import.meta.url)) },
"~@": fileURLToPath(new URL("./src", import.meta.url)), { find: "~@", replacement: fileURLToPath(new URL("./src", import.meta.url)) },
"~vuetify": fileURLToPath(new URL("./node_modules/vuetify", import.meta.url)), { find: "~vuetify", replacement: fileURLToPath(new URL("./node_modules/vuetify", import.meta.url)) },
}, ],
}, },
define: { define: {
global: "window", //global: "window",
//module: {},
Lame: "window.Lame", Lame: "window.Lame",
Presets: "window.Presets", Presets: "window.Presets",
GainAnalysis: "window.GainAnalysis", GainAnalysis: "window.GainAnalysis",
@ -60,4 +70,40 @@ export default defineConfig({
MPEGMode: "window.MPEGMode", MPEGMode: "window.MPEGMode",
BitStream: "window.BitStream", BitStream: "window.BitStream",
}, },
}); build: {
commonjsOptions: { transformMixedEsModules: true } // Change
}
// optimizeDeps: {
// include: ["deepmerge", "vuex-persist"],
// },
// optimizeDeps: {
// include: [
// "vuex-persist", "vue-sanitize"
// ],
// esbuildOptions:{
// plugins:[
// commonjs()
// ]
// }
// },
// build: {
// commonjsOptions: {
// include: [/node_modules/],
// requireReturnsDefault: true,
// exclude: ["vuex-persist"]
// }
// },
// rollupOptions: {
// //Here, we are externalizing Vue to prevent it to be bundled
// //with our library
// external: ["vue"],
// //Add this so the UMD build will recognize the global variables
// //of externalized dependencies
// output: {
// globals: {
// vue: "Vue",
// },
// exports: "named",
// },
// },
}));

View file

@ -1,63 +0,0 @@
const CopyWebpackPlugin = require("copy-webpack-plugin");
const webpack = require("webpack");
//const fs = require('fs')
module.exports = {
transpileDependencies: ["vuetify"],
publicPath: process.env.NODE_ENV === "production" ? "./" : "./",
chainWebpack: (config) => {
config.plugin("html").tap((args) => {
var c = require("./src/assets/config.json");
args[0].title = c.appName;
return args;
});
},
configureWebpack: {
devtool: "source-map",
resolve: {
fallback: {
"path": require.resolve("path-browserify"),
"crypto": require.resolve("crypto-browserify"),
"stream": require.resolve("stream-browserify"),
"fs": require.resolve("browserify-fs"),
"buffer": require.resolve("buffer"),
"util": require.resolve("util")
}
},
plugins: [
new webpack.ProvidePlugin({
Buffer: ['buffer', 'Buffer'],
}),
new webpack.ProvidePlugin({
process: 'process/browser',
}),
new CopyWebpackPlugin({patterns: [
{
from: "./src/assets/config.json",
to: "./",
},
{
from: "./node_modules/@matrix-org/olm/olm.wasm",
to: "./js/olm.wasm",
},
]}),
],
},
devServer: {
//https: true,
/***
* For testing notification via service worker in Mobile
* Run your site locally with secure HTTPS using mkcert
* https://web.dev/how-to-use-local-https/#running-your-site-locally-with-https-using-mkcert-recommended
*/
// https: {
// key: fs.readFileSync('./your-local-ip-address-key.pem'),
// cert: fs.readFileSync('./your-local-ip-address.pem'),
// }
}
};