From d185fd38cd0e8be690cba6025237655be2e39579 Mon Sep 17 00:00:00 2001 From: SasukeUchiha Date: Sat, 18 Nov 2023 10:30:55 +0300 Subject: [PATCH] v2 --- app/client/.gitignore | 3 + app/client/index.html | 2 +- app/client/package-lock.json | 413 +++++++++++++++++- app/client/package.json | 7 +- app/client/src/App.tsx | 25 +- .../components/Admin/LoginForm/LoginForm.tsx | 2 +- .../src/components/Admin/Sidebar/Sidebar.tsx | 5 +- .../Tables/ArtistTable/ArtistColumns.tsx | 2 +- .../Tables/PlaylistTable/PlaylistColumns.tsx | 2 +- .../Tables/VideosTable/Modals/AddModal.tsx | 130 +++--- .../VideosTable/Modals/UploadProgress.tsx | 21 + .../Admin/Tables/VideosTable/VideoColumns.tsx | 2 +- .../src/components/Auth/AuthProvider.tsx | 6 +- app/client/src/components/ui/Card.tsx | 79 ++++ app/client/src/components/ui/Progress.tsx | 26 ++ app/client/src/hooks/useVideo.ts | 6 +- app/client/src/hooks/useVisits.ts | 14 + app/client/src/http/index.ts | 2 +- app/client/src/main.tsx | 19 +- app/client/src/models/IVisit.ts | 5 + .../src/models/response/VisitResponse.ts | 8 + app/client/src/pages/Admin/DashboardPage.tsx | 33 ++ app/client/src/routers/admin.routes.tsx | 7 +- app/client/src/services/VideoService.ts | 12 +- app/client/src/services/VisitService.ts | 13 + app/client/vite.config.ts | 15 +- app/server/config/storage.js | 14 + app/server/controllers/VideoController.js | 11 +- app/server/controllers/VisitController.js | 22 + app/server/index.js | 5 +- app/server/models/Visits.js | 8 + app/server/package-lock.json | 294 ++++++++++++- app/server/package.json | 4 +- app/server/routers/visits.router.js | 10 + app/server/services/VideoService.js | 17 +- app/server/services/VisitService.js | 21 + app/server/services/VisitsReset.js | 17 + app/server/utils/uploadVideo.js | 24 + 38 files changed, 1185 insertions(+), 121 deletions(-) create mode 100644 app/client/src/components/Admin/Tables/VideosTable/Modals/UploadProgress.tsx create mode 100644 app/client/src/components/ui/Card.tsx create mode 100644 app/client/src/components/ui/Progress.tsx create mode 100644 app/client/src/hooks/useVisits.ts create mode 100644 app/client/src/models/IVisit.ts create mode 100644 app/client/src/models/response/VisitResponse.ts create mode 100644 app/client/src/pages/Admin/DashboardPage.tsx create mode 100644 app/client/src/services/VisitService.ts create mode 100644 app/server/config/storage.js create mode 100644 app/server/controllers/VisitController.js create mode 100644 app/server/models/Visits.js create mode 100644 app/server/routers/visits.router.js create mode 100644 app/server/services/VisitService.js create mode 100644 app/server/services/VisitsReset.js create mode 100644 app/server/utils/uploadVideo.js diff --git a/app/client/.gitignore b/app/client/.gitignore index a547bf3..ebcc2a1 100644 --- a/app/client/.gitignore +++ b/app/client/.gitignore @@ -22,3 +22,6 @@ dist-ssr *.njsproj *.sln *.sw? + +# Sentry Config File +.env.sentry-build-plugin diff --git a/app/client/index.html b/app/client/index.html index e4b78ea..fc78326 100644 --- a/app/client/index.html +++ b/app/client/index.html @@ -4,7 +4,7 @@ - Vite + React + TS + 808
diff --git a/app/client/package-lock.json b/app/client/package-lock.json index 518b6da..d76b144 100644 --- a/app/client/package-lock.json +++ b/app/client/package-lock.json @@ -13,9 +13,12 @@ "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-progress": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-toast": "^1.1.5", - "@react-icons/all-files": "https://github.com/react-icons/react-icons/releases/download/v4.7.1/react-icons-all-files-4.7.1.tgz", + "@react-icons/all-files": "https://github.com/react-icons/react-icons/releases/download/v4.10.1/react-icons-all-files-4.10.1.tgz", + "@sentry/react": "^7.80.1", + "@sentry/vite-plugin": "^2.10.0", "@tanstack/react-query": "^5.7.2", "@tanstack/react-query-devtools": "^5.7.2", "@tanstack/react-table": "^8.10.7", @@ -1398,6 +1401,30 @@ } } }, + "node_modules/@radix-ui/react-progress": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.0.3.tgz", + "integrity": "sha512-5G6Om/tYSxjSeEdrb1VfKkfZfn/1IlPWd731h2RfPuSbIfNUgfqAwbKfJCg/PP6nuUCTrYzalwHSpSinoWoCag==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", @@ -1588,9 +1615,9 @@ } }, "node_modules/@react-icons/all-files": { - "version": "4.7.1", - "resolved": "https://github.com/react-icons/react-icons/releases/download/v4.7.1/react-icons-all-files-4.7.1.tgz", - "integrity": "sha512-YnHGdOz7tWUIgDHDkNBU1rz7JfoH5RDySHY1KMQj2JHKRAVlj2vtgOKuWPV79kAb4I9Nyb+A6s17yrUr2/NNDw==", + "version": "4.10.1", + "resolved": "https://github.com/react-icons/react-icons/releases/download/v4.10.1/react-icons-all-files-4.10.1.tgz", + "integrity": "sha512-jm/9akpfUQRYke8YArGwnoTTTcsCNFjzXfC9rUwrtnEDrV3EOXYOF+R5sFrIgHPn+DMp5nEWLlPV4fmnLCEpMQ==", "license": "MIT", "peerDependencies": { "react": "*" @@ -1604,6 +1631,199 @@ "node": ">=14.0.0" } }, + "node_modules/@sentry-internal/tracing": { + "version": "7.80.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.80.1.tgz", + "integrity": "sha512-5gZ4LPIj2vpQl2/dHBM4uXMi9OI5E0VlOhJQt0foiuN6JJeiOjdpJFcfVqJk69wrc0deVENTtgKKktxqMwVeWQ==", + "dependencies": { + "@sentry/core": "7.80.1", + "@sentry/types": "7.80.1", + "@sentry/utils": "7.80.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser": { + "version": "7.80.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.80.1.tgz", + "integrity": "sha512-1dPR6vPJ9vOTzgXff9HGheb178XeEv5hyjBNhCO1f6rjCgnVj99XGNZIgO1Ee1ALJbqlfPWaeV+uSWbbcmgJMA==", + "dependencies": { + "@sentry-internal/tracing": "7.80.1", + "@sentry/core": "7.80.1", + "@sentry/replay": "7.80.1", + "@sentry/types": "7.80.1", + "@sentry/utils": "7.80.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/bundler-plugin-core": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.10.0.tgz", + "integrity": "sha512-bjcYvMrCQgqTiRRkWGNpeZ7EJOu0JQFYj+rrcQpwaVO+ll1eWNGW1nNveU+8vpnXrlaIAvieBxCrcCj5V9y1+Q==", + "dependencies": { + "@sentry/cli": "^2.21.2", + "@sentry/node": "^7.60.0", + "@sentry/utils": "^7.60.0", + "dotenv": "^16.3.1", + "find-up": "5.0.0", + "glob": "9.3.2", + "magic-string": "0.27.0", + "unplugin": "1.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/glob": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.2.tgz", + "integrity": "sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/cli": { + "version": "2.21.4", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.21.4.tgz", + "integrity": "sha512-KIgvgl1DB/i41GmXfJkv96TdtKeJIhiV6l5OLRmxtnvA2JTqAQaeH+YMHE+vpZ/0FqtLK5clIkt5ReQNpmigPg==", + "hasInstallScript": true, + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@sentry/core": { + "version": "7.80.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.80.1.tgz", + "integrity": "sha512-3Yh+O9Q86MxwIuJFYtuSSoUCpdx99P1xDAqL0FIPTJ+ekaVMiUJq9NmyaNh9uN2myPSmxvEXW6q3z37zta9ZHg==", + "dependencies": { + "@sentry/types": "7.80.1", + "@sentry/utils": "7.80.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node": { + "version": "7.80.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.80.1.tgz", + "integrity": "sha512-0NWfcZMlyQphKWsvyzfhGm2dCBk5DUPqOGW/vGx18G4tCCYtFcAIj/mCp/4XOEcZRPQgb9vkm+sidGD6DnwWlA==", + "dependencies": { + "@sentry-internal/tracing": "7.80.1", + "@sentry/core": "7.80.1", + "@sentry/types": "7.80.1", + "@sentry/utils": "7.80.1", + "https-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/react": { + "version": "7.80.1", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.80.1.tgz", + "integrity": "sha512-AZjROgfJsYmI/Htb+giRQuVTCNofsLKGz6nYmJS2cYDZYKP4KU1l1SapF5F8r5Pu7c/6ZvULNj7MeHOXq2SEYA==", + "dependencies": { + "@sentry/browser": "7.80.1", + "@sentry/types": "7.80.1", + "@sentry/utils": "7.80.1", + "hoist-non-react-statics": "^3.3.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "15.x || 16.x || 17.x || 18.x" + } + }, + "node_modules/@sentry/replay": { + "version": "7.80.1", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.80.1.tgz", + "integrity": "sha512-yjpftIyybQeWD2i0Nd7C96tZwjNbSMRW515EL9jwlNxYbQtGtMs0HavP9Y7uQvQrzwSHY0Wp+ooe9PMuvzqbHw==", + "dependencies": { + "@sentry-internal/tracing": "7.80.1", + "@sentry/core": "7.80.1", + "@sentry/types": "7.80.1", + "@sentry/utils": "7.80.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry/types": { + "version": "7.80.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.80.1.tgz", + "integrity": "sha512-CVu4uPVTOI3U9kYiOdA085R7jX5H1oVODbs9y+A8opJ0dtJTMueCXgZyE8oXQ0NjGVs6HEeaLkOuiV0mj8X3yw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.80.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.80.1.tgz", + "integrity": "sha512-bfFm2e/nEn+b9++QwjNEYCbS7EqmteT8uf0XUs7PljusSimIqqxDtK1pfD9zjynPgC8kW/fVBKv0pe2LufomeA==", + "dependencies": { + "@sentry/types": "7.80.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/vite-plugin": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-2.10.0.tgz", + "integrity": "sha512-jOJQnu3ox+HcD1HCul5LBy6YEhS0oVFjrFshoFD2PtHI5sMldbwNWrkkTXcknNy/0o4d5cAtdsEuVzEnbdd+Gg==", + "dependencies": { + "@sentry/bundler-plugin-core": "2.10.0", + "unplugin": "1.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/@tanstack/query-core": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.7.2.tgz", @@ -2022,7 +2242,6 @@ "version": "8.11.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -2039,6 +2258,17 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2694,7 +2924,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -2768,6 +2997,17 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.576", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", @@ -3168,7 +3408,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3374,6 +3613,26 @@ "node": ">= 0.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -3496,8 +3755,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/jiti": { "version": "1.21.0", @@ -3626,7 +3884,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -3676,6 +3933,17 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0" } }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/match-sorter": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", @@ -3740,11 +4008,18 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mz": { "version": "2.7.0", @@ -3779,6 +4054,25 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -3847,7 +4141,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3862,7 +4155,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -3889,7 +4181,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -3916,6 +4207,40 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.2.tgz", + "integrity": "sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -4090,6 +4415,14 @@ "node": ">= 0.8.0" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -4430,7 +4763,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -4445,7 +4777,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -4456,8 +4787,7 @@ "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -4690,6 +5020,11 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/ts-api-utils": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", @@ -4755,6 +5090,17 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/unplugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", + "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==", + "dependencies": { + "acorn": "^8.8.1", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -4895,11 +5241,37 @@ } } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4933,7 +5305,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, diff --git a/app/client/package.json b/app/client/package.json index afd2d49..391577e 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsc && vite build", + "build": "vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview" }, @@ -15,9 +15,12 @@ "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-progress": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-toast": "^1.1.5", - "@react-icons/all-files": "https://github.com/react-icons/react-icons/releases/download/v4.7.1/react-icons-all-files-4.7.1.tgz", + "@react-icons/all-files": "https://github.com/react-icons/react-icons/releases/download/v4.10.1/react-icons-all-files-4.10.1.tgz", + "@sentry/react": "^7.80.1", + "@sentry/vite-plugin": "^2.10.0", "@tanstack/react-query": "^5.7.2", "@tanstack/react-query-devtools": "^5.7.2", "@tanstack/react-table": "^8.10.7", diff --git a/app/client/src/App.tsx b/app/client/src/App.tsx index 5adfb49..6252919 100644 --- a/app/client/src/App.tsx +++ b/app/client/src/App.tsx @@ -1,6 +1,7 @@ -import { useRef, useState, useEffect } from 'react' +import { useRef, useState } from 'react' import ReactPlayer from 'react-player' import { Disc3 } from 'lucide-react' +import { IoPlayCircleOutline } from "@react-icons/all-files/io5/IoPlayCircleOutline"; import {ImSoundcloud} from '@react-icons/all-files/im/ImSoundcloud' import {BsSpotify} from '@react-icons/all-files/bs/BsSpotify' import {BsFacebook} from '@react-icons/all-files/bs/BsFacebook' @@ -24,6 +25,13 @@ function App() { const [playing, setPlaying] = useState(false); const { data, refetch } = useQuery({ queryKey: ['video '], queryFn: () => VideoService.GetOne()}) const [start, setStart] = useState(true); + const [videoQuality, setVideoQuality] = useState(false); + + const changeVideoQuality = () => { + const time = progress; + setVideoQuality(!videoQuality); + player.current?.seekTo(time); + } return (
@@ -31,9 +39,9 @@ function App() {

808

{start && - + } - {refetch(); player.current?.seekTo(0) }} volume={volume ? 1 : 0} playing={playing} ref={player} onProgress={(e) => {setProgress(e.played); setProgressSec(e.playedSeconds)}} className='h-screen w-full m-auto' width='auto' height='100%' url={data?.data.video.videoHQ}/> + player.current?.seekTo(progress)} onEnded={()=> {refetch(); setProgress(0); player.current?.seekTo(0) }} volume={volume ? 1 : 0} playing={playing} ref={player} onProgress={(e) => {setProgress(e.played); setProgressSec(e.playedSeconds)}} className='h-screen w-full m-auto' width='auto' height='100%' url={videoQuality ? data?.data.video.videoLQ : data?.data.video.videoHQ}/>
{player.current.seekTo(progressBar.current ? e.clientX / progressBar.current?.clientWidth : 0); setProgress(progressBar.current ? e.clientX / progressBar.current?.clientWidth : 0)}} className="bg-slate-500 h-2">
@@ -44,28 +52,27 @@ function App() {
-

Исполнитель

-

Название трека

+

{data?.data.video.artist[0]?.name}

+

{data?.data.video.playlist[0]?.name}

- {data?.data.video.artist[0]?.soundcloud && } {data?.data.video.artist[0]?.spotify && } - + {data?.data.video.artist[0]?.facebook && }
- +
- +
diff --git a/app/client/src/components/Admin/LoginForm/LoginForm.tsx b/app/client/src/components/Admin/LoginForm/LoginForm.tsx index c0b451a..68d1779 100644 --- a/app/client/src/components/Admin/LoginForm/LoginForm.tsx +++ b/app/client/src/components/Admin/LoginForm/LoginForm.tsx @@ -28,7 +28,7 @@ const LoginForm: FC = () => { localStorage.setItem('token', res.data.accessToken); localStorage.setItem('user', JSON.stringify(res.data.user)); setIsAuth(true); - navigate('/admin/artists') + navigate('/admin') } ) } diff --git a/app/client/src/components/Admin/Sidebar/Sidebar.tsx b/app/client/src/components/Admin/Sidebar/Sidebar.tsx index 39f680a..10d8a22 100644 --- a/app/client/src/components/Admin/Sidebar/Sidebar.tsx +++ b/app/client/src/components/Admin/Sidebar/Sidebar.tsx @@ -1,11 +1,12 @@ import { FC } from 'react' +import { Link } from 'react-router-dom'; import Menu from './Menu'; import Profile from './Profile'; const Sidebar: FC = () => { return ( -