This commit is contained in:
2025-06-21 23:42:15 +03:00
parent a29fc4233d
commit 8db8fd6c6c
18 changed files with 729 additions and 319 deletions

365
package-lock.json generated
View File

@@ -19,6 +19,7 @@
"dompurify": "^3.2.3",
"jotai": "^2.12.4",
"localforage": "^1.10.0",
"mediainfo.js": "^0.3.5",
"moment": "^2.30.1",
"qapp-core": "^1.0.29",
"quill": "^2.0.2",
@@ -34,10 +35,10 @@
"react-router-dom": "^7.1.1",
"react-toastify": "^11.0.2",
"redux-persist": "^6.0.0",
"short-unique-id": "^5.2.0",
"ts-key-enum": "^2.0.13"
"short-unique-id": "^5.2.0"
},
"devDependencies": {
"@types/node": "^24.0.0",
"@types/react": "^19.0.2",
"@types/react-dom": "^19.0.2",
"@typescript-eslint/eslint-plugin": "^8.18.2",
@@ -48,7 +49,8 @@
"eslint-plugin-react-refresh": "^0.4.16",
"prettier": "^3.4.2",
"typescript": "^5.7.2",
"vite": "^6.3.5"
"vite": "^6.3.5",
"vite-plugin-static-copy": "^3.0.0"
}
},
"node_modules/@ampproject/remapping": {
@@ -1899,6 +1901,16 @@
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true
},
"node_modules/@types/node": {
"version": "24.0.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.0.tgz",
"integrity": "sha512-yZQa2zm87aRVcqDyH5+4Hv9KYgSdgwX1rFnGvpbzMaC7YAljmhBET93TPiTd3ObwTL+gSpIzPKg5BqVxdCvxKg==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~7.8.0"
}
},
"node_modules/@types/parse-json": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
@@ -2191,11 +2203,19 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2206,6 +2226,20 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -2267,6 +2301,19 @@
}
]
},
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/bloom-filters": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/bloom-filters/-/bloom-filters-3.0.4.tgz",
@@ -2454,6 +2501,58 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/chokidar/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
@@ -2474,7 +2573,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -2485,8 +2583,7 @@
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/compressorjs": {
"version": "1.2.1",
@@ -2688,6 +2785,12 @@
"integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==",
"dev": true
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -2768,7 +2871,6 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
"engines": {
"node": ">=6"
}
@@ -3142,6 +3244,21 @@
"integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
"dev": true
},
"node_modules/fs-extra": {
"version": "11.3.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
"integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -3182,6 +3299,15 @@
"node": ">=6.9.0"
}
},
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-intrinsic": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
@@ -3244,6 +3370,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true,
"license": "ISC"
},
"node_modules/graphemer": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -3405,6 +3538,19 @@
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-blob": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz",
@@ -3476,6 +3622,15 @@
"node": ">=0.10.0"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -3604,6 +3759,19 @@
"node": ">=6"
}
},
"node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -3721,6 +3889,21 @@
"node": ">= 0.4"
}
},
"node_modules/mediainfo.js": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/mediainfo.js/-/mediainfo.js-0.3.5.tgz",
"integrity": "sha512-frLJzKOoAUC0sbPzmg9VOR+WFbNj5CarbTuOzXeH9cOl33haU/CGcyXUTWK00HPXCVS2N5eT0o0dirVxaPIOIw==",
"license": "BSD-2-Clause",
"dependencies": {
"yargs": "^17.7.2"
},
"bin": {
"mediainfo.js": "dist/esm/cli.js"
},
"engines": {
"node": ">=18.0.0"
}
},
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -3802,6 +3985,16 @@
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
"dev": true
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -3880,6 +4073,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-map": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz",
"integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/parchment": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz",
@@ -4410,6 +4616,19 @@
"react-dom": ">=16.6.0"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/redux": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
@@ -4453,6 +4672,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/reselect": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
@@ -4663,6 +4891,32 @@
"node": ">=0.10.0"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -4772,11 +5026,6 @@
"typescript": ">=4.2.0"
}
},
"node_modules/ts-key-enum": {
"version": "2.0.13",
"resolved": "https://registry.npmjs.org/ts-key-enum/-/ts-key-enum-2.0.13.tgz",
"integrity": "sha512-zixs6j8+NhzazLUQ1SiFrlo1EFWG/DbqLuUGcWWZ5zhwjRT7kbi1hBlofxdqel+h28zrby2It5TrOyKp04kvqw=="
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -4812,6 +5061,23 @@
"node": ">=14.17"
}
},
"node_modules/undici-types": {
"version": "7.8.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
"integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
"dev": true,
"license": "MIT"
},
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/update-browserslist-db": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
@@ -4934,6 +5200,26 @@
}
}
},
"node_modules/vite-plugin-static-copy": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.0.0.tgz",
"integrity": "sha512-Uki9pPUQ4ZnoMEdIFabvoh9h6Bh9Q1m3iF7BrZvoiF30reREpJh2gZb4jOnW1/uYFzyRiLCmFSkM+8hwiq1vWQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"chokidar": "^3.5.3",
"fs-extra": "^11.3.0",
"p-map": "^7.0.3",
"picocolors": "^1.1.1",
"tinyglobby": "^0.2.13"
},
"engines": {
"node": "^18.0.0 || >=20.0.0"
},
"peerDependencies": {
"vite": "^5.0.0 || ^6.0.0"
}
},
"node_modules/vite/node_modules/fdir": {
"version": "6.4.4",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
@@ -4986,6 +5272,23 @@
"node": ">=0.10.0"
}
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/xxhashjs": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz",
@@ -4994,6 +5297,15 @@
"cuint": "^0.2.2"
}
},
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -5014,6 +5326,33 @@
"node": ">= 14"
}
},
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",

View File

@@ -5,7 +5,7 @@
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"build": "vite build",
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
},
@@ -21,6 +21,7 @@
"dompurify": "^3.2.3",
"jotai": "^2.12.4",
"localforage": "^1.10.0",
"mediainfo.js": "^0.3.5",
"moment": "^2.30.1",
"qapp-core": "^1.0.29",
"quill": "^2.0.2",
@@ -36,10 +37,10 @@
"react-router-dom": "^7.1.1",
"react-toastify": "^11.0.2",
"redux-persist": "^6.0.0",
"short-unique-id": "^5.2.0",
"ts-key-enum": "^2.0.13"
"short-unique-id": "^5.2.0"
},
"devDependencies": {
"@types/node": "^24.0.0",
"@types/react": "^19.0.2",
"@types/react-dom": "^19.0.2",
"@typescript-eslint/eslint-plugin": "^8.18.2",
@@ -50,6 +51,7 @@
"eslint-plugin-react-refresh": "^0.4.16",
"prettier": "^3.4.2",
"typescript": "^5.7.2",
"vite": "^6.3.5"
"vite": "^6.3.5",
"vite-plugin-static-copy": "^3.0.0"
}
}

View File

@@ -1,9 +1,13 @@
import { GlobalProvider } from 'qapp-core'
import { useSelector } from 'react-redux';
import { RootState } from './state/store';
import { useLocation, useNavigate } from 'react-router-dom';
export const QappCoreWrapper = ({children}) => {
const { user } = useSelector((state: RootState) => state.auth);
const navigate = useNavigate();
const location = useLocation();
return (
<GlobalProvider
config={{
@@ -17,6 +21,8 @@ export const QappCoreWrapper = ({children}) => {
publicSalt: "usVbeM9YpjGCbLrTcc78YJS0ap1AxDkHAOMZrp3+wDY=",
appName: "Q-Tube",
}}
navigate={navigate}
location={location}
>
{children}
</GlobalProvider>

View File

@@ -53,6 +53,7 @@ import {
NewCrowdfundTitle,
TimesIcon,
} from "./EditVideo-styles.tsx";
import { usePublish } from "qapp-core";
const uid = new ShortUniqueId();
const shortuid = new ShortUniqueId({ length: 5 });
@@ -71,7 +72,8 @@ export const EditVideo = () => {
const [isOpenMultiplePublish, setIsOpenMultiplePublish] = useState(false);
const [videoPropertiesToSetToRedux, setVideoPropertiesToSetToRedux] =
useState(null);
const publishFromLibrary = usePublish()
const [title, setTitle] = useState<string>("");
const [description, setDescription] = useState<string>("");
const [coverImage, setCoverImage] = useState<string>("");
@@ -318,30 +320,34 @@ export const EditVideo = () => {
action: "PUBLISH_MULTIPLE_QDN_RESOURCES",
resources: [...listOfPublishes],
};
setPublishes(multiplePublish);
setIsOpenMultiplePublish(true);
// setPublishes(multiplePublish);
// setIsOpenMultiplePublish(true);
setVideoPropertiesToSetToRedux({
...editVideoProperties,
...videoObject,
});
const success = await publishFromLibrary.publishMultipleResources(listOfPublishes)
console.log('success', success)
setIsOpenMultiplePublish(false);
const clonedCopy = structuredClone({
...editVideoProperties,
...videoObject,
});
dispatch(updateVideo(clonedCopy));
dispatch(updateInHashMap(clonedCopy));
dispatch(
setNotification({
msg: "Video updated",
alertType: "success",
})
);
onClose();
} catch (error: any) {
let notificationObj: any = null;
if (typeof error === "string") {
notificationObj = {
msg: error || "Failed to publish update",
alertType: "error",
};
} else if (typeof error?.error === "string") {
notificationObj = {
msg: error?.error || "Failed to publish update",
alertType: "error",
};
} else {
notificationObj = {
notificationObj = {
msg: error?.message || "Failed to publish update",
alertType: "error",
};
}
if (!notificationObj) return;
dispatch(setNotification(notificationObj));

View File

@@ -11,6 +11,8 @@ import React, { useCallback, useEffect, useState, useRef } from "react";
import { CircleSVG } from "../../../assets/svgs/CircleSVG.tsx";
import { EmptyCircleSVG } from "../../../assets/svgs/EmptyCircleSVG.tsx";
import { styled } from "@mui/system";
import { useAtomValue } from "jotai";
import { usePublish } from "qapp-core";
interface Publish {
resources: any[];
@@ -30,6 +32,7 @@ export const MultiplePublish = ({
onError,
}: MultiplePublishProps) => {
const theme = useTheme();
const publishFromLibrary = usePublish()
const listOfSuccessfulPublishesRef = useRef([]);
const [listOfSuccessfulPublishes, setListOfSuccessfulPublishes] = useState<
any[]
@@ -41,7 +44,7 @@ export const MultiplePublish = ({
const publish = useCallback(async (pub: any) => {
const lengthOfResources = pub?.resources?.length;
const lengthOfTimeout = lengthOfResources * 1200000; // Time out in QR, Seconds = 20 Minutes
return await qortalRequestWithTimeout(pub, lengthOfTimeout);
return await publishFromLibrary.publishMultipleResources(pub.resources)
}, []);
const [isPublishing, setIsPublishing] = useState(true);
@@ -123,9 +126,12 @@ export const MultiplePublish = ({
const unpublished = listOfUnsuccessfulPublishes.map(
item => item?.identifier
);
const key = `${publish?.service}-${publish?.name}-${publish?.identifier}`
return (
<Box key={key}>
<Box
key={publish?.identifier}
sx={{
display: "flex",
gap: "20px",
@@ -154,6 +160,8 @@ export const MultiplePublish = ({
<CircularProgress size={16} color="secondary" />
)}
</Box>
</Box>
);
})}
{!isPublishing && listOfUnsuccessfulPublishes.length > 0 && (

View File

@@ -482,7 +482,7 @@ export const PublishVideo = ({
throw new Error("cannot get playlist data");
}
}
console.log('listOfPublishes', listOfPublishes)
const multiplePublish = {
action: "PUBLISH_MULTIPLE_QDN_RESOURCES",
resources: [...listOfPublishes],

View File

@@ -4,7 +4,7 @@ import { useSignalEffect, useSignals } from "@preact/signals-react/runtime";
import { useEffect } from "react";
import ReactDOM from "react-dom";
import { useDispatch, useSelector } from "react-redux";
import { Key } from "ts-key-enum";
// import { Key } from "ts-key-enum";
import { setVideoPlaying } from "../../../../state/features/globalSlice.ts";
import { RootState } from "../../../../state/store.ts";
import { useVideoPlayerState } from "../VideoPlayer-State.ts";
@@ -229,110 +229,110 @@ export const useVideoControlsState = (
e.preventDefault();
// console.log("hotkey is: ", '"' + e.key + '"');
switch (e.key) {
case "o":
toggleObjectFit();
break;
case "c":
toggleAlwaysShowControls();
break;
case Key.Add:
increaseSpeed(false);
break;
case "+":
increaseSpeed(false);
break;
case ">":
increaseSpeed(false);
break;
// switch (e.key) {
// case "o":
// toggleObjectFit();
// break;
// case "c":
// toggleAlwaysShowControls();
// break;
// case Key.Add:
// increaseSpeed(false);
// break;
// case "+":
// increaseSpeed(false);
// break;
// case ">":
// increaseSpeed(false);
// break;
case Key.Subtract:
decreaseSpeed();
break;
case "-":
decreaseSpeed();
break;
case "<":
decreaseSpeed();
break;
// case Key.Subtract:
// decreaseSpeed();
// break;
// case "-":
// decreaseSpeed();
// break;
// case "<":
// decreaseSpeed();
// break;
case Key.ArrowLeft:
{
if (e.shiftKey) setProgressRelative(-300);
else if (e.ctrlKey) setProgressRelative(-60);
else if (e.altKey) setProgressRelative(-10);
else setProgressRelative(-5);
}
break;
// case Key.ArrowLeft:
// {
// if (e.shiftKey) setProgressRelative(-300);
// else if (e.ctrlKey) setProgressRelative(-60);
// else if (e.altKey) setProgressRelative(-10);
// else setProgressRelative(-5);
// }
// break;
case Key.ArrowRight:
{
if (e.shiftKey) setProgressRelative(300);
else if (e.ctrlKey) setProgressRelative(60);
else if (e.altKey) setProgressRelative(10);
else setProgressRelative(5);
}
break;
// case Key.ArrowRight:
// {
// if (e.shiftKey) setProgressRelative(300);
// else if (e.ctrlKey) setProgressRelative(60);
// else if (e.altKey) setProgressRelative(10);
// else setProgressRelative(5);
// }
// break;
case Key.ArrowDown:
changeVolume(-0.05);
break;
case Key.ArrowUp:
changeVolume(0.05);
break;
case " ":
togglePlay();
break;
case "m":
toggleMute();
break;
// case Key.ArrowDown:
// changeVolume(-0.05);
// break;
// case Key.ArrowUp:
// changeVolume(0.05);
// break;
// case " ":
// togglePlay();
// break;
// case "m":
// toggleMute();
// break;
case "f":
toggleFullscreen();
break;
case Key.Escape:
exitFullscreen();
break;
// case "f":
// toggleFullscreen();
// break;
// case Key.Escape:
// exitFullscreen();
// break;
case "r":
reloadVideo();
break;
// case "r":
// reloadVideo();
// break;
case "p":
togglePictureInPicture();
break;
// case "p":
// togglePictureInPicture();
// break;
case "0":
setProgressAbsolute(0);
break;
case "1":
setProgressAbsolute(10);
break;
case "2":
setProgressAbsolute(20);
break;
case "3":
setProgressAbsolute(30);
break;
case "4":
setProgressAbsolute(40);
break;
case "5":
setProgressAbsolute(50);
break;
case "6":
setProgressAbsolute(60);
break;
case "7":
setProgressAbsolute(70);
break;
case "8":
setProgressAbsolute(80);
break;
case "9":
setProgressAbsolute(90);
break;
}
// case "0":
// setProgressAbsolute(0);
// break;
// case "1":
// setProgressAbsolute(10);
// break;
// case "2":
// setProgressAbsolute(20);
// break;
// case "3":
// setProgressAbsolute(30);
// break;
// case "4":
// setProgressAbsolute(40);
// break;
// case "5":
// setProgressAbsolute(50);
// break;
// case "6":
// setProgressAbsolute(60);
// break;
// case "7":
// setProgressAbsolute(70);
// break;
// case "8":
// setProgressAbsolute(80);
// break;
// case "9":
// setProgressAbsolute(90);
// break;
// }
};
useEffect(() => {

View File

@@ -1,11 +1,12 @@
import CSS from "csstype";
import { forwardRef } from "react";
import { forwardRef, useCallback, useMemo, useRef } from "react";
import useIdleTimeout from "../../../hooks/useIdleTimeout.ts";
import { LoadingVideo } from "./Components/LoadingVideo.tsx";
import { useContextData, VideoContext } from "./Components/VideoContext.ts";
import { VideoControlsBar } from "./Components/VideoControlsBar.tsx";
import { VideoContainer, VideoElement } from "./VideoPlayer-styles.ts";
import {VideoPlayer as QappVideoPlayer, Service, TimelineAction} from 'qapp-core'
import { Box } from "@mui/material";
export interface VideoStyles {
videoContainer?: CSS.Properties;
video?: CSS.Properties;
@@ -35,91 +36,116 @@ export type videoRefType = {
};
export const VideoPlayer = forwardRef<videoRefType, VideoPlayerProps>(
(props: VideoPlayerProps, ref) => {
const contextData = useContextData(props, ref);
const videoRef = useRef(null)
// const contextData = useContextData(props, ref);
const {
keyboardShortcuts,
from,
videoStyles,
containerRef,
resourceStatus,
src,
togglePlay,
identifier,
videoRef,
poster,
updateProgress,
autoplay,
handleEnded,
handleCanPlay,
startPlay,
videoObjectFit,
showControlsFullScreen,
isFullscreen,
alwaysShowControls,
} = contextData;
// const {
// keyboardShortcuts,
// from,
// videoStyles,
// containerRef,
// resourceStatus,
// src,
// togglePlay,
// identifier,
// videoRef,
// poster,
// updateProgress,
// autoplay,
// handleEnded,
// handleCanPlay,
// startPlay,
// videoObjectFit,
// showControlsFullScreen,
// isFullscreen,
// alwaysShowControls,
// } = contextData;
const showControls =
!isFullscreen.value ||
(isFullscreen.value && showControlsFullScreen.value) ||
alwaysShowControls.value;
// const showControls =
// !isFullscreen.value ||
// (isFullscreen.value && showControlsFullScreen.value) ||
// alwaysShowControls.value;
const idleTime = 5000; // Time in milliseconds
useIdleTimeout({
onIdle: () => (showControlsFullScreen.value = false),
onActive: () => (showControlsFullScreen.value = true),
idleTime,
});
// const idleTime = 5000; // Time in milliseconds
// useIdleTimeout({
// onIdle: () => (showControlsFullScreen.value = false),
// onActive: () => (showControlsFullScreen.value = true),
// idleTime,
// });
const timelineActions: TimelineAction[] = useMemo(()=> {
return [{
label: "Skip intro",
type: 'SEEK',
duration: 10,
time: 60,
seekToTime: 3600,
placement: 'BOTTOM-RIGHT'
}, {
label: "Skip intro",
type: 'SEEK',
duration: 10,
time: 3610,
seekToTime: 7200,
placement: 'TOP-RIGHT'
}]
}, [])
return (
<VideoContext.Provider value={contextData}>
<VideoContainer
tabIndex={0}
onKeyDown={keyboardShortcuts}
style={{
padding: from === "create" ? "8px" : 0,
cursor:
!showControlsFullScreen.value && isFullscreen.value
? "none"
: "auto",
...videoStyles?.videoContainer,
}}
onMouseEnter={e => {
showControlsFullScreen.value = true;
}}
onMouseLeave={e => {
showControlsFullScreen.value = false;
}}
ref={containerRef}
>
<LoadingVideo />
<VideoElement
id={identifier}
ref={videoRef}
src={
resourceStatus?.status === "READY" && startPlay.value ? src : null
}
poster={startPlay.value ? "" : poster}
onTimeUpdate={updateProgress}
autoPlay={autoplay}
onClick={() => togglePlay()}
onEnded={handleEnded}
// onLoadedMetadata={handleLoadedMetadata}
onCanPlay={handleCanPlay}
preload="metadata"
style={{
...videoStyles?.video,
objectFit: videoObjectFit.value,
backgroundColor: "#000000",
height:
isFullscreen.value && showControls
? "calc(100vh - 40px)"
: "100%",
}}
/>
{showControls && <VideoControlsBar />}
</VideoContainer>
</VideoContext.Provider>
// <VideoContext.Provider value={contextData}>
<Box sx={{
width: '100%',
height: '70vh'
}}>
<QappVideoPlayer timelineActions={timelineActions} poster={props.poster} videoRef={videoRef} qortalVideoResource={{name: props.name, service: props.service as Service, identifier: props.identifier}} />
</Box>
// <VideoContainer
// tabIndex={0}
// onKeyDown={keyboardShortcuts}
// style={{
// padding: from === "create" ? "8px" : 0,
// cursor:
// !showControlsFullScreen.value && isFullscreen.value
// ? "none"
// : "auto",
// ...videoStyles?.videoContainer,
// }}
// onMouseEnter={e => {
// showControlsFullScreen.value = true;
// }}
// onMouseLeave={e => {
// showControlsFullScreen.value = false;
// }}
// ref={containerRef}
// >
// <LoadingVideo />
// <VideoElement
// id={identifier}
// ref={videoRef}
// src={
// resourceStatus?.status === "READY" && startPlay.value ? src : null
// }
// poster={startPlay.value ? "" : poster}
// onTimeUpdate={updateProgress}
// autoPlay={autoplay}
// onClick={() => togglePlay()}
// onEnded={handleEnded}
// // onLoadedMetadata={handleLoadedMetadata}
// onCanPlay={handleCanPlay}
// preload="metadata"
// style={{
// ...videoStyles?.video,
// objectFit: videoObjectFit.value,
// backgroundColor: "#000000",
// height:
// isFullscreen.value && showControls
// ? "calc(100vh - 40px)"
// : "100%",
// }}
// />
// {showControls && <VideoControlsBar />}
// </VideoContainer>
// </VideoContext.Provider>
);
}
);

View File

@@ -21,7 +21,7 @@ import {
import { styled } from "@mui/system";
import React, { useContext, useEffect, useMemo, useRef, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { Key } from "ts-key-enum";
// import { Key } from "ts-key-enum";
import { setVideoPlaying } from "../../../state/features/globalSlice.ts";
import { RootState } from "../../../state/store.ts";
import { formatTime } from "../../../utils/numberFunctions.ts";
@@ -346,103 +346,103 @@ export const VideoPlayerGlobal: React.FC<VideoPlayerProps> = ({
const keyboardShortcutsDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
e.preventDefault();
switch (e.key) {
case Key.Add:
increaseSpeed(false);
break;
case "+":
increaseSpeed(false);
break;
case ">":
increaseSpeed(false);
break;
// switch (e.key) {
// case Key.Add:
// increaseSpeed(false);
// break;
// case "+":
// increaseSpeed(false);
// break;
// case ">":
// increaseSpeed(false);
// break;
case Key.Subtract:
decreaseSpeed();
break;
case "-":
decreaseSpeed();
break;
case "<":
decreaseSpeed();
break;
// case Key.Subtract:
// decreaseSpeed();
// break;
// case "-":
// decreaseSpeed();
// break;
// case "<":
// decreaseSpeed();
// break;
case Key.ArrowLeft:
{
if (e.shiftKey) setProgressRelative(-300);
else if (e.ctrlKey) setProgressRelative(-60);
else if (e.altKey) setProgressRelative(-10);
else setProgressRelative(-5);
}
break;
// case Key.ArrowLeft:
// {
// if (e.shiftKey) setProgressRelative(-300);
// else if (e.ctrlKey) setProgressRelative(-60);
// else if (e.altKey) setProgressRelative(-10);
// else setProgressRelative(-5);
// }
// break;
case Key.ArrowRight:
{
if (e.shiftKey) setProgressRelative(300);
else if (e.ctrlKey) setProgressRelative(60);
else if (e.altKey) setProgressRelative(10);
else setProgressRelative(5);
}
break;
// case Key.ArrowRight:
// {
// if (e.shiftKey) setProgressRelative(300);
// else if (e.ctrlKey) setProgressRelative(60);
// else if (e.altKey) setProgressRelative(10);
// else setProgressRelative(5);
// }
// break;
case Key.ArrowDown:
changeVolume(-0.05);
break;
case Key.ArrowUp:
changeVolume(0.05);
break;
}
// case Key.ArrowDown:
// changeVolume(-0.05);
// break;
// case Key.ArrowUp:
// changeVolume(0.05);
// break;
// }
};
const keyboardShortcutsUp = (e: React.KeyboardEvent<HTMLDivElement>) => {
e.preventDefault();
switch (e.key) {
case " ":
togglePlay();
break;
case "m":
toggleMute();
break;
// switch (e.key) {
// case " ":
// togglePlay();
// break;
// case "m":
// toggleMute();
// break;
case "f":
enterFullscreen();
break;
case Key.Escape:
exitFullscreen();
break;
// case "f":
// enterFullscreen();
// break;
// case Key.Escape:
// exitFullscreen();
// break;
case "0":
setProgressAbsolute(0);
break;
case "1":
setProgressAbsolute(10);
break;
case "2":
setProgressAbsolute(20);
break;
case "3":
setProgressAbsolute(30);
break;
case "4":
setProgressAbsolute(40);
break;
case "5":
setProgressAbsolute(50);
break;
case "6":
setProgressAbsolute(60);
break;
case "7":
setProgressAbsolute(70);
break;
case "8":
setProgressAbsolute(80);
break;
case "9":
setProgressAbsolute(90);
break;
}
// case "0":
// setProgressAbsolute(0);
// break;
// case "1":
// setProgressAbsolute(10);
// break;
// case "2":
// setProgressAbsolute(20);
// break;
// case "3":
// setProgressAbsolute(30);
// break;
// case "4":
// setProgressAbsolute(40);
// break;
// case "5":
// setProgressAbsolute(50);
// break;
// case "6":
// setProgressAbsolute(60);
// break;
// case "7":
// setProgressAbsolute(70);
// break;
// case "8":
// setProgressAbsolute(80);
// break;
// case "9":
// setProgressAbsolute(90);
// break;
// }
};
// useEffect(() => {

View File

@@ -1,4 +1,4 @@
export const useTestIdentifiers = false;
export const useTestIdentifiers = true;
export const QTUBE_VIDEO_BASE = useTestIdentifiers
? "MYTEST2_vid_"
: "qtube_vid_";

View File

@@ -5,7 +5,7 @@ export const useIframe = () => {
const navigate = useNavigate();
useEffect(() => {
function handleNavigation(event) {
if (event.data?.action === "NAVIGATE_TO_PATH" && event.data.path) {
if (event.data?.action === "NAVIGATE_TO_PATH" && event.data.path) {
console.log("Navigating to path within React app:", event.data.path);
navigate(event.data.path); // Navigate directly to the specified path

View File

@@ -35,7 +35,6 @@ export const VideoActionsBar = ({
setSuperLikeList,
sx,
}: VideoActionsBarProps) => {
console.log('videoDatalike', videoData)
const calculateAmountSuperlike = useMemo(() => {
const totalQort = superLikeList?.reduce((acc, curr) => {
if (curr?.amount && !isNaN(parseFloat(curr.amount)))

View File

@@ -72,7 +72,8 @@ export const VideoContent = () => {
sx={{
display: "flex",
flexDirection: "column",
padding: `0px 0px 0px ${isScreenSmall ? "0px" : "2%"}`,
// padding: `0px 0px 0px ${isScreenSmall ? "0px" : "2%"}`,
padding: '10px',
width: "100%",
}}
onClick={focusVideo}
@@ -80,8 +81,8 @@ export const VideoContent = () => {
{videoReference ? (
<VideoPlayerContainer
sx={{
width: `${videoWidth}%`,
marginLeft: "0%",
// width: `${videoWidth}%`,
// marginLeft: "0%",
}}
>
<VideoPlayer

View File

@@ -64,16 +64,18 @@ export const Home = ({ mode }: HomeProps) => {
console.log('filterName', filterName)
const searchParameters: QortalSearchParams = useMemo(()=> {
let description = ""
let query = ""
const searchOptions: {
description?: string
query?: string
} = {}
if (selectedCategoryVideos) {
description = `category:${selectedCategoryVideos.id};`;
searchOptions.description = `category:${selectedCategoryVideos.id};`;
if (selectedSubCategoryVideos)
description += `subcategory:${selectedSubCategoryVideos.id}`;
searchOptions.description += `subcategory:${selectedSubCategoryVideos.id}`;
}
if(filterSearch){
query = filterSearch
searchOptions.query = filterSearch
}
return {
identifier:
@@ -84,9 +86,8 @@ const searchParameters: QortalSearchParams = useMemo(()=> {
limit: 20,
excludeBlocked: true,
name: filterName || "",
description,
query,
mode: 'LATEST'
...searchOptions,
mode: 'ALL'
};
}, [filterType, filterName, selectedSubCategoryVideos, selectedCategoryVideos, filterSearch])
console.log('searchParameters', searchParameters)

View File

@@ -20,7 +20,7 @@ import {
setSuperlikesAll,
setUserAvatarHash,
} from "../state/features/globalSlice";
import { VideoPlayerGlobal } from "../components/common/VideoPlayer/VideoPlayerGlobal.tsx";
// import { VideoPlayerGlobal } from "../components/common/VideoPlayer/VideoPlayerGlobal.tsx";
import { Rnd } from "react-rnd";
import { RequestQueue } from "../utils/queue";
import { EditVideo } from "../components/Publish/EditVideo/EditVideo";

View File

@@ -20,6 +20,7 @@
"noUnusedParameters": false,
"noFallthroughCasesInSwitch": true,
"strictNullChecks": false,
"types": ["node"]
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]

View File

@@ -4,7 +4,8 @@
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
"allowSyntheticDefaultImports": true,
"types": ["node"]
},
"include": ["vite.config.ts"]
}

View File

@@ -1,10 +1,30 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { viteStaticCopy } from 'vite-plugin-static-copy';
import { fileURLToPath } from 'url';
import path from 'path';
// const __filename = fileURLToPath(import.meta.url);
// const __dirname = path.dirname(__filename);
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
plugins: [react(), viteStaticCopy({
targets: [
{
src: path.join(
__dirname,
'node_modules',
'mediainfo.js',
'dist',
'MediaInfoModule.wasm'
),
dest: '', // copies to root of /dist → served at /MediaInfoModule.wasm
},
],
}),],
server: {
host: '0.0.0.0',
port: 5174