diff --git a/.eslintrc.js b/.eslintrc.js index 2a411f9..6e31065 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -21,6 +21,7 @@ module.exports = { 'plugin:react-hooks/recommended', ], rules: { + '@typescript-eslint/quotes': 'off', 'jsx-a11y/click-events-have-key-events': 'off', 'jsx-a11y/no-noninteractive-element-interactions': 'off', 'jsx-a11y/no-static-element-interactions': 'off', @@ -30,7 +31,6 @@ module.exports = { 'import/no-cycle': 'off', 'react/jsx-indent': 'off', 'no-nested-ternary': 'off', - '@typescript-eslint/indent': 'off', 'consistent-return': 'off', 'react/react-in-jsx-scope': 'off', 'react/require-default-props': 'off', diff --git a/.github/workflows/azure-static-web-apps-agreeable-ground-01c3b230f.yml b/.github/workflows/azure-static-web-apps-agreeable-ground-01c3b230f.yml index 3916c50..d606c23 100644 --- a/.github/workflows/azure-static-web-apps-agreeable-ground-01c3b230f.yml +++ b/.github/workflows/azure-static-web-apps-agreeable-ground-01c3b230f.yml @@ -4,12 +4,12 @@ on: push: branches: - main - - dev + # - dev pull_request: types: [opened, synchronize, reopened, closed] branches: - main - - dev + # - dev jobs: build_and_deploy_job: diff --git a/.gitignore b/.gitignore index d74df8a..f0de0e2 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ npm-debug.log* yarn-debug.log* yarn-error.log* package-lock.json +.vs/ diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json deleted file mode 100644 index f8b4888..0000000 --- a/.vs/ProjectSettings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "CurrentProjectSetting": null -} \ No newline at end of file diff --git a/.vs/StreetCode_Client/FileContentIndex/14f4a601-095f-466c-aec6-720f8b2ce4cd.vsidx b/.vs/StreetCode_Client/FileContentIndex/14f4a601-095f-466c-aec6-720f8b2ce4cd.vsidx deleted file mode 100644 index c649687..0000000 Binary files a/.vs/StreetCode_Client/FileContentIndex/14f4a601-095f-466c-aec6-720f8b2ce4cd.vsidx and /dev/null differ diff --git a/.vs/StreetCode_Client/FileContentIndex/687acb2f-694d-493c-8225-ead0505f2f4c.vsidx b/.vs/StreetCode_Client/FileContentIndex/687acb2f-694d-493c-8225-ead0505f2f4c.vsidx deleted file mode 100644 index 25a44e7..0000000 Binary files a/.vs/StreetCode_Client/FileContentIndex/687acb2f-694d-493c-8225-ead0505f2f4c.vsidx and /dev/null differ diff --git a/.vs/StreetCode_Client/v17/.wsuo b/.vs/StreetCode_Client/v17/.wsuo deleted file mode 100644 index 5080df0..0000000 Binary files a/.vs/StreetCode_Client/v17/.wsuo and /dev/null differ diff --git a/.vs/StreetCode_Client/v17/TestStore/0/000.testlog b/.vs/StreetCode_Client/v17/TestStore/0/000.testlog deleted file mode 100644 index 6bbf10e..0000000 Binary files a/.vs/StreetCode_Client/v17/TestStore/0/000.testlog and /dev/null differ diff --git a/.vs/StreetCode_Client/v17/TestStore/0/testlog.manifest b/.vs/StreetCode_Client/v17/TestStore/0/testlog.manifest deleted file mode 100644 index e92ede2..0000000 Binary files a/.vs/StreetCode_Client/v17/TestStore/0/testlog.manifest and /dev/null differ diff --git a/.vs/StreetcodeMasterEdit/FileContentIndex/read.lock b/.vs/StreetcodeMasterEdit/FileContentIndex/read.lock deleted file mode 100644 index e69de29..0000000 diff --git a/.vs/StreetcodeMasterEdit/v17/.wsuo b/.vs/StreetcodeMasterEdit/v17/.wsuo deleted file mode 100644 index ac8ecdb..0000000 Binary files a/.vs/StreetcodeMasterEdit/v17/.wsuo and /dev/null differ diff --git a/.vs/StreetcodeMasterEdit/v17/workspaceFileList.bin b/.vs/StreetcodeMasterEdit/v17/workspaceFileList.bin deleted file mode 100644 index 1338f0c..0000000 Binary files a/.vs/StreetcodeMasterEdit/v17/workspaceFileList.bin and /dev/null differ diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json deleted file mode 100644 index e6ee1b9..0000000 --- a/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "ExpandedNodes": [ - "", - "\\.github", - "\\config", - "\\public", - "\\src", - "\\src\\app", - "\\src\\features", - "\\src\\features\\AdminPage", - "\\src\\features\\AdminPage\\NewStreetcode", - "\\src\\features\\StreetcodePage" - ], - "SelectedNode": "\\src\\features\\AdminPage\\NewStreetcode\\MainNewStreetcode.component.tsx", - "PreviewInSolutionExplorer": false -} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100644 index 8cdd146..0000000 Binary files a/.vs/slnx.sqlite and /dev/null differ diff --git a/package.json b/package.json index 8c9b403..2f8dbfb 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,10 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", - "@tinymce/tinymce-react": "^4.3.0", + "@tinymce/tinymce-react": "^6.3.0", "@types/googlemaps": "^3.43.3", "@types/jest": "^27.5.2", "@types/maplibre-gl": "^1.14.0", - "@types/node": "^16.18.9", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.9", "antd": "^5.21.2", @@ -28,6 +27,7 @@ "date-fns": "^2.29.3", "dayjs": "^1.11.7", "dnd-core": "^16.0.1", + "dompurify": "^3.4.6", "dotenv": "^16.1.4", "dotenv-webpack": "^8.0.1", "eslint-config-airbnb-typescript": "^17.0.0", @@ -69,10 +69,9 @@ "react-toastify": "^9.1.1", "slick-carousel": "^1.8.1", "styled-components": "^5.3.6", - "svg-react-loader": "^0.4.6", "svg-url-loader": "^8.0.0", - "swiper": "^8.4.6", - "tinymce": "^6.4.0", + "swiper": "^12.1.4", + "tinymce": "^8.5.0", "typescript": "^4.9.4", "yet-another-react-lightbox": "^2.2.7" }, @@ -111,6 +110,7 @@ "@babel/core": "^7.21.3", "@svgr/webpack": "^6.5.1", "@types/leaflet": "^1.9.0", + "@types/node": "^16.18.9", "@types/react-beautiful-dnd": "^13.1.3", "@types/react-google-recaptcha": "^2.1.5", "@types/react-slick": "^0.23.10", @@ -122,14 +122,26 @@ "eslint-config-airbnb": "^19.0.4", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.5.0", - "lint-staged": "^13.1.0", - "sass": "^1.57.1", - "sass-loader": "^13.2.0", + "lint-staged": "^17.0.5", + "sass": "^1.99.0", + "sass-loader": "^16.0.8", "ts-loader": "^9.4.2", "url-loader": "^4.1.1", "webpack": "^5.75.0", "webpack-cli": "^5.0.1", - "webpack-dev-server": "^4.11.1" + "webpack-dev-server": "^5.2.4" + }, + "overrides": { + "tangram": { + "js-yaml": "^3.14.2", + "jszip": "^3.10.1" + }, + "nth-check": "^2.1.1", + "postcss": "^8.4.38", + "react-scripts": { + "webpack-dev-server": "^5.2.4", + "serialize-javascript": "^6.0.2" + } }, "description": " \"SoftServe ", "main": ".eslintrc.js", diff --git a/src/app/api/agent.api.ts b/src/app/api/agent.api.ts index 47dfef5..efd9b29 100644 --- a/src/app/api/agent.api.ts +++ b/src/app/api/agent.api.ts @@ -1,4 +1,3 @@ -import { redirect } from 'react-router-dom'; import { toast } from 'react-toastify'; import axios, { AxiosError, AxiosResponse } from 'axios'; import { ReasonPhrases, StatusCodes } from 'http-status-codes'; @@ -6,8 +5,27 @@ import { ReasonPhrases, StatusCodes } from 'http-status-codes'; import FRONTEND_ROUTES from '../common/constants/frontend-routes.constants'; import UserLoginStore from '../stores/user-login-store'; -axios.defaults.baseURL = process.env.NODE_ENV === 'development' - ? 'https://localhost:5001/api' : 'https://app-streetcode-webapi-eu-prop-001-gsbqfwc2fdh6hhaw.polandcentral-01.azurewebsites.net/api'; +const isDevelopment = process.env.NODE_ENV === 'development'; + +axios.defaults.baseURL = isDevelopment + ? 'https://localhost:5001/api' + : 'https://app-streetcode-webapi-eu-prop-001-gsbqfwc2fdh6hhaw.polandcentral-01.azurewebsites.net/api'; + +const getErrorMessage = (data: unknown): string | undefined => { + if (Array.isArray(data)) { + return data[0]?.message; + } + + if ( + typeof data === 'object' + && data !== null + && 'message' in data + ) { + return String(data['message']); + } + + return undefined; +}; axios.interceptors.response.use( async (response) => response, @@ -22,13 +40,14 @@ axios.interceptors.response.use( break; case StatusCodes.UNAUTHORIZED: errorMessage = ReasonPhrases.UNAUTHORIZED; - redirect(FRONTEND_ROUTES.ADMIN.LOGIN); + UserLoginStore.clearUserData(); + globalThis.location.href = FRONTEND_ROUTES.ADMIN.LOGIN; break; case StatusCodes.NOT_FOUND: errorMessage = ReasonPhrases.NOT_FOUND; break; - case StatusCodes.BAD_REQUEST: - errorMessage = ReasonPhrases.BAD_REQUEST; + case StatusCodes.BAD_REQUEST: + errorMessage = getErrorMessage(response?.data) || ReasonPhrases.BAD_REQUEST; break; case StatusCodes.FORBIDDEN: errorMessage = ReasonPhrases.FORBIDDEN; @@ -40,7 +59,7 @@ axios.interceptors.response.use( toast.error(errorMessage); } - return Promise.reject(message); + return Promise.reject(response?.data || message); }, ); diff --git a/src/app/api/media/videos.api.ts b/src/app/api/media/videos.api.ts index f47e874..5fb0985 100644 --- a/src/app/api/media/videos.api.ts +++ b/src/app/api/media/videos.api.ts @@ -1,3 +1,4 @@ +import { VideoCreateDto } from '@/models/media/video.model'; import Agent from '@api/agent.api'; import { API_ROUTES } from '@constants/api-routes.constants'; import Video from '@models/media/video.model'; @@ -11,7 +12,7 @@ const VideosApi = { `${API_ROUTES.VIDEOS.GET_BY_STREETCODE_ID}/${streetcodeId}`, ), - create: (video: Video) => Agent.post