From 47f859c298dd7bd9b0634449f435d7f9bc405322 Mon Sep 17 00:00:00 2001 From: TuanVT Date: Tue, 21 Jul 2026 16:46:47 +0700 Subject: [PATCH] one-day-update-vna --- .vscode/settings.json | 4 + .vscode/tasks.json | 33 + .yarnrc.yml | 1 + eslint.config.mjs | 7 + next.config.ts | 5 +- package.json | 23 +- public/static/anim/loading_screen.json | 43 + public/static/images/avatar-default.png | Bin 0 -> 49762 bytes public/static/images/box-remove.svg | 8 + public/static/images/emptyFile.svg | 39 + public/static/images/empty_table.png | Bin 0 -> 26881 bytes public/static/images/full-screen.svg | 3 + public/static/images/icon-hamburger.svg | 5 + public/static/images/logoFull.png | Bin 0 -> 42152 bytes public/static/images/logoSmall.webp | Bin 0 -> 12214 bytes public/static/images/may-bay.png | Bin 0 -> 185114 bytes public/static/images/pause.svg | 4 + public/static/images/play-circle.svg | 3 + public/static/images/tick-circle.svg | 5 + public/static/images/warning-2.svg | 5 + src/app/airlines/[id]/page.tsx | 16 + src/app/airlines/create/page.tsx | 16 + src/app/airlines/page.tsx | 16 + src/app/airlines/update/page.tsx | 16 + src/app/continents/[id]/page.tsx | 16 + src/app/continents/page.tsx | 16 + src/app/countries/[id]/page.tsx | 16 + src/app/countries/create/page.tsx | 16 + src/app/countries/page.tsx | 16 + src/app/countries/update/page.tsx | 16 + src/app/country-regions/[id]/page.tsx | 16 + src/app/country-regions/page.tsx | 16 + src/app/dashboard/page.tsx | 10 + src/app/layout.tsx | 19 +- src/app/page.tsx | 73 +- src/common/funcs/convertCoin.ts | 14 + src/common/funcs/delay.ts | 3 + src/common/funcs/localStorage.ts | 18 + src/common/funcs/optionConvert.ts | 27 + src/common/funcs/selectData.ts | 96 + src/common/funcs/toast.tsx | 39 + src/common/funcs/validate.ts | 14 + src/common/hooks/useStyleClass.ts | 14 + src/components/customs/DataWrapper.tsx | 63 + src/components/customs/FilterCustom.tsx | 230 +++ src/components/customs/FilterMany.tsx | 248 +++ src/components/customs/StateActive.tsx | 62 + src/components/customs/custom-button.tsx | 149 ++ src/components/customs/custom-dialog.tsx | 68 + src/components/customs/custom-icon.tsx | 83 + src/components/customs/custom-loading.tsx | 54 + src/components/customs/custom-pagination.tsx | 206 +++ src/components/customs/custom-popup.tsx | 89 + src/components/customs/custom-portal.tsx | 51 + src/components/customs/custom-search.tsx | 69 + src/components/customs/custom-table.tsx | 305 ++++ src/components/customs/custom-tabs.tsx | 61 + src/components/customs/custom-toast.tsx | 46 + src/components/customs/input-single.tsx | 105 ++ src/components/customs/slider-props.tsx | 122 ++ .../layouts/BaseLayout/BaseLayout.tsx | 84 + .../BaseLayout/compoents/Header/Header.tsx | 156 ++ .../BaseLayout/compoents/Header/index.ts | 1 + .../compoents/Header/interface/index.ts | 4 + .../compoents/MenuProfile/MenuProfile.tsx | 89 + .../BaseLayout/compoents/MenuProfile/index.ts | 1 + .../compoents/MenuProfile/interface/index.ts | 3 + .../BaseLayout/compoents/Navbar/Navbar.tsx | 72 + .../BaseLayout/compoents/Navbar/index.ts | 1 + src/components/layouts/BaseLayout/index.ts | 1 + .../layouts/BaseLayout/interface/index.ts | 12 + .../layouts/GridColumn/GridColumn.tsx | 69 + src/components/layouts/GridColumn/index.ts | 1 + .../layouts/GridColumn/interface/index.ts | 14 + .../layouts/LayoutAuth/LayoutAuth.tsx | 40 + src/components/layouts/LayoutAuth/index.ts | 1 + .../layouts/LayoutPages/LayoutPages.tsx | 57 + src/components/layouts/LayoutPages/index.ts | 1 + .../layouts/LayoutPages/interface/index.ts | 8 + .../DetailAirlines/DetailAirlines.tsx | 140 ++ .../page/airlines/DetailAirlines/index.ts | 1 + .../MainPageAirlines/MainPageAirlines.tsx | 345 ++++ .../page/airlines/MainPageAirlines/index.ts | 1 + .../PageCreateAirlines/PageCreateAirlines.tsx | 569 ++++++ .../page/airlines/PageCreateAirlines/index.ts | 0 .../PageUpdateAirlines/PageUpdateAirlines.tsx | 338 ++++ .../page/airlines/PageUpdateAirlines/index.ts | 1 + .../CreateContinents/CreateContinents.tsx | 158 ++ .../page/continents/CreateContinents/index.ts | 1 + .../DetailContinent/DetailContinent.tsx | 187 ++ .../page/continents/DetailContinent/index.ts | 1 + .../MainPageContinents/MainPageContinents.tsx | 345 ++++ .../continents/MainPageContinents/index.ts | 1 + .../UpdateContinents/UpdateContinents.tsx | 180 ++ .../page/continents/UpdateContinents/index.ts | 1 + .../CreateCountries/CreateCountries.tsx | 354 ++++ .../page/countries/CreateCountries/index.ts | 1 + .../DetailCountries/DetailCountries.tsx | 157 ++ .../page/countries/DetailCountries/index.ts | 1 + .../MainPageCountries/MainPageCountries.tsx | 356 ++++ .../page/countries/MainPageCountries/index.ts | 1 + .../UpdateCountries/UpdateCountries.tsx | 403 +++++ .../page/countries/UpdateCountries/index.ts | 1 + .../CreateCountryRegions.tsx | 213 +++ .../CreateCountryRegions/index.ts | 0 .../DetailCountryRegions.tsx | 182 ++ .../DetailCountryRegions/index.ts | 1 + .../MainPageCountryRegions.tsx | 386 ++++ .../MainPageCountryRegions/index.ts | 1 + .../UpdateCountryRegions.tsx | 232 +++ .../UpdateCountryRegions/index.ts | 1 + .../protected/LoadingTopBar/LoadingTopBar.tsx | 32 + .../protected/LoadingTopBar/index.ts | 1 + .../protected/RequireAuth/index.tsx | 28 + .../protected/RequiredLogout/index.tsx | 28 + .../protected/SplashScreen/SplashScreen.tsx | 247 +++ .../protected/SplashScreen/index.ts | 1 + .../utils/FilterDateRage/FilterDateRage.tsx | 94 + .../component/CalendarMain/CalendarMain.tsx | 247 +++ .../component/CalendarMain/index.ts | 1 + .../component/CalendarMain/interface/index.ts | 7 + .../component/DateOption/DateOption.tsx | 89 + .../component/DateOption/index.ts | 1 + .../component/DateOption/interface/index.ts | 12 + .../RangeDatePicker/RangeDatePicker.tsx | 398 ++++ .../component/RangeDatePicker/index.ts | 1 + .../RangeDatePicker/interface/index.ts | 7 + src/components/utils/FilterDateRage/index.ts | 1 + .../utils/FilterDateRage/interface/index.ts | 17 + .../utils/FormCustom/FormCustom.tsx | 69 + .../compoents/InputForm/InputForm.tsx | 437 +++++ .../FormCustom/compoents/InputForm/index.ts | 0 .../compoents/InputForm/interface/index.ts | 36 + .../compoents/SelectForm/SelectForm.tsx | 210 +++ .../FormCustom/compoents/SelectForm/index.ts | 0 .../compoents/SelectForm/interface/index.ts | 15 + .../compoents/SelectMany/SelectMany.tsx | 316 ++++ .../FormCustom/compoents/SelectMany/index.ts | 1 + .../compoents/SelectMany/interface/index.ts | 27 + .../compoents/SelectSingle/SelectSingle.tsx | 235 +++ .../compoents/SelectSingle/index.ts | 1 + .../compoents/SelectSingle/interface/index.ts | 17 + .../compoents/TextArea/TextArea.tsx | 208 +++ .../FormCustom/compoents/TextArea/index.ts | 1 + .../compoents/TextArea/interface/index.ts | 18 + .../utils/FormCustom/contexts/index.ts | 23 + src/components/utils/FormCustom/index.ts | 1 + .../utils/FormCustom/interface/index.ts | 8 + src/components/utils/IconRound.tsx | 83 + .../PositionContainer/PositionContainer.tsx | 126 ++ .../component/ClickOpen/ClickOpen.tsx | 36 + .../component/ClickOpen/index.ts | 1 + .../component/ClickOpen/interface/index.ts | 5 + .../utils/PositionContainer/index.ts | 1 + .../PositionContainer/interface/index.ts | 11 + .../utils/UploadImage/UploadImage.tsx | 236 +++ src/components/utils/UploadImage/index.ts | 1 + .../utils/UploadImage/interface/index.ts | 17 + src/constant/config/country_option.ts | 1611 +++++++++++++++++ src/constant/config/enum.ts | 38 + src/constant/config/index.ts | 122 ++ src/constant/images/icons.ts | 36 + src/contexts/AppProvider.tsx | 55 + src/redux/reducer/auth.ts | 45 + src/redux/reducer/site.ts | 27 + src/redux/reducer/user.ts | 31 + src/redux/store.ts | 20 + src/services/administrativeServices.ts | 63 + src/services/airlinesServices.ts | 102 ++ src/services/continentsServices.ts | 92 + src/services/countriesServices.ts | 113 ++ src/services/countryServices.ts | 90 + src/services/index.ts | 339 ++++ tsconfig.json | 16 +- yarn.lock | 1178 +++++++++++- 175 files changed, 15135 insertions(+), 87 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .yarnrc.yml create mode 100644 public/static/anim/loading_screen.json create mode 100644 public/static/images/avatar-default.png create mode 100644 public/static/images/box-remove.svg create mode 100644 public/static/images/emptyFile.svg create mode 100644 public/static/images/empty_table.png create mode 100644 public/static/images/full-screen.svg create mode 100644 public/static/images/icon-hamburger.svg create mode 100644 public/static/images/logoFull.png create mode 100644 public/static/images/logoSmall.webp create mode 100644 public/static/images/may-bay.png create mode 100644 public/static/images/pause.svg create mode 100644 public/static/images/play-circle.svg create mode 100644 public/static/images/tick-circle.svg create mode 100644 public/static/images/warning-2.svg create mode 100644 src/app/airlines/[id]/page.tsx create mode 100644 src/app/airlines/create/page.tsx create mode 100644 src/app/airlines/page.tsx create mode 100644 src/app/airlines/update/page.tsx create mode 100644 src/app/continents/[id]/page.tsx create mode 100644 src/app/continents/page.tsx create mode 100644 src/app/countries/[id]/page.tsx create mode 100644 src/app/countries/create/page.tsx create mode 100644 src/app/countries/page.tsx create mode 100644 src/app/countries/update/page.tsx create mode 100644 src/app/country-regions/[id]/page.tsx create mode 100644 src/app/country-regions/page.tsx create mode 100644 src/app/dashboard/page.tsx create mode 100644 src/common/funcs/convertCoin.ts create mode 100644 src/common/funcs/delay.ts create mode 100644 src/common/funcs/localStorage.ts create mode 100644 src/common/funcs/optionConvert.ts create mode 100644 src/common/funcs/selectData.ts create mode 100644 src/common/funcs/toast.tsx create mode 100644 src/common/funcs/validate.ts create mode 100644 src/common/hooks/useStyleClass.ts create mode 100644 src/components/customs/DataWrapper.tsx create mode 100644 src/components/customs/FilterCustom.tsx create mode 100644 src/components/customs/FilterMany.tsx create mode 100644 src/components/customs/StateActive.tsx create mode 100644 src/components/customs/custom-button.tsx create mode 100644 src/components/customs/custom-dialog.tsx create mode 100644 src/components/customs/custom-icon.tsx create mode 100644 src/components/customs/custom-loading.tsx create mode 100644 src/components/customs/custom-pagination.tsx create mode 100644 src/components/customs/custom-popup.tsx create mode 100644 src/components/customs/custom-portal.tsx create mode 100644 src/components/customs/custom-search.tsx create mode 100644 src/components/customs/custom-table.tsx create mode 100644 src/components/customs/custom-tabs.tsx create mode 100644 src/components/customs/custom-toast.tsx create mode 100644 src/components/customs/input-single.tsx create mode 100644 src/components/customs/slider-props.tsx create mode 100644 src/components/layouts/BaseLayout/BaseLayout.tsx create mode 100644 src/components/layouts/BaseLayout/compoents/Header/Header.tsx create mode 100644 src/components/layouts/BaseLayout/compoents/Header/index.ts create mode 100644 src/components/layouts/BaseLayout/compoents/Header/interface/index.ts create mode 100644 src/components/layouts/BaseLayout/compoents/MenuProfile/MenuProfile.tsx create mode 100644 src/components/layouts/BaseLayout/compoents/MenuProfile/index.ts create mode 100644 src/components/layouts/BaseLayout/compoents/MenuProfile/interface/index.ts create mode 100644 src/components/layouts/BaseLayout/compoents/Navbar/Navbar.tsx create mode 100644 src/components/layouts/BaseLayout/compoents/Navbar/index.ts create mode 100644 src/components/layouts/BaseLayout/index.ts create mode 100644 src/components/layouts/BaseLayout/interface/index.ts create mode 100644 src/components/layouts/GridColumn/GridColumn.tsx create mode 100644 src/components/layouts/GridColumn/index.ts create mode 100644 src/components/layouts/GridColumn/interface/index.ts create mode 100644 src/components/layouts/LayoutAuth/LayoutAuth.tsx create mode 100644 src/components/layouts/LayoutAuth/index.ts create mode 100644 src/components/layouts/LayoutPages/LayoutPages.tsx create mode 100644 src/components/layouts/LayoutPages/index.ts create mode 100644 src/components/layouts/LayoutPages/interface/index.ts create mode 100644 src/components/page/airlines/DetailAirlines/DetailAirlines.tsx create mode 100644 src/components/page/airlines/DetailAirlines/index.ts create mode 100644 src/components/page/airlines/MainPageAirlines/MainPageAirlines.tsx create mode 100644 src/components/page/airlines/MainPageAirlines/index.ts create mode 100644 src/components/page/airlines/PageCreateAirlines/PageCreateAirlines.tsx create mode 100644 src/components/page/airlines/PageCreateAirlines/index.ts create mode 100644 src/components/page/airlines/PageUpdateAirlines/PageUpdateAirlines.tsx create mode 100644 src/components/page/airlines/PageUpdateAirlines/index.ts create mode 100644 src/components/page/continents/CreateContinents/CreateContinents.tsx create mode 100644 src/components/page/continents/CreateContinents/index.ts create mode 100644 src/components/page/continents/DetailContinent/DetailContinent.tsx create mode 100644 src/components/page/continents/DetailContinent/index.ts create mode 100644 src/components/page/continents/MainPageContinents/MainPageContinents.tsx create mode 100644 src/components/page/continents/MainPageContinents/index.ts create mode 100644 src/components/page/continents/UpdateContinents/UpdateContinents.tsx create mode 100644 src/components/page/continents/UpdateContinents/index.ts create mode 100644 src/components/page/countries/CreateCountries/CreateCountries.tsx create mode 100644 src/components/page/countries/CreateCountries/index.ts create mode 100644 src/components/page/countries/DetailCountries/DetailCountries.tsx create mode 100644 src/components/page/countries/DetailCountries/index.ts create mode 100644 src/components/page/countries/MainPageCountries/MainPageCountries.tsx create mode 100644 src/components/page/countries/MainPageCountries/index.ts create mode 100644 src/components/page/countries/UpdateCountries/UpdateCountries.tsx create mode 100644 src/components/page/countries/UpdateCountries/index.ts create mode 100644 src/components/page/country-regions/CreateCountryRegions/CreateCountryRegions.tsx create mode 100644 src/components/page/country-regions/CreateCountryRegions/index.ts create mode 100644 src/components/page/country-regions/DetailCountryRegions/DetailCountryRegions.tsx create mode 100644 src/components/page/country-regions/DetailCountryRegions/index.ts create mode 100644 src/components/page/country-regions/MainPageCountryRegions/MainPageCountryRegions.tsx create mode 100644 src/components/page/country-regions/MainPageCountryRegions/index.ts create mode 100644 src/components/page/country-regions/UpdateCountryRegions/UpdateCountryRegions.tsx create mode 100644 src/components/page/country-regions/UpdateCountryRegions/index.ts create mode 100644 src/components/protected/LoadingTopBar/LoadingTopBar.tsx create mode 100644 src/components/protected/LoadingTopBar/index.ts create mode 100644 src/components/protected/RequireAuth/index.tsx create mode 100644 src/components/protected/RequiredLogout/index.tsx create mode 100644 src/components/protected/SplashScreen/SplashScreen.tsx create mode 100644 src/components/protected/SplashScreen/index.ts create mode 100644 src/components/utils/FilterDateRage/FilterDateRage.tsx create mode 100644 src/components/utils/FilterDateRage/component/CalendarMain/CalendarMain.tsx create mode 100644 src/components/utils/FilterDateRage/component/CalendarMain/index.ts create mode 100644 src/components/utils/FilterDateRage/component/CalendarMain/interface/index.ts create mode 100644 src/components/utils/FilterDateRage/component/DateOption/DateOption.tsx create mode 100644 src/components/utils/FilterDateRage/component/DateOption/index.ts create mode 100644 src/components/utils/FilterDateRage/component/DateOption/interface/index.ts create mode 100644 src/components/utils/FilterDateRage/component/RangeDatePicker/RangeDatePicker.tsx create mode 100644 src/components/utils/FilterDateRage/component/RangeDatePicker/index.ts create mode 100644 src/components/utils/FilterDateRage/component/RangeDatePicker/interface/index.ts create mode 100644 src/components/utils/FilterDateRage/index.ts create mode 100644 src/components/utils/FilterDateRage/interface/index.ts create mode 100644 src/components/utils/FormCustom/FormCustom.tsx create mode 100644 src/components/utils/FormCustom/compoents/InputForm/InputForm.tsx create mode 100644 src/components/utils/FormCustom/compoents/InputForm/index.ts create mode 100644 src/components/utils/FormCustom/compoents/InputForm/interface/index.ts create mode 100644 src/components/utils/FormCustom/compoents/SelectForm/SelectForm.tsx create mode 100644 src/components/utils/FormCustom/compoents/SelectForm/index.ts create mode 100644 src/components/utils/FormCustom/compoents/SelectForm/interface/index.ts create mode 100644 src/components/utils/FormCustom/compoents/SelectMany/SelectMany.tsx create mode 100644 src/components/utils/FormCustom/compoents/SelectMany/index.ts create mode 100644 src/components/utils/FormCustom/compoents/SelectMany/interface/index.ts create mode 100644 src/components/utils/FormCustom/compoents/SelectSingle/SelectSingle.tsx create mode 100644 src/components/utils/FormCustom/compoents/SelectSingle/index.ts create mode 100644 src/components/utils/FormCustom/compoents/SelectSingle/interface/index.ts create mode 100644 src/components/utils/FormCustom/compoents/TextArea/TextArea.tsx create mode 100644 src/components/utils/FormCustom/compoents/TextArea/index.ts create mode 100644 src/components/utils/FormCustom/compoents/TextArea/interface/index.ts create mode 100644 src/components/utils/FormCustom/contexts/index.ts create mode 100644 src/components/utils/FormCustom/index.ts create mode 100644 src/components/utils/FormCustom/interface/index.ts create mode 100644 src/components/utils/IconRound.tsx create mode 100644 src/components/utils/PositionContainer/PositionContainer.tsx create mode 100644 src/components/utils/PositionContainer/component/ClickOpen/ClickOpen.tsx create mode 100644 src/components/utils/PositionContainer/component/ClickOpen/index.ts create mode 100644 src/components/utils/PositionContainer/component/ClickOpen/interface/index.ts create mode 100644 src/components/utils/PositionContainer/index.ts create mode 100644 src/components/utils/PositionContainer/interface/index.ts create mode 100644 src/components/utils/UploadImage/UploadImage.tsx create mode 100644 src/components/utils/UploadImage/index.ts create mode 100644 src/components/utils/UploadImage/interface/index.ts create mode 100644 src/constant/config/country_option.ts create mode 100644 src/constant/config/enum.ts create mode 100644 src/constant/config/index.ts create mode 100644 src/constant/images/icons.ts create mode 100644 src/contexts/AppProvider.tsx create mode 100644 src/redux/reducer/auth.ts create mode 100644 src/redux/reducer/site.ts create mode 100644 src/redux/reducer/user.ts create mode 100644 src/redux/store.ts create mode 100644 src/services/administrativeServices.ts create mode 100644 src/services/airlinesServices.ts create mode 100644 src/services/continentsServices.ts create mode 100644 src/services/countriesServices.ts create mode 100644 src/services/countryServices.ts create mode 100644 src/services/index.ts diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..779ad19 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..03b52fe --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,33 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Create new component", + "type": "shell", + "command": "mkdir -p '${workspaceFolder}/src/components/${input:type}/${input:dirName}/interfaces' && touch '${workspaceFolder}/src/components/${input:type}/${input:dirName}/interfaces/index.ts' '${workspaceFolder}/src/components/${input:type}/${input:dirName}/${input:dirName}.tsx' '${workspaceFolder}/src/components/${input:type}/${input:dirName}/${input:dirName}.module.scss' '${workspaceFolder}/src/components/${input:type}/${input:dirName}/index.ts' && echo 'export interface Props${input:dirName} {}' >> '${workspaceFolder}/src/components/${input:type}/${input:dirName}/interfaces/index.ts' && echo 'export { default } from \"./${input:dirName}\";' >> '${workspaceFolder}/src/components/${input:type}/${input:dirName}/index.ts' && echo 'import React from \"react\"; \n\nimport {Props${input:dirName}} from \"./interfaces\"; \nimport styles from \"./${input:dirName}.module.scss\"; \n\nfunction ${input:dirName}({}:Props${input:dirName}) { \n\treturn
${input:dirName}
; \n} \n\nexport default ${input:dirName};' >> '${workspaceFolder}/src/components/${input:type}/${input:dirName}/${input:dirName}.tsx'", + "problemMatcher": [], + "presentation": { + "echo": false, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": false, + "clear": true + } + } + ], + "inputs": [ + { + "type": "promptString", + "id": "type", + "description": "Where do you want to create?", + "default": "pages/" + }, + { + "type": "promptString", + "id": "dirName", + "description": "Complete my folder name", + "default": "tsx folder to create" + } + ] +} diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..8b757b2 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index 05e726d..4e80a14 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -13,6 +13,13 @@ const eslintConfig = defineConfig([ "build/**", "next-env.d.ts", ]), + { + rules: { + "no-var": "off", + "prefer-const": "off", + "@typescript-eslint/no-explicit-any": "off", // tắt lỗi any + }, + }, ]); export default eslintConfig; diff --git a/next.config.ts b/next.config.ts index 66e1566..3b846fe 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,8 +1,11 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ reactCompiler: true, + + turbopack: { + root: process.cwd(), + }, }; export default nextConfig; diff --git a/package.json b/package.json index 293fd09..cea0126 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,36 @@ "lint": "eslint" }, "dependencies": { + "@radix-ui/react-popover": "^1.1.17", + "@radix-ui/react-tooltip": "^1.2.12", + "@reduxjs/toolkit": "^2.12.0", + "@tanstack/react-query": "^5.101.2", + "axios": "^1.18.1", + "clsx": "^2.1.1", + "countries-and-timezones": "^3.9.0", + "countries-list": "^3.4.1", + "iconsax-react": "^0.0.8", + "lottie-react": "^2.4.1", + "md5": "^2.3.0", + "moment": "^2.30.1", "next": "16.2.9", + "nprogress": "^0.2.0", "react": "19.2.4", - "react-dom": "19.2.4" + "react-dom": "19.2.4", + "react-icons": "^5.7.0", + "react-moment": "^2.0.2", + "react-redux": "^9.3.0", + "react-toastify": "^11.1.0" }, "devDependencies": { "@tailwindcss/postcss": "^4", + "@types/md5": "^2.3.6", + "@types/moment": "^2.13.0", "@types/node": "^20", + "@types/nprogress": "^0.2.3", "@types/react": "^19", "@types/react-dom": "^19", + "@types/react-redux": "^7.1.34", "babel-plugin-react-compiler": "1.0.0", "eslint": "^9", "eslint-config-next": "16.2.9", diff --git a/public/static/anim/loading_screen.json b/public/static/anim/loading_screen.json new file mode 100644 index 0000000..a15255f --- /dev/null +++ b/public/static/anim/loading_screen.json @@ -0,0 +1,43 @@ +{ + "vna_loading_animation": { + "theme": "Vietnam Airlines Premium", + "background": { + "type": "gradient", + "colors": ["#004b5e", "#007b85"], + "direction": "vertical" + }, + "aircraft": { + "asset_id": "{{DATA:IMAGE:IMAGE_3}}", + "style": "Photo-realistic", + "brand": "Vietnam Airlines", + "livery": "Teal body, Gold Lotus tail, Gold stripe", + "animation": { + "type": "bobbing", + "duration": "3s", + "timing": "ease-in-out", + "loop": true + } + }, + "loading_bar": { + "color": "#c89f3c", + "track_color": "rgba(255, 255, 255, 0.2)", + "animation": { + "type": "progress", + "duration": "4s", + "loop": true + } + }, + "atmosphere": { + "clouds": { + "color": "white", + "opacity": 0.3, + "animation": "parallax-scrolling" + }, + "speed_lines": { + "color": "white", + "opacity": 0.4, + "animation": "fast-streak" + } + } + } +} diff --git a/public/static/images/avatar-default.png b/public/static/images/avatar-default.png new file mode 100644 index 0000000000000000000000000000000000000000..9334d43f37fa7bb5eeafc1de63a07fd9c4a49cc1 GIT binary patch literal 49762 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 z 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%0AC_1J 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 XPOD!GgGXWV00000NkvXXu0mjfk|CkE literal 0 HcmV?d00001 diff --git a/public/static/images/box-remove.svg b/public/static/images/box-remove.svg new file mode 100644 index 0000000..79d6ac5 --- /dev/null +++ b/public/static/images/box-remove.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/static/images/emptyFile.svg b/public/static/images/emptyFile.svg new file mode 100644 index 0000000..345931d --- /dev/null +++ b/public/static/images/emptyFile.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/empty_table.png b/public/static/images/empty_table.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8ddaf1bfc6da0f7139f4a49f2a45a3c829872c GIT binary patch literal 26881 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 R-(LZbAO#s!NF~@D_CIX<#2f$s literal 0 HcmV?d00001 diff --git a/public/static/images/full-screen.svg b/public/static/images/full-screen.svg new file mode 100644 index 0000000..95cf99c --- /dev/null +++ b/public/static/images/full-screen.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/static/images/icon-hamburger.svg b/public/static/images/icon-hamburger.svg new file mode 100644 index 0000000..5e7744e --- /dev/null +++ b/public/static/images/icon-hamburger.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/static/images/logoFull.png b/public/static/images/logoFull.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5c7394117976fce939a6cd73a6e8cd4eeb8aeb GIT binary patch literal 42152 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 V05ODE?C$^o002ovPDHLkV1oTwyaE6K literal 0 HcmV?d00001 diff --git a/public/static/images/logoSmall.webp b/public/static/images/logoSmall.webp new file mode 100644 index 0000000000000000000000000000000000000000..ad53df1de4a2366f9c6d5db84cb20411c4fc7dfb GIT binary patch literal 12214 zcmchd^;cA1*yx957`nSbVuYbVT0j^^kS?W58fm1vyM`8|a{%ccI#o(i83bu*X}Emv zz5l}duC;$Sd!Nr!>+JnJ=j^k!ps!xl@dE(*N-s6^G{j#QKV9?J5Au>kF%zqtdc(aV zPz6LGa(H5GiUip1>n#cFD#fQnoqjig-C}GO=;v?7!jix}v8DC2gZio$SQ-8c3&(N3 zjb99Sc}8cj=1JAgF{<8MpX1bibiPlCd-FmDzpc%8Nf~BKsB85>kXMx7UBSHT^UI>* zn3rT&YQ<{@5I!tz6RX=dc6DkKi(cMWgpKT?Yd7Y=ZqZGf6|klSL)gP6;ZzJ z24*~N7u;XtW;|Xpo@oDmku+STTFn}tF&|4inC?l#yB_#@?5c^~znT15@rn-HLmcD8g>4{Cp2dYNBTkg# z!e$UB`ETRIEAZ)lbqq&`ArU7dI~_DQ0oFafyRZ&A94G4@zdcwN1CFuv17rJb!>rEw zZD$W0CwX3b9cQ_x4+CD436@4ff6LUz;As`jwAc%|2Cix-EMCQ2fXJBol@ubFvU?zZ zY4R@IPlWENuo;n>k|9j?G6IJz2cDL@ESQCh``lI{Vfjo(y#griRZW46!kiv~KLYPA z+)gal#ISEHuVz%&w>Ol_q@u#q!P4dZ%AzvSHLnn7?q~YLGSQMeCC6a{`q%}7N=z|@ zj+i?eYDpI5AXrk>FPca2OI_hWkDKZBrZ)SH4cprz{Bzq6b78-ua*5P@ zsoy?lmX2Rn$SqjV1V%8K^a?-N<$11O@9x4ZnMO=7A{nWAgpZ|OV(A2S-Oinle8@1} z+#V=zkxBY|jxU|mBjSr@6|R4MeepJpvQO75Mb?L&!}dMauAkB?*9=*GXW+Xn%InV~ zn)Z%9h6;d;Iaf8&O9ZBk_Y>DeRCciG4dP;Z#1e0@!9uHHAKQO>-W(XalD;4>+I zwEvKr@jIg9D5r=BWJz;7#ULG{L9EVdTmUDW5;gd z`#60(BRP(4XBTfu(_ib?(xKRJeNqBBeZ6d;WgUSP_Z&gG%j*>Y9gX-;<^YRiZ@9IFci%q{SxcWfdPpmE zFT|Hf7d?Pz3p9J#=NuFwb{*2tHP+GF1G)@|=`?HY?Cb36;rFET^bVjqJPYl5)7sj1 zD{M;Do6^zRlXB%bMrYpI)JON+lxi8eX7~&EyLISHZ>=!7? z*!L$m&=Bm>a#Zz~)8DXe&2=&D_gW@D?3em4?KQ&R-b1H>1BvuUV*dJd1Q!e$1Q|zo zPSFE__(#;eJO$pXmuao!Jv_d!120RTiHqu&epQ`NKZ`RpV3%DhRf*b=i|Uf@PuQkf z>l?h&mMOiPy2U`vjh<6=beG$k;x7Rt&LxL&GF+Kr1^-Y!zaRYE4r`7+AJq82d2dVa zW$v?oC34br(Gut2a^j%%Z`heg#m|9>Y;!70TJdMs{Zr~}SbF)(_#yNB&{*=g%kL)L z;HL}lwnaD9aXU9UbSu zYW7Ic9-h2lV;H%``|{s^>e=L?; zjv7EHevnXOcI>5tvVRbX5~3>+h;6sOa3gOd8cWic^g#4qcH{PTXQnRqoFNC ztP%~^GMLcPZE;GEI~j6l^Y*(``$8Nm&EJ+eC5!$Hp*2Wt{J0l^46!w*+MzXjBWQ*T z_uPhh@xLOO!7W5A<`FImDSG~q*5+9*7_d$$HfY?*#QM%q zQ=v%Tc4SelTqwP_sJ`qNT#&_$+zPDc5f%Lv#w_m5o9TDQNZvmrDbb&Cga)izIXWw*cAALn=Ye)j_XkrS<|Vgl{^ac31%P2ac7*xvGNtKm_dljT z*DmB}seYH(-n7Yo!~J9V`fv9_s+KFEX9W0WUq;@;@ypgbmC8BQyFMd#Ji<~d|ElIw z+RBCWJOv8hrTN=;jUZJwzEUko{uKLDE(S6>{`PtD{O@X+48O|9_;^R!;PzWstrK{| zx+ebB+~Tz!sP+}a0rWXv$&AmgG);EfcbGoi)*o*c%La*j3SvHQ?nA z*;E1{?SEVabs_#yC1{yRU-O3?ytWMoIjFx=FPL>J=!K9GL?T%UJ7Izre<%~)h2mWi zs$psJaf)W1Hh1!H+Bkp5-I@vMMyp2P4h;{7*5O2CzZE96dvV;`^ny8NvAU^-2qe_{ zz9gh(;Jot_M#~JOvZ?Lse?y9>bd8{_bYeww3(FXn`sny3h?=% zQl)_QKdlPY^6Tqe&4|4VwdhKfw~S-}W6EE?8V; zXovk`93DoF9CDxpw7qgc_A0%x_A0q&*+Yfqw~HkslhPa0jkJ69d?IuC*>i>uR{wAo zH%BIy4y!AR9;>QCF1J9{kWkD9yWn=^Rr384{SutcXRq@;spTW#x_y&Ne@D5I_t6*B zUYmlv4Ti*)I_U18+nCtn-Vd>(x4?vExLj%rcSv^X(rZ1%8#N8Zm3Zi&kt1bz_LnDN zr&8YHJ5KJ<)(ydZfePOdLC^(_tbtW1)XZrfL&&x%qz3O2^f|T#EzK}(EyNXrJG8xR zOGG!^R9yG?^tFvHXEMJ@j#-`ahnn&8xC&6KsJ>ywRA{vE4@`F=UiS{JUX_k$UiS=7 z8u@X!ZvW~)M=0MOe-+X){sjCt5#%g)G`9(meIU~KT6jm3a@^fXl{Mut4Q(gsLgMB*DRC=9O{mSj{(p8&L_-pLo#Na>W^+(|N@D z5G?_-FAUFIwJp9XLA2gJ><3AV2(8?|OmgJv0FOcbSv;VUUj& zo{=1IBo7DZw6%ovNtf%5Ym)|(9afA%sg-xqGac!VYO0c%sVN}}G+E? zG|24N)DS;@8vID`3062%w|ed2Tybg za($bUlc&0R=x8~WidAbggMa2Jx$u4_t@kanUM)uVi#69FKSODbjFMdI1t-j@S8J|K zt!_N+=N@Z#bo-)V&P~qn)%;Y|s)D_IN82?~9YWDHNEDf-?u_$hv?mPvivv`G{zzMQ z=6vuHSYu3dL$Hjhd7(%ClLO(!|LwSxVcMHTxP+ow>*R8@##rzL zI&2x`5Bf}AUhWY$xp(nttAcUb+x27P$4-N8s-5VAn7j-EL3^5OMHy5F#t z>u*q>q~_xCHw=2i_uTRJ+*RJF^E<2RY5?wS?-9Akqjd9oQSo4vo3W#%Qf6;-=G`a_ zZ4=E8*t_L@B!hK~gkblY_xD(&u+^m?V8;!e)r#$3U83~qS%>1b6J5ju$Za+iYeXD~C zre)ZYEn5YK)D)k;^v%~1FMjo`qzqy+pYE|Sjcb*G$XTWCdcit&a|Zc?)&))tM#SbBPjsni8M5>nSzVBY(%15a?*ZQC|j^g}1R%Me|Zu z@jp{&sYhVMmC((^=A#)^j(>QD&9|mg+c)fDg_-9c{7eEJ=JSgx*)2Y2Z44yMvM$v0?rhKGf66)S0;@eD>a*Oc1} zv}R()f)XmNnA`{+`;VipJ}KwHY`PrcppI8J#QWd#7)L+4;@Lx_9ZIS=22Momp|oRX zp`r1NtJfhlkrkgHU*B)iez31_4Njn)iT)9tjbqFL<^78(uN$ka62)W_F_=;kfvvn~ zSCmK{@vava?}IAP7Pm@Wj^%->qOc~MFlv!IB(mcLZlKWx+GkxLid=pkjY!us{g>i} zFoTEqusYC&y_)TAxZ*Qm1L1%~XdQ-F>KFMdy7%Mq48-)CpTZy;%_*o6c{;nnUFLlD z9Uc`nb-KU$74-G!$j{_D$;xsx41on1s8^|Yqbjr-ou%Z1LaQuHYpQqVY4>wJ&OLB~zf{uWFFt%7(5*TuXT#Cz>p(22epJ*yb` z7F+Ed+bgtioN;dEL~1p-pParT{Rcc1*W&8CIueaREHQ#uS2oQ+hNSc~Q-&&g<}Q$q zG(3g97hu~FTTf&yqS#hDixIDP;we6-?k|=8<=gtOA;_~Ljz5p5V#A$H9rRCKMRimG zd`~#C9Q`$knuEQqS^p({!^YV*UgP-;?#`$FDSn1F68>&HoE4RNd|iU%b~;gtb(Pct zNkdm)J%KfWcw09I7I8c!N>_YYrSW%BNicxu9Irw_&F7z^JZS;lhtrAUQRZIZ!N#wy zZ4DEA@zf{QK06#TvK!&H>QtCZ#%yxPiQ`4Ev=FIP*1Es<_xU28PJANuMmFkhMP;A9 zyq)(uq-$77gvHegx*jCzJ{k16Da_({$F9nuFa_{6q4H|G~B3GC%!`;nG_0=p2=w#*nfQ7#KA zin#rzG-E#3I0~ZoKVaomFl3z%1qh_boobNNWT)Y%TM2J&eP@uG72keGoA|fzE1(Zd zB&(xDi8`Q)X<(4I(+KyYqngp>J^AWa%YkLz;nv#53K20Oq8RN6FP>G zNxCFA-ebWzg9!)N`H5W2Q}yXP{$-H_?%=sJVdde#FTDvQD7`~25i!*SONSg+<~v=w z<2JN%s|5@lgGyJd1|I|x<$k>j-i1eB<{k>WerY8fFn-7QbCA6b;^CAaH94%bX>`1h@D~er>Xfut^DaI4*Z%h|1uCo-`7%4 zIG|?4_;Z-O7UFR@fqbX$drSTY(BfpQ5E)^-9^i=NQLuT7R<<$3T4RG}u$(~?i)8g@ zsX@HQT`psNeKGj5L>vozSlRDNmKi1{I39biv8o-JZD5d$WgEPrO)m)E2mKu5sg??V zI}Vv8iAz1ekA90R;;K&Mk6_V!3TjCsB0FY?#zyX^MhJ?N7vy4{tV?}*yDN?+1QPz* z*TN)gWiSW)Il)>bh#4SBIo!~o0!j=iT_eU<))es(NMRom_c-K4ii=X(4+unewhwod zjCRqiD^f&G+VI3%S~iH%hjq{hSsBit{hWenIpOZ_KVUB`Bg&vp;dh=OPE78 zT#g+55K&5}0Tz|FKuh+D#QG=>`BIi0x?Mh zF%*&FP=m|UPiM3_7&v7X<24P{+XpGBR*2T-`es21m0Sulk*W87Pag0cF+D_0OO z@-tkjt6EbvUO|QKJ%rZan=j@#;iN&<43>*SiWY6?mk{wejv*U%N9F;9EsL0saRab2 ziKX^yJSL?lZ9f6LfrlM=i3J{uz9-(?@}#b9++)+o)Hhp1Br|k1$g6lxf{$ngz>bon zS=+;n$*f&XhOZo>nCqvL6zz=JY&=8>Yn=qgEp0q)N>r;80MDlrI4D01{J@4P zIz}?rCzuf%u8M0d=$UuLMT5Iq^5Y__n8f5f!5}7-amp%EgLg8HK^vpeA;M z{Iy6Qs_$4w&Y8p`0!?4UwYGF$9n7r4ErC=%e!1Z{)bDuR+1Tq}pz~HkOgQF_FXTyy zqXbF<5Peba&7CJ3g2#}z4jgkM%+K+0YS8yOc;fYezCK}L!Q$~OwIJ-ZF^FX(7Cnlg z2lI(x#9vj4JOO{gclnS)6eX~;jXXrg(`32~{J_oizrhT;A&s}aCPw->sz}ife_{kJ zVxZvWC#ex)OXKBl5Vrh%J}F62-V)JK1Js+(7q!2etv2|ubxlE~0?=o2CIPrLL?=0G z;XDQSNA8(~Q3BBpZcnavM4kYD#W%9j&7=^nKvaGUJ3Ufhly{s>-NcK%wqjtAkG}C(?`^EGlYcQuSalN!)Vv;0|Un(h`bSccHk?-ho#zkN$Dc zd67+q&fuzolon9oUolD?ZP|@lIj;s8 zjoM1hUN`tcUi+=2@b`bZE;m@_1>3NdQ3*|Fc zKSX@*fSCP=LO`GZedH(AihjiJArr{=1~ZJix$xDi5gqr_f8j;2_LG3Ojk3Ya)JR}5 z)$B;}rh*NazYG=62?xlYx1R;Pg-+-3Qo*)wFDG7yF;npgA!;KAh{dmcsJ*)M8X*D= z?=W7sW?wz%q=}V}g;$@rJHWBz`3{~1mo}dZ;LZRcCRAi*#n$cEa0Xi0ELFGi(czbO z=Zqf+G24mNgAtU8mab!*18v*QHt?lQxBks<*C!XJK0c1%L5C7?oKS1)^r+Jb( z25G1-Ma2(VOhJBln^<+ORtm6?)qmL_$F(q*#aPk0$^jVi(QtB_@EF418`jX2<&49g ze`lo1rRC2$c!F5+0GXLcXLPGdEBJfgS~N}zDp+J?h)?_dDbA4XhDa1QaS75B`>Od1 z4Y8G5|71%h$i@UbkFPCMpRL-55n4oCFZm{fnIchW-3ZTAs4q869b$O+Q`_4gDQ zX+r!W19M100>~_>OIGUl{E05>{|lXwbHPv$VBcJ~2u_pGQ-JA%{|{;x?~WMmRdFyHI?&?wZGs@Tl+rAECy&S{7Vd>e}xM_)}bK1(F>cegd_HVCmq=!QtC_by!^^?$|WIkrX9` zb!XJJ!~`&V-}#;dmDO@)B>g%8{N34{Q=K%aI9@2~eSI@>)f~O<3 znStSBuS43X|A2z90RQZ(E59R;1WxQRUJnhUPeH_*#H(kc$DZ8KX2uPtQxEB)EjyM3 z$OSd)o*$qx>(1;kCa1vPaNUJqUyPj0EQ&<)&`DN9g&m3!`fg#r;Y|YU6;Z+b%V#X56K=X5%Dnojg9$1XXb3?n;O=hy_KUu z(9>k~#LaH@`x0(mKy2N~0I$!J9oOsN(f^-|XwT+=$>WqYx;}9=r|ZHv8=>&(P9Pxj znFo%yNQ_TE+MgGhwhHiE!?vk0BK}O50*vIXesjWb3W3YuO91Yr1Fo27b{4%^9fvP@ z_>elz?oaeVrb`PT1n!H(LzPcI#s@@1%Q} z93I~%giytlLK**9*htutXYYe|Bi#YH;-k}Ou!$Sn&aP}*x?f$AcM)+BK3iyiEG+H3 zK<*6>ds8pik+4y)Y`o}FnP@PNwPBM6V0@V9BXN6<5tB3!Mc{9 z>rm<^>{Cg}@K!gZ%|*k?&>=;G0i}ATlMCXi!5I zAZt1k%ENSUaNzBPdA|8 zJ1LM9Fl>O`)q@@Vb;}?!9wOOv42m5VrVJYR&zAUW^p&p|hVX+JYbYV7rS*w7FI=vs z&*mALjk#+M=AycS5}e)uPGBx5x?q-yXS2Yv1O;eP=RHH)Y;x^C7)5rOwQww$E2S(B z+v7L&c^SG6Lx~B|ec}0rnVaS<&lXrELNG0qOqu}I;5HOH;+|X>BdwtkoExzeB9c9r zVwi>X42|8;wJ8lSLDOc|Vh5i1&qY4oSadpvrfkD?74p~4q;gV#CuJOz99Zy#r=9Iu zX8H!1v1#<0Vl%>~KG8#6j3$hUMnkw0-F{jqHS50cB)UrDx)kVm#yE60+uFC^L%C)K z96o6@HQVQ<={f)f)a}>4g(oB^K^e<%7VMSK%q+Y0@~{jP`>kxzC~J*zn;06nszY|O zFP0DgIoeKnNrISD+2OyzfH$;kM6+xYg8d$jHHN3TXM-K35CTUsEUG8zb6sK^OLI*x z(CqUDw}A!p{mUF|*O<`Ge5`e-KDl|vK6pGHB8><<8y0kE+Yoj&CY`jSHT$k31d(pw z8XLHqq~&X?o_xV6Nq~qBtv{-@(E-vsz+%p0+DSj9&;Y?((`PZ1+YRx$KGJn zEVJOuVl;4(O^zU|I9q98HI8^^eL7HxzR**U_IOA~ZNu~_r2mTHiaBql!7rL}G{sa* z?Huf~-3av8NrT0&j|ckji0DoRX z_3hP*6ZPq7LM|aVuV)onAwP68t-X&Y2KT{{+$D%^JjI9pjB9n7v;T zh|Elk)`fgfM1UqR+;0#F$Rgx}@9}_|sIRQqWkSu(L*AIT$^u-~C?`F#fy6rNHsRyQ z1IECZj5p>6nWdI}d4XueP|C@7chrgr@Hs4stnxkEw+d ziQE8V2gXDsSs0{p$i(kb0a{eUvK{&!pMIa=JyK=yOf*ScRX&r6ca~T2r?0-o3O?E} z`(xr>l`*fE!! zeQz3$vk%%bCr1SDG5a>f>Wr?Om}N2u^i!|RL@&tzZ-2Gyt+$q)_Jct{e^LHBU~sjI z(dF@PMStNlL8(IZ(_S>!i|6}jfd{mO(`~r0k+AlhUx2HJ$P2(zDa4uMN0ThnP?bf; zy+7PT3uK6X!?i>qEK{;}kIOtKR*iGjTV@ z0k>~ntP1KAJ*=U^${p+r|mO_Bz$!y>cs%$?nZDk{-u6VXpDUJ&fnj!4Gj?a zukPGxJ+bKQ7AnC2eN*I@ei`VR?t&RS0Zq#!CK%wYIkrIa3 zkfJ|)Eq~e0qHJRIccIKBRS{-*XU^ny_OT2V)9%4vbbx5H*e6rQzx%vQyKZzNpj$xh4$WL2P3iBeD1kHIR-nU^PB6_qGW~piI*z=Ee>tpWu3qtGZmaT zt;65098Fsh{$0C*-Z$kJm2CYCNM!llO?Hvx@arYntzX}b59c&uC>alhPUO9N ztNa(ZZ*lHt2LnyG{Crxz4%&9#kDmFK9~5E&>IyO#iT~q#-^j|paD4>#OX2oixX&<1 z(I}u4T!K=rR$C`zahMrMV~@>pX$x;}Fb1M}IWNgwl}lKq=EGn6{~LHZJoR9hCaH^6 zVE6K`{{zt0HxRT!aWI9*C!YT6JY2eZ&Cz9Z@nhX|pJL4kal%rI<`T;HXZ)x*JMAjs zKt#zlkTROc9(ct@rNt4*vQJ(jwjukrTg%l8ucP|R&Pk#JxZ^*ban65=%etZSE~Pe*|9F zSNse55TxAxkag~z{;xN^_cP*}Y0p#(`Pdf(RSWt;d>^CrIB_4MMLh9KhYKB`c;n7- zXE%d?SM3y(v-zkR1ZTfunq}fV>8+Dh&53wi`ezz*U4MgL)tq@=U%IgTK;C9XUN4Jj zR4a1tUD^Eana-69?6OKi0!RCMd%C^fMMqdnUGK-{l6CN;5>?$t{!7{5(#|jR;MH$8 zIyaKuEU$<5^Bp84!s(U`cKE37zGgbhNl>>n$CdUvP9Z&hn6wmp4tu*&y;juEyuhUS z?^xx$vd0z}nDevgqi^`L9D|^FS4`#^qSz?qPMu!}d(=ovkNKh7u@(Ln71iXRR16;m z$V1<+l?zG0*8TSW6!+^$vYom&gvOGN7cDb}8 z4he(Wgo}hdLg)P(x_N%036X|xLGxDTXFEdOu=MqX7?Uzuf|}*FAX?&LwL@thY-i_j zKSc>yu(cz+8^3oV&nQXcsi|v zktBMNZ#Rad8BE@FvLj?XT3&f6!A!3dbU{^$V_>nvui7h>r$VSW=krL#opJ)G!k4G4E{lp(fLnSX)_mVI5g{lQ|-)y03atwY&IhuXv>?L|` zB;G)c*9~0iL#hQ*s6t#_@8?ZJ9nDTSdok0c^GxYht|zcX-wQJIdKrojai*s!1I^Rm zJDX1n8*;n)m7XI!!D7!gu~AukMzs0&0*0g5`R@fj&@(!PqA)#a$EEo+z2Xpzzx9E` zjS)^O{=*;t;f|~he(d0)S$t6z*kRP@y8L}Ru+9j87WuKR0yA8}#ZpphDU{f$jBK6{ z$CgQu#XV~d;W{A^OWuAaQ?0u1E7-OI9pnPM~&OULq3MNoZZ!Ug<%BKVWq-bjft zp^3hC^VxTP&_;{CER(cfcoyaTJQ21v(aTnSS!!t<4E}mxdtr2-FL8JGP0T0K=Us!G zn}Osv*770$_LM_ZzZ?tZCg0M${~k)K=4c!I)Yr;Q?)+PUi7`H?q2jGm9FethRn1*% z%9y@aSN5eKEFz0OplZCBl%QfE{N=cPme_Gir$NWluKFj7+^W>4OjzH2qOYsoDHU3F zKc7D9hB$ucgm74C zfA*aS%Vh8snWVKIM?Ga<;Yy9};;_$qNL?sTZQ1%dk=E}S-A?9@YTsGtjXYT9IdPv> zGbpIaD64L{bzwgvFM`d{xWj(Ms9wSsCuo?KN~_L^xBCxyUI>QMJC*j9+VdQ35A26g zrERV8=DIlhDQ<}gJO4Ja^ZFe0T0rt*3si zNI7|)!c`MZzB^x8`i$;l6T$gSugR|Ink*{g%d`a5Y;Wd`?Cj&rUQl_^tL-PW_wl;$ Kf2BRLGyESmcw#F6 literal 0 HcmV?d00001 diff --git a/public/static/images/may-bay.png b/public/static/images/may-bay.png new file mode 100644 index 0000000000000000000000000000000000000000..9f245f44dbcc6524322ac3a544e06ccebb05dbea GIT binary patch literal 185114 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 j{`0_p9{7LM1A=h*0F literal 0 HcmV?d00001 diff --git a/public/static/images/pause.svg b/public/static/images/pause.svg new file mode 100644 index 0000000..c41d8ca --- /dev/null +++ b/public/static/images/pause.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/static/images/play-circle.svg b/public/static/images/play-circle.svg new file mode 100644 index 0000000..b3906d4 --- /dev/null +++ b/public/static/images/play-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/static/images/tick-circle.svg b/public/static/images/tick-circle.svg new file mode 100644 index 0000000..869e8f1 --- /dev/null +++ b/public/static/images/tick-circle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/static/images/warning-2.svg b/public/static/images/warning-2.svg new file mode 100644 index 0000000..2ecb51f --- /dev/null +++ b/public/static/images/warning-2.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/app/airlines/[id]/page.tsx b/src/app/airlines/[id]/page.tsx new file mode 100644 index 0000000..39a26ae --- /dev/null +++ b/src/app/airlines/[id]/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import DetailAirlines from "@/components/page/airlines/DetailAirlines"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/airlines/create/page.tsx b/src/app/airlines/create/page.tsx new file mode 100644 index 0000000..6029ba5 --- /dev/null +++ b/src/app/airlines/create/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import PageCreateAirlines from "@/components/page/airlines/PageCreateAirlines/PageCreateAirlines"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/airlines/page.tsx b/src/app/airlines/page.tsx new file mode 100644 index 0000000..bcb01b1 --- /dev/null +++ b/src/app/airlines/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import MainPageAirlines from "@/components/page/airlines/MainPageAirlines"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/airlines/update/page.tsx b/src/app/airlines/update/page.tsx new file mode 100644 index 0000000..3c39736 --- /dev/null +++ b/src/app/airlines/update/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import PageUpdateAirlines from "@/components/page/airlines/PageUpdateAirlines"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/continents/[id]/page.tsx b/src/app/continents/[id]/page.tsx new file mode 100644 index 0000000..4b135be --- /dev/null +++ b/src/app/continents/[id]/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import DetailContinent from "@/components/page/continents/DetailContinent"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/continents/page.tsx b/src/app/continents/page.tsx new file mode 100644 index 0000000..afdf9fe --- /dev/null +++ b/src/app/continents/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import MainPageContinents from "@/components/page/continents/MainPageContinents"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/countries/[id]/page.tsx b/src/app/countries/[id]/page.tsx new file mode 100644 index 0000000..7de2d9c --- /dev/null +++ b/src/app/countries/[id]/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import DetailCountries from "@/components/page/countries/DetailCountries"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/countries/create/page.tsx b/src/app/countries/create/page.tsx new file mode 100644 index 0000000..cfa4615 --- /dev/null +++ b/src/app/countries/create/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import CreateCountries from "@/components/page/countries/CreateCountries"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/countries/page.tsx b/src/app/countries/page.tsx new file mode 100644 index 0000000..6e29257 --- /dev/null +++ b/src/app/countries/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import MainPageCountries from "@/components/page/countries/MainPageCountries"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/countries/update/page.tsx b/src/app/countries/update/page.tsx new file mode 100644 index 0000000..be8716c --- /dev/null +++ b/src/app/countries/update/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import UpdateCountries from "@/components/page/countries/UpdateCountries"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/country-regions/[id]/page.tsx b/src/app/country-regions/[id]/page.tsx new file mode 100644 index 0000000..a96eeaa --- /dev/null +++ b/src/app/country-regions/[id]/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import DetailCountryRegions from "@/components/page/country-regions/DetailCountryRegions"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/country-regions/page.tsx b/src/app/country-regions/page.tsx new file mode 100644 index 0000000..3d3c117 --- /dev/null +++ b/src/app/country-regions/page.tsx @@ -0,0 +1,16 @@ +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import MainPageCountryRegions from "@/components/page/country-regions/MainPageCountryRegions"; +import React, { Suspense } from "react"; + +function page() { + return ( + + Loading...}> + + + + ); +} + +export default page; diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx new file mode 100644 index 0000000..0657834 --- /dev/null +++ b/src/app/dashboard/page.tsx @@ -0,0 +1,10 @@ +"use client"; + +import BaseLayout from "@/components/layouts/BaseLayout"; +import React from "react"; + +function page() { + return page; +} + +export default page; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 976eb90..13dbe24 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,8 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import "react-toastify/dist/ReactToastify.css"; +import AppProvider from "@/contexts/AppProvider"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -13,7 +15,7 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", + title: "Quản lý hàng không", description: "Generated by create next app", }; @@ -23,11 +25,16 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - - {children} + // + // {children} + // + + + {children} + ); } diff --git a/src/app/page.tsx b/src/app/page.tsx index 3f36f7c..547c34e 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,65 +1,16 @@ -import Image from "next/image"; +"use client"; +import BaseLayout from "@/components/layouts/BaseLayout"; +import MainPageContinents from "@/components/page/continents/MainPageContinents"; +import React, { Suspense } from "react"; -export default function Home() { +function page() { return ( -

-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
- -
-
+ + Loading...}> + + + ); } + +export default page; diff --git a/src/common/funcs/convertCoin.ts b/src/common/funcs/convertCoin.ts new file mode 100644 index 0000000..427927b --- /dev/null +++ b/src/common/funcs/convertCoin.ts @@ -0,0 +1,14 @@ +// Hàm chuyển đổi số coin thành chuỗi định dạng tiền tệ +export const convertCoin = (coin: number | null) => { + return coin + ? coin.toLocaleString("de-DE", { maximumFractionDigits: 2 }) + : "0"; +}; + +// Hàm chuyển đổi chuỗi định dạng tiền tệ thành số coin +export const price = (value: string | number): number => { + const numberIsvalue = Number( + `${value}`.replace(/[^0-9,]/g, "").replace(",", "."), + ); + return isNaN(numberIsvalue) ? 0 : numberIsvalue; +}; diff --git a/src/common/funcs/delay.ts b/src/common/funcs/delay.ts new file mode 100644 index 0000000..91b78df --- /dev/null +++ b/src/common/funcs/delay.ts @@ -0,0 +1,3 @@ +export async function delay(duration: number) { + return await new Promise((resolve) => setTimeout(resolve, duration)); +} diff --git a/src/common/funcs/localStorage.ts b/src/common/funcs/localStorage.ts new file mode 100644 index 0000000..dfa9d07 --- /dev/null +++ b/src/common/funcs/localStorage.ts @@ -0,0 +1,18 @@ +export function getItemStorage(key: string) { + const value = localStorage.getItem(key)!; + if (value !== "undefined") { + return JSON.parse(value); + } else { + return null; + } +} + +export function setItemStorage(key: string, value: any) { + localStorage.setItem(key, JSON.stringify(value)); +} + +export function deleteItemStorage(...keys: Array) { + keys.forEach((key) => { + localStorage.removeItem(key); + }); +} diff --git a/src/common/funcs/optionConvert.ts b/src/common/funcs/optionConvert.ts new file mode 100644 index 0000000..37aa4e3 --- /dev/null +++ b/src/common/funcs/optionConvert.ts @@ -0,0 +1,27 @@ +import md5 from "md5"; +import moment from "moment"; + +export function removeVietnameseTones(str: string): string { + if (!str || typeof str !== "string") { + return ""; + } + return str + .trim() + .toLowerCase() + .normalize("NFD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/đ/g, "d") + .replace(/Đ/g, "D"); +} + +export function getKeyCert(): { + time: string; + keyCert: string; +} { + const key: string = process.env.NEXT_PUBLIC_KEY_CERT!; + const time = moment(new Date()).format("MM/DD/YYYY HH:mm:ss"); + return { + time: time, + keyCert: md5(`${key}${time}`), + }; +} diff --git a/src/common/funcs/selectData.ts b/src/common/funcs/selectData.ts new file mode 100644 index 0000000..88cb2d6 --- /dev/null +++ b/src/common/funcs/selectData.ts @@ -0,0 +1,96 @@ +import { TYPE_DATE } from "@/constant/config/enum"; + +export function getDateRange(range: number): { + from: Date | null; + to: Date | null; +} { + const today = new Date(); + today.setHours(0, 0, 0, 0); + + switch (range) { + // Tuần này + case TYPE_DATE.TODAY: + return { from: new Date(), to: new Date() }; + + // Hôm qua + case TYPE_DATE.YESTERDAY: + const firstYesterday = new Date(); + firstYesterday.setDate(today.getDate() - 1); + + const lastYesterday = new Date(); + + lastYesterday.setDate(today.getDate() - 1); + + return { + from: firstYesterday, + to: lastYesterday, + }; + + // Tuần này + case TYPE_DATE.THIS_WEEK: + const firstDayOfWeek = new Date(today); + firstDayOfWeek.setDate(today.getDate() - today.getDay()); + + const lastDayOfWeek = new Date(today); + lastDayOfWeek.setDate(today.getDate() - today.getDay() + 6); + + return { from: firstDayOfWeek, to: lastDayOfWeek }; + + // Tuần trước + case TYPE_DATE.LAST_WEEK: + const firstDayLastWeek = new Date(today); + firstDayLastWeek.setDate(today.getDate() - today.getDay() - 7); + + const lastDayLastWeek = new Date(today); + lastDayLastWeek.setDate(today.getDate() - today.getDay() - 1); + + return { from: firstDayLastWeek, to: lastDayLastWeek }; + + // Tháng này + case TYPE_DATE.THIS_MONTH: + const firstDayOfMonth = new Date( + today.getFullYear(), + today.getMonth(), + 1, + ); + const lastDayOfMonth = new Date( + today.getFullYear(), + today.getMonth() + 1, + 0, + ); + + return { from: firstDayOfMonth, to: lastDayOfMonth }; + + // Tháng trước + case TYPE_DATE.LAST_MONTH: + const firstDayLastMonth = new Date( + today.getFullYear(), + today.getMonth() - 1, + 1, + ); + const lastDayLastMonth = new Date( + today.getFullYear(), + today.getMonth(), + 0, + ); + + return { from: firstDayLastMonth, to: lastDayLastMonth }; + + // Năm nay + case TYPE_DATE.THIS_YEAR: + const firstDayOfYear = new Date(today.getFullYear(), 0, 1); + const lastDayOfYear = new Date(today.getFullYear(), 11, 31); + + return { from: firstDayOfYear, to: lastDayOfYear }; + + // 7 ngày trước + case TYPE_DATE.LAST_7_DAYS: + const firstDayLast7Days = new Date(today); + firstDayLast7Days.setDate(today.getDate() - 7); + + return { from: firstDayLast7Days, to: today }; + + default: + return { from: null, to: null }; + } +} diff --git a/src/common/funcs/toast.tsx b/src/common/funcs/toast.tsx new file mode 100644 index 0000000..54d96dc --- /dev/null +++ b/src/common/funcs/toast.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { toast, ToastOptions } from "react-toastify"; +import IconToastifyCustom from "@/components/customs/custom-toast"; + +const defaultOption: ToastOptions = { + autoClose: 2000, + hideProgressBar: true, + position: "top-center", + closeButton: true, +}; + +export const toastSuccess = ({ msg }: { msg: string }) => + toast.success(msg, { + ...defaultOption, + className: "toastify-custom-success", + icon: () => , + }); + +export const toastWarn = ({ msg }: { msg: string }) => + toast.warning(msg, { + ...defaultOption, + className: "toastify-custom-warn", + icon: () => , + }); + +export const toastInfo = ({ msg }: { msg: string }) => + toast.info(msg, { + ...defaultOption, + className: "toastify-custom-info", + icon: () => , + }); + +export const toastError = ({ msg }: { msg: string }) => + toast.error(msg, { + ...defaultOption, + className: "toastify-custom-error", + icon: () => , + }); diff --git a/src/common/funcs/validate.ts b/src/common/funcs/validate.ts new file mode 100644 index 0000000..6fceb9d --- /dev/null +++ b/src/common/funcs/validate.ts @@ -0,0 +1,14 @@ +export function validateEmail(value: string) { + return !!value + ?.trim() + .toLowerCase() + .match( + /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, + ); +} + +export function validatePhoneNumber(phoneNumber: string) { + const vietnamPhoneRegex = /^(03|05|07|08|09)[0-9]{8}$/; + + return vietnamPhoneRegex.test(phoneNumber); +} diff --git a/src/common/hooks/useStyleClass.ts b/src/common/hooks/useStyleClass.ts new file mode 100644 index 0000000..dc36bcd --- /dev/null +++ b/src/common/hooks/useStyleClass.ts @@ -0,0 +1,14 @@ +export const useStyleClass = (props: any, style: any) => { + let styleProps: Array = []; + + for (let i in props) { + styleProps.push(i); + } + + const convert: any = styleProps.map((item) => { + if (style[item] !== undefined) { + return { [style[item]]: !!props[item] }; + } + }); + return convert; +}; diff --git a/src/components/customs/DataWrapper.tsx b/src/components/customs/DataWrapper.tsx new file mode 100644 index 0000000..a1105ed --- /dev/null +++ b/src/components/customs/DataWrapper.tsx @@ -0,0 +1,63 @@ +"use client"; + +import React, { ReactNode } from "react"; +import Image from "next/image"; +import icons from "@/constant/images/icons"; + +interface PropsDataWrapper { + title?: string; + note?: string; + loading: boolean; + data: unknown[]; + children: ReactNode; + button?: ReactNode; +} + +function DataWrapper({ + title = "Dữ liệu trống", + note = "Hiện tại dữ liệu đang trống!", + data, + loading, + button, + children, +}: PropsDataWrapper) { + // ================= LOADING ================= + if (loading) { + return ( +
+
+ +

Đang tải...

+

+ Vui lòng chờ, đang tải dữ liệu! +

+
+ ); + } + + // ================= EMPTY ================= + if (!loading && (!data || data.length === 0)) { + return ( +
+ empty-data + +

{title}

+ +

{note}

+ + {button &&
{button}
} +
+ ); + } + + // ================= HAS DATA ================= + return <>{children}; +} + +export default DataWrapper; diff --git a/src/components/customs/FilterCustom.tsx b/src/components/customs/FilterCustom.tsx new file mode 100644 index 0000000..e40e672 --- /dev/null +++ b/src/components/customs/FilterCustom.tsx @@ -0,0 +1,230 @@ +"use client"; + +import React, { useEffect, useRef, useState } from "react"; +import clsx from "clsx"; + +import { removeVietnameseTones } from "@/common/funcs/optionConvert"; + +interface OptionItem { + uuid: string | number; + name: string; + code?: string; +} + +interface PropsFilterCustom { + styleRounded?: boolean; + showOptionAll?: boolean; + name: string; + listOption: OptionItem[]; + value: T; + onChange: (value: T) => void; +} + +function FilterCustom({ + styleRounded = false, + showOptionAll = true, + name, + listOption, + value, + onChange, +}: PropsFilterCustom) { + const wrapperRef = useRef(null); + const inputRef = useRef(null); + + const [open, setOpen] = useState(false); + const [keyword, setKeyword] = useState(""); + + const normalizedKeyword = removeVietnameseTones(keyword); + + useEffect(() => { + if (open) { + requestAnimationFrame(() => { + inputRef.current?.focus(); + }); + } + }, [open]); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + wrapperRef.current && + !wrapperRef.current.contains(event.target as Node) + ) { + setOpen(false); + } + }; + + document.addEventListener("mousedown", handleClickOutside); + + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, []); + + const filteredOptions = listOption.filter((item) => + removeVietnameseTones(item.name).includes(normalizedKeyword), + ); + + const selectedLabel = + listOption.find((item) => item.uuid === value)?.name || "Tất cả"; + + return ( +
+ {/* Trigger */} +
setOpen((prev) => !prev)} + className={clsx( + "flex items-center justify-between gap-2 border px-4 h-12", + "cursor-pointer select-none bg-white border-[#e1e5ed]", + "transition-all hover:border-[#0019f6]", + "w-full min-w-[240px]", // Đảm bảo độ rộng tối thiểu và tự co giãn linh hoạt + styleRounded ? "rounded-full" : "rounded-full", + open && "border-[#0019f6]", + )} + > +
+ + {name}: + + + {selectedLabel} + +
+ + + + +
+ + {/* Dropdown */} + {open && ( +
+
+ {/* Search */} + setKeyword(e.target.value)} + placeholder="Tìm kiếm..." + className=" + mb-2 w-full + rounded-lg border border-[#e1e5ed] + px-3 py-2 text-sm + outline-none + focus:border-[#0019f6] + " + /> + + {/* Options */} +
+ {showOptionAll && ( +
{ + onChange(null as T); + setOpen(false); + }} + className={clsx( + "flex cursor-pointer items-center justify-between", + "border-b border-[#e2e0ec]", + "px-3 py-2 text-sm", + "hover:text-[#0019f6]", + (value === null || value === "") && "text-[#0019f6]", + )} + > + Tất cả + + {(value === null || value === "") && ( + + + + )} +
+ )} + + {filteredOptions.map((item) => { + const isActive = item.uuid === value; + + return ( +
{ + onChange(item.uuid as T); + setOpen(false); + }} + className={clsx( + "mt-1 flex cursor-pointer items-center justify-between", + "border-b border-[#e2e0ec]", + "px-3 py-2 text-sm", + "hover:text-[#0019f6]", + "last:border-none", + isActive && "text-[#0019f6]", + )} + > + {item.name} + + {isActive && ( + + + + )} +
+ ); + })} + + {filteredOptions.length === 0 && ( +
+ Không tìm thấy dữ liệu +
+ )} +
+
+
+ )} +
+ ); +} + +export default FilterCustom; diff --git a/src/components/customs/FilterMany.tsx b/src/components/customs/FilterMany.tsx new file mode 100644 index 0000000..18642e8 --- /dev/null +++ b/src/components/customs/FilterMany.tsx @@ -0,0 +1,248 @@ +"use client"; + +import React, { + Dispatch, + SetStateAction, + useEffect, + useRef, + useState, +} from "react"; +import clsx from "clsx"; +import { removeVietnameseTones } from "@/common/funcs/optionConvert"; +import CustomButton from "./custom-button"; + +interface OptionItem { + uuid: T; + name: string; + code?: string; +} + +interface PropsFilterMany { + styleRounded?: boolean; + small?: boolean; + name: string; + listOption: OptionItem[]; + value: T[]; + setValue: Dispatch>; +} + +function FilterMany({ + styleRounded = false, + small = false, + name, + listOption, + value, + setValue, +}: PropsFilterMany) { + const inputRef = useRef(null); + + const [open, setOpen] = useState(false); + const [keyword, setKeyword] = useState(""); + const [tempSelected, setTempSelected] = useState([]); + + const wrapperRef = useRef(null); + + // sync khi mở dropdown + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + wrapperRef.current && + !wrapperRef.current.contains(event.target as Node) + ) { + setOpen(false); + } + }; + + document.addEventListener("mousedown", handleClickOutside); + + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, []); + + const handleOpen = () => { + setOpen((prev) => !prev); + }; + + useEffect(() => { + if (open) { + requestAnimationFrame(() => { + inputRef.current?.focus(); + }); + } + }, [open]); + + const isAllSelected = + tempSelected.length === 0 || tempSelected.length === listOption.length; + + const filteredList = listOption.filter((item) => + removeVietnameseTones(item.name).includes( + removeVietnameseTones(keyword || ""), + ), + ); + + return ( +
+ {/* TRIGGER */} +
+
+

{name}:

+ +

+ {value.length === 0 || value.length === listOption.length + ? "Tất cả" + : `${value.length} ${name.toLowerCase()}`} +

+
+ + + + +
+ + {/* DROPDOWN */} + {open && ( +
+ {/* SEARCH */} + setKeyword(e.target.value)} + placeholder="Tìm kiếm..." + className=" + w-full px-3 py-2 text-sm + border border-gray-200 rounded-lg outline-none + focus:border-blue-500 + " + /> + + {/* LIST */} +
+ {/* ALL */} +
setTempSelected([])} + className={clsx( + "flex items-center justify-between px-3 py-2 cursor-pointer rounded-lg hover:bg-gray-100", + isAllSelected && "bg-blue-50", + )} + > +

Tất cả

+ + {isAllSelected && ( + + + + )} +
+ + {/* OPTIONS */} + {filteredList.map((item) => { + const active = tempSelected.includes(item.uuid); + + return ( +
{ + setTempSelected((prev) => + prev.includes(item.uuid) + ? prev.filter((x) => x !== item.uuid) + : [...prev, item.uuid], + ); + }} + className={clsx( + "flex items-center justify-between px-3 py-2 cursor-pointer rounded-lg hover:bg-gray-100", + active && "bg-blue-50", + )} + > +

{item.name}

+ + {active && ( + + + + )} +
+ ); + })} +
+ + {/* ACTION */} +
+ setOpen(false)} + > + Hủy bỏ + + + { + setValue(tempSelected); + setOpen(false); + }} + > + Xác nhận + +
+
+ )} +
+ ); +} + +export default FilterMany; diff --git a/src/components/customs/StateActive.tsx b/src/components/customs/StateActive.tsx new file mode 100644 index 0000000..a83004a --- /dev/null +++ b/src/components/customs/StateActive.tsx @@ -0,0 +1,62 @@ +"use client"; + +import React, { useMemo } from "react"; + +interface StateItem { + state: number | string; + text: string; + backgroundColor?: string; + textColor?: string; +} + +interface PropsStateActive { + isBox?: boolean; + stateActive: number | string | undefined; + listState: StateItem[]; +} + +function StateActive({ + isBox = true, + stateActive, + listState, +}: PropsStateActive) { + // memo trạng thái hiện tại + const current = useMemo(() => { + return listState.find((item) => item.state === stateActive); + }, [stateActive, listState]); + + if (isBox) { + return ( +
+ {current?.text ?? "---"} +
+ ); + } + + return ( +
+ {/* DOT */} +
+ + {/* TEXT */} +

+ {current?.text ?? "---"} +

+
+ ); +} + +export default StateActive; diff --git a/src/components/customs/custom-button.tsx b/src/components/customs/custom-button.tsx new file mode 100644 index 0000000..2a308d3 --- /dev/null +++ b/src/components/customs/custom-button.tsx @@ -0,0 +1,149 @@ +"use client"; +import clsx from "clsx"; +import Link from "next/link"; + +export interface PropsButton { + children?: React.ReactNode; + icon?: React.ReactNode; + href?: string; + target?: string; + onClick?: ( + e: React.MouseEvent, + ) => void; + className?: string; + disabled?: boolean; + type?: "button" | "submit" | "reset"; + variant?: + | "default" + | "midnightBlue" + | "green" + | "red" + | "grey" + | "white" + | "black" + | "warning"; + + size?: "sm" | "md" | "lg"; + + rounded?: "sm" | "md" | "lg" | "xl" | "full"; + + fullWidth?: boolean; + maxContent?: boolean; + maxHeight?: boolean; +} + +export default function CustomButton({ + children, + icon, + href, + target, + onClick, + className, + + disabled = false, + + type = "button", + + variant = "default", + size = "md", + rounded = "md", + + fullWidth = true, + maxContent = false, + maxHeight = false, +}: PropsButton) { + const variantClasses = { + default: "bg-gray-100 text-gray-700 border border-gray-200 cursor-pointer", + midnightBlue: + "bg-blue-900 text-white border border-blue-900 cursor-pointer", + green: "bg-green-500 text-white border border-green-500 cursor-pointer", + red: "bg-red-500 text-white border border-red-500 cursor-pointer", + grey: "bg-white text-gray-700 border border-gray-200 cursor-pointer", + white: + "bg-white text-gray-700 border border-gray-200 shadow-sm cursor-pointer", + black: "bg-gray-800 text-white border border-gray-800 cursor-pointer", + warning: "bg-orange-400 text-white border border-orange-400 cursor-pointer", + }; + + const sizeClasses = { + sm: "px-6 py-2 text-[13px]", + md: "px-6 py-3 text-sm", + lg: "px-8 py-3 text-base", + }; + + const roundedClasses = { + sm: "rounded-sm", + md: "rounded-md", + lg: "rounded-lg", + xl: "rounded-xl", + full: "rounded-full", + }; + + const baseClass = clsx( + "inline-flex items-center justify-center gap-2", + "font-medium whitespace-nowrap", + "select-none", + "transition-all duration-200", + "hover:opacity-80", + "active:scale-95", + + variantClasses[variant], + sizeClasses[size], + roundedClasses[rounded], + + fullWidth && "w-full", + maxContent && "w-max", + maxHeight && "h-full", + + disabled && + "opacity-30 cursor-not-allowed pointer-events-none active:scale-100", + + className, + ); + const content = ( + <> + {icon && ( + + {icon} + + )} + + {children} + + ); + const handleClick = ( + e: React.MouseEvent, + ) => { + if (disabled) { + e.preventDefault(); + return; + } + + onClick?.(e); + }; + + if (href) { + return ( + + {content} + + ); + } + + return ( + + ); +} diff --git a/src/components/customs/custom-dialog.tsx b/src/components/customs/custom-dialog.tsx new file mode 100644 index 0000000..8cf126d --- /dev/null +++ b/src/components/customs/custom-dialog.tsx @@ -0,0 +1,68 @@ +"use client"; + +import React, { ReactNode } from "react"; +import IconRound, { IconRoundType } from "../utils/IconRound"; +import CustomPopup from "./custom-popup"; +import CustomButton from "./custom-button"; + +export interface PropsDialog { + open: boolean; + title: ReactNode; + note?: ReactNode; + onClose: () => void; + onSubmit: () => void; + titleCancel?: string; + titleSubmit?: string; + type?: IconRoundType; +} + +const CustomDialog = ({ + open, + title, + note, + titleCancel = "Hủy bỏ", + titleSubmit = "Xác nhận", + onClose, + onSubmit, + type = "success", +}: PropsDialog) => { + return ( + +
+ {/* ICON */} + + + {/* TITLE */} +

{title}

+ + {/* NOTE */} + {note &&

{note}

} + + {/* ACTIONS */} +
+ + {titleCancel} + + + + {titleSubmit} + +
+
+
+ ); +}; + +export default CustomDialog; diff --git a/src/components/customs/custom-icon.tsx b/src/components/customs/custom-icon.tsx new file mode 100644 index 0000000..14c8a09 --- /dev/null +++ b/src/components/customs/custom-icon.tsx @@ -0,0 +1,83 @@ +"use client"; + +import React from "react"; +import Link from "next/link"; +import clsx from "clsx"; +import * as Tooltip from "@radix-ui/react-tooltip"; + +export interface PropsCustomIcon { + icon: React.ReactNode; + tooltip: string; + onClick?: () => void; + color?: string; + href?: string; + type?: "edit" | "delete" | "view" | "create"; + disnable?: boolean; +} + +export default function CustomIcon({ + icon, + tooltip, + onClick, + color, + href, + type, + disnable = false, +}: PropsCustomIcon) { + const className = clsx( + "flex h-8 w-8 items-center justify-center rounded-md transition-all duration-200 select-none", + + !disnable && ["cursor-pointer", "hover:opacity-70", "active:scale-90"], + + disnable && "pointer-events-none opacity-30", + + type === "create" && "text-green-500", + type === "edit" && "text-blue-600", + type === "delete" && "text-red-500", + type === "view" && "text-orange-500", + ); + + const content = ( + + {icon} + + ); + + return ( + + + + {href ? {content} : content} + + + + + {tooltip} + + + + + + + ); +} diff --git a/src/components/customs/custom-loading.tsx b/src/components/customs/custom-loading.tsx new file mode 100644 index 0000000..95dfe0f --- /dev/null +++ b/src/components/customs/custom-loading.tsx @@ -0,0 +1,54 @@ +"use client"; +import React from "react"; +import CustomPortal from "./custom-portal"; + +interface PropsLoading { + loading?: boolean; +} + +const SCALE = 2.5; + +function CustomLoading({ loading }: PropsLoading) { + if (!loading) return null; + return ( + +
+
+ {Array.from({ length: 12 }).map((_, i) => { + const rotate = i * 30; + return ( +
+
+
+ ); + })} +
+
+ + ); +} + +export default CustomLoading; diff --git a/src/components/customs/custom-pagination.tsx b/src/components/customs/custom-pagination.tsx new file mode 100644 index 0000000..476517b --- /dev/null +++ b/src/components/customs/custom-pagination.tsx @@ -0,0 +1,206 @@ +"use client"; + +import React, { useEffect, useMemo, useRef, useState, forwardRef } from "react"; +import clsx from "clsx"; +// import { ChevronDown, ArrowLeft, ArrowRight } from "lucide-react"; +import { ArrowDown2, ArrowLeft2, ArrowRight2 } from "iconsax-react"; + +export interface PropsPagination { + total: number; + page: number; + onSetPage: (page: number) => void; + pageSize: number; + onSetPageSize: (pageSize: number) => void; + dependencies?: any[]; +} + +// Wrapper component to forward ref for the dropdown trigger +const TriggerButton = forwardRef< + HTMLDivElement, + { + onClick: () => void; + className: string; + pageSize: number; + openLimit: boolean; + } +>(({ onClick, className, pageSize, openLimit }, ref) => ( +
+ {pageSize} + + {/* */} +
+)); + +TriggerButton.displayName = "TriggerButton"; + +export default function Pagination({ + total, + page, + pageSize, + onSetPage, + onSetPageSize, + dependencies = [], +}: PropsPagination) { + const pageSizes = [50, 100, 200]; + + const [openLimit, setOpenLimit] = useState(false); + const dropdownRef = useRef(null); + + const maxPage = Math.ceil(total / Number(pageSize)); + + const items = useMemo(() => { + const nodes: React.ReactNode[] = []; + + for (let i = 1; i <= maxPage; i++) { + const isCurrent = page === i; + const isNear = + i === page || + i === page - 1 || + i === page + 1 || + i === 1 || + i === maxPage; + + if (isNear) { + nodes.push( +
  • onSetPage(i)} + className={clsx( + "h-[30px] w-[30px] flex items-center justify-center text-[13px] font-semibold border rounded cursor-pointer transition", + isCurrent + ? "bg-[#0011ab] text-white border-[#0011ab] pointer-events-none" + : "bg-white text-black border-[#efefef] hover:opacity-70", + )} + > + {i} +
  • , + ); + } + + if ((i === page - 2 && page >= 4) || (i === page + 2 && i < maxPage)) { + nodes.push( +
  • + ... +
  • , + ); + } + } + + return nodes; + }, [maxPage, page, onSetPage]); + + const handlePrev = () => { + if (page > 1) onSetPage(page - 1); + }; + + const handleNext = () => { + if (page < maxPage) onSetPage(page + 1); + }; + + useEffect(() => { + if (dependencies.length > 0) { + onSetPage(1); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, dependencies); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + openLimit && + dropdownRef.current && + !dropdownRef.current.contains(event.target as Node) + ) { + setOpenLimit(false); + } + }; + + document.addEventListener("mousedown", handleClickOutside); + return () => document.removeEventListener("mousedown", handleClickOutside); + }, [openLimit]); + + if (total <= 0) return null; + + return ( +
    + {/* LEFT */} +
    +

    Hiển thị

    + +
    + setOpenLimit(!openLimit)} + className={clsx( + "w-[80px] flex items-center justify-between px-3 py-1 border rounded-full cursor-pointer bg-white", + "border-gray-300", + )} + pageSize={pageSize} + openLimit={openLimit} + /> + + {openLimit && ( +
    + {pageSizes.map((v) => ( +
    { + onSetPageSize(v); + setOpenLimit(false); + }} + className={clsx( + "px-2 py-1 text-[13px] cursor-pointer rounded", + "hover:bg-[#0011ab] hover:text-white", + pageSize === v && "bg-[#0011ab] text-white", + )} + > + {v} +
    + ))} +
    + )} +
    + +

    + trong tổng {total} kết quả +

    +
    + + {/* PAGINATION */} +
    + {page > 1 && ( + + )} + +
      {items}
    + + {page < maxPage && ( + + )} +
    +
    + ); +} diff --git a/src/components/customs/custom-popup.tsx b/src/components/customs/custom-popup.tsx new file mode 100644 index 0000000..b6c8b09 --- /dev/null +++ b/src/components/customs/custom-popup.tsx @@ -0,0 +1,89 @@ +"use client"; + +import React, { ReactNode, useEffect } from "react"; +import { createPortal } from "react-dom"; +import clsx from "clsx"; + +/* ================== TYPES ================== */ +interface Props { + open: boolean; + isFull?: boolean; + onClose: () => void; + children?: ReactNode; + showOverlay?: boolean; +} + +/* ================== COMPONENT ================== */ +export default function CustomPopup({ + open, + onClose, + showOverlay = true, + isFull, + children, +}: Props) { + // lock body scroll + useEffect(() => { + if (!open) return; + + const original = document.body.style.overflow; + + document.body.style.overflow = "hidden"; + + return () => { + document.body.style.overflow = original || "auto"; + }; + }, [open]); + + // SSR safe + if (typeof window === "undefined") return null; + + // popup closed + if (!open) return null; + + return createPortal( + <> + {/* OVERLAY */} + {showOverlay && ( +
    + )} + + {/* CONTENT */} +
    + {children} +
    + , + document.body, + ); +} diff --git a/src/components/customs/custom-portal.tsx b/src/components/customs/custom-portal.tsx new file mode 100644 index 0000000..4aa39c7 --- /dev/null +++ b/src/components/customs/custom-portal.tsx @@ -0,0 +1,51 @@ +"use client"; +import React, { ReactNode, useEffect, useMemo, useState } from "react"; +import { createPortal } from "react-dom"; + +interface Props { + children: ReactNode; + className?: string; + containerId?: string; +} + +function CustomPortal({ children, className, containerId }: Props) { + const [mounted, setMounted] = useState(false); + + const element = useMemo(() => { + if (typeof window === "undefined") return null; + + const el = document.createElement("div"); + + if (className) { + el.className = className; + } + + return el; + }, [className]); + + useEffect(() => { + setMounted(true); + }, []); + + useEffect(() => { + if (!mounted || !element) return; + + const parent = containerId + ? document.getElementById(containerId) + : document.body; + + if (!parent) return; + + parent.appendChild(element); + + return () => { + parent.removeChild(element); + }; + }, [mounted, element, containerId]); + + if (!mounted || !element) return null; + + return createPortal(children, element); +} + +export default CustomPortal; diff --git a/src/components/customs/custom-search.tsx b/src/components/customs/custom-search.tsx new file mode 100644 index 0000000..273cbfc --- /dev/null +++ b/src/components/customs/custom-search.tsx @@ -0,0 +1,69 @@ +"use client"; + +import React, { useEffect, useRef, useState } from "react"; +import clsx from "clsx"; + +interface PropsSearch { + placeholder?: string; + keyword?: string; + setKeyword: (value: string) => void; +} + +export default function Search({ + keyword = "", + setKeyword, + placeholder = "Nhập từ khóa tìm kiếm", +}: PropsSearch) { + const inputRef = useRef(null); + const [searchTerm, setSearchTerm] = useState(keyword); + + useEffect(() => { + const timer = setTimeout(() => { + setKeyword(searchTerm.trim()); + }, 600); + + return () => clearTimeout(timer); + }, [searchTerm]); + + return ( +
    inputRef.current?.focus()} + className={clsx( + "flex h-12 cursor-text items-center gap-2 rounded-full border bg-white px-4 transition-colors", + "border-[#e1e5ed] hover:border-[#3772ff] focus-within:border-[#3772ff]", + )} + > + + + + + setSearchTerm(e.target.value)} + placeholder={placeholder} + className={clsx( + "flex-1", + "border-none", + "bg-transparent", + "p-2", + "text-[16px]", + "font-medium", + "outline-none", + "placeholder:text-[#777e90]", + )} + /> +
    + ); +} diff --git a/src/components/customs/custom-table.tsx b/src/components/customs/custom-table.tsx new file mode 100644 index 0000000..4f7911c --- /dev/null +++ b/src/components/customs/custom-table.tsx @@ -0,0 +1,305 @@ +"use client"; +import clsx from "clsx"; +import React, { + Fragment, + Key, + ReactNode, + useMemo, + useRef, + useState, +} from "react"; + +interface ColumnType { + title: string | ReactNode; + render: (row: T, index: number, path?: number[]) => ReactNode; + className?: string; + checkBox?: boolean; + fixedLeft?: boolean; + fixedRight?: boolean; + maxWidth?: number | string; + sortTable?: string; +} + +interface PropsTable { + data: T[]; + column: ColumnType[]; + fixedHeader?: boolean; + activeHeader?: boolean; + handleCheckedAll?: (e: React.ChangeEvent) => void; + isCheckedAll?: boolean; + handleCheckedRow?: (e: React.ChangeEvent, row: T) => void; + handleIsCheckedRow?: (row: T) => boolean; + rowKey: (row: T) => React.Key; + getChildren?: (row: T) => T[] | undefined; + useIndexPathAsKey?: boolean; +} + +function CustomTable({ + data, + column, + fixedHeader, + activeHeader, + handleCheckedAll, + isCheckedAll, + handleCheckedRow, + handleIsCheckedRow, + rowKey, + getChildren, + useIndexPathAsKey, +}: PropsTable) { + const tableRef = useRef(null); + const thRefs = useRef<(HTMLTableCellElement | null)[]>([]); + + const [expandedRows, setExpandedRows] = useState([]); + const [sortConfig, setSortConfig] = useState<{ + key: string; + direction: "asc" | "desc" | null; + }>({ key: "", direction: null }); + + /* ================= SORT ================= */ + const handleSort = (key: string) => { + setSortConfig((prev) => { + if (prev.key === key) { + const next = + prev.direction === "asc" + ? "desc" + : prev.direction === "desc" + ? null + : "asc"; + return { key, direction: next }; + } + return { key, direction: "asc" }; + }); + }; + + const sortedData = useMemo(() => { + if (!sortConfig.key || !sortConfig.direction) return data; + + const copy = [...data]; + + copy.sort((a: any, b: any) => { + const aVal = a?.[sortConfig.key]; + const bVal = b?.[sortConfig.key]; + + if (typeof aVal === "number" && typeof bVal === "number") { + return sortConfig.direction === "asc" ? aVal - bVal : bVal - aVal; + } + + if (typeof aVal === "string" && typeof bVal === "string") { + return sortConfig.direction === "asc" + ? aVal.localeCompare(bVal) + : bVal.localeCompare(aVal); + } + + return 0; + }); + + return copy; + }, [data, sortConfig]); + + /* ================= EXPAND ================= */ + const toggleExpand = (key: React.Key) => { + setExpandedRows((prev) => + prev.includes(key) ? prev.filter((k) => k !== key) : [...prev, key], + ); + }; + + /* ================= ROWS ================= */ + const renderRows = (rows: T[], path: number[] = []): React.ReactNode => + rows.map((row, i) => { + const currentPath = [...path, i]; + const keyPath = useIndexPathAsKey ? currentPath.join(".") : rowKey(row); + + const children = getChildren?.(row); + const expanded = expandedRows.includes(keyPath); + + return ( + + + {getChildren && ( + + {!!children?.length && ( + + )} + + )} + + {column.map((col, idx) => ( + +
    + {col.checkBox && ( + handleCheckedRow?.(e, row)} + checked={handleIsCheckedRow?.(row) ?? false} + /> + )} + {col.render(row, i, currentPath)} +
    + + ))} + + + {expanded && children && renderRows(children, currentPath)} +
    + ); + }); + + return ( +
    table>thead]:sticky [&>table>thead]:top-0", + activeHeader && "[&>table>thead]:bg-[#F4F7FA]", + )} + > + + + + {getChildren && + ); + })} + + + + {renderRows(sortedData)} +
    } + + {column.map((col, i) => { + const isActive = col.sortTable === sortConfig.key; + + return ( + { + thRefs.current[i] = el; + }} + onClick={() => col.sortTable && handleSort(col.sortTable)} + className={clsx( + "px-4 py-3 text-left text-[15px] font-semibold whitespace-nowrap", + col.sortTable && "cursor-pointer", + isActive && "text-blue-600", + col.fixedLeft && "sticky left-0 bg-white z-10", + col.fixedRight && "sticky right-0 bg-white z-10", + )} + > +
    + {col.checkBox && ( + + )} + + {col.title} + + {col.sortTable && + (isActive ? ( + sortConfig.direction === "asc" ? ( + + + + ) : sortConfig.direction === "desc" ? ( + + + + ) : ( + + + + ) + ) : ( + + + + ))} +
    +
    +
    + ); +} + +export default CustomTable; diff --git a/src/components/customs/custom-tabs.tsx b/src/components/customs/custom-tabs.tsx new file mode 100644 index 0000000..419116e --- /dev/null +++ b/src/components/customs/custom-tabs.tsx @@ -0,0 +1,61 @@ +"use client"; +import clsx from "clsx"; +import { useRouter, useSearchParams } from "next/navigation"; +import React from "react"; +interface PropsTabNavLink { + query: string; + listHref: { + title: string; + pathname: string; + query: string | null; + }[]; +} +function CustomTabs({ query, listHref }: PropsTabNavLink) { + const router = useRouter(); + const searchParams = useSearchParams(); + + const currentValue = searchParams.get(query); + + const handleActive = (value: string | null) => { + const params = new URLSearchParams(searchParams.toString()); + + if (value === null) { + params.delete(query); + } else { + params.set(query, value); + } + router.replace(`?${params.toString()}`, { scroll: false }); + }; + + return ( +
    + {listHref.map((item, i) => { + const isActive = + currentValue === item.query || + (!currentValue && item.query === null && i === 0); + + return ( + + ); + })} +
    + ); +} + +export default CustomTabs; diff --git a/src/components/customs/custom-toast.tsx b/src/components/customs/custom-toast.tsx new file mode 100644 index 0000000..fb6cd4b --- /dev/null +++ b/src/components/customs/custom-toast.tsx @@ -0,0 +1,46 @@ +"use client"; + +import clsx from "clsx"; +import { CloseCircle, InfoCircle, TickCircle } from "iconsax-react"; + +export type ToastType = "success" | "info" | "warn" | "error"; + +interface Props { + type?: ToastType; +} + +const ICON_CONFIG = { + success: { + bg: "bg-[#06D7A0]", + icon: TickCircle, + }, + info: { + bg: "bg-[#4BC9F0]", + icon: TickCircle, + }, + warn: { + bg: "bg-[#FFD167]", + icon: InfoCircle, + }, + error: { + bg: "bg-[#EE464C]", + icon: CloseCircle, + }, +} as const; + +export default function IconToastifyCustom({ type = "info" }: Props) { + const config = ICON_CONFIG[type]; + + const Icon = config.icon; + + return ( +
    + +
    + ); +} diff --git a/src/components/customs/input-single.tsx b/src/components/customs/input-single.tsx new file mode 100644 index 0000000..03da343 --- /dev/null +++ b/src/components/customs/input-single.tsx @@ -0,0 +1,105 @@ +"use client"; +import clsx from "clsx"; +import React, { ReactNode, useMemo, useRef } from "react"; + +interface Props { + length?: number; + onSetValue?: (value: any) => void; + name?: string; + className?: string; +} + +function InputSingle({ + className, + length = 6, + onSetValue, + name = "otp_code", +}: Props) { + const inputsRef = useRef([]); + // update value + const updateOTPValue = () => { + const code = inputsRef.current.map((input) => input?.value || ""); + + onSetValue?.((prev: any) => ({ + ...prev, + [name]: code.join(""), + })); + }; + + // input change + const handleChange = (e: React.FormEvent) => { + const target = e.currentTarget; + + const index = Number(target.dataset.index); + + let value = target.value; + + if (value.length > 1) { + value = value.slice(0, 1); + + target.value = value; + } + + updateOTPValue(); + + if (value) { + inputsRef.current[index + 1]?.focus(); + } + }; + + // backspace + const handleKeyDown = (e: React.KeyboardEvent) => { + const index = Number(e.currentTarget.dataset.index); + + if (e.key === "Backspace") { + if (!e.currentTarget.value) { + inputsRef.current[index - 1]?.focus(); + } + + requestAnimationFrame(() => { + updateOTPValue(); + }); + } + }; + + // set refs + const setRef = (el: HTMLInputElement | null, index: number) => { + if (el) { + inputsRef.current[index] = el; + } + }; + + const renderInputs = useMemo(() => { + const list: ReactNode[] = []; + + for (let i = 0; i < length; i++) { + list.push( + setRef(el, i)} + data-index={i} + inputMode="numeric" + maxLength={1} + onInput={handleChange} + onKeyDown={handleKeyDown} + className={clsx( + "h-[72px] w-[56px]", + "rounded-xl border-2 border-[#dae1ea]", + "text-center text-[42px] font-medium", + "outline-none transition", + "focus:border-[#066bb1]", + )} + />, + ); + } + + return list; + }, [length]); + return ( +
    + {renderInputs} +
    + ); +} + +export default InputSingle; diff --git a/src/components/customs/slider-props.tsx b/src/components/customs/slider-props.tsx new file mode 100644 index 0000000..4acc218 --- /dev/null +++ b/src/components/customs/slider-props.tsx @@ -0,0 +1,122 @@ +"use client"; + +import React from "react"; +import clsx from "clsx"; + +interface CustomSliderProps { + label?: string; + value: number; + min?: number; + max?: number; + step?: number; + + onChange?: (value: number) => void; + + showValue?: boolean; + disabled?: boolean; + + className?: string; + labelClassName?: string; + sliderClassName?: string; + thumbClassName?: string; + trackClassName?: string; + + color?: string; + trackColor?: string; + + renderValue?: (value: number) => React.ReactNode; +} + +const CustomSlider = ({ + label, + value, + min = 0, + max = 1, + step = 0.01, + + onChange, + + showValue = true, + disabled = false, + + className, + labelClassName, + sliderClassName, + + color = "#2563eb", + trackColor = "#e5e7eb", + + renderValue, +}: CustomSliderProps) => { + const percentage = ((value - min) / (max - min)) * 100; + + return ( +
    + {/* Header */} + {(label || showValue) && ( +
    + {label && ( + {label} + )} + + {showValue && ( + + {renderValue ? renderValue(value) : value} + + )} +
    + )} + + {/* Slider */} + onChange?.(Number(e.target.value))} + className={clsx( + ` + w-full + appearance-none + bg-transparent + cursor-pointer + + disabled:opacity-50 + disabled:cursor-not-allowed + + [&::-webkit-slider-runnable-track]:h-2 + [&::-webkit-slider-runnable-track]:rounded-full + + [&::-webkit-slider-thumb]:appearance-none + [&::-webkit-slider-thumb]:h-6 + [&::-webkit-slider-thumb]:w-6 + [&::-webkit-slider-thumb]:rounded-full + [&::-webkit-slider-thumb]:bg-white + [&::-webkit-slider-thumb]:border-4 + [&::-webkit-slider-thumb]:shadow-md + [&::-webkit-slider-thumb]:-mt-2 + + [&::-moz-range-track]:h-2 + [&::-moz-range-track]:rounded-full + + [&::-moz-range-thumb]:h-6 + [&::-moz-range-thumb]:w-6 + [&::-moz-range-thumb]:rounded-full + [&::-moz-range-thumb]:bg-white + [&::-moz-range-thumb]:border-4 + `, + sliderClassName, + )} + style={{ + background: `linear-gradient(to right, ${color} ${percentage}%, ${trackColor} ${percentage}%)`, + }} + /> +
    + ); +}; + +export default CustomSlider; diff --git a/src/components/layouts/BaseLayout/BaseLayout.tsx b/src/components/layouts/BaseLayout/BaseLayout.tsx new file mode 100644 index 0000000..30d9b9a --- /dev/null +++ b/src/components/layouts/BaseLayout/BaseLayout.tsx @@ -0,0 +1,84 @@ +"use client"; +import React from "react"; +import { PropsBaseLayout, TContextBaseLayout } from "./interface"; +import clsx from "clsx"; +import Navbar from "./compoents/Navbar"; +import Header from "./compoents/Header"; + +export const ContextBaseLayout = React.createContext({}); + +const BaseLayout = ({ children, title, breadcrumb }: PropsBaseLayout) => { + const [showFull, setShowFull] = React.useState(true); + const [openMenuMobile, setOpenMenuMobile] = React.useState(false); + + return ( + // + +
    + {/* OVERLAY cho Mobile */} +
    setOpenMenuMobile(false)} + /> + + {/* SIDEBAR (Dùng chung cho cả Desktop & Mobile) */} + + + {/* HEADER */} +
    +
    +
    + + {/* MAIN CONTENT */} +
    + {children} +
    +
    + + ); +}; + +export default BaseLayout; diff --git a/src/components/layouts/BaseLayout/compoents/Header/Header.tsx b/src/components/layouts/BaseLayout/compoents/Header/Header.tsx new file mode 100644 index 0000000..f669aef --- /dev/null +++ b/src/components/layouts/BaseLayout/compoents/Header/Header.tsx @@ -0,0 +1,156 @@ +"use client"; +import React, { useContext, useEffect } from "react"; +import { PropsHeader } from "./interface"; +import { usePathname } from "next/navigation"; +import { useSelector } from "react-redux"; +import { RootState } from "@/redux/store"; +import { ContextBaseLayout } from "../../BaseLayout"; +import Image from "next/image"; +import icons from "@/constant/images/icons"; +import clsx from "clsx"; +import MenuProfile from "../MenuProfile"; + +function Header({ title, breadcrumb }: PropsHeader) { + const pathname = usePathname(); + const { infoUser } = useSelector((state: RootState) => state.user); + const context = useContext(ContextBaseLayout); + + const [openProfile, setOpenProfile] = React.useState(false); + // Đóng menu mobile khi đổi route + useEffect(() => { + if (window.innerWidth < 1280) { + context.setOpenMenuMobile?.(false); + } + }, [pathname]); + + const toggleFullScreen = () => { + if (!document.fullscreenElement) { + document.documentElement.requestFullscreen(); + } else { + document.exitFullscreen(); + } + }; + + /* ========================================================= + CALL API GET LIST PROFILE & KHỚP NỐI THEO CHUẨN DATA MỚI + ========================================================= */ + // const profileQuery = useQuery({ + // queryKey: [QUERY_KEY.table_list_profile], + // queryFn: async () => { + // const res = await httpRequest({ + // showMessageFailed: true, + // http: profileServices.getProfile(), // Đảm bảo endpoint trỏ về /api/v1/UserProfile/list + // }); + + // // Trả về đúng object chứa items theo cấu trúc của API + // return ( + // res || { + // items: [], + // page: 1, + // pageSize: 10, + // total: 0, + // totalPages: 0, + // } + // ); + // }, + // }); + + // Tìm kiếm thông tin profile của user hiện tại đang đăng nhập bằng useMemo + // eslint-disable-next-line react-hooks/preserve-manual-memoization + // const currentUserProfile = useMemo(() => { + // const listItems = profileQuery.data?.items || []; + // if (!infoUser?.userId) return null; + + // // So khớp accountId của API trả về với userId trong Redux (infoUser) + // return ( + // listItems.find((item: any) => item.accountId === infoUser.userId) || null + // ); + // }, [profileQuery.data, infoUser?.userId]); + + return ( +
    +
    + {/* Nút bấm Mobile: Mở menu mobile */} +
    context?.setOpenMenuMobile?.(!context?.openMenuMobile)} + > + menu +
    + {/* Nút bấm Desktop: Thu gọn/Mở rộng sidebar */} +
    context?.setShowFull?.(!context?.showFull)} + > + menu +
    + {breadcrumb ? ( + breadcrumb + ) : ( +

    {title}

    + )} +
    + +
    +
    + +
    + + {/* PROFILE CONTROL AREA */} +
    setOpenProfile(!openProfile)} + > +
    + avatar +
    +

    + { + // currentUserProfile?.fullName || + "User admin" + } +

    + + + + {/* ChevronDown */} + + {/* {openProfile && ( +
    + setOpenProfile(false)} /> +
    + )} */} +
    +
    +
    + ); +} + +export default Header; diff --git a/src/components/layouts/BaseLayout/compoents/Header/index.ts b/src/components/layouts/BaseLayout/compoents/Header/index.ts new file mode 100644 index 0000000..2764567 --- /dev/null +++ b/src/components/layouts/BaseLayout/compoents/Header/index.ts @@ -0,0 +1 @@ +export { default } from "./Header"; diff --git a/src/components/layouts/BaseLayout/compoents/Header/interface/index.ts b/src/components/layouts/BaseLayout/compoents/Header/interface/index.ts new file mode 100644 index 0000000..bd52b48 --- /dev/null +++ b/src/components/layouts/BaseLayout/compoents/Header/interface/index.ts @@ -0,0 +1,4 @@ +export interface PropsHeader { + title: string; + breadcrumb?: React.ReactNode; +} diff --git a/src/components/layouts/BaseLayout/compoents/MenuProfile/MenuProfile.tsx b/src/components/layouts/BaseLayout/compoents/MenuProfile/MenuProfile.tsx new file mode 100644 index 0000000..f3393b9 --- /dev/null +++ b/src/components/layouts/BaseLayout/compoents/MenuProfile/MenuProfile.tsx @@ -0,0 +1,89 @@ +"use client"; +import React, { useCallback } from "react"; +import { PropsMenuProfile } from "./interface"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import Link from "next/link"; +import clsx from "clsx"; +import { PATH } from "@/constant/config"; + +function MenuProfile({ onClose }: PropsMenuProfile) { + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + + /* ================== CHECK ACTIVE ================== */ + const checkActive = useCallback( + (path: string) => { + return pathname === path; + }, + [pathname], + ); + + const handleLogout = () => { + // logoutMutation.mutate(); + }; + + return ( +
    + {/* PROFILE */} + + + + + {/* */} +
    +

    Thông tin cá nhân

    +

    Chi tiết tài khoản

    +
    + +
    + {/* LOGOUT */} +
    { + handleLogout(); + }} + className="flex items-center gap-3 p-3 rounded-lg hover:bg-red-50 cursor-pointer transition" + > + + + + {/* */} +
    +

    Đăng xuất

    +

    Đăng xuất khỏi hệ thống

    +
    +
    +
    + ); +} + +export default MenuProfile; diff --git a/src/components/layouts/BaseLayout/compoents/MenuProfile/index.ts b/src/components/layouts/BaseLayout/compoents/MenuProfile/index.ts new file mode 100644 index 0000000..12ae6c8 --- /dev/null +++ b/src/components/layouts/BaseLayout/compoents/MenuProfile/index.ts @@ -0,0 +1 @@ +export { default } from "./MenuProfile"; diff --git a/src/components/layouts/BaseLayout/compoents/MenuProfile/interface/index.ts b/src/components/layouts/BaseLayout/compoents/MenuProfile/interface/index.ts new file mode 100644 index 0000000..88f466b --- /dev/null +++ b/src/components/layouts/BaseLayout/compoents/MenuProfile/interface/index.ts @@ -0,0 +1,3 @@ +export interface PropsMenuProfile { + onClose: () => void; +} diff --git a/src/components/layouts/BaseLayout/compoents/Navbar/Navbar.tsx b/src/components/layouts/BaseLayout/compoents/Navbar/Navbar.tsx new file mode 100644 index 0000000..81db3d6 --- /dev/null +++ b/src/components/layouts/BaseLayout/compoents/Navbar/Navbar.tsx @@ -0,0 +1,72 @@ +"use client"; + +import React, { useCallback } from "react"; +import { usePathname } from "next/navigation"; +import Link from "next/link"; +import { Menus, PATH } from "@/constant/config"; +import clsx from "clsx"; +import Image from "next/image"; +import icons from "@/constant/images/icons"; +// import { Hospital } from "lucide-react"; + +const Navbar = () => { + const pathname = usePathname(); + + const checkActive = useCallback( + (pathActive: string) => { + // Handle root path "/" as dashboard + if (pathname === "/" && pathActive === "/continents") { + return true; + } + + const currentRoute = pathname.split("/")[1]; + return pathActive === `/${currentRoute}`; + }, + [pathname], + ); + + return ( +
    + + Logo + +
    + {Menus.map((menu, i) => ( +
    + {/* TITLE */} +
    + {menu.title} +
    + +
    + {menu.group.map((tab, y) => { + const isActive = checkActive(tab.pathActive); + + return ( + + +

    {tab.title}

    + + ); + })} +
    +
    + ))} +
    +
    + ); +}; + +export default Navbar; diff --git a/src/components/layouts/BaseLayout/compoents/Navbar/index.ts b/src/components/layouts/BaseLayout/compoents/Navbar/index.ts new file mode 100644 index 0000000..8d95d66 --- /dev/null +++ b/src/components/layouts/BaseLayout/compoents/Navbar/index.ts @@ -0,0 +1 @@ +export { default } from "./Navbar"; diff --git a/src/components/layouts/BaseLayout/index.ts b/src/components/layouts/BaseLayout/index.ts new file mode 100644 index 0000000..cd391ad --- /dev/null +++ b/src/components/layouts/BaseLayout/index.ts @@ -0,0 +1 @@ +export { default } from "./BaseLayout"; diff --git a/src/components/layouts/BaseLayout/interface/index.ts b/src/components/layouts/BaseLayout/interface/index.ts new file mode 100644 index 0000000..3185206 --- /dev/null +++ b/src/components/layouts/BaseLayout/interface/index.ts @@ -0,0 +1,12 @@ +export interface PropsBaseLayout { + children: React.ReactNode; + title: string; + breadcrumb?: React.ReactNode; +} + +export interface TContextBaseLayout { + showFull?: boolean | undefined; + setShowFull?: (show: boolean) => void; + openMenuMobile?: boolean; + setOpenMenuMobile?: (show: boolean) => void; +} diff --git a/src/components/layouts/GridColumn/GridColumn.tsx b/src/components/layouts/GridColumn/GridColumn.tsx new file mode 100644 index 0000000..68d696b --- /dev/null +++ b/src/components/layouts/GridColumn/GridColumn.tsx @@ -0,0 +1,69 @@ +"use client"; + +import React from "react"; +import { GridColumnProps } from "./interface"; +import clsx from "clsx"; + +const GridColumn = ({ + children, + col = 3, + sm, + tabletCol3, + mobile2, + scroll20, + scrollMobile85, + className, +}: GridColumnProps) => { + return ( +
    + {children} +
    + ); +}; + +export default GridColumn; diff --git a/src/components/layouts/GridColumn/index.ts b/src/components/layouts/GridColumn/index.ts new file mode 100644 index 0000000..6b7d9a9 --- /dev/null +++ b/src/components/layouts/GridColumn/index.ts @@ -0,0 +1 @@ +export { default } from "./GridColumn"; diff --git a/src/components/layouts/GridColumn/interface/index.ts b/src/components/layouts/GridColumn/interface/index.ts new file mode 100644 index 0000000..9d1c8f9 --- /dev/null +++ b/src/components/layouts/GridColumn/interface/index.ts @@ -0,0 +1,14 @@ +export interface GridColumnProps { + children: React.ReactNode; + + col?: 1 | 2 | 3 | 4 | 5 | 6 | 8 | 12; + sm?: boolean; + + tabletCol3?: boolean; + mobile2?: boolean; + + scroll20?: boolean; + scrollMobile85?: boolean; + + className?: string; +} diff --git a/src/components/layouts/LayoutAuth/LayoutAuth.tsx b/src/components/layouts/LayoutAuth/LayoutAuth.tsx new file mode 100644 index 0000000..67066b0 --- /dev/null +++ b/src/components/layouts/LayoutAuth/LayoutAuth.tsx @@ -0,0 +1,40 @@ +"use client"; + +import RequiredLogout from "@/components/protected/RequiredLogout"; +import React from "react"; + +interface PropsLayoutAuth { + children: React.ReactNode; +} + +function LayoutAuth({ children }: PropsLayoutAuth) { + return ( + +
    + {/* BACKGROUND */} +
    + + {/* MAIN */} +
    + {children} +
    +
    + + ); +} + +export default LayoutAuth; diff --git a/src/components/layouts/LayoutAuth/index.ts b/src/components/layouts/LayoutAuth/index.ts new file mode 100644 index 0000000..b43ee9c --- /dev/null +++ b/src/components/layouts/LayoutAuth/index.ts @@ -0,0 +1 @@ +export { default } from "./LayoutAuth"; diff --git a/src/components/layouts/LayoutPages/LayoutPages.tsx b/src/components/layouts/LayoutPages/LayoutPages.tsx new file mode 100644 index 0000000..b263476 --- /dev/null +++ b/src/components/layouts/LayoutPages/LayoutPages.tsx @@ -0,0 +1,57 @@ +"use client"; +import React, { useCallback } from "react"; +import { PropsLayoutPages } from "./interface"; +import { usePathname } from "next/navigation"; +import Link from "next/link"; +import clsx from "clsx"; + +const LayoutPages = ({ children, listPages }: PropsLayoutPages) => { + const pathname = usePathname(); + const checkActive = useCallback( + (url: string) => { + return pathname === url; + }, + [pathname], + ); + return ( + <> +
    + {listPages.map((item, i) => { + const isActive = checkActive(item.url); + return ( + { + if (isActive) e.preventDefault(); + }} + className={clsx( + "inline-block min-w-[60px] text-center font-medium rounded-md px-6 py-3 border select-none cursor-pointer", + "text-[16px] max-[1200px]:text-[14px] max-[768px]:text-[13px]", + isActive + ? "bg-[#3772ff] text-white border-[#3772ff]" + : "bg-white text-[#202939] border-[#eaedf2]", + i !== 0 && "ml-2", + )} + > + {" "} +
    +
    +

    {item.title}

    +
    + + ); + })} +
    + {/* MAIN */} +
    {children}
    + + ); +}; + +export default LayoutPages; diff --git a/src/components/layouts/LayoutPages/index.ts b/src/components/layouts/LayoutPages/index.ts new file mode 100644 index 0000000..14b40c4 --- /dev/null +++ b/src/components/layouts/LayoutPages/index.ts @@ -0,0 +1 @@ +export { default } from "./LayoutPages"; diff --git a/src/components/layouts/LayoutPages/interface/index.ts b/src/components/layouts/LayoutPages/interface/index.ts new file mode 100644 index 0000000..c47ef62 --- /dev/null +++ b/src/components/layouts/LayoutPages/interface/index.ts @@ -0,0 +1,8 @@ +export interface PropsLayoutPages { + children: React.ReactNode; + listPages: { + title: string; + url: string; + color: string; + }[]; +} diff --git a/src/components/page/airlines/DetailAirlines/DetailAirlines.tsx b/src/components/page/airlines/DetailAirlines/DetailAirlines.tsx new file mode 100644 index 0000000..7847174 --- /dev/null +++ b/src/components/page/airlines/DetailAirlines/DetailAirlines.tsx @@ -0,0 +1,140 @@ +"use client"; + +import React from "react"; +import { useParams, useRouter } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { ArrowLeft, Edit } from "iconsax-react"; + +import { httpRequest } from "@/services"; + +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; + +import CustomButton from "@/components/customs/custom-button"; +import StateActive from "@/components/customs/StateActive"; +import airlinesServices, { AirlinesDetail } from "@/services/airlinesServices"; +import { PATH } from "@/constant/config"; + +function DetailAirlines() { + const router = useRouter(); + const params = useParams(); + + const airlinesId = params.id as string; + + const airlinesDetailQuery = useQuery({ + queryKey: [QUERY_KEY.detail_airlines, airlinesId], + enabled: !!airlinesId, + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: airlinesServices.detailAirlines(airlinesId), + }); + }, + }); + + const airlines = airlinesDetailQuery.data; + + if (!airlines) { + return ( +
    + Không tìm thấy thông tin hãng hàng không. +
    + ); + } + + return ( +
    +
    +
    +
    +

    router.back()} + > + + {airlines.name} +

    + {airlines?.status === STATUS_CONTINENTS.ACTIVE && ( + } + onClick={() => + router.push(`${PATH.Airlines}/update?id=${airlines.id}`) + } + > + Chỉnh sửa + + )} +
    + +
    +
    +

    + Mã hãng hàng không +

    +

    + {airlines.code} +

    +
    + +
    +

    + Tên hãng hàng không +

    +

    + {airlines.name} +

    +
    + +
    +

    Mã IATA

    +

    + {airlines.iataCode} +

    +
    + +
    +

    Mã ICAO

    +

    + {airlines.icaoCode} +

    +
    + +
    +

    Website

    +

    + {airlines.website} +

    +
    + +
    +

    + Trạng thái +

    + + +
    +
    +
    +
    +
    + ); +} + +export default DetailAirlines; diff --git a/src/components/page/airlines/DetailAirlines/index.ts b/src/components/page/airlines/DetailAirlines/index.ts new file mode 100644 index 0000000..4975c69 --- /dev/null +++ b/src/components/page/airlines/DetailAirlines/index.ts @@ -0,0 +1 @@ +export { default } from "./DetailAirlines"; diff --git a/src/components/page/airlines/MainPageAirlines/MainPageAirlines.tsx b/src/components/page/airlines/MainPageAirlines/MainPageAirlines.tsx new file mode 100644 index 0000000..c53998f --- /dev/null +++ b/src/components/page/airlines/MainPageAirlines/MainPageAirlines.tsx @@ -0,0 +1,345 @@ +"use client"; +import CustomButton from "@/components/customs/custom-button"; +import CustomDialog from "@/components/customs/custom-dialog"; +import CustomIcon from "@/components/customs/custom-icon"; +import CustomPagination from "@/components/customs/custom-pagination"; +import Search from "@/components/customs/custom-search"; +import CustomTable from "@/components/customs/custom-table"; +import DataWrapper from "@/components/customs/DataWrapper"; +import FilterCustom from "@/components/customs/FilterCustom"; +import { PATH } from "@/constant/config"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; + +import * as Tooltip from "@radix-ui/react-tooltip"; // Sửa lại cách import chuẩn của Radix UI +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { Airplane, Edit, Eye, Trash } from "iconsax-react"; +import Link from "next/link"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import React, { Fragment, useState } from "react"; +import StateActive from "@/components/customs/StateActive"; + +import countriesServices, { + CountriesResponse, +} from "@/services/countriesServices"; +import airlinesServices, { + AirlinesItem, + AirlinesResponse, +} from "@/services/airlinesServices"; + +function MainPageAirlines() { + const router = useRouter(); + const queryClient = useQueryClient(); + const searchParams = useSearchParams(); + const pathname = usePathname(); + + const [uuidDelete, setUuidDelete] = useState(""); + + const action = searchParams.get("action"); + const _uuidCountryRegion = searchParams.get("_uuidCountryRegion"); + + const page = Number(searchParams.get("_page") ?? "1"); + const pageSize = Number(searchParams.get("_pageSize") ?? "10"); + const keyword = searchParams.get("_keyword") ?? ""; + const status = searchParams.get("_status"); + const countriesId = searchParams.get("_countriesId"); + + // Nâng cấp hàm cập nhật Query URL để hỗ trợ cập nhật nhiều tham số cùng lúc + const updateQuery = ( + updates: Record, + replace = false, + ) => { + const params = new URLSearchParams(searchParams.toString()); + + Object.entries(updates).forEach(([key, value]) => { + if (value === undefined || value === null || value === "") { + params.delete(key); + } else { + params.set(key, String(value)); + } + }); + + const url = params.toString() + ? `${pathname}?${params.toString()}` + : pathname; + + if (replace) { + router.replace(url); + } else { + router.push(url); + } + }; + + const airlinesQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_airline, page, pageSize, keyword, status], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: airlinesServices.getAirlines({ + page, + limit: pageSize, + search: keyword, + status: status || undefined, // active | inactive | undefined + countryId: countriesId, + }), + }); + }, + }); + + const countriesQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_countries, STATUS_CONTINENTS.ACTIVE], + queryFn: async () => { + const res = await httpRequest({ + http: countriesServices.getCountries({ + status: STATUS_CONTINENTS.ACTIVE, + }), + showMessageFailed: true, + }); + + return res; + }, + }); + + const deleteAirlineMutation = useMutation({ + mutationFn: async (id: string) => { + return await httpRequest({ + http: airlinesServices.deleteAirline(id), + showMessageSuccess: true, + msgSuccess: "Xóa hãng hàng không thành công!", + showMessageFailed: true, + }); + }, + + onSuccess: () => { + setUuidDelete(""); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_airline], + }); + }, + + onError: (error: any) => { + console.log(error); + }, + }); + + return ( +
    +
    + {/* Header */} +
    +

    Hãng Hàng Không

    + } + href={PATH.CreateAirlines} + > + Thêm mới + +
    + + {/* Bộ lọc & Tìm kiếm */} +
    + {/* Search */} +
    + updateQuery({ _keyword: value, _page: 1 })} + placeholder="Tìm kiếm theo mã/iata/icao/tên" + /> +
    +
    + + name="Trạng thái" + value={status ? status : null} + onChange={(value) => + updateQuery({ _status: value ?? "", _page: 1 }) + } + listOption={[ + { + uuid: STATUS_CONTINENTS.ACTIVE, + name: "Hoạt động", + }, + { + uuid: STATUS_CONTINENTS.INACTIVE, + name: "Đã xóa", + }, + ]} + /> +
    +
    + + name="Quốc gia" + value={countriesId} + onChange={(value) => + updateQuery({ + _countriesId: value ?? "", + _page: 1, + }) + } + listOption={ + countriesQuery.data?.items?.map((item) => ({ + uuid: item.id, + name: item.name, + })) ?? [] + } + /> +
    +
    +
    + {/* Bảng dữ liệu */} +
    + + item.id} + data={airlinesQuery.data?.items ?? []} + column={[ + { + fixedLeft: true, + title: "Mã Hãng Hàng Không", + render: (item: AirlinesItem) => ( + + + + {/* SỬA: Link dẫn tới chi tiết châu lục thay vì bệnh nhân (patient) */} + + {item.code} + + + +

    + Xem chi tiết +

    +
    +
    +
    + ), + }, + { + title: "Tên Hãng Hàng Không", + render: (item: AirlinesItem) => ( + {item.name || "---"} + ), + }, + { + title: "Mã IATA", + render: (item: AirlinesItem) => ( + {item.iataCode || "---"} + ), + }, + { + title: "Mã ICAO", + render: (item: AirlinesItem) => ( + {item.icaoCode || "---"} + ), + }, + // { + // title: "LOGO", + // render: (item: AirlinesItem) => ( + // {item.logoUrl || "---"} + // ), + // }, + { + title: "Website", + render: (item: AirlinesItem) => ( + {item.website || "---"} + ), + }, + + { + title: "TRẠNG THÁI", + render: (item: AirlinesItem) => ( + + ), + }, + { + fixedRight: true, + title: "HÀNH ĐỘNG", + render: (item: AirlinesItem) => ( +
    + } + tooltip="Xem chi tiết" + /> + {item?.status === STATUS_CONTINENTS.ACTIVE && ( + <> + } + tooltip="Chỉnh sửa" + onClick={() => + router.push(`${PATH.Airlines}/update?id=${item.id}`) + } + /> + } + tooltip="Xóa" + onClick={() => setUuidDelete(item?.id)} + /> + + )} +
    + ), + }, + ]} + /> +
    + {/* Phân trang */} + updateQuery({ _page: value })} + onSetPageSize={(value) => updateQuery({ _pageSize: value, _page: 1 })} + dependencies={[pageSize, keyword]} + /> +
    + + {/* Dialog xác nhận xóa */} + setUuidDelete("")} + // SỬA: Đổi text liên quan từ "nhà thầu" thành "châu lục" để khớp ngữ cảnh của page + title="Xóa châu lục" + note="Bạn có chắc chắn muốn xóa hãng hàng không này?" + onSubmit={() => { + if (!uuidDelete) return; + + deleteAirlineMutation.mutate(uuidDelete); + }} + /> +
    + ); +} + +export default MainPageAirlines; diff --git a/src/components/page/airlines/MainPageAirlines/index.ts b/src/components/page/airlines/MainPageAirlines/index.ts new file mode 100644 index 0000000..f54d932 --- /dev/null +++ b/src/components/page/airlines/MainPageAirlines/index.ts @@ -0,0 +1 @@ +export { default } from "./MainPageAirlines"; diff --git a/src/components/page/airlines/PageCreateAirlines/PageCreateAirlines.tsx b/src/components/page/airlines/PageCreateAirlines/PageCreateAirlines.tsx new file mode 100644 index 0000000..8a1d6fd --- /dev/null +++ b/src/components/page/airlines/PageCreateAirlines/PageCreateAirlines.tsx @@ -0,0 +1,569 @@ +// "use client"; +// import { toastWarn } from "@/common/funcs/toast"; +// import CustomButton from "@/components/customs/custom-button"; +// import FormCustom from "@/components/utils/FormCustom"; +// import InputForm from "@/components/utils/FormCustom/compoents/InputForm/InputForm"; +// import SelectForm from "@/components/utils/FormCustom/compoents/SelectForm/SelectForm"; +// import UploadImage from "@/components/utils/UploadImage"; +// import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +// import { httpRequest } from "@/services"; +// import airlinesServices from "@/services/airlinesServices"; +// import countriesServices, { +// CountriesItem, +// CountriesResponse, +// } from "@/services/countriesServices"; +// import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +// import { ArrowLeft } from "iconsax-react"; +// import { useRouter } from "next/navigation"; +// import React, { useMemo, useState } from "react"; + +// export interface ICreateAirlines { +// countryId: string; +// code: string; +// iataCode: string; +// icaoCode: string; +// name: string; +// logoUrl: string; +// website: string; +// } + +// const PageCreateAirlines = () => { +// const router = useRouter(); +// const queryClient = useQueryClient(); + +// const [file, setFile] = useState(null); + +// const [form, setForm] = useState({ +// countryId: "", +// code: "", +// iataCode: "", +// icaoCode: "", +// name: "", +// logoUrl: "", +// website: "", +// }); + +// // Helper hàm onChangeValue cho InputForm nhận trực tiếp (fieldName, value) +// const handleChangeField = ( +// field: keyof ICreateAirlines, +// value: string | number, +// ) => { +// setForm((prev) => ({ +// ...prev, +// [field]: String(value), +// })); +// }; + +// // Query lấy danh sách quốc gia +// const countriesQuery = useQuery({ +// queryKey: [QUERY_KEY.table_list_countries, STATUS_CONTINENTS.ACTIVE], +// queryFn: async () => { +// return await httpRequest({ +// showMessageFailed: true, +// http: countriesServices.getCountries({ +// status: STATUS_CONTINENTS.ACTIVE, +// }), +// }); +// }, +// }); + +// const countriesOptions = useMemo(() => { +// return countriesQuery.data?.items || []; +// }, [countriesQuery.data]); + +// // Mutation thêm hãng hàng không +// const funcCreateAirlines = useMutation({ +// mutationFn: async (payload: FormData) => { +// return await httpRequest({ +// showMessageFailed: true, +// showMessageSuccess: true, +// msgSuccess: "Thêm hãng hàng không thành công!", +// http: airlinesServices.createAirlines(payload), +// }); +// }, +// onSuccess() { +// queryClient.invalidateQueries({ +// queryKey: [QUERY_KEY.table_list_continents], +// }); +// router.back(); +// }, +// }); + +// /* ========================= +// SUBMIT HANDLER +// ========================= */ +// const handleSubmit = () => { +// // Validate phía Frontend +// if (!form?.countryId) { +// return toastWarn({ msg: "Vui lòng chọn quốc gia!" }); +// } +// if (!form?.code?.trim()) { +// return toastWarn({ msg: "Vui lòng nhập mã hãng!" }); +// } +// if (!form?.name?.trim()) { +// return toastWarn({ msg: "Vui lòng nhập tên hãng!" }); +// } +// if (!file) { +// return toastWarn({ msg: "Vui lòng tải lên logo!" }); +// } + +// const formData = new FormData(); +// formData.append("countryId", form.countryId); +// formData.append("code", form.code.trim()); +// formData.append("iataCode", form.iataCode.trim()); +// formData.append("icaoCode", form.icaoCode.trim()); +// formData.append("name", form.name.trim()); +// formData.append("website", form.website.trim()); + +// // Thêm File logo +// formData.append("logoUrl", file); + +// // Gửi request +// funcCreateAirlines.mutate(formData); +// }; + +// const isLoading = funcCreateAirlines.isPending; + +// return ( +// +//
    +// {/* HEADER */} +//
    +//

    router.back()} +// > +// Thêm Hãng Hàng Không +//

    +//
    +// router.back()} +// disabled={isLoading} +// > +// Hủy bỏ +// + +// +// {isLoading ? "Đang xử lý..." : "Thêm hãng"} +// +//
    +//
    + +// {/* BODY */} +//
    +// {/* SELECT QUỐC GIA */} +//
    +// +// Quốc gia * +// +// } +// placeholder="Chọn quốc gia" +// value={form.countryId} +// options={countriesOptions} +// onSelect={(item: CountriesItem) => +// setForm((prev) => ({ +// ...prev, +// countryId: item.id, +// })) +// } +// onClean={() => +// setForm((prev) => ({ +// ...prev, +// countryId: "", +// })) +// } +// getOptionLabel={(item: CountriesItem) => item.name} +// getOptionValue={(item: CountriesItem) => item.id} +// /> +//
    + +// {/* MÃ HÃNG */} +//
    +// handleChangeField("code", val)} +// label={ +// +// Mã hãng * +// +// } +// /> +//
    + +// {/* TÊN HÃNG */} +//
    +// handleChangeField("name", val)} +// label={ +// +// Tên hãng * +// +// } +// /> +//
    + +// {/* MÃ IATA VÀ ICAO */} +//
    +// handleChangeField("iataCode", val)} +// label={Mã IATA} +// /> +// handleChangeField("icaoCode", val)} +// label={Mã ICAO} +// /> +//
    + +// {/* WEBSITE */} +//
    +// handleChangeField("website", val)} +// label={WEBSITE} +// /> +//
    + +// {/* UPLOAD LOGO */} +//
    +// +// Hình ảnh logo * +// +// } +// name="logoUrl" +// file={file} +// setFile={setFile} +// path={form.logoUrl} +// resetPath={() => +// setForm((prev) => ({ +// ...prev, +// logoUrl: "", +// })) +// } +// /> +//
    +//
    +//
    +//
    +// ); +// }; + +// export default PageCreateAirlines; + +"use client"; +import { toastWarn } from "@/common/funcs/toast"; +import CustomButton from "@/components/customs/custom-button"; +import FormCustom from "@/components/utils/FormCustom"; +import InputForm from "@/components/utils/FormCustom/compoents/InputForm/InputForm"; +import SelectForm from "@/components/utils/FormCustom/compoents/SelectForm/SelectForm"; +import UploadImage from "@/components/utils/UploadImage"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import airlinesServices from "@/services/airlinesServices"; +import countriesServices, { + CountriesItem, + CountriesResponse, +} from "@/services/countriesServices"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { ArrowLeft } from "iconsax-react"; +import { useRouter } from "next/navigation"; +import React, { useMemo, useState } from "react"; + +export interface ICreateAirlines { + countryId: string; + code: string; + iataCode: string; + icaoCode: string; + name: string; + logoUrl: string; + website: string; +} + +const PageCreateAirlines = () => { + const router = useRouter(); + const queryClient = useQueryClient(); + + const [file, setFile] = useState(null); + + const [form, setForm] = useState({ + countryId: "", + code: "", + iataCode: "", + icaoCode: "", + name: "", + logoUrl: "", + website: "", + }); + + // Helper hàm onChangeValue cho InputForm nhận trực tiếp (fieldName, value) + const handleChangeField = ( + field: keyof ICreateAirlines, + value: string | number, + ) => { + setForm((prev) => ({ + ...prev, + [field]: String(value), + })); + }; + + // Query lấy danh sách quốc gia + const countriesQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_countries, STATUS_CONTINENTS.ACTIVE], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: countriesServices.getCountries({ + status: STATUS_CONTINENTS.ACTIVE, + }), + }); + }, + }); + + const countriesOptions = useMemo(() => { + return countriesQuery.data?.items || []; + }, [countriesQuery.data]); + + // Mutation thêm hãng hàng không (Gửi JSON Payload) + const funcCreateAirlines = useMutation({ + mutationFn: async (payload: ICreateAirlines) => { + return await httpRequest({ + showMessageFailed: true, + showMessageSuccess: true, + msgSuccess: "Thêm hãng hàng không thành công!", + http: airlinesServices.createAirlines(payload as any), + }); + }, + onSuccess() { + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_continents], + }); + router.back(); + }, + }); + + /* ========================= + SUBMIT HANDLER + ========================= */ + const handleSubmit = () => { + // Validate phía Frontend + if (!form?.countryId) { + return toastWarn({ msg: "Vui lòng chọn quốc gia!" }); + } + if (!form?.code?.trim()) { + return toastWarn({ msg: "Vui lòng nhập mã hãng!" }); + } + if (!form?.name?.trim()) { + return toastWarn({ msg: "Vui lòng nhập tên hãng!" }); + } + + // Tạo payload dạng Object JSON thuần túy + const payload: ICreateAirlines = { + countryId: form.countryId, + code: form.code.trim(), + iataCode: form.iataCode.trim(), + icaoCode: form.icaoCode.trim(), + name: form.name.trim(), + website: form.website.trim(), + // Luôn truyền chuỗi "string" (hoặc truyền form.logoUrl nếu người dùng có nhập) + logoUrl: form.logoUrl.trim() || "string", + }; + + // Gửi request + funcCreateAirlines.mutate(payload); + }; + + const isLoading = funcCreateAirlines.isPending; + + return ( + +
    + {/* HEADER */} +
    +

    router.back()} + > + Thêm Hãng Hàng Không +

    +
    + router.back()} + disabled={isLoading} + > + Hủy bỏ + + + + {isLoading ? "Đang xử lý..." : "Thêm hãng"} + +
    +
    + + {/* BODY */} +
    + {/* SELECT QUỐC GIA */} +
    + + Quốc gia * + + } + placeholder="Chọn quốc gia" + value={form.countryId} + options={countriesOptions} + onSelect={(item: CountriesItem) => + setForm((prev) => ({ + ...prev, + countryId: item.id, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + countryId: "", + })) + } + getOptionLabel={(item: CountriesItem) => item.name} + getOptionValue={(item: CountriesItem) => item.id} + /> +
    + + {/* MÃ HÃNG */} +
    + handleChangeField("code", val)} + label={ + + Mã hãng * + + } + /> +
    + + {/* TÊN HÃNG */} +
    + handleChangeField("name", val)} + label={ + + Tên hãng * + + } + /> +
    + + {/* MÃ IATA VÀ ICAO */} +
    + handleChangeField("iataCode", val)} + label={Mã IATA} + /> + handleChangeField("icaoCode", val)} + label={Mã ICAO} + /> +
    + + {/* WEBSITE */} +
    + handleChangeField("website", val)} + label={WEBSITE} + /> +
    + + {/* UPLOAD LOGO */} + {/*
    + + Hình ảnh logo * + + } + name="logoUrl" + file={file} + setFile={setFile} + path={form.logoUrl} + resetPath={() => + setForm((prev) => ({ + ...prev, + logoUrl: "", + })) + } + /> +
    */} +
    +
    +
    + ); +}; + +export default PageCreateAirlines; diff --git a/src/components/page/airlines/PageCreateAirlines/index.ts b/src/components/page/airlines/PageCreateAirlines/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/components/page/airlines/PageUpdateAirlines/PageUpdateAirlines.tsx b/src/components/page/airlines/PageUpdateAirlines/PageUpdateAirlines.tsx new file mode 100644 index 0000000..65dafe8 --- /dev/null +++ b/src/components/page/airlines/PageUpdateAirlines/PageUpdateAirlines.tsx @@ -0,0 +1,338 @@ +"use client"; + +import { toastSuccess, toastWarn } from "@/common/funcs/toast"; +import CustomButton from "@/components/customs/custom-button"; +import FormCustom from "@/components/utils/FormCustom"; +import InputForm from "@/components/utils/FormCustom/compoents/InputForm/InputForm"; +import SelectForm from "@/components/utils/FormCustom/compoents/SelectForm/SelectForm"; +import UploadImage from "@/components/utils/UploadImage"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import airlinesServices, { AirlinesDetail } from "@/services/airlinesServices"; +import countriesServices, { + CountriesItem, + CountriesResponse, +} from "@/services/countriesServices"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { ArrowLeft } from "iconsax-react"; +import { useRouter, useSearchParams } from "next/navigation"; +import React, { useEffect, useMemo, useState, Suspense } from "react"; + +// Hàm làm sạch dữ liệu URL từ API +const extractImageUrl = (value: any): string => { + if (!value) return ""; + if (typeof value === "string") return value; + if (typeof value === "object") { + return value.url || value.path || value.link || value.src || ""; + } + return ""; +}; + +export interface IUpdateAirlines { + countryId: string; + code: string; + iataCode: string; + icaoCode: string; + name: string; + logoUrl: string; + website: string; +} + +export default function PageUpdateAirlines() { + const router = useRouter(); + const queryClient = useQueryClient(); + const searchParams = useSearchParams(); + + const airlinesId = searchParams.get("id") || ""; + + const [file, setFile] = useState(null); + const [form, setForm] = useState({ + countryId: "", + code: "", + iataCode: "", + icaoCode: "", + name: "", + logoUrl: "string", + website: "", + }); + + const { data, isLoading } = useQuery({ + queryKey: [QUERY_KEY.detail_airlines, airlinesId], + enabled: !!airlinesId, + queryFn: async () => { + return await httpRequest({ + http: airlinesServices.detailAirlines(airlinesId), + }); + }, + }); + + useEffect(() => { + if (!data) return; + + const safeLogoUrl = extractImageUrl(data.logoUrl); + + setForm({ + countryId: data?.countryId || "", + code: data?.code || "", + iataCode: data?.iataCode || "", + icaoCode: data?.icaoCode || "", + name: data?.name || "", + logoUrl: safeLogoUrl, + website: data?.website || "", + }); + }, [data]); + + const countriesQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_countries, STATUS_CONTINENTS.ACTIVE], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: countriesServices.getCountries({ + status: STATUS_CONTINENTS.ACTIVE, + }), + }); + }, + }); + + const countriesOptions = useMemo(() => { + return countriesQuery.data?.items || []; + }, [countriesQuery.data]); + + /* ========================================================= + MUTATION: SỬ DỤNG FORMDATA ĐỂ TRÁNH LỖI OVER 500 CHARACTERS + ========================================================= */ + const funcUpdateAirlines = useMutation({ + mutationFn: async () => { + const formData = new FormData(); + + formData.append("countryId", form.countryId); + formData.append("code", form.code); + formData.append("name", form.name); + + if (form.iataCode) formData.append("iataCode", form.iataCode); + if (form.icaoCode) formData.append("icaoCode", form.icaoCode); + if (form.website) formData.append("website", form.website); + + // Nếu người dùng chọn FILE MỚI -> gửi File + // Nếu không chọn file mới -> gửi lại URL CŨ dạng string + if (file) { + formData.append("logoUrl", file); + } else if (form.logoUrl) { + formData.append("logoUrl", form.logoUrl); + } + + return await httpRequest({ + showMessageFailed: false, + http: airlinesServices.updateAirlines(airlinesId, formData as any), + }); + }, + onSuccess: () => { + toastSuccess({ + msg: "Chỉnh sửa hãng thành công!", + }); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_airline], + }); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.detail_airlines, airlinesId], + }); + + router.back(); + }, + onError: (error: any) => { + toastWarn({ + msg: + error?.response?.data?.error?.message ?? + error?.message ?? + "Có lỗi xảy ra khi cập nhật.", + }); + }, + }); + + const handleSubmit = () => { + if (!form?.countryId) { + return toastWarn({ msg: "Vui lòng chọn quốc gia!" }); + } + if (!form?.code?.trim()) { + return toastWarn({ msg: "Vui lòng nhập mã hãng!" }); + } + if (!form?.name?.trim()) { + return toastWarn({ msg: "Vui lòng nhập tên hãng!" }); + } + if (!file && !form?.logoUrl) { + return toastWarn({ msg: "Vui lòng tải lên logo!" }); + } + + funcUpdateAirlines.mutate(); + }; + + const handleBack = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + router.back(); + }; + + if (isLoading) { + return ( +
    + Đang tải thông tin hãng hàng không... +
    + ); + } + return ( + +
    +
    +
    + + Chỉnh Sửa Hãng Hàng Không +
    + +
    + + Hủy bỏ + + + + {funcUpdateAirlines.isPending ? "Đang lưu..." : "Lưu thay đổi"} + +
    +
    + +
    + {/* SELECT QUỐC GIA */} +
    + + Quốc gia * + + } + placeholder="Chọn quốc gia" + value={form.countryId} + options={countriesOptions} + onSelect={(item: CountriesItem) => + setForm((prev) => ({ ...prev, countryId: item.id })) + } + onClean={() => setForm((prev) => ({ ...prev, countryId: "" }))} + getOptionLabel={(item: CountriesItem) => item.name} + getOptionValue={(item: CountriesItem) => item.id} + /> +
    + + {/* MÃ HÃNG */} +
    + + setForm((prev) => ({ ...prev, code: String(val) })) + } + label={ + + Mã hãng * + + } + /> +
    + + {/* TÊN HÃNG */} +
    + + setForm((prev) => ({ ...prev, name: String(val) })) + } + label={ + + Tên hãng * + + } + /> +
    + + {/* MÃ IATA VÀ ICAO */} +
    + + setForm((prev) => ({ ...prev, iataCode: String(val) })) + } + label={Mã IATA} + /> + + setForm((prev) => ({ ...prev, icaoCode: String(val) })) + } + label={Mã ICAO} + /> +
    + + {/* WEBSITE */} +
    + + setForm((prev) => ({ ...prev, website: String(val) })) + } + label={WEBSITE} + /> +
    + + {/* UPLOAD LOGO */} + {/*
    + + Hình ảnh logo * + + } + name="logoUrl" + file={file} + setFile={setFile} + path={form.logoUrl} + resetPath={() => setForm((prev) => ({ ...prev, logoUrl: "" }))} + /> +
    */} +
    +
    +
    + ); +} diff --git a/src/components/page/airlines/PageUpdateAirlines/index.ts b/src/components/page/airlines/PageUpdateAirlines/index.ts new file mode 100644 index 0000000..d1eaea2 --- /dev/null +++ b/src/components/page/airlines/PageUpdateAirlines/index.ts @@ -0,0 +1 @@ +export { default } from "./PageUpdateAirlines"; diff --git a/src/components/page/continents/CreateContinents/CreateContinents.tsx b/src/components/page/continents/CreateContinents/CreateContinents.tsx new file mode 100644 index 0000000..2f5837f --- /dev/null +++ b/src/components/page/continents/CreateContinents/CreateContinents.tsx @@ -0,0 +1,158 @@ +"use client"; +import { toastWarn } from "@/common/funcs/toast"; +import CustomButton from "@/components/customs/custom-button"; +import CustomLoading from "@/components/customs/custom-loading"; +import FormCustom from "@/components/utils/FormCustom"; +import InputForm from "@/components/utils/FormCustom/compoents/InputForm/InputForm"; +import { ContextFormCustom } from "@/components/utils/FormCustom/contexts"; +import { QUERY_KEY } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import continentsServices from "@/services/continentsServices"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { CloseCircle, FolderOpen } from "iconsax-react"; +import React, { useState } from "react"; + +export interface PropsCreateContinents { + onClose: () => void; +} + +export interface IFormCreateContinents { + code: string; + name: string; +} + +function CreateContinents({ onClose }: PropsCreateContinents) { + const queryClient = useQueryClient(); + + const [form, setForm] = useState({ + code: "", + name: "", + }); + + const funcCreateContinent = useMutation({ + mutationFn: async () => { + return await httpRequest({ + showMessageFailed: true, + showMessageSuccess: true, + msgSuccess: "Thêm châu lục thành công!", + + http: continentsServices.createContinents({ + code: form?.code, + name: form?.name, + sortOrder: 0, + status: "ACTIVE", + }), + }); + }, + onError(error: any) { + // Lấy message lỗi từ backend trả về + const message = error?.response?.data?.error?.message || error?.message; + + // Bật thông báo Toast dạng cảnh báo + toastWarn({ msg: message }); + }, + onSuccess() { + /* REFRESH LIST */ + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_continents], + }); + + onClose(); + }, + }); + + const handleSubmit = () => { + const cleanCode = form.code?.trim(); + const cleanName = form.name?.trim(); + + if (!cleanCode) { + return toastWarn({ msg: "Vui lòng nhập mã châu lục!" }); + } + if (!cleanName) { + return toastWarn({ msg: "Vui lòng nhập tên châu lục!" }); + } + + // Cập nhật lại state chuẩn trước khi gửi + setForm({ code: cleanCode, name: cleanName }); + + return funcCreateContinent.mutate(); + }; + + return ( + + +
    + {/* Header */} +

    + Thêm Mới Châu Lục +

    + + {/* Form */} + +
    + + Mã châu lục * + + } + /> +
    + + Tên châu lục * + + } + /> +
    +
    + + {/* Footer */} +
    + + Hủy bỏ + + + + {({ isDone }) => ( + } + onClick={handleSubmit} + > + Lưu lại + + )} + +
    + + {/* Close */} + +
    +
    + ); +} + +export default CreateContinents; diff --git a/src/components/page/continents/CreateContinents/index.ts b/src/components/page/continents/CreateContinents/index.ts new file mode 100644 index 0000000..f4e4b36 --- /dev/null +++ b/src/components/page/continents/CreateContinents/index.ts @@ -0,0 +1 @@ +export { default } from "./CreateContinents"; diff --git a/src/components/page/continents/DetailContinent/DetailContinent.tsx b/src/components/page/continents/DetailContinent/DetailContinent.tsx new file mode 100644 index 0000000..dca38a5 --- /dev/null +++ b/src/components/page/continents/DetailContinent/DetailContinent.tsx @@ -0,0 +1,187 @@ +"use client"; +import CustomButton from "@/components/customs/custom-button"; +import StateActive from "@/components/customs/StateActive"; +import PositionContainer from "@/components/utils/PositionContainer"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import continentsServices, { + ContinentsDetail, +} from "@/services/continentsServices"; +import { useQuery } from "@tanstack/react-query"; +import { ArrowLeft, Edit } from "iconsax-react"; +import { + useParams, + usePathname, + useRouter, + useSearchParams, +} from "next/navigation"; +import React from "react"; +import UpdateContinents from "../UpdateContinents"; + +function DetailContinent() { + const params = useParams(); + const router = useRouter(); + const searchParams = useSearchParams(); + const pathname = usePathname(); + + const continentId = params?.id as string; + + const _uuidContinent = searchParams.get("_uuidContinent"); + + const updateQuery = ( + updates: Record, + replace = false, + ) => { + const params = new URLSearchParams(searchParams.toString()); + + Object.entries(updates).forEach(([key, value]) => { + if (value === undefined || value === null || value === "") { + params.delete(key); + } else { + params.set(key, String(value)); + } + }); + + const url = params.toString() + ? `${pathname}?${params.toString()}` + : pathname; + + if (replace) { + router.replace(url); + } else { + router.push(url); + } + }; + + const ContinentDetailQuery = useQuery({ + queryKey: [QUERY_KEY.detail_continent, continentId], + enabled: !!continentId, + queryFn: async () => { + const res = await httpRequest({ + showMessageFailed: true, + http: continentsServices.detailContinents(continentId), + }); + + return ( + res || { + id: "", + code: "", + name: "", + status: "string", + sortOrder: 0, + createdAt: "", + updatedAt: "", + } + ); + }, + }); + + const continent = ContinentDetailQuery.data; + + return ( +
    +
    +
    +
    +
    +

    router.back()} + > + {continent?.name} +

    + {continent?.status === STATUS_CONTINENTS.ACTIVE && ( +
    + } + onClick={() => + updateQuery( + { + _uuidContinent: continent?.id, + }, + true, + ) + } + > + Chỉnh sửa + +
    + )} +
    + + {/* Thông tin chi tiết bệnh nhân */} +
    +
    +

    + Mã châu lục +

    +

    + {continent?.code} +

    +
    + +
    +

    + Tên châu lục +

    +

    + {continent?.name} +

    +
    +
    +

    + TRẠNG THÁI: +

    + +
    +
    +
    +
    +
    + + updateQuery( + { + _uuidContinent: null, + }, + true, + ) + } + > + {_uuidContinent && ( + + updateQuery( + { + _uuidContinent: null, + }, + true, + ) + } + /> + )} + +
    + ); +} + +export default DetailContinent; diff --git a/src/components/page/continents/DetailContinent/index.ts b/src/components/page/continents/DetailContinent/index.ts new file mode 100644 index 0000000..05f9db9 --- /dev/null +++ b/src/components/page/continents/DetailContinent/index.ts @@ -0,0 +1 @@ +export { default } from "./DetailContinent"; diff --git a/src/components/page/continents/MainPageContinents/MainPageContinents.tsx b/src/components/page/continents/MainPageContinents/MainPageContinents.tsx new file mode 100644 index 0000000..bc84419 --- /dev/null +++ b/src/components/page/continents/MainPageContinents/MainPageContinents.tsx @@ -0,0 +1,345 @@ +"use client"; +import CustomButton from "@/components/customs/custom-button"; +import CustomDialog from "@/components/customs/custom-dialog"; +import CustomIcon from "@/components/customs/custom-icon"; +import CustomPagination from "@/components/customs/custom-pagination"; +import Search from "@/components/customs/custom-search"; +import CustomTable from "@/components/customs/custom-table"; +import DataWrapper from "@/components/customs/DataWrapper"; +import FilterCustom from "@/components/customs/FilterCustom"; +import PositionContainer from "@/components/utils/PositionContainer"; +import { PATH } from "@/constant/config"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import continentsServices, { + ContinentsItem, + ContinentsResponse, +} from "@/services/continentsServices"; +import * as Tooltip from "@radix-ui/react-tooltip"; // Sửa lại cách import chuẩn của Radix UI +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { Edit, Eye, Global, Trash } from "iconsax-react"; +import Link from "next/link"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import React, { Fragment, useState } from "react"; +import CreateContinents from "../CreateContinents"; +import StateActive from "@/components/customs/StateActive"; +import UpdateContinents from "../UpdateContinents"; + +function MainPageContinents() { + const router = useRouter(); + const queryClient = useQueryClient(); + const searchParams = useSearchParams(); + const pathname = usePathname(); + + const [uuidDelete, setUuidDelete] = useState(""); + + const action = searchParams.get("action"); + const _uuidContinent = searchParams.get("_uuidContinent"); + + const page = Number(searchParams.get("_page") ?? "1"); + const pageSize = Number(searchParams.get("_pageSize") ?? "10"); + const keyword = searchParams.get("_keyword") ?? ""; + const status = searchParams.get("_status"); + + // Nâng cấp hàm cập nhật Query URL để hỗ trợ cập nhật nhiều tham số cùng lúc + const updateQuery = ( + updates: Record, + replace = false, + ) => { + const params = new URLSearchParams(searchParams.toString()); + + Object.entries(updates).forEach(([key, value]) => { + if (value === undefined || value === null || value === "") { + params.delete(key); + } else { + params.set(key, String(value)); + } + }); + + const url = params.toString() + ? `${pathname}?${params.toString()}` + : pathname; + + if (replace) { + router.replace(url); + } else { + router.push(url); + } + }; + + const continentQuery = useQuery({ + queryKey: [ + QUERY_KEY.table_list_continents, + page, + pageSize, + keyword, + status, + ], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: continentsServices.getContinents({ + page, + limit: pageSize, + search: keyword, + status: status || undefined, // active | inactive | undefined + }), + }); + }, + }); + + const deleteContinentMutation = useMutation({ + mutationFn: async (id: string) => { + return await httpRequest({ + http: continentsServices.deleteContinents(id), + showMessageSuccess: true, + msgSuccess: "Xóa châu lục thành công!", + showMessageFailed: true, + }); + }, + + onSuccess: () => { + setUuidDelete(""); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_continents], + }); + }, + + onError: (error: any) => { + console.log(error); + }, + }); + + return ( +
    +
    + {/* Header */} +
    +

    Châu Lục

    + } + onClick={() => { + // SỬA: Điều hướng chuẩn App Router bằng cách cập nhật query string + updateQuery({ action: "create" }); + }} + > + Thêm mới + +
    + + {/* Bộ lọc & Tìm kiếm */} +
    +
    + updateQuery({ _keyword: value, _page: 1 })} + placeholder="Tìm kiếm theo tên, ID châu lục" + /> +
    + + name="Trạng thái" + value={status ? status : null} + onChange={(value) => + updateQuery({ _status: value ?? "", _page: 1 }) + } + listOption={[ + { + uuid: STATUS_CONTINENTS.ACTIVE, + name: "Hoạt động", + }, + { + uuid: STATUS_CONTINENTS.INACTIVE, + name: "Đã xóa", + }, + ]} + /> +
    +
    + {/* Bảng dữ liệu */} +
    + + item.id} + data={continentQuery.data?.items ?? []} + column={[ + { + fixedLeft: true, + title: "MÃ CHÂU LỤC", + render: (item: ContinentsItem) => ( + + + + {/* SỬA: Link dẫn tới chi tiết châu lục thay vì bệnh nhân (patient) */} + + {item.code} + + + +

    + Xem chi tiết +

    +
    +
    +
    + ), + }, + { + title: "TÊN CHÂU LỤC", + render: (item: ContinentsItem) => ( + {item.name || "---"} + ), + }, + { + title: "TRẠNG THÁI", + render: (item: ContinentsItem) => ( + + ), + }, + { + fixedRight: true, + title: "HÀNH ĐỘNG", + render: (item: ContinentsItem) => ( +
    + } + tooltip="Xem chi tiết" + /> + {item?.status === STATUS_CONTINENTS.ACTIVE && ( + <> + } + tooltip="Chỉnh sửa" + onClick={() => + updateQuery( + { + _uuidContinent: item.id, + }, + true, + ) + } + /> + } + tooltip="Xóa" + onClick={() => setUuidDelete(item?.id)} + /> + + )} +
    + ), + }, + ]} + /> +
    + {/* Phân trang */} + updateQuery({ _page: value })} + onSetPageSize={(value) => updateQuery({ _pageSize: value, _page: 1 })} + dependencies={[pageSize, keyword]} + /> +
    + + + updateQuery( + { + action: null, + }, + true, + ) + } + > + {action === "create" && ( + + updateQuery( + { + action: null, + }, + true, + ) + } + /> + )} + + + + updateQuery( + { + _uuidContinent: null, + }, + true, + ) + } + > + {_uuidContinent && ( + + updateQuery( + { + _uuidContinent: null, + }, + true, + ) + } + /> + )} + + + {/* Dialog xác nhận xóa */} + setUuidDelete("")} + // SỬA: Đổi text liên quan từ "nhà thầu" thành "châu lục" để khớp ngữ cảnh của page + title="Xóa châu lục" + note="Bạn có chắc chắn muốn xóa châu lục này?" + onSubmit={() => { + if (!uuidDelete) return; + + deleteContinentMutation.mutate(uuidDelete); + }} + /> +
    + ); +} + +export default MainPageContinents; diff --git a/src/components/page/continents/MainPageContinents/index.ts b/src/components/page/continents/MainPageContinents/index.ts new file mode 100644 index 0000000..b2fbb43 --- /dev/null +++ b/src/components/page/continents/MainPageContinents/index.ts @@ -0,0 +1 @@ +export { default } from "./MainPageContinents"; diff --git a/src/components/page/continents/UpdateContinents/UpdateContinents.tsx b/src/components/page/continents/UpdateContinents/UpdateContinents.tsx new file mode 100644 index 0000000..3f13a14 --- /dev/null +++ b/src/components/page/continents/UpdateContinents/UpdateContinents.tsx @@ -0,0 +1,180 @@ +"use client"; + +import React, { useEffect, useState } from "react"; +import { useSearchParams } from "next/navigation"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; + +import { QUERY_KEY } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import continentsServices, { + ContinentsDetail, +} from "@/services/continentsServices"; +import FormCustom from "@/components/utils/FormCustom"; +import CustomLoading from "@/components/customs/custom-loading"; +import { toastWarn, toastSuccess } from "@/common/funcs/toast"; +import InputForm from "@/components/utils/FormCustom/compoents/InputForm/InputForm"; +import CustomButton from "@/components/customs/custom-button"; +import { ContextFormCustom } from "@/components/utils/FormCustom/contexts"; +import { CloseCircle, FolderOpen } from "iconsax-react"; + +export interface PropsUpdateContinents { + onClose: () => void; +} + +export interface IUpdateContinents { + name: string; + code: string; +} + +export default function UpdateContinents({ onClose }: PropsUpdateContinents) { + const queryClient = useQueryClient(); + const searchParams = useSearchParams(); + + const uuidContinent = searchParams.get("_uuidContinent"); + + const [form, setForm] = useState({ + name: "", + code: "", + }); + + const { data, isLoading, isError } = useQuery({ + queryKey: [QUERY_KEY.detail_continent, uuidContinent], + enabled: !!uuidContinent, + queryFn: async () => { + return await httpRequest({ + http: continentsServices.detailContinents(uuidContinent!), + }); + }, + }); + + useEffect(() => { + if (!data) return; + + setForm({ + name: data.name ?? "", + code: data.code ?? "", + }); + }, [data]); + + const updateContinentMutation = useMutation({ + mutationFn: async () => { + if (!uuidContinent) { + throw new Error("Không tìm thấy mã châu lục."); + } + + return await httpRequest({ + showMessageFailed: false, + http: continentsServices.updateContinents(uuidContinent as string, { + name: form.name, + code: form.code, + }), + }); + }, + + onSuccess: () => { + toastSuccess({ + msg: "Cập nhật châu lục thành công!", + }); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_continents], + }); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.detail_continent, uuidContinent], + }); + + onClose(); + }, + + onError: (error: any) => { + toastWarn({ + msg: + error?.response?.data?.error?.message ?? + error?.message ?? + "Có lỗi xảy ra.", + }); + }, + }); + + const handleSubmit = () => { + updateContinentMutation.mutate(); + }; + + return ( + + + +
    + {/* Header */} +

    + Chỉnh sửa châu lục +

    + + {/* Form */} + +
    + + Mã châu lục * + + } + /> +
    + + Tên châu lục * + + } + /> +
    +
    + + {/* Footer */} +
    + + Hủy bỏ + + + + {({ isDone }) => ( + } + onClick={handleSubmit} + > + Lưu lại + + )} + +
    + + {/* Close */} + +
    +
    + ); +} diff --git a/src/components/page/continents/UpdateContinents/index.ts b/src/components/page/continents/UpdateContinents/index.ts new file mode 100644 index 0000000..86d4b6d --- /dev/null +++ b/src/components/page/continents/UpdateContinents/index.ts @@ -0,0 +1 @@ +export { default } from "./UpdateContinents"; diff --git a/src/components/page/countries/CreateCountries/CreateCountries.tsx b/src/components/page/countries/CreateCountries/CreateCountries.tsx new file mode 100644 index 0000000..17755f0 --- /dev/null +++ b/src/components/page/countries/CreateCountries/CreateCountries.tsx @@ -0,0 +1,354 @@ +import { toastWarn } from "@/common/funcs/toast"; +import CustomButton from "@/components/customs/custom-button"; +import GridColumn from "@/components/layouts/GridColumn"; +import FormCustom from "@/components/utils/FormCustom"; +import InputForm from "@/components/utils/FormCustom/compoents/InputForm/InputForm"; +import SelectForm from "@/components/utils/FormCustom/compoents/SelectForm/SelectForm"; +import { COUNTRY_OPTIONS } from "@/constant/config/country_option"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import continentsServices, { + ContinentsItem, + ContinentsResponse, +} from "@/services/continentsServices"; +import countriesServices, { CountriesItem } from "@/services/countriesServices"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { ArrowLeft } from "iconsax-react"; +import { useRouter } from "next/navigation"; +import React, { useMemo, useState } from "react"; + +export interface ICreateCountries { + continentId: string; + code: string; + name: string; + iso2Code: string; + iso3Code: string; + phoneCode: string; + currencyCode: string; + timezone: string; +} + +const CreateCountries = () => { + const router = useRouter(); + const queryClient = useQueryClient(); + + const [form, setForm] = useState({ + continentId: "", + code: "", + name: "", + iso2Code: "", + iso3Code: "", + phoneCode: "", + currencyCode: "", + timezone: "", + }); + + /* ========================= + GET LIST SPECIALTY + ========================= */ + const continentQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_continents, STATUS_CONTINENTS.ACTIVE], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: continentsServices.getContinents({ + status: STATUS_CONTINENTS.ACTIVE, // active | inactive | undefined + }), + }); + }, + }); + + const continentOptions = useMemo(() => { + return continentQuery.data?.items || []; + }, [continentQuery.data]); + + /* ========================= + CREATE CONSULTATION + ========================= */ + const funcCreateCountries = useMutation({ + mutationFn: async () => { + return await httpRequest({ + showMessageFailed: true, + showMessageSuccess: true, + msgSuccess: "Thêm quốc gia thành công!", + + http: countriesServices.createCountries({ + continentId: form?.continentId, + code: form?.code, + name: form?.name, + iso2Code: form?.iso2Code, + iso3Code: form?.iso3Code, + phoneCode: form?.phoneCode, + currencyCode: form?.currencyCode, + timezone: form?.timezone, + }), + }); + }, + onError(error: any) { + // Lấy message lỗi từ backend trả về + const message = error?.response?.data?.error?.message || error?.message; + + // Bật thông báo Toast dạng cảnh báo + toastWarn({ msg: message }); + }, + onSuccess() { + /* REFRESH LIST */ + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_continents], + }); + + router.back(); + }, + }); + + const handleSubmit = () => { + if (!form?.continentId) { + return toastWarn({ msg: "Vui lòng chọn châu lục" }); + } + funcCreateCountries.mutate(); + }; + + return ( + +
    +
    +

    router.back()} + > + Thêm Quốc Gia +

    +
    + router.back()} + > + Hủy bỏ + + + + {funcCreateCountries.isPending ? "Đang thêm..." : "Thêm quốc gia"} + +
    +
    + + {/* Thêm overflow-y-auto ở phần nội dung để tự động có thanh cuộn dọc khi mở Múi giờ nếu form quá dài */} +
    +
    + + Châu lục * + + } + // Thay đổi ở đây: Bỏ !!form?.continentId, chỉ gán true nếu form thực sự ở chế độ chỉ xem (view mode) + readOnly={false} + placeholder="Chọn châu lục" + value={form.continentId} + options={continentOptions} + onSelect={(item: ContinentsItem) => + setForm((prev) => ({ + ...prev, + continentId: item.id, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + continentId: "", + })) + } + getOptionLabel={(item: ContinentsItem) => `${item.name}`} + getOptionValue={(item: ContinentsItem) => item.id} + /> +
    + +
    +
    + + Mã Quốc Gia * + + } + name="code" + type="text" + value={form.code} + placeholder="Nhập mã quốc gia" + isRequired + onChangeValue={(v) => + setForm((prev) => ({ ...prev, code: String(v) })) + } + /> + + Tên Quốc Gia * + + } + name="name" + type="text" + value={form.name} + placeholder="Nhập tên quốc gia" + isRequired + onChangeValue={(v) => + setForm((prev) => ({ ...prev, name: String(v) })) + } + /> + + Mã ISO 2 * + + } + placeholder="Chọn mã ISO2" + value={form.iso2Code} + options={COUNTRY_OPTIONS} + onSelect={(item) => + setForm((prev) => ({ + ...prev, + iso2Code: item.iso2Code, + iso3Code: item.iso3Code, + phoneCode: item.phoneCode, + timezone: item.timezone, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + iso2Code: "", + iso3Code: "", + phoneCode: "", + timezone: "", + })) + } + getOptionLabel={(item) => `${item.iso2Code} - ${item.name}`} + getOptionValue={(item) => item.iso2Code} // Trùng khớp với form.iso2Code + /> + + Mã ISO 3 * + + } + placeholder="Chọn mã ISO3" + value={form.iso3Code} + options={COUNTRY_OPTIONS} + onSelect={(item) => + setForm((prev) => ({ + ...prev, + iso2Code: item.iso2Code, + iso3Code: item.iso3Code, + phoneCode: item.phoneCode, + timezone: item.timezone, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + iso2Code: "", + iso3Code: "", + phoneCode: "", + timezone: "", + })) + } + getOptionLabel={(item) => `${item.iso3Code} - ${item.name}`} + getOptionValue={(item) => item.iso3Code} // SỬA: Phải là item.iso3Code thay vì item.uuid + /> +
    + + Mã Điện thoại * + + } + placeholder="Chọn mã điện thoại" + value={form.phoneCode} + options={COUNTRY_OPTIONS} + onSelect={(item) => + setForm((prev) => ({ + ...prev, + phoneCode: item.phoneCode, + timezone: item.timezone, + iso2Code: item.iso2Code, + iso3Code: item.iso3Code, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + iso2Code: "", + iso3Code: "", + phoneCode: "", + timezone: "", + })) + } + getOptionLabel={(item) => `${item.phoneCode} (${item.name})`} // Nên hiển thị thêm kèm tên nước cho dễ nhìn + getOptionValue={(item) => item.phoneCode} // SỬA: Phải là item.phoneCode thay vì item.uuid + /> +
    + + + Mã Tiền Tệ * + + } + name="currencyCode" + type="text" + value={form.currencyCode} + placeholder="VND" + isRequired + onChangeValue={(v) => + setForm((prev) => ({ ...prev, currencyCode: String(v) })) + } + /> +
    + + {/* Phần Múi Giờ dưới cùng */} +
    + + Múi Giờ * + + } + placeholder="Chọn múi giờ" + value={form.timezone} + options={COUNTRY_OPTIONS} + onSelect={(item) => + setForm((prev) => ({ + ...prev, + timezone: item.timezone, + phoneCode: item.phoneCode, + iso2Code: item.iso2Code, + iso3Code: item.iso3Code, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + iso2Code: "", + iso3Code: "", + phoneCode: "", + timezone: "", + })) + } + getOptionLabel={(item) => `${item.timezone} (${item.name})`} // Hiển thị kèm tên nước cho trực quan + getOptionValue={(item) => item.timezone} // SỬA: Phải là item.timezone thay vì item.uuid + /> +
    +
    +
    +
    +
    + ); +}; + +export default CreateCountries; diff --git a/src/components/page/countries/CreateCountries/index.ts b/src/components/page/countries/CreateCountries/index.ts new file mode 100644 index 0000000..8b51fec --- /dev/null +++ b/src/components/page/countries/CreateCountries/index.ts @@ -0,0 +1 @@ +export { default } from "./CreateCountries"; diff --git a/src/components/page/countries/DetailCountries/DetailCountries.tsx b/src/components/page/countries/DetailCountries/DetailCountries.tsx new file mode 100644 index 0000000..470b1d0 --- /dev/null +++ b/src/components/page/countries/DetailCountries/DetailCountries.tsx @@ -0,0 +1,157 @@ +"use client"; + +import React from "react"; +import { useParams, useRouter } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { ArrowLeft, Edit } from "iconsax-react"; + +import { httpRequest } from "@/services"; +import countriesServices, { + CountriesDetail, +} from "@/services/countriesServices"; + +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; + +import CustomButton from "@/components/customs/custom-button"; +import StateActive from "@/components/customs/StateActive"; + +function DetailCountries() { + const router = useRouter(); + const params = useParams(); + + const countriesId = params.id as string; + + const countriesDetailQuery = useQuery({ + queryKey: [QUERY_KEY.detail_countries, countriesId], + enabled: !!countriesId, + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: countriesServices.detailCountries(countriesId), + }); + }, + }); + + const countries = countriesDetailQuery.data; + + if (!countries) { + return ( +
    + Không tìm thấy thông tin quốc gia. +
    + ); + } + + return ( +
    +
    +
    +
    +

    router.back()} + > + + {countries.name} +

    + {countries?.status === STATUS_CONTINENTS.ACTIVE && ( + } + onClick={() => router.push(`/countries/update/${countries.id}`)} + > + Chỉnh sửa + + )} +
    + +
    +
    +

    + Mã quốc gia +

    +

    + {countries.code} +

    +
    + +
    +

    + Tên quốc gia +

    +

    + {countries.name} +

    +
    + +
    +

    Mã ISO 2

    +

    + {countries.iso2Code} +

    +
    + +
    +

    Mã ISO 3

    +

    + {countries.iso3Code} +

    +
    + +
    +

    + Mã điện thoại +

    +

    + {countries.phoneCode} +

    +
    + +
    +

    + Mã tiền tệ +

    +

    + {countries.currencyCode} +

    +
    + +
    +

    Múi giờ

    +

    + {countries.timezone} +

    +
    + +
    +

    + Trạng thái +

    + + +
    +
    +
    +
    +
    + ); +} + +export default DetailCountries; diff --git a/src/components/page/countries/DetailCountries/index.ts b/src/components/page/countries/DetailCountries/index.ts new file mode 100644 index 0000000..ab0e737 --- /dev/null +++ b/src/components/page/countries/DetailCountries/index.ts @@ -0,0 +1 @@ +export { default } from "./DetailCountries"; diff --git a/src/components/page/countries/MainPageCountries/MainPageCountries.tsx b/src/components/page/countries/MainPageCountries/MainPageCountries.tsx new file mode 100644 index 0000000..eceee1e --- /dev/null +++ b/src/components/page/countries/MainPageCountries/MainPageCountries.tsx @@ -0,0 +1,356 @@ +"use client"; +import CustomButton from "@/components/customs/custom-button"; +import CustomIcon from "@/components/customs/custom-icon"; +import Search from "@/components/customs/custom-search"; +import CustomTable from "@/components/customs/custom-table"; +import DataWrapper from "@/components/customs/DataWrapper"; +import FilterCustom from "@/components/customs/FilterCustom"; +import StateActive from "@/components/customs/StateActive"; +import { PATH } from "@/constant/config"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import countriesServices, { + CountriesItem, + CountriesResponse, +} from "@/services/countriesServices"; +import * as Tooltip from "@radix-ui/react-tooltip"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { Edit, Eye, LocationAdd, Trash } from "iconsax-react"; +import Link from "next/link"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import React, { useState } from "react"; +import CustomPagination from "@/components/customs/custom-pagination"; +import continentsServices, { + ContinentsResponse, +} from "@/services/continentsServices"; +import CustomDialog from "@/components/customs/custom-dialog"; + +const MainPageCountries = () => { + const router = useRouter(); + const queryClient = useQueryClient(); + const searchParams = useSearchParams(); + const pathname = usePathname(); + + const [uuidDelete, setUuidDelete] = useState(""); + + const page = Number(searchParams.get("_page") ?? "1"); + const pageSize = Number(searchParams.get("_pageSize") ?? "10"); + const keyword = searchParams.get("_keyword") ?? ""; + const status = searchParams.get("_status"); + const continentId = searchParams.get("_continentId"); + + // Nâng cấp hàm cập nhật Query URL để hỗ trợ cập nhật nhiều tham số cùng lúc + const updateQuery = ( + updates: Record, + replace = false, + ) => { + const params = new URLSearchParams(searchParams.toString()); + + Object.entries(updates).forEach(([key, value]) => { + if (value === undefined || value === null || value === "") { + params.delete(key); + } else { + params.set(key, String(value)); + } + }); + + const url = params.toString() + ? `${pathname}?${params.toString()}` + : pathname; + + if (replace) { + router.replace(url); + } else { + router.push(url); + } + }; + + const countriesQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_countries, page, pageSize, keyword, status], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: countriesServices.getCountries({ + page, + limit: pageSize, + search: keyword, + status: status || undefined, // active | inactive | undefined + continentId: continentId, + }), + }); + }, + }); + + const continentQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_continents, STATUS_CONTINENTS.ACTIVE], + queryFn: async () => { + const res = await httpRequest({ + http: continentsServices.getContinents({ + status: STATUS_CONTINENTS.ACTIVE, + }), + showMessageFailed: true, + }); + + return res; + }, + }); + + const deleteCountriesMutation = useMutation({ + mutationFn: async (id: string) => { + return await httpRequest({ + http: countriesServices.deleteCountries(id), + showMessageSuccess: true, + msgSuccess: "Xóa quốc gia thành công!", + showMessageFailed: true, + }); + }, + + onSuccess: () => { + setUuidDelete(""); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_countries], + }); + }, + + onError: (error: any) => { + console.log(error); + }, + }); + + return ( +
    +
    + {/* Header */} +
    +

    Quốc Gia

    + + } + href={PATH.CreateCountries} + className="w-full sm:w-auto" + > + Thêm mới + +
    + + {/* Bộ lọc & Tìm kiếm */} +
    + {/* Search */} +
    + + updateQuery({ + _keyword: value, + _page: 1, + }) + } + placeholder="Tìm kiếm theo mã/tên/ISO2/ISO3" + /> +
    + + {/* Status */} +
    + + name="Trạng thái" + value={status} + onChange={(value) => + updateQuery({ + _status: value ?? "", + _page: 1, + }) + } + listOption={[ + { + uuid: STATUS_CONTINENTS.ACTIVE, + name: "Hoạt động", + }, + { + uuid: STATUS_CONTINENTS.INACTIVE, + name: "Đã xóa", + }, + ]} + /> +
    + + {/* Continent */} +
    + + name="Châu lục" + value={continentId} + onChange={(value) => + updateQuery({ + _continentId: value ?? "", + _page: 1, + }) + } + listOption={ + continentQuery.data?.items?.map((item) => ({ + uuid: item.id, + name: item.name, + })) ?? [] + } + /> +
    +
    +
    + {/* Bảng dữ liệu */} +
    + + item.id} + data={countriesQuery.data?.items ?? []} + column={[ + { + fixedLeft: true, + title: "MÃ QUỐC GIA", + render: (item: CountriesItem) => ( + + + + {/* SỬA: Link dẫn tới chi tiết châu lục thay vì bệnh nhân (patient) */} + + {item.code} + + + +

    + Xem chi tiết +

    +
    +
    +
    + ), + }, + { + title: "TÊN QUỐC GIA", + render: (item: CountriesItem) => ( + {item.name || "---"} + ), + }, + { + title: "MÃ ISO 2", + render: (item: CountriesItem) => ( + {item.iso2Code || "---"} + ), + }, + { + title: "MÃ ISO 3", + render: (item: CountriesItem) => ( + {item.iso3Code || "---"} + ), + }, + { + title: "MÃ ĐIỆN THOẠI", + render: (item: CountriesItem) => ( + {item.phoneCode || "---"} + ), + }, + { + title: "MÃ TIỀN TỆ", + render: (item: CountriesItem) => ( + {item.currencyCode || "---"} + ), + }, + { + title: "MÚI GIỜ", + render: (item: CountriesItem) => ( + {item.timezone || "---"} + ), + }, + { + title: "TRẠNG THÁI", + render: (item: CountriesItem) => ( + + ), + }, + { + fixedRight: true, + title: "HÀNH ĐỘNG", + render: (item: CountriesItem) => ( +
    + } + tooltip="Xem chi tiết" + /> + {item?.status === STATUS_CONTINENTS.ACTIVE && ( + <> + } + tooltip="Chỉnh sửa" + href={`/countries/update?id=${item.id}`} + /> + } + tooltip="Xóa" + onClick={() => setUuidDelete(item?.id)} + /> + + )} +
    + ), + }, + ]} + /> +
    + {/* Phân trang */} + updateQuery({ _page: value })} + onSetPageSize={(value) => updateQuery({ _pageSize: value, _page: 1 })} + dependencies={[pageSize, keyword]} + /> +
    + + {/* Dialog xác nhận xóa */} + setUuidDelete("")} + // SỬA: Đổi text liên quan từ "nhà thầu" thành "châu lục" để khớp ngữ cảnh của page + title="Xóa quốc gia" + note="Bạn có chắc chắn muốn xóa quốc gia này?" + onSubmit={() => { + if (!uuidDelete) return; + + deleteCountriesMutation.mutate(uuidDelete); + }} + /> +
    + ); +}; + +export default MainPageCountries; diff --git a/src/components/page/countries/MainPageCountries/index.ts b/src/components/page/countries/MainPageCountries/index.ts new file mode 100644 index 0000000..f8ce6ee --- /dev/null +++ b/src/components/page/countries/MainPageCountries/index.ts @@ -0,0 +1 @@ +export { default } from "./MainPageCountries"; diff --git a/src/components/page/countries/UpdateCountries/UpdateCountries.tsx b/src/components/page/countries/UpdateCountries/UpdateCountries.tsx new file mode 100644 index 0000000..09d860c --- /dev/null +++ b/src/components/page/countries/UpdateCountries/UpdateCountries.tsx @@ -0,0 +1,403 @@ +"use client"; +import { toastSuccess, toastWarn } from "@/common/funcs/toast"; +import CustomButton from "@/components/customs/custom-button"; +import FormCustom from "@/components/utils/FormCustom"; +import InputForm from "@/components/utils/FormCustom/compoents/InputForm/InputForm"; +import SelectForm from "@/components/utils/FormCustom/compoents/SelectForm/SelectForm"; +import { COUNTRY_OPTIONS } from "@/constant/config/country_option"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import continentsServices, { + ContinentsItem, + ContinentsResponse, +} from "@/services/continentsServices"; +import countriesServices, { + CountriesDetail, +} from "@/services/countriesServices"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { ArrowLeft } from "iconsax-react"; +import { useRouter, useSearchParams } from "next/navigation"; +import React, { useEffect, useMemo, useState } from "react"; + +export interface IUpdateCountries { + continentId: string; + code: string; + name: string; + iso2Code: string; + iso3Code: string; + phoneCode: string; + currencyCode: string; + timezone: string; +} + +function UpdateCountries() { + const router = useRouter(); + const queryClient = useQueryClient(); + const searchParams = useSearchParams(); + + // Lấy từ dynamic route parameter hoặc query parameter + const countriesId = searchParams.get("id") || ""; + + const [form, setForm] = useState({ + continentId: "", + code: "", + name: "", + iso2Code: "", + iso3Code: "", + phoneCode: "", + currencyCode: "", + timezone: "", + }); + + /* ========================= + GET DETAIL API + ========================= */ + const { data, isLoading } = useQuery({ + queryKey: [QUERY_KEY.detail_countries, countriesId], + enabled: !!countriesId, + queryFn: async () => { + return await httpRequest({ + http: countriesServices.detailCountries(countriesId), + }); + }, + }); + + useEffect(() => { + if (!data) return; + + setForm({ + continentId: data?.continentId || "", + code: data?.code || "", + name: data?.name || "", + iso2Code: data?.iso2Code || "", + iso3Code: data?.iso3Code || "", + phoneCode: data?.phoneCode || "", + currencyCode: data?.currencyCode || "", + timezone: data?.timezone || "", + }); + }, [data]); + + /* ========================= + GET LIST CONTINENTS + ========================= */ + const continentQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_continents, STATUS_CONTINENTS.ACTIVE], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: continentsServices.getContinents({ + status: STATUS_CONTINENTS.ACTIVE, + }), + }); + }, + }); + + const continentOptions = useMemo(() => { + return continentQuery.data?.items || []; + }, [continentQuery.data]); + + // SỬA TẠI ĐÂY: Loại bỏ việc chặn bởi continentOptions.length + // để form hiển thị ngay thông tin quốc gia khi vừa load xong chi tiết + + /* ========================= + UPDATE MUTATION + ========================= */ + const funcUpdateCountries = useMutation({ + mutationFn: async () => { + return await httpRequest({ + showMessageFailed: false, + http: countriesServices.updateCountries(countriesId, { + continentId: form?.continentId, + code: form?.code, + name: form?.name, + iso2Code: form?.iso2Code, + iso3Code: form?.iso3Code, + phoneCode: form?.phoneCode, + currencyCode: form?.currencyCode, + timezone: form?.timezone, + }), + }); + }, + + onSuccess: () => { + toastSuccess({ + msg: "Chỉnh sửa quốc gia thành công!", + }); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_countries], + }); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.detail_countries, countriesId], + }); + + router.back(); + }, + + onError: (error: any) => { + toastWarn({ + msg: + error?.response?.data?.error?.message ?? + error?.message ?? + "Có lỗi xảy ra khi cập nhật.", + }); + }, + }); + + const handleSubmit = () => { + if (!form?.continentId) { + return toastWarn({ msg: "Vui lòng chọn châu lục" }); + } + funcUpdateCountries.mutate(); + }; + + if (isLoading) { + return ( +
    + Đang tải thông tin quốc gia... +
    + ); + } + + return ( + +
    +
    +

    router.back()} + > + Chỉnh Sửa Quốc Gia +

    +
    + router.back()} + > + Hủy bỏ + + + + {/* SỬA: Đổi text hiển thị đúng ngữ cảnh cập nhật quốc gia */} + {funcUpdateCountries.isPending ? "Đang lưu..." : "Lưu thay đổi"} + +
    +
    + +
    +
    + + Châu lục * + + } + placeholder="Chọn châu lục" + value={form.continentId} + options={continentOptions} + onSelect={(item: ContinentsItem) => + setForm((prev) => ({ + ...prev, + continentId: item.id, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + continentId: "", + })) + } + getOptionLabel={(item: ContinentsItem) => `${item.name}`} + getOptionValue={(item: ContinentsItem) => item.id} + /> +
    + +
    +
    + + Mã Quốc Gia * + + } + name="code" + type="text" + value={form.code} + placeholder="Nhập mã quốc gia" + isRequired + onChangeValue={(v) => + setForm((prev) => ({ ...prev, code: String(v) })) + } + /> + + Tên Quốc Gia * + + } + name="name" + type="text" + value={form.name} + placeholder="Nhập tên quốc gia" + isRequired + onChangeValue={(v) => + setForm((prev) => ({ ...prev, name: String(v) })) + } + /> + + Mã ISO 2 * + + } + placeholder="Chọn mã ISO2" + value={form.iso2Code} + options={COUNTRY_OPTIONS} + onSelect={(item) => + setForm((prev) => ({ + ...prev, + iso2Code: item.iso2Code, + iso3Code: item.iso3Code, + phoneCode: item.phoneCode, + timezone: item.timezone, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + iso2Code: "", + iso3Code: "", + phoneCode: "", + timezone: "", + })) + } + getOptionLabel={(item) => `${item.iso2Code} - ${item.name}`} + getOptionValue={(item) => item.iso2Code} + /> + + Mã ISO 3 * + + } + placeholder="Chọn mã ISO3" + value={form.iso3Code} + options={COUNTRY_OPTIONS} + onSelect={(item) => + setForm((prev) => ({ + ...prev, + iso2Code: item.iso2Code, + iso3Code: item.iso3Code, + phoneCode: item.phoneCode, + timezone: item.timezone, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + iso2Code: "", + iso3Code: "", + phoneCode: "", + timezone: "", + })) + } + getOptionLabel={(item) => `${item.iso3Code} - ${item.name}`} + getOptionValue={(item) => item.iso3Code} + /> +
    + + Mã Điện thoại * + + } + placeholder="Chọn mã điện thoại" + value={form.phoneCode} + options={COUNTRY_OPTIONS} + onSelect={(item) => + setForm((prev) => ({ + ...prev, + phoneCode: item.phoneCode, + timezone: item.timezone, + iso2Code: item.iso2Code, + iso3Code: item.iso3Code, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + iso2Code: "", + iso3Code: "", + phoneCode: "", + timezone: "", + })) + } + getOptionLabel={(item) => `${item.phoneCode} (${item.name})`} + getOptionValue={(item) => item.phoneCode} + /> +
    + + + Mã Tiền Tệ * + + } + name="currencyCode" + type="text" + value={form.currencyCode} + placeholder="VND" + isRequired + onChangeValue={(v) => + setForm((prev) => ({ ...prev, currencyCode: String(v) })) + } + /> +
    + +
    + + Múi Giờ * + + } + placeholder="Chọn múi giờ" + value={form.timezone} + options={COUNTRY_OPTIONS} + onSelect={(item) => + setForm((prev) => ({ + ...prev, + timezone: item.timezone, + phoneCode: item.phoneCode, + iso2Code: item.iso2Code, + iso3Code: item.iso3Code, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + iso2Code: "", + iso3Code: "", + phoneCode: "", + timezone: "", + })) + } + getOptionLabel={(item) => `${item.timezone} (${item.name})`} + getOptionValue={(item) => item.timezone} + /> +
    +
    +
    +
    +
    + ); +} + +export default UpdateCountries; diff --git a/src/components/page/countries/UpdateCountries/index.ts b/src/components/page/countries/UpdateCountries/index.ts new file mode 100644 index 0000000..ff74272 --- /dev/null +++ b/src/components/page/countries/UpdateCountries/index.ts @@ -0,0 +1 @@ +export { default } from "./UpdateCountries"; diff --git a/src/components/page/country-regions/CreateCountryRegions/CreateCountryRegions.tsx b/src/components/page/country-regions/CreateCountryRegions/CreateCountryRegions.tsx new file mode 100644 index 0000000..65176f3 --- /dev/null +++ b/src/components/page/country-regions/CreateCountryRegions/CreateCountryRegions.tsx @@ -0,0 +1,213 @@ +"use client"; +import { toastWarn } from "@/common/funcs/toast"; +import CustomButton from "@/components/customs/custom-button"; +import CustomLoading from "@/components/customs/custom-loading"; +import FormCustom from "@/components/utils/FormCustom"; +import InputForm from "@/components/utils/FormCustom/compoents/InputForm/InputForm"; +import SelectForm from "@/components/utils/FormCustom/compoents/SelectForm/SelectForm"; +import { ContextFormCustom } from "@/components/utils/FormCustom/contexts"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; +import countriesServices, { + CountriesItem, + CountriesResponse, +} from "@/services/countriesServices"; +import countryServices from "@/services/countryServices"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { CloseCircle, FolderOpen } from "iconsax-react"; +import React, { useMemo, useState } from "react"; + +export interface PropsCreateCountryRegions { + onClose: () => void; +} + +export interface IFormCreateCountryRegions { + code: string; + name: string; + countryId: string; +} + +function CreateCountryRegions({ onClose }: PropsCreateCountryRegions) { + const queryClient = useQueryClient(); + + const [form, setForm] = useState({ + code: "", + name: "", + countryId: "", + }); + + const countriesQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_countries, STATUS_CONTINENTS.ACTIVE], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: countriesServices.getCountries({ + status: STATUS_CONTINENTS.ACTIVE, // active | inactive | undefined + }), + }); + }, + }); + + const countriesOptions = useMemo(() => { + return countriesQuery.data?.items || []; + }, [countriesQuery.data]); + console.log(countriesOptions); + + const funcCreateCountry = useMutation({ + mutationFn: async () => { + return await httpRequest({ + showMessageFailed: true, + showMessageSuccess: true, + msgSuccess: "Thêm vùng thành công!", + + http: countryServices.createCountry({ + code: form?.code, + name: form?.name, + countryId: form?.countryId, + }), + }); + }, + onError(error: any) { + // Lấy message lỗi từ backend trả về + const message = error?.response?.data?.error?.message || error?.message; + + // Bật thông báo Toast dạng cảnh báo + toastWarn({ msg: message }); + }, + onSuccess() { + /* REFRESH LIST */ + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_country_regions], + }); + + onClose(); + }, + }); + + const handleSubmit = () => { + const cleanCode = form.code?.trim(); + const cleanName = form.name?.trim(); + const cleanCountryId = form.countryId?.trim(); + + if (!cleanCode) { + return toastWarn({ msg: "Vui lòng nhập mã châu lục!" }); + } + if (!cleanName) { + return toastWarn({ msg: "Vui lòng nhập tên châu lục!" }); + } + if (!cleanCountryId) { + return toastWarn({ msg: "Vui lòng chọn quốc gia!" }); + } + + // Cập nhật lại state chuẩn trước khi gửi + setForm({ code: cleanCode, name: cleanName, countryId: cleanCountryId }); + + return funcCreateCountry.mutate(); + }; + + return ( + + +
    + {/* Header */} +

    + Thêm Mới Vùng +

    + + {/* Form */} + +
    + + Quốc gia * + + } + readOnly={!!form?.countryId} + placeholder="Chọn quốc gia" + value={form.countryId} + options={countriesOptions} + onSelect={(item: CountriesItem) => + setForm((prev) => ({ + ...prev, + countryId: item.id, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + countryId: "", + })) + } + // ✅ SỬA TẠI ĐÂY: Truyền trực tiếp item.name hoặc dùng đúng dấu huyền ` + getOptionLabel={(item: CountriesItem) => item.name} + getOptionValue={(item: CountriesItem) => item.id} + /> +
    + + Mã vùng * + + } + /> +
    +
    + + Tên vùng * + + } + /> +
    +
    + + {/* Footer */} +
    + + Hủy bỏ + + + + {({ isDone }) => ( + } + onClick={handleSubmit} + > + Lưu lại + + )} + +
    + + {/* Close */} + +
    +
    + ); +} + +export default CreateCountryRegions; diff --git a/src/components/page/country-regions/CreateCountryRegions/index.ts b/src/components/page/country-regions/CreateCountryRegions/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/components/page/country-regions/DetailCountryRegions/DetailCountryRegions.tsx b/src/components/page/country-regions/DetailCountryRegions/DetailCountryRegions.tsx new file mode 100644 index 0000000..54d50a0 --- /dev/null +++ b/src/components/page/country-regions/DetailCountryRegions/DetailCountryRegions.tsx @@ -0,0 +1,182 @@ +"use client"; +import CustomButton from "@/components/customs/custom-button"; +import StateActive from "@/components/customs/StateActive"; +import PositionContainer from "@/components/utils/PositionContainer"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; + +import { useQuery } from "@tanstack/react-query"; +import { ArrowLeft, Edit } from "iconsax-react"; +import { + useParams, + usePathname, + useRouter, + useSearchParams, +} from "next/navigation"; +import React from "react"; +import UpdateCountryRegions from "../UpdateCountryRegions"; +import countryServices, { CountryDetail } from "@/services/countryServices"; + +function DetailCountryRegions() { + const params = useParams(); + const router = useRouter(); + const searchParams = useSearchParams(); + const pathname = usePathname(); + + const countryRegionId = params?.id as string; + + const _uuidCountryRegion = searchParams.get("_uuidCountryRegion"); + + const updateQuery = ( + updates: Record, + replace = false, + ) => { + const params = new URLSearchParams(searchParams.toString()); + + Object.entries(updates).forEach(([key, value]) => { + if (value === undefined || value === null || value === "") { + params.delete(key); + } else { + params.set(key, String(value)); + } + }); + + const url = params.toString() + ? `${pathname}?${params.toString()}` + : pathname; + + if (replace) { + router.replace(url); + } else { + router.push(url); + } + }; + + const CountryDetailQuery = useQuery({ + queryKey: [QUERY_KEY.detail_country_region, countryRegionId], + enabled: !!countryRegionId, + queryFn: async () => { + const res = await httpRequest({ + showMessageFailed: true, + http: countryServices.detailCountry(countryRegionId), + }); + + return ( + res || { + id: "", + code: "", + status: "", + } + ); + }, + }); + + const countryRegions = CountryDetailQuery.data; + + return ( +
    +
    +
    +
    +
    +

    router.back()} + > + {countryRegions?.name} +

    + {countryRegions?.status === STATUS_CONTINENTS.ACTIVE && ( +
    + } + onClick={() => + updateQuery( + { + _uuidCountryRegion: countryRegions?.id, + }, + true, + ) + } + > + Chỉnh sửa + +
    + )} +
    + + {/* Thông tin chi tiết bệnh nhân */} +
    +
    +

    + Mã vùng miền +

    +

    + {countryRegions?.code} +

    +
    + +
    +

    + Tên vùng miền +

    +

    + {countryRegions?.name} +

    +
    +
    +

    + TRẠNG THÁI: +

    + +
    +
    +
    +
    +
    + + updateQuery( + { + _uuidCountryRegion: null, + }, + true, + ) + } + > + {_uuidCountryRegion && ( + + updateQuery( + { + _uuidCountryRegion: null, + }, + true, + ) + } + /> + )} + +
    + ); +} + +export default DetailCountryRegions; diff --git a/src/components/page/country-regions/DetailCountryRegions/index.ts b/src/components/page/country-regions/DetailCountryRegions/index.ts new file mode 100644 index 0000000..ce8389b --- /dev/null +++ b/src/components/page/country-regions/DetailCountryRegions/index.ts @@ -0,0 +1 @@ +export { default } from "./DetailCountryRegions"; diff --git a/src/components/page/country-regions/MainPageCountryRegions/MainPageCountryRegions.tsx b/src/components/page/country-regions/MainPageCountryRegions/MainPageCountryRegions.tsx new file mode 100644 index 0000000..b9e1de5 --- /dev/null +++ b/src/components/page/country-regions/MainPageCountryRegions/MainPageCountryRegions.tsx @@ -0,0 +1,386 @@ +"use client"; +import CustomButton from "@/components/customs/custom-button"; +import CustomDialog from "@/components/customs/custom-dialog"; +import CustomIcon from "@/components/customs/custom-icon"; +import CustomPagination from "@/components/customs/custom-pagination"; +import Search from "@/components/customs/custom-search"; +import CustomTable from "@/components/customs/custom-table"; +import DataWrapper from "@/components/customs/DataWrapper"; +import FilterCustom from "@/components/customs/FilterCustom"; +import PositionContainer from "@/components/utils/PositionContainer"; +import { PATH } from "@/constant/config"; +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; + +import * as Tooltip from "@radix-ui/react-tooltip"; // Sửa lại cách import chuẩn của Radix UI +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { Edit, Eye, Global, Hierarchy, Trash } from "iconsax-react"; +import Link from "next/link"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import React, { Fragment, useState } from "react"; +// import CreateContinents from "../CreateContinents"; +import StateActive from "@/components/customs/StateActive"; +import countryServices, { + CountryItem, + CountryResponse, +} from "@/services/countryServices"; +import countriesServices, { + CountriesResponse, +} from "@/services/countriesServices"; +import CreateCountryRegions from "../CreateCountryRegions/CreateCountryRegions"; +import UpdateCountryRegion from "../UpdateCountryRegions"; + +function MainPageCountryRegions() { + const router = useRouter(); + const queryClient = useQueryClient(); + const searchParams = useSearchParams(); + const pathname = usePathname(); + + const [uuidDelete, setUuidDelete] = useState(""); + + const action = searchParams.get("action"); + const _uuidCountryRegion = searchParams.get("_uuidCountryRegion"); + + const page = Number(searchParams.get("_page") ?? "1"); + const pageSize = Number(searchParams.get("_pageSize") ?? "10"); + const keyword = searchParams.get("_keyword") ?? ""; + const status = searchParams.get("_status"); + const countriesId = searchParams.get("_countriesId"); + + // Nâng cấp hàm cập nhật Query URL để hỗ trợ cập nhật nhiều tham số cùng lúc + const updateQuery = ( + updates: Record, + replace = false, + ) => { + const params = new URLSearchParams(searchParams.toString()); + + Object.entries(updates).forEach(([key, value]) => { + if (value === undefined || value === null || value === "") { + params.delete(key); + } else { + params.set(key, String(value)); + } + }); + + const url = params.toString() + ? `${pathname}?${params.toString()}` + : pathname; + + if (replace) { + router.replace(url); + } else { + router.push(url); + } + }; + + const countryQuery = useQuery({ + queryKey: [ + QUERY_KEY.table_list_country_regions, + page, + pageSize, + keyword, + status, + ], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: countryServices.getCountry({ + page, + limit: pageSize, + search: keyword, + status: status || undefined, // active | inactive | undefined + }), + }); + }, + }); + + const countriesQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_countries, STATUS_CONTINENTS.ACTIVE], + queryFn: async () => { + const res = await httpRequest({ + http: countriesServices.getCountries({ + status: STATUS_CONTINENTS.ACTIVE, + }), + showMessageFailed: true, + }); + + return res; + }, + }); + + const deleteCountryMutation = useMutation({ + mutationFn: async (id: string) => { + return await httpRequest({ + http: countryServices.deleteCountry(id), + showMessageSuccess: true, + msgSuccess: "Xóa vùng thành công!", + showMessageFailed: true, + }); + }, + + onSuccess: () => { + setUuidDelete(""); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_country_regions], + }); + }, + + onError: (error: any) => { + console.log(error); + }, + }); + + return ( +
    +
    + {/* Header */} +
    +

    Vùng Miền

    + } + onClick={() => { + // SỬA: Điều hướng chuẩn App Router bằng cách cập nhật query string + updateQuery({ action: "create" }); + }} + > + Thêm mới + +
    + + {/* Bộ lọc & Tìm kiếm */} +
    + {/* Search */} +
    + updateQuery({ _keyword: value, _page: 1 })} + placeholder="Tìm kiếm theo tên, mã vùng" + /> +
    +
    + + name="Trạng thái" + value={status ? status : null} + onChange={(value) => + updateQuery({ _status: value ?? "", _page: 1 }) + } + listOption={[ + { + uuid: STATUS_CONTINENTS.ACTIVE, + name: "Hoạt động", + }, + { + uuid: STATUS_CONTINENTS.INACTIVE, + name: "Đã xóa", + }, + ]} + /> +
    +
    + + name="Quốc gia" + value={countriesId} + onChange={(value) => + updateQuery({ + _countriesId: value ?? "", + _page: 1, + }) + } + listOption={ + countriesQuery.data?.items?.map((item) => ({ + uuid: item.id, + name: item.name, + })) ?? [] + } + /> +
    +
    +
    + {/* Bảng dữ liệu */} +
    + + item.id} + data={countryQuery.data?.items ?? []} + column={[ + { + fixedLeft: true, + title: "MÃ VÙNG MIỀN", + render: (item: CountryItem) => ( + + + + {/* SỬA: Link dẫn tới chi tiết châu lục thay vì bệnh nhân (patient) */} + + {item.code} + + + +

    + Xem chi tiết +

    +
    +
    +
    + ), + }, + { + title: "TÊN VÙNG MIỀN", + render: (item: CountryItem) => ( + {item.name || "---"} + ), + }, + { + title: "TRẠNG THÁI", + render: (item: CountryItem) => ( + + ), + }, + { + fixedRight: true, + title: "HÀNH ĐỘNG", + render: (item: CountryItem) => ( +
    + } + tooltip="Xem chi tiết" + /> + {item?.status === STATUS_CONTINENTS.ACTIVE && ( + <> + } + tooltip="Chỉnh sửa" + onClick={() => + updateQuery( + { + _uuidCountryRegion: item.id, + }, + true, + ) + } + /> + } + tooltip="Xóa" + onClick={() => setUuidDelete(item?.id)} + /> + + )} +
    + ), + }, + ]} + /> +
    + {/* Phân trang */} + updateQuery({ _page: value })} + onSetPageSize={(value) => updateQuery({ _pageSize: value, _page: 1 })} + dependencies={[pageSize, keyword]} + /> +
    + + + updateQuery( + { + action: null, + }, + true, + ) + } + > + {action === "create" && ( + + updateQuery( + { + action: null, + }, + true, + ) + } + /> + )} + + + + updateQuery( + { + _uuidCountryRegion: null, + }, + true, + ) + } + > + {_uuidCountryRegion && ( + + updateQuery( + { + _uuidCountryRegion: null, + }, + true, + ) + } + /> + )} + + + {/* Dialog xác nhận xóa */} + setUuidDelete("")} + // SỬA: Đổi text liên quan từ "nhà thầu" thành "châu lục" để khớp ngữ cảnh của page + title="Xóa châu lục" + note="Bạn có chắc chắn muốn xóa vùng này?" + onSubmit={() => { + if (!uuidDelete) return; + + deleteCountryMutation.mutate(uuidDelete); + }} + /> +
    + ); +} + +export default MainPageCountryRegions; diff --git a/src/components/page/country-regions/MainPageCountryRegions/index.ts b/src/components/page/country-regions/MainPageCountryRegions/index.ts new file mode 100644 index 0000000..c3bda8c --- /dev/null +++ b/src/components/page/country-regions/MainPageCountryRegions/index.ts @@ -0,0 +1 @@ +export { default } from "./MainPageCountryRegions"; diff --git a/src/components/page/country-regions/UpdateCountryRegions/UpdateCountryRegions.tsx b/src/components/page/country-regions/UpdateCountryRegions/UpdateCountryRegions.tsx new file mode 100644 index 0000000..faf1d3f --- /dev/null +++ b/src/components/page/country-regions/UpdateCountryRegions/UpdateCountryRegions.tsx @@ -0,0 +1,232 @@ +"use client"; + +import React, { useEffect, useMemo, useState } from "react"; +import { useSearchParams } from "next/navigation"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; + +import { QUERY_KEY, STATUS_CONTINENTS } from "@/constant/config/enum"; +import { httpRequest } from "@/services"; + +import FormCustom from "@/components/utils/FormCustom"; +import CustomLoading from "@/components/customs/custom-loading"; +import { toastWarn, toastSuccess } from "@/common/funcs/toast"; +import InputForm from "@/components/utils/FormCustom/compoents/InputForm/InputForm"; +import CustomButton from "@/components/customs/custom-button"; +import { ContextFormCustom } from "@/components/utils/FormCustom/contexts"; +import { CloseCircle, FolderOpen } from "iconsax-react"; +import countryServices, { CountryDetail } from "@/services/countryServices"; +import countriesServices, { + CountriesItem, + CountriesResponse, +} from "@/services/countriesServices"; +import SelectForm from "@/components/utils/FormCustom/compoents/SelectForm/SelectForm"; + +export interface PropsUpdateCountryRegion { + onClose: () => void; +} + +export interface IUpdateCountryRegion { + name: string; + code: string; + countryId: string; +} + +export default function UpdateCountryRegion({ + onClose, +}: PropsUpdateCountryRegion) { + const queryClient = useQueryClient(); + const searchParams = useSearchParams(); + + const uuidCountryRegion = searchParams.get("_uuidCountryRegion"); + + const [form, setForm] = useState({ + name: "", + code: "", + countryId: "", + }); + + const countriesQuery = useQuery({ + queryKey: [QUERY_KEY.table_list_countries, STATUS_CONTINENTS.ACTIVE], + queryFn: async () => { + return await httpRequest({ + showMessageFailed: true, + http: countriesServices.getCountries({ + status: STATUS_CONTINENTS.ACTIVE, // active | inactive | undefined + }), + }); + }, + }); + + const countriesOptions = useMemo(() => { + return countriesQuery.data?.items || []; + }, [countriesQuery.data]); + console.log(countriesOptions); + + const { data, isLoading, isError } = useQuery({ + queryKey: [QUERY_KEY.detail_country_region, uuidCountryRegion], + enabled: !!uuidCountryRegion, + queryFn: async () => { + return await httpRequest({ + http: countryServices.detailCountry(uuidCountryRegion!), + }); + }, + }); + + useEffect(() => { + if (!data) return; + + setForm({ + name: data.name ?? "", + code: data.code ?? "", + countryId: data.countryId ?? "", + }); + }, [data]); + + const updateCountryMutation = useMutation({ + mutationFn: async () => { + return await httpRequest({ + showMessageFailed: false, + http: countryServices.updateCountry(uuidCountryRegion as string, { + name: form.name, + code: form.code, + countryId: form.countryId, + }), + }); + }, + + onSuccess: () => { + toastSuccess({ + msg: "Chỉnh sửa vùng thành công!", + }); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.table_list_country_regions], + }); + + queryClient.invalidateQueries({ + queryKey: [QUERY_KEY.detail_country_region, uuidCountryRegion], + }); + + onClose(); + }, + + onError: (error: any) => { + toastWarn({ + msg: + error?.response?.data?.error?.message ?? + error?.message ?? + "Có lỗi xảy ra.", + }); + }, + }); + + const handleSubmit = () => { + updateCountryMutation.mutate(); + }; + + return ( + + + +
    + {/* Header */} +

    + Chỉnh Sửa Vùng +

    + + {/* Form */} + +
    + + Quốc gia * + + } + readOnly={false} + placeholder="Chọn quốc gia" + value={form.countryId} + options={countriesOptions} + onSelect={(item: CountriesItem) => + setForm((prev) => ({ + ...prev, + countryId: item.id, + })) + } + onClean={() => + setForm((prev) => ({ + ...prev, + countryId: "", + })) + } + // ✅ SỬA TẠI ĐÂY: Truyền trực tiếp item.name hoặc dùng đúng dấu huyền ` + getOptionLabel={(item: CountriesItem) => item.name} + getOptionValue={(item: CountriesItem) => item.id} + /> +
    + + Mã vùng * + + } + /> +
    +
    + + Tên vùng * + + } + /> +
    +
    + + {/* Footer */} +
    + + Hủy bỏ + + + {/* + {({ isDone }) => ( + + )} + */} + } + onClick={handleSubmit} + > + Lưu lại + +
    + + {/* Close */} + +
    +
    + ); +} diff --git a/src/components/page/country-regions/UpdateCountryRegions/index.ts b/src/components/page/country-regions/UpdateCountryRegions/index.ts new file mode 100644 index 0000000..f259c69 --- /dev/null +++ b/src/components/page/country-regions/UpdateCountryRegions/index.ts @@ -0,0 +1 @@ +export { default } from "./UpdateCountryRegions"; diff --git a/src/components/protected/LoadingTopBar/LoadingTopBar.tsx b/src/components/protected/LoadingTopBar/LoadingTopBar.tsx new file mode 100644 index 0000000..fd14374 --- /dev/null +++ b/src/components/protected/LoadingTopBar/LoadingTopBar.tsx @@ -0,0 +1,32 @@ +"use client"; + +import NProgress from "nprogress"; +import { useEffect } from "react"; +import "nprogress/nprogress.css"; + +function LoadingTopBar() { + useEffect(() => { + NProgress.configure({ showSpinner: false }); + const handleClick = (e: any) => { + const target = e.target.closest("a"); + if (target?.href && target.href.startsWith(window.location.origin)) { + NProgress.start(); + } + }; + + const handleStop = () => { + NProgress.done(); + }; + + window.addEventListener("click", handleClick); + window.addEventListener("load", handleStop); + + return () => { + window.removeEventListener("click", handleClick); + window.removeEventListener("load", handleStop); + }; + }, []); + return null; +} + +export default LoadingTopBar; diff --git a/src/components/protected/LoadingTopBar/index.ts b/src/components/protected/LoadingTopBar/index.ts new file mode 100644 index 0000000..6219428 --- /dev/null +++ b/src/components/protected/LoadingTopBar/index.ts @@ -0,0 +1 @@ +export { default } from "./LoadingTopBar"; diff --git a/src/components/protected/RequireAuth/index.tsx b/src/components/protected/RequireAuth/index.tsx new file mode 100644 index 0000000..d6bf150 --- /dev/null +++ b/src/components/protected/RequireAuth/index.tsx @@ -0,0 +1,28 @@ +"use client"; +import { PATH } from "@/constant/config"; +import { RootState } from "@/redux/store"; +import { useRouter } from "next/navigation"; +import React, { useEffect } from "react"; +import { useSelector } from "react-redux"; + +interface IRequireAuthProps { + children: React.ReactNode; +} + +export default function RequireAuth(props: IRequireAuthProps) { + const router = useRouter(); + const { loading } = useSelector((state: RootState) => state.site); + const { isLogin } = useSelector((state: RootState) => state.auth); + + useEffect(() => { + if (!isLogin && !loading) { + router.replace(PATH.Login); + } + }, [isLogin, loading, router]); + + if (isLogin && !loading) { + return <>{props.children}; + } + + return
    ; +} diff --git a/src/components/protected/RequiredLogout/index.tsx b/src/components/protected/RequiredLogout/index.tsx new file mode 100644 index 0000000..0e3cb5c --- /dev/null +++ b/src/components/protected/RequiredLogout/index.tsx @@ -0,0 +1,28 @@ +"use client"; + +import { PATH } from "@/constant/config"; +import { RootState } from "@/redux/store"; +import { useRouter } from "next/navigation"; +import { ReactNode, useEffect } from "react"; +import { useSelector } from "react-redux"; + +interface Props { + children: ReactNode; +} + +function RequiredLogout({ children }: Props) { + const { replace } = useRouter(); + const { isLogin } = useSelector((state: RootState) => state.auth); + const { loading } = useSelector((state: RootState) => state.site); + + useEffect(() => { + if (!isLogin && !loading) replace(PATH.Home); + }, [isLogin, loading, replace]); + if (!isLogin && !loading) { + return <>{children}; + } + + return
    ; +} + +export default RequiredLogout; diff --git a/src/components/protected/SplashScreen/SplashScreen.tsx b/src/components/protected/SplashScreen/SplashScreen.tsx new file mode 100644 index 0000000..883895d --- /dev/null +++ b/src/components/protected/SplashScreen/SplashScreen.tsx @@ -0,0 +1,247 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { RootState, store } from "@/redux/store"; +import { useSelector } from "react-redux"; +import clsx from "clsx"; +import Image from "next/image"; +import icons from "@/constant/images/icons"; + +import { getItemStorage, setItemStorage } from "@/common/funcs/localStorage"; +import { KEY_STORE } from "@/constant/config"; + +import { setLoading, setRememberPassword } from "@/redux/reducer/site"; +import { + setDataLoginStorage, + setStateLogin, + setToken, +} from "@/redux/reducer/auth"; +import { setInfoUser } from "@/redux/reducer/user"; + +// Import trực tiếp file JSON cấu hình của bạn +import loadingAnim from "@/../public/static/anim/loading_screen.json"; + +function SplashScreen() { + const [isClosing, setIsClosing] = useState(false); + const [progress, setProgress] = useState(0); // Quản lý phần trăm loading thực tế + + const { loading, isRememberPassword } = useSelector( + (state: RootState) => state.site, + ); + const { infoUser } = useSelector((state: RootState) => state.user); + const { token, isLogin, dataLoginStorage } = useSelector( + (state: RootState) => state.auth, + ); + + // Đọc dữ liệu cấu hình động trực tiếp từ file JSON của bạn + const config = loadingAnim?.vna_loading_animation; + + // Trích xuất các biến từ file JSON + const bgColors = config?.background?.colors || ["#004b5e", "#007b85"]; + const aircraftAnim = config?.aircraft?.animation || { + duration: "3s", + timing: "ease-in-out", + }; + const loadingBarConfig = config?.loading_bar || { + color: "#c89f3c", + track_color: "rgba(255, 255, 255, 0.2)", + animation: { duration: "4s" }, + }; + const atmosphere = config?.atmosphere || { + clouds: { opacity: 0.3 }, + speed_lines: { opacity: 0.4 }, + }; + + // 🔥 Khởi tạo tiến trình chạy loading bar thực tế dựa trên thời gian (duration) trong JSON + useEffect(() => { + if (!loading) return; + + // Lấy thời gian từ cấu hình JSON (ví dụ "4s" -> 4000ms) + const durationSeconds = + parseFloat(loadingBarConfig.animation.duration) || 4; + const totalDuration = durationSeconds * 1000; + const intervalTime = 40; + const step = 100 / (totalDuration / intervalTime); + + const timer = setInterval(() => { + setProgress((prev) => { + if (prev >= 100) { + clearInterval(timer); + // Tắt loading sau khi thanh tiến trình chạy đầy 100% + setTimeout(() => { + store.dispatch(setLoading(false)); + }, 200); + return 100; + } + return prev + step; + }); + }, intervalTime); + + return () => clearInterval(timer); + }, [loading, loadingBarConfig.animation.duration]); + + // 🔥 Load state từ localStorage + useEffect(() => { + (async () => { + const encryptedState = await getItemStorage(KEY_STORE); + const SECRET_KEY = process.env.NEXT_PUBLIC_SECRET_KEY || "default_key"; + + const decode = (data: string): any => { + try { + const decoded = decodeURIComponent(atob(data)); + const clean = decoded.startsWith(SECRET_KEY) + ? decoded.slice(SECRET_KEY.length) + : null; + return clean ? JSON.parse(clean) : null; + } catch (err) { + console.error("Decode error:", err); + return null; + } + }; + + const state = + typeof encryptedState === "string" ? decode(encryptedState) : null; + + if (state) { + store.dispatch(setToken(state.token)); + store.dispatch(setStateLogin(state.isLogin)); + store.dispatch(setInfoUser(state.infoUser)); + store.dispatch(setRememberPassword(state.isRememberPassword)); + store.dispatch(setDataLoginStorage(state.dataLoginStorage)); + } + })(); + }, []); + + // 🔥 Lưu lại trạng thái khi hoàn tất + useEffect(() => { + if (!loading) { + const SECRET_KEY = process.env.NEXT_PUBLIC_SECRET_KEY || "default_key"; + + const encode = (data: string): string => { + const textToEncode = SECRET_KEY + data; + return btoa(encodeURIComponent(textToEncode)); + }; + + const hashedData = encode( + JSON.stringify({ + isLogin, + token, + infoUser, + isRememberPassword, + dataLoginStorage, + }), + ); + + setItemStorage(KEY_STORE, hashedData); + + // 👉 trigger animation fade out + setTimeout(() => setIsClosing(true), 0); + } + }, [loading, isLogin, token, infoUser, isRememberPassword, dataLoginStorage]); + + if (!loading && isClosing) return null; + + return ( +
    + {/* CSS Keyframes sử dụng các tham số động từ file JSON cấu hình */} + + + {/* --- HIỆU ỨNG BẦU TRỜI & ĐƯỜNG BAY (Atmosphere) --- */} + {/* Vệt gió lướt hoàng hôn */} +
    +
    + + {/* Các tầng mây mờ ảo phía sau máy bay */} +
    +
    + + {/* --- KHU VỰC TRUNG TÂM (Máy bay & Loading Bar) --- */} +
    + {/* Máy bay dập dềnh tích hợp ảnh trong suốt hoàn hảo */} +
    + {config?.aircraft?.brand +
    + + {/* --- THANH TIẾN TRÌNH (Loading Bar) --- */} +
    +
    + {/* Tiến trình tăng dần tự động dựa vào state progress */} +
    +
    +
    +
    +
    + ); +} + +export default SplashScreen; diff --git a/src/components/protected/SplashScreen/index.ts b/src/components/protected/SplashScreen/index.ts new file mode 100644 index 0000000..076d132 --- /dev/null +++ b/src/components/protected/SplashScreen/index.ts @@ -0,0 +1 @@ +export { default } from "./SplashScreen"; diff --git a/src/components/utils/FilterDateRage/FilterDateRage.tsx b/src/components/utils/FilterDateRage/FilterDateRage.tsx new file mode 100644 index 0000000..8824d01 --- /dev/null +++ b/src/components/utils/FilterDateRage/FilterDateRage.tsx @@ -0,0 +1,94 @@ +"use client"; + +import React, { useEffect, useState } from "react"; +import clsx from "clsx"; +import * as Popover from "@radix-ui/react-popover"; + +import { PropsFilterDateRange } from "./interface"; +import Moment from "react-moment"; +import { TYPE_DATE } from "@/constant/config/enum"; +import { getDateRange } from "@/common/funcs/selectData"; +import { ListOptionFilterDate } from "@/constant/config"; +import DateOption from "./component/DateOption"; + +function FilterDateRange({ + styleRounded = false, + showOptionAll = false, + date, + setDate, + typeDate, + setTypeDate, + title = "Thời gian", +}: PropsFilterDateRange) { + const [openDate, setOpenDate] = useState(false); + + useEffect(() => { + if (typeDate !== null && typeDate !== TYPE_DATE.LUA_CHON) { + setDate(getDateRange(typeDate)); + } + }, [typeDate, setDate]); + + return ( + + + + + + + + + + ); +} + +export default FilterDateRange; diff --git a/src/components/utils/FilterDateRage/component/CalendarMain/CalendarMain.tsx b/src/components/utils/FilterDateRage/component/CalendarMain/CalendarMain.tsx new file mode 100644 index 0000000..a9308c3 --- /dev/null +++ b/src/components/utils/FilterDateRage/component/CalendarMain/CalendarMain.tsx @@ -0,0 +1,247 @@ +"use client"; + +import { memo, useCallback, useContext, useMemo } from "react"; +import clsx from "clsx"; +import type { PropsCalendarMain } from "./interface"; +import { ContextCalendar } from "../RangeDatePicker/RangeDatePicker"; + +const months = Array.from({ length: 12 }, (_, i) => i + 1); + +function CalendarMain({ + date, + setDate, + setType, + type, + year, +}: PropsCalendarMain) { + const context = useContext(ContextCalendar); + + // const hover = useMemo(() => { + // if (!context?.datePicker.from || !context?.dateHover) return null; + + // return context.dateHover > context.datePicker.from + // ? { + // start: context.datePicker.from, + // end: context.dateHover, + // } + // : { + // start: context.dateHover, + // end: context.datePicker.from, + // }; + // }, [context?.dateHover, context?.datePicker.from]); + + const hover = (() => { + if (!context?.datePicker.from || !context?.dateHover) { + return null; + } + + return context.dateHover > context.datePicker.from + ? { + start: context.datePicker.from, + end: context.dateHover, + } + : { + start: context.dateHover, + end: context.datePicker.from, + }; + })(); + + /** + * Chọn ngày + */ + const handleDatePick = useCallback( + (datePick: Date) => { + const { from, to } = context.datePicker; + + // chọn ngày bắt đầu + if (!from || to) { + context.setDatePicker({ + from: datePick, + to: null, + }); + return; + } + + // chọn ngày kết thúc + context.setDateHover(null); + + if (datePick < from) { + context.setDatePicker({ + from: datePick, + to: from, + }); + } else { + context.setDatePicker({ + from, + to: datePick, + }); + } + }, + [context], + ); + + /** + * Hover + */ + const handleHover = useCallback( + (value: Date) => { + if (context.datePicker.from && !context.datePicker.to) { + context.setDateHover(value); + } + }, + [context], + ); + + /** + * Calendar + */ + const rows = useMemo(() => { + const currentDate = new Date(); + + const monthStart = new Date(date.getFullYear(), date.getMonth(), 1); + const monthEnd = new Date(date.getFullYear(), date.getMonth() + 1, 0); + + const cursor = new Date(monthStart); + + while (cursor.getDay() !== 0) { + cursor.setDate(cursor.getDate() - 1); + } + + const weeks: React.ReactNode[] = []; + + while (cursor <= monthEnd) { + const week: React.ReactNode[] = []; + + for (let i = 0; i < 7; i++) { + const currDate = new Date(cursor); + + const isCurrentMonth = currDate.getMonth() === date.getMonth(); + + const isToday = currDate.toDateString() === currentDate.toDateString(); + + const isStart = + currDate.getTime() === context.datePicker.from?.getTime(); + + const isEnd = currDate.getTime() === context.datePicker.to?.getTime(); + + const isBetween = + context.datePicker.from && + context.datePicker.to && + currDate > context.datePicker.from && + currDate < context.datePicker.to; + + const isHover = hover && currDate > hover.start && currDate < hover.end; + + week.push( + , + ); + + cursor.setDate(cursor.getDate() + 1); + } + + weeks.push( +
    + {week} +
    , + ); + } + + return weeks; + }, [context, date, hover, handleDatePick, handleHover]); + + /** + * List year + */ + const listYear = useMemo(() => { + return Array.from( + { length: year.last - year.first + 1 }, + (_, i) => year.first + i, + ); + }, [year]); + + return ( +
    context.setDateHover(null)}> + {/* Calendar */} + {type === 0 && rows} + + {/* Month */} + {type === 1 && ( +
    + {months.map((month) => ( + + ))} +
    + )} + + {/* Year */} + {type === 2 && ( +
    + {listYear.map((item) => ( + + ))} +
    + )} +
    + ); +} + +export default memo(CalendarMain); diff --git a/src/components/utils/FilterDateRage/component/CalendarMain/index.ts b/src/components/utils/FilterDateRage/component/CalendarMain/index.ts new file mode 100644 index 0000000..cadb07e --- /dev/null +++ b/src/components/utils/FilterDateRage/component/CalendarMain/index.ts @@ -0,0 +1 @@ +export { default } from "./CalendarMain"; diff --git a/src/components/utils/FilterDateRage/component/CalendarMain/interface/index.ts b/src/components/utils/FilterDateRage/component/CalendarMain/interface/index.ts new file mode 100644 index 0000000..bd62012 --- /dev/null +++ b/src/components/utils/FilterDateRage/component/CalendarMain/interface/index.ts @@ -0,0 +1,7 @@ +export interface PropsCalendarMain { + date: Date; + setDate: (date: Date) => void; + type: number; + setType: (num: number) => void; + year: any; +} diff --git a/src/components/utils/FilterDateRage/component/DateOption/DateOption.tsx b/src/components/utils/FilterDateRage/component/DateOption/DateOption.tsx new file mode 100644 index 0000000..e7b385e --- /dev/null +++ b/src/components/utils/FilterDateRage/component/DateOption/DateOption.tsx @@ -0,0 +1,89 @@ +"use client"; + +import clsx from "clsx"; + +import { PropsDateOption } from "./interface"; + +import { TYPE_DATE } from "@/constant/config/enum"; +import { getDateRange } from "@/common/funcs/selectData"; +import { ListOptionFilterDate } from "@/constant/config"; + +import RangeDatePicker from "../RangeDatePicker"; + +export default function DateOption({ + showOptionAll, + date, + setDate, + typeDate, + setTypeDate, + show, + setShow, +}: PropsDateOption) { + const isCustom = Number(typeDate) === TYPE_DATE.LUA_CHON; + + return ( +
    + {/* MENU */} +
    + {ListOptionFilterDate.map((item) => { + const active = item.value === typeDate; + + return ( +
    { + setTypeDate(item.value); + + if (item.value !== TYPE_DATE.LUA_CHON) { + setDate(getDateRange(item.value)); + setShow(false); + } + }} + className={clsx( + "flex cursor-pointer items-center justify-between rounded-lg px-3 py-2 text-sm", + active ? "bg-blue-50 text-blue-600" : "hover:bg-gray-50", + )} + > + {item.name} + + {active && item.value !== TYPE_DATE.LUA_CHON && ( + + + + )} +
    + ); + })} +
    + + {/* DATE PICKER */} + {isCustom && ( + setShow(false)} + /> + )} +
    + ); +} diff --git a/src/components/utils/FilterDateRage/component/DateOption/index.ts b/src/components/utils/FilterDateRage/component/DateOption/index.ts new file mode 100644 index 0000000..09e27e5 --- /dev/null +++ b/src/components/utils/FilterDateRage/component/DateOption/index.ts @@ -0,0 +1 @@ +export { default } from "./DateOption"; diff --git a/src/components/utils/FilterDateRage/component/DateOption/interface/index.ts b/src/components/utils/FilterDateRage/component/DateOption/interface/index.ts new file mode 100644 index 0000000..5a52221 --- /dev/null +++ b/src/components/utils/FilterDateRage/component/DateOption/interface/index.ts @@ -0,0 +1,12 @@ +export interface PropsDateOption { + showOptionAll?: boolean; + date: { + from: Date | null; + to: Date | null; + } | null; + setDate: (any: any) => void; + typeDate: number | null; + setTypeDate: (any: any) => void; + show: boolean; + setShow: (any: any) => void; +} diff --git a/src/components/utils/FilterDateRage/component/RangeDatePicker/RangeDatePicker.tsx b/src/components/utils/FilterDateRage/component/RangeDatePicker/RangeDatePicker.tsx new file mode 100644 index 0000000..c6e0096 --- /dev/null +++ b/src/components/utils/FilterDateRage/component/RangeDatePicker/RangeDatePicker.tsx @@ -0,0 +1,398 @@ +"use client"; +import React, { + createContext, + useCallback, + useEffect, + useMemo, + useState, +} from "react"; +import { PropsRangeDatePicker } from "./interface"; +import clsx from "clsx"; +import Moment from "react-moment"; +import CustomButton from "@/components/customs/custom-button"; +import CalendarMain from "../CalendarMain"; + +const daysOfWeek = ["CN", "T2", "T3", "T4", "T5", "T6", "T7"]; +export const ContextCalendar = createContext(null); + +function RangeDatePicker({ + onClose, + onSetValue, + value, + onSubmit, + open, +}: PropsRangeDatePicker) { + const [typeCalendarLeft, setTypeCalendarLeft] = useState(0); + const [typeCalendarRight, setTypeCalendarRight] = useState(0); + const [dateLeft, setDateLeft] = useState(new Date()); + const [dateRight, setDateRight] = useState( + new Date(new Date().getFullYear(), new Date().getMonth() + 1), + ); + + const [dateHover, setDateHover] = useState(null); + // const [yearTableLeft, setYearTableLeft] = useState(); + // const [yearTableRight, setYearTableRight] = useState(); + const [datePicker, setDatePicker] = useState<{ + to: Date | null; + from: Date | null; + }>({ + from: null, + to: null, + }); + + const handleNext = useCallback( + (isCalendarRight?: boolean) => { + if (isCalendarRight) { + if (typeCalendarRight == 0) + setDateRight((prevDate) => { + const month = prevDate.getMonth() + 1; + const year = prevDate.getFullYear(); + const newDate = new Date(year, month); + return newDate; + }); + } else { + if (typeCalendarLeft == 0) + setDateLeft((prevDate) => { + const month = prevDate.getMonth() + 1; + const year = prevDate.getFullYear(); + const newDate = new Date(year, month); + if (newDate < dateRight) return newDate; + else return prevDate; + }); + } + }, + [dateRight, typeCalendarLeft, typeCalendarRight], + ); + + const handlePrev = useCallback( + (isCalendarRight?: boolean) => { + if (isCalendarRight) { + if (typeCalendarRight == 0) + setDateRight((prevDate) => { + const month = prevDate.getMonth() - 1; + const year = prevDate.getFullYear(); + const newDate = new Date(year, month); + if (dateLeft < newDate) return newDate; + else return prevDate; + }); + } else { + if (typeCalendarLeft == 0) + setDateLeft((prevDate) => { + const month = prevDate.getMonth() - 1; + const year = prevDate.getFullYear(); + const newDate = new Date(year, month); + return newDate; + }); + } + }, + [dateLeft, typeCalendarLeft, typeCalendarRight], + ); + + const titleMonthYear = (date: Date, type: number, year: any) => { + if (type == 1) { + return `${"Năm"} ${date.getFullYear()}`; + } + if (type == 2) { + return `${"Từ"} ${year.first} - ${year.last}`; + } + return `${"Tháng"} ${date.getMonth() + 1}, ${date.getFullYear()}`; + }; + + const handleSubmit = useCallback(() => { + if (datePicker.from && datePicker.to) { + onSetValue(datePicker); + onClose(); + onSubmit && onSubmit(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [datePicker]); + + const handleChangeType = ( + setType: (number: number) => void, + type: number, + ) => { + if (type == 0) { + setType(1); + } + if (type == 1) { + setType(2); + } + if (type == 2) { + setType(0); + } + }; + + //Cap nhat value neu co + useEffect(() => { + if (!open) { + setDatePicker({ + from: value?.from, + to: value?.to, + }); + } else { + if (!!value?.from && !!value?.to) { + if ( + value?.from.getMonth() == value?.to.getMonth() && + value?.from.getFullYear() == value?.to.getFullYear() + ) { + setDateLeft(new Date(value?.from.getTime())); + setDateRight( + new Date(value?.from.getFullYear(), value?.from.getMonth() + 1), + ); + } else { + setDateLeft(new Date(value?.from.getTime())); + setDateRight(new Date(value?.to.getTime())); + } + } + } + }, [open, value?.from, value?.to]); + + const yearTableLeft = useMemo( + () => ({ + first: dateLeft.getFullYear() - 5, + last: dateLeft.getFullYear() + 6, + }), + [dateLeft], + ); + + const yearTableRight = useMemo( + () => ({ + first: dateRight.getFullYear() - 5, + last: dateRight.getFullYear() + 6, + }), + [dateRight], + ); + + return ( + +
    + {/* Show Date Header */} +
    + + {datePicker.from ? ( + + ) : ( + "Ngày bắt đầu" + )} + + + + + + + {datePicker.to ? ( + + ) : ( + "Ngày kết thúc" + )} + +
    + + {/* Group Calendar */} +
    + {/* Left Calendar */} +
    +
    +
    handlePrev(false)} + > + + + +
    +

    + handleChangeType(setTypeCalendarLeft, typeCalendarLeft) + } + > + {titleMonthYear(dateLeft, typeCalendarLeft, yearTableLeft)} +

    +
    handleNext(false)} + > + + + +
    +
    + {typeCalendarLeft === 0 ? ( +
    + {daysOfWeek.map((day, i) => ( +
    + {day} +
    + ))} +
    + ) : null} + +
    + + {/* Right Calendar */} +
    +
    +
    handlePrev(true)} + > + + + +
    +

    + handleChangeType(setTypeCalendarRight, typeCalendarRight) + } + > + {titleMonthYear(dateRight, typeCalendarRight, yearTableRight)} +

    +
    handleNext(true)} + > + + + +
    +
    + {typeCalendarRight === 0 ? ( +
    + {daysOfWeek.map((day, i) => ( +
    + {day} +
    + ))} +
    + ) : null} + +
    +
    + + {/* Group Buttons */} +
    + + Hủy bỏ + + + Áp dụng + +
    +
    +
    + ); +} + +export default RangeDatePicker; diff --git a/src/components/utils/FilterDateRage/component/RangeDatePicker/index.ts b/src/components/utils/FilterDateRage/component/RangeDatePicker/index.ts new file mode 100644 index 0000000..68339b9 --- /dev/null +++ b/src/components/utils/FilterDateRage/component/RangeDatePicker/index.ts @@ -0,0 +1 @@ +export { default } from "./RangeDatePicker"; diff --git a/src/components/utils/FilterDateRage/component/RangeDatePicker/interface/index.ts b/src/components/utils/FilterDateRage/component/RangeDatePicker/interface/index.ts new file mode 100644 index 0000000..1a4febd --- /dev/null +++ b/src/components/utils/FilterDateRage/component/RangeDatePicker/interface/index.ts @@ -0,0 +1,7 @@ +export interface PropsRangeDatePicker { + onClose: () => void; + onSetValue: (any: any) => void; + onSubmit?: () => void; + value: any; + open?: boolean; +} diff --git a/src/components/utils/FilterDateRage/index.ts b/src/components/utils/FilterDateRage/index.ts new file mode 100644 index 0000000..aee99cb --- /dev/null +++ b/src/components/utils/FilterDateRage/index.ts @@ -0,0 +1 @@ +export { default } from "./FilterDateRage"; diff --git a/src/components/utils/FilterDateRage/interface/index.ts b/src/components/utils/FilterDateRage/interface/index.ts new file mode 100644 index 0000000..5e6d459 --- /dev/null +++ b/src/components/utils/FilterDateRage/interface/index.ts @@ -0,0 +1,17 @@ +import { Dispatch, SetStateAction } from "react"; +import { TYPE_DATE } from "@/constant/config/enum"; + +export interface PropsFilterDateRange { + styleRounded?: boolean; + showOptionAll?: boolean; + date: { + from: Date | null; + to: Date | null; + } | null; + setDate: Dispatch< + SetStateAction<{ from: Date | null; to: Date | null } | null> + >; + typeDate: TYPE_DATE; + setTypeDate: Dispatch>; + title?: string; +} diff --git a/src/components/utils/FormCustom/FormCustom.tsx b/src/components/utils/FormCustom/FormCustom.tsx new file mode 100644 index 0000000..d555071 --- /dev/null +++ b/src/components/utils/FormCustom/FormCustom.tsx @@ -0,0 +1,69 @@ +"use client"; +import React, { useCallback, useMemo } from "react"; + +import { PropsFormCustom } from "./interface"; +import { ContextFormCustom } from "./contexts"; + +function FormCustom>({ + form, + setForm, + onSubmit, + children, +}: PropsFormCustom) { + // tạo object error ban đầu + const initialError = useMemo(() => { + return Object.fromEntries( + Object.keys(form).map((key) => [key, null]), + ) as Record; + }, [form]); + + const [countValidate, setCountValidate] = React.useState(0); + const [errorText, setErrorText] = + React.useState>(initialError); + + const [validate, setValidate] = React.useState | null>(null); + + // 👉 check form hợp lệ + const isDone = useMemo(() => { + if (!validate) return false; + return Object.values(validate).every(Boolean); + }, [validate]); + + // Check form hop le + const handleSubmit = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); + + if (isDone) { + onSubmit?.(); + } else { + setCountValidate((prev) => prev + 1); + } + }, + [isDone, onSubmit], + ); + + return ( + +
    + {children} +
    +
    + ); +} + +export default FormCustom; diff --git a/src/components/utils/FormCustom/compoents/InputForm/InputForm.tsx b/src/components/utils/FormCustom/compoents/InputForm/InputForm.tsx new file mode 100644 index 0000000..aa3e0a6 --- /dev/null +++ b/src/components/utils/FormCustom/compoents/InputForm/InputForm.tsx @@ -0,0 +1,437 @@ +"use client"; +import React, { useContext, useMemo, useState } from "react"; +import { PropsInputForm } from "./interface"; +import { ContextFormCustom, IContextFormCustom } from "../../contexts"; +import { validateEmail, validatePhoneNumber } from "@/common/funcs/validate"; +import { convertCoin, price } from "@/common/funcs/convertCoin"; +import clsx from "clsx"; + +function InputForm({ + type, + name, + placeholder, + icon, + label, + value, + unit, + note, + textRequired, + textConfirm, + valueConfirm, + isBlur = true, + onClean, + showDone, + readOnly, + max, + min, + isRequired, + isNumber, + isUppercase, + isPhone, + isEmail, + isMoney, + onBlur, + onChangeValue, +}: PropsInputForm) { + const isPassword = type === "password"; + + const [showPass, setShowPass] = useState(false); + const [isFocus, setIsFocus] = useState(false); + + const { + form, + countValidate, + errorText, + isDone, + setForm, + setValidate, + setErrorText, + } = useContext>(ContextFormCustom); + + // ========================= + // VALUE + // ========================= + + const currentValue = useMemo(() => { + return value ?? form[name] ?? ""; + }, [value, form, name]); + + // ========================= + // VALIDATE + // ========================= + + const handleValidate = (inputValue?: string | number) => { + const finalValue = String(inputValue ?? currentValue ?? ""); + + if (isRequired && finalValue.trim() === "") { + return { + valid: false, + message: textRequired || "Vui lòng nhập trường này", + }; + } + + if (finalValue) { + if (isNumber && isNaN(Number(finalValue))) { + return { + valid: false, + message: "Vui lòng chỉ nhập số", + }; + } + + if (isPhone && !validatePhoneNumber(finalValue)) { + return { + valid: false, + message: "Định dạng số điện thoại không đúng", + }; + } + + if (isEmail && !validateEmail(finalValue)) { + return { + valid: false, + message: "Định dạng email không chính xác", + }; + } + + if (valueConfirm && finalValue !== valueConfirm) { + return { + valid: false, + message: textConfirm || "Mật khẩu không trùng khớp", + }; + } + + if (max && finalValue.length > max) { + return { + valid: false, + message: `Nhập tối đa ${max} kí tự`, + }; + } + + if (min && finalValue.length < min) { + return { + valid: false, + message: `Nhập tối thiểu ${min} kí tự`, + }; + } + } + }; + + // ========================= + // ERROR + // ========================= + + const handleSetMessage = (inputValue?: string | number) => { + const result = handleValidate(inputValue); + setErrorText((prev) => ({ + ...prev, + [name]: result?.message || "", + })); + setValidate((prev) => ({ + ...prev, + [name]: result?.valid ?? true, + })); + }; + + // ========================= + // HANDLERS + // ========================= + + const handleFocus = () => { + setIsFocus(true); + setErrorText((prev) => ({ + ...prev, + [name]: null, + })); + }; + + const handleBlur = () => { + setIsFocus(false); + onBlur?.(); + if (isBlur) { + handleSetMessage(); + } + }; + + const handleChange = (e: React.ChangeEvent) => { + let inputValue = e.target.value; + + if (isUppercase) { + inputValue = inputValue.toUpperCase(); + } + + // Money + if (isMoney) { + const numberIsValue = Number(price(inputValue)); + inputValue = numberIsValue ? convertCoin(numberIsValue) : "0"; + } + + //Custom onChangeValue + if (onChangeValue) { + onChangeValue(inputValue); + return; + } + + //Update form + setForm((prev: any) => ({ + ...prev, + [name]: inputValue, + })); + + // Validate live + if (countValidate > 0) { + handleSetMessage(inputValue); + } + }; + + const handleClean = () => { + setForm((prev: any) => ({ + ...prev, + [name]: "", + })); + + setErrorText((prev) => ({ + ...prev, + [name]: null, + })); + + setValidate((prev) => ({ + ...prev, + [name]: !isRequired, + })); + }; + + // ========================= + // RENDER + // ========================= + + return ( +
    + {/* LABEL */} + {label && ( + + )} + + {/* INPUT WRAPPER */} +
    + {/* ICON */} + {icon && ( +
    + {icon} +
    + )} + + {/* INPUT */} + + + {/* UNIT */} + {unit ? ( +
    + {unit} +
    + ) : ( +
    + {/* CLEAN */} + {onClean && !!currentValue && ( + + )} + + {/* DONE */} + {!isPassword && + showDone && + isDone && + !errorText?.[name] && + !!currentValue && ( + + + + )} + + {/* PASSWORD */} + {isPassword && ( + + )} +
    + )} +
    + + {/* ERROR */} + {errorText?.[name] && ( +

    + {errorText[name]} +

    + )} + + {/* NOTE */} + {note && ( +

    + {note} +

    + )} +
    + ); +} + +export default InputForm; diff --git a/src/components/utils/FormCustom/compoents/InputForm/index.ts b/src/components/utils/FormCustom/compoents/InputForm/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/components/utils/FormCustom/compoents/InputForm/interface/index.ts b/src/components/utils/FormCustom/compoents/InputForm/interface/index.ts new file mode 100644 index 0000000..971e957 --- /dev/null +++ b/src/components/utils/FormCustom/compoents/InputForm/interface/index.ts @@ -0,0 +1,36 @@ +import { ReactNode } from "react"; + +export interface PropsInputForm { + type: string; + name: string; + placeholder?: string; + + icon?: ReactNode; + label?: string | ReactNode; + + value?: string | number; + unit?: string; + note?: string; + textRequired?: string; + valueConfirm?: string; + textConfirm?: string; + + isBlur?: boolean; + onClean?: boolean; + showDone?: boolean; + readOnly?: boolean; + + max?: number; + min?: number; + + isRequired?: boolean; + isNumber?: boolean; + isPhone?: boolean; + isEmail?: boolean; + isMoney?: boolean; + isUppercase?: boolean; + + onBlur?: () => void; + + onChangeValue?: (value: string | number) => void; +} diff --git a/src/components/utils/FormCustom/compoents/SelectForm/SelectForm.tsx b/src/components/utils/FormCustom/compoents/SelectForm/SelectForm.tsx new file mode 100644 index 0000000..792c66b --- /dev/null +++ b/src/components/utils/FormCustom/compoents/SelectForm/SelectForm.tsx @@ -0,0 +1,210 @@ +"use client"; + +import React, { useEffect, useRef, useState } from "react"; +import clsx from "clsx"; +import Image from "next/image"; +import { IoIosArrowDown } from "react-icons/io"; +import { GrSearch } from "react-icons/gr"; +import { RiCloseCircleFill } from "react-icons/ri"; + +import { removeVietnameseTones } from "@/common/funcs/optionConvert"; +import icons from "@/constant/images/icons"; +import { PropsSelectForm } from "./interface"; + +function SelectForm({ + label, + placeholder = "Chọn...", + isSearch = true, + readOnly = false, + value, + options = [], + onClean, + onSelect, + getOptionLabel, + getOptionValue, +}: PropsSelectForm) { + const refWrapper = useRef(null); + const refInputSearch = useRef(null); + + const [isFocus, setIsFocus] = useState(false); + const [keyword, setKeyword] = useState(""); + + /* ================= CLICK OUTSIDE (SỬA LẠI ĐỂ TRÁNH XUNG ĐỘT) ================= */ + useEffect(() => { + const handleClickOutside = (e: MouseEvent) => { + // Nếu click bên ngoài Wrapper thì mới đóng Dropdown + if ( + refWrapper.current && + !refWrapper.current.contains(e.target as Node) + ) { + setIsFocus(false); + setKeyword(""); + } + }; + + // Dùng 'click' thay vì 'mousedown' để tránh tranh chấp sự kiện với onClick của Select Box + document.addEventListener("click", handleClickOutside); + return () => document.removeEventListener("click", handleClickOutside); + }, []); + + /* ================= AUTO FOCUS SEARCH ================= */ + useEffect(() => { + if (isFocus && isSearch) { + const timer = setTimeout(() => { + refInputSearch.current?.focus(); + }, 50); + return () => clearTimeout(timer); + } + }, [isFocus, isSearch]); + + /* ================= DATA FILTER ================= */ + const safeOptions = options ?? []; + + const selectedOption = safeOptions.find( + (opt) => getOptionValue(opt) === value, + ); + + const filteredOptions = safeOptions.filter((opt) => { + const labelText = removeVietnameseTones(getOptionLabel(opt) || ""); + const key = removeVietnameseTones(keyword || ""); + return labelText.includes(key); + }); + + /* ================= HANDLERS ================= */ + const handleToggleFocus = (e: React.MouseEvent) => { + e.stopPropagation(); // Dừng bọt sự kiện để không bị clickOutside bắt nhầm + if (!readOnly) { + setIsFocus((prev) => !prev); + } + }; + + const handleOptionClick = (e: React.MouseEvent, option: OptionType) => { + e.stopPropagation(); // Dừng bọt sự kiện + onSelect?.(option); + setIsFocus(false); + setKeyword(""); + }; + + return ( +
    + {/* LABEL */} + {label && ( + + )} + + {/* MAIN SELECT BOX */} +
    + {/* VALUE / PLACEHOLDER */} +

    + {selectedOption ? getOptionLabel(selectedOption) : placeholder} +

    + + {/* CLEAR BUTTON */} + {onClean && !!value && !readOnly && ( +
    { + e.stopPropagation(); + onClean(); + setKeyword(""); + }} + > + +
    + )} + + {/* ARROW ICON */} +
    + +
    +
    + + {/* DROPDOWN OPTIONS */} + {isFocus && !readOnly && ( +
    e.stopPropagation()} + className="absolute left-0 top-[calc(100%+6px)] z-50 w-full bg-white border border-[#0019f6] rounded-[20px] p-2.5 shadow-lg" + > + {/* SEARCH INPUT */} + {isSearch && ( +
    +
    + +
    + setKeyword(e.target.value)} + className="flex-1 h-full bg-transparent outline-none border-none text-sm font-medium text-gray-800 placeholder-[#9ea5c0] px-1" + /> +
    + )} + + {/* LIST OPTION */} + {filteredOptions.length > 0 ? ( +
    + {filteredOptions.map((opt) => { + const isActive = getOptionValue(opt) === value; + + return ( +
    handleOptionClick(e, opt)} + className={clsx( + "px-4 py-2.5 text-sm font-medium rounded-full cursor-pointer transition-colors duration-200 select-none", + isActive + ? "bg-[#0019f6] text-white" + : "text-gray-900 hover:bg-[#0019f6] hover:text-white", + )} + > + {getOptionLabel(opt)} +
    + ); + })} +
    + ) : ( + /* EMPTY STATE */ +
    + image empty +

    + Danh sách lựa chọn rỗng! +

    +
    + )} +
    + )} +
    + ); +} + +export default SelectForm; diff --git a/src/components/utils/FormCustom/compoents/SelectForm/index.ts b/src/components/utils/FormCustom/compoents/SelectForm/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/components/utils/FormCustom/compoents/SelectForm/interface/index.ts b/src/components/utils/FormCustom/compoents/SelectForm/interface/index.ts new file mode 100644 index 0000000..22e082a --- /dev/null +++ b/src/components/utils/FormCustom/compoents/SelectForm/interface/index.ts @@ -0,0 +1,15 @@ +export interface PropsSelectForm { + placeholder: string; + label?: string | React.ReactNode; + + isSearch?: boolean; + readOnly?: boolean; + + value: string | number | React.ReactNode; + options: OptionType[]; + + onClean?: () => void; + onSelect: (option: OptionType) => void; + getOptionLabel: (option: OptionType) => string; + getOptionValue: (option: OptionType) => string | number; +} diff --git a/src/components/utils/FormCustom/compoents/SelectMany/SelectMany.tsx b/src/components/utils/FormCustom/compoents/SelectMany/SelectMany.tsx new file mode 100644 index 0000000..a6fb076 --- /dev/null +++ b/src/components/utils/FormCustom/compoents/SelectMany/SelectMany.tsx @@ -0,0 +1,316 @@ +"use client"; + +import React, { Fragment, useEffect, useRef, useState } from "react"; +import clsx from "clsx"; +// import { CirclePlus, Trash, Search, X } from "lucide-react"; +import { removeVietnameseTones } from "@/common/funcs/optionConvert"; +import Image from "next/image"; +import icons from "@/constant/images/icons"; +import Popup from "@/components/customs/custom-popup"; +import CustomButton from "@/components/customs/custom-button"; + +import { PropsSelectMany } from "./interface"; + +function SelectMany({ + text, + label, + placeholder, + isSearch = true, + showSelectedItems = false, + readOnly, + disabledItems = [], + selectedItems = [], + options = [], + title, + onClickSelect, + setSelectedItems, + getOptionLabel, + getOptionValue, + onRemove, + action, + renderOption, + selectedItemFields, + selectedItemFieldLabels, +}: PropsSelectMany) { + const refInputSearch = useRef(null); + + const [keyword, setKeyword] = useState(""); + const [isFocus, setIsFocus] = useState(false); + const [listDataTerm, setListDataTerm] = + useState>(selectedItems); + + useEffect(() => { + if (isFocus) { + setTimeout(() => refInputSearch.current?.focus(), 0); + } + }, [isFocus]); + + const filteredOptions = options.filter((opt) => + removeVietnameseTones(String(getOptionLabel(opt) || "")).includes( + removeVietnameseTones(keyword), + ), + ); + + const handleOptionClick = (option: OptionType) => { + const value = getOptionValue(option); + if (disabledItems.includes(value)) return; + + setListDataTerm((prev) => + prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value], + ); + + setKeyword(""); + }; + + const handleRemoveSelected = (value: string | number) => { + const updated = listDataTerm.filter((v) => v !== value); + setListDataTerm(updated); + + onRemove ? onRemove(value) : setSelectedItems?.(updated); + }; + + const handleClose = () => { + setKeyword(""); + setIsFocus(false); + + // reset lại data cũ + setTimeout(() => { + setListDataTerm(selectedItems); + }, 0); + }; + + const handleSaveData = () => { + setIsFocus(false); + setSelectedItems?.(listDataTerm); + }; + + return ( + +
    + {label && ( + + )} + + {/* Select box */} +
    !readOnly && setIsFocus(true)} + className={clsx( + "flex items-center justify-between h-12 px-4 rounded-full border cursor-pointer transition", + "border-gray-300 bg-white hover:border-blue-700", + isFocus && "border-blue-700", + readOnly && "bg-gray-100 border-gray-200 cursor-not-allowed", + )} + > +

    + {selectedItems.length > 0 + ? `Đã chọn ${selectedItems.length} ${text}` + : placeholder} +

    + + + + + {/* */} +
    + + {/* Selected chips */} + {showSelectedItems === "default" && ( +
    + {selectedItems + .map((v) => options.find((o) => getOptionValue(o) === v)) + .filter(Boolean) + .map((item) => { + const value = getOptionValue(item!); + const disabled = disabledItems.includes(value); + + return ( +
    + {getOptionLabel(item!)} + handleRemoveSelected(value)} + > + + +
    + ); + })} +
    + )} +
    + + {/* Popup */} + +
    + {/* Title */} +

    {title || "Danh sách"}

    + + {/* Search */} + {isSearch && ( +
    + + + + + {/* */} + setKeyword(e.target.value)} + placeholder="Tìm kiếm..." + className="flex-1 outline-none bg-transparent text-sm" + /> +
    + )} + + {/* Select all */} + {filteredOptions.length > 0 && ( +
    +
    + + setListDataTerm( + e.target.checked ? options.map(getOptionValue) : [], + ) + } + className="w-5 h-5 accent-blue-500" + /> + Chọn tất cả +
    + +

    + Đã chọn:{" "} + {listDataTerm.length} +

    +
    + )} + + {/* Options */} + {filteredOptions.length > 0 ? ( +
    + {filteredOptions.map((opt) => { + const value = getOptionValue(opt); + const checked = listDataTerm.includes(value); + + return ( +
    + handleOptionClick(opt)} + disabled={disabledItems.includes(value)} + className="w-5 h-5 accent-blue-500" + /> + +
    + ); + })} +
    + ) : ( +
    + empty +

    Danh sách lựa chọn rỗng!

    +
    + )} + + {/* Buttons */} +
    + + Hủy bỏ + + + + Xác nhận + +
    + + {/* Close */} +
    + + + + + {/* */} +
    +
    +
    +
    + ); +} + +export default SelectMany; diff --git a/src/components/utils/FormCustom/compoents/SelectMany/index.ts b/src/components/utils/FormCustom/compoents/SelectMany/index.ts new file mode 100644 index 0000000..ed5c741 --- /dev/null +++ b/src/components/utils/FormCustom/compoents/SelectMany/index.ts @@ -0,0 +1 @@ +export { default } from "./SelectMany"; diff --git a/src/components/utils/FormCustom/compoents/SelectMany/interface/index.ts b/src/components/utils/FormCustom/compoents/SelectMany/interface/index.ts new file mode 100644 index 0000000..35749c3 --- /dev/null +++ b/src/components/utils/FormCustom/compoents/SelectMany/interface/index.ts @@ -0,0 +1,27 @@ +import { Dispatch, SetStateAction } from "react"; + +export interface PropsSelectMany { + text: string; + placeholder: string; + label?: string | React.ReactNode; + + isSearch?: boolean; + readOnly?: boolean; + showSelectedItems?: false | "default" | "input"; + + disabledItems?: Array; + selectedItems: Array; + options: OptionType[]; + title?: string; + + onClickSelect?: () => void; + setSelectedItems?: Dispatch>>; + getOptionLabel: (option: OptionType) => string | React.ReactNode; + getOptionValue: (option: OptionType) => string | number; + onRemove?: (item: string | number) => void; + + action?: React.ReactNode; + renderOption?: (option: OptionType) => React.ReactNode; + selectedItemFields?: (keyof OptionType)[]; + selectedItemFieldLabels?: Record; +} diff --git a/src/components/utils/FormCustom/compoents/SelectSingle/SelectSingle.tsx b/src/components/utils/FormCustom/compoents/SelectSingle/SelectSingle.tsx new file mode 100644 index 0000000..8b4cc48 --- /dev/null +++ b/src/components/utils/FormCustom/compoents/SelectSingle/SelectSingle.tsx @@ -0,0 +1,235 @@ +"use client"; + +import React, { useEffect, useRef, useState } from "react"; +import clsx from "clsx"; +// import { X, Search } from "lucide-react"; + +import Image from "next/image"; + +import { removeVietnameseTones } from "@/common/funcs/optionConvert"; +import icons from "@/constant/images/icons"; +import Popup from "@/components/customs/custom-popup"; +import CustomButton from "@/components/customs/custom-button"; +import { PropsSelectSingle } from "./interface"; + +function SelectSingle({ + text = "", + label, + placeholder = "Chọn 1 giá trị", + isSearch = true, + readOnly, + disabledItems = [], + selectedItem, + options, + title, + action, + getOptionLabel, + getOptionValue, + setSelectedItem, + onClickSelect, + renderOption, +}: PropsSelectSingle) { + const refInputSearch = useRef(null); + + const [keyword, setKeyword] = useState(""); + const [isFocus, setIsFocus] = useState(false); + const [selectedTemp, setSelectedTemp] = useState( + null, + ); + + useEffect(() => { + if (isFocus && refInputSearch.current) { + setTimeout(() => refInputSearch.current?.focus(), 0); + } + }, [isFocus]); + + const handlerFocused = () => { + if (onClickSelect) { + onClickSelect(); + return; + } + + if (readOnly) return; + + // sync dữ liệu tại đây + setSelectedTemp(selectedItem ?? null); + + setIsFocus(true); + }; + + const handleSelect = (value: string | number) => { + if (!disabledItems.includes(value)) { + setSelectedTemp(value); + } + }; + + const handleSave = () => { + setSelectedItem?.(selectedTemp); + setIsFocus(false); + }; + + const handleClose = () => { + setIsFocus(false); + setKeyword(""); + setSelectedTemp(selectedItem ?? null); + }; + + const selectedLabel = (() => { + const selectedOption = options.find( + (opt) => getOptionValue(opt) === selectedItem, + ); + return selectedOption + ? getOptionLabel(selectedOption) + : `Đã chọn 1 ${text}`; + })(); + + const filteredOptions = options.filter((opt) => + removeVietnameseTones(getOptionLabel(opt)).includes( + removeVietnameseTones(keyword), + ), + ); + + return ( +
    + {label && ( + + )} + + {/* Select box */} +
    +

    + {selectedItem ? selectedLabel : placeholder} +

    +
    + + {/* Popup */} + +
    + {/* Header */} +
    +

    + {title || "Chọn 1 giá trị"} +

    + + {isSearch && ( +
    +
    + + + + + {/* */} + setKeyword(e.target.value)} + placeholder="Tìm kiếm..." + className="flex-1 ml-2 outline-none bg-transparent" + /> +
    + + {action &&
    {action}
    } +
    + )} +
    + + {/* List */} + {filteredOptions.length > 0 ? ( +
    + {filteredOptions.map((opt) => { + const value = getOptionValue(opt); + return ( +
    + handleSelect(value)} + disabled={disabledItems.includes(value)} + className="w-5 h-5 accent-[#0011AB]" + /> + +
    + ); + })} +
    + ) : ( +
    + empty +

    Danh sách lựa chọn rỗng!

    +
    + )} + + {/* Footer */} +
    + + Hủy bỏ + + + + Xác nhận + +
    + + {/* Close */} +
    + + + + {/* */} +
    +
    +
    +
    + ); +} + +export default SelectSingle; diff --git a/src/components/utils/FormCustom/compoents/SelectSingle/index.ts b/src/components/utils/FormCustom/compoents/SelectSingle/index.ts new file mode 100644 index 0000000..5e9f46e --- /dev/null +++ b/src/components/utils/FormCustom/compoents/SelectSingle/index.ts @@ -0,0 +1 @@ +export { default } from "./SelectSingle"; diff --git a/src/components/utils/FormCustom/compoents/SelectSingle/interface/index.ts b/src/components/utils/FormCustom/compoents/SelectSingle/interface/index.ts new file mode 100644 index 0000000..99c80ab --- /dev/null +++ b/src/components/utils/FormCustom/compoents/SelectSingle/interface/index.ts @@ -0,0 +1,17 @@ +export interface PropsSelectSingle { + text?: string; + label?: React.ReactNode; + placeholder?: string; + isSearch?: boolean; + readOnly?: boolean; + disabledItems?: (string | number)[]; + selectedItem?: string | number | null; + options: OptionType[]; + title?: string; + action?: React.ReactNode; + getOptionLabel: (opt: OptionType) => string; + getOptionValue: (opt: OptionType) => string | number; + setSelectedItem?: (value: string | number | null) => void; + renderOption?: (option: OptionType) => React.ReactNode; + onClickSelect?: () => void; +} diff --git a/src/components/utils/FormCustom/compoents/TextArea/TextArea.tsx b/src/components/utils/FormCustom/compoents/TextArea/TextArea.tsx new file mode 100644 index 0000000..98f98d5 --- /dev/null +++ b/src/components/utils/FormCustom/compoents/TextArea/TextArea.tsx @@ -0,0 +1,208 @@ +"use client"; + +import React, { useContext, useEffect, useState } from "react"; +import clsx from "clsx"; +import { PropsTextArea } from "./interface"; +import { ContextFormCustom, IContextFormCustom } from "../../contexts"; + +function TextArea({ + name, + value, + placeholder, + label, + isBlur = true, + showDone, + readOnly, + max, + min, + isRequired, + textRequired, + onChangeValue, // Nhận callback custom từ cha +}: PropsTextArea) { + const [isFocus, setIsFocus] = useState(false); + + const { + form, + countValidate, + errorText, + isDone, + setForm, + setValidate, + setErrorText, + } = useContext>(ContextFormCustom); + + // Lấy giá trị hiện tại (ưu tiên value từ props, sau đó là value trong context) + const currentValue = value ?? form?.[name] ?? ""; + + // ========================= + // VALIDATE LOGIC + // ========================= + + const handleValidate = (inputValue?: string) => { + const finalValue = (inputValue ?? String(currentValue)).trim(); + + if (isRequired && finalValue === "") { + return { + valid: false, + message: textRequired || "Vui lòng nhập trường này", + }; + } + + if (max && finalValue.length > max) { + return { + valid: false, + message: `Nhập tối đa ${max} kí tự`, + }; + } + + if (min && finalValue.length < min) { + return { + valid: false, + message: `Nhập tối thiểu ${min} kí tự`, + }; + } + + return { + valid: true, + message: null, + }; + }; + + // Cập nhật lỗi và trạng thái validate vào Context + const handleSetMessage = (inputValue?: string) => { + const result = handleValidate(inputValue); + + setErrorText((prev) => ({ + ...prev, + [name]: result.message, + })); + + setValidate((prev) => ({ + ...prev, + [name]: result.valid, + })); + }; + + // ========================= + // EFFECTS + // ========================= + + // Chạy validate toàn cục khi Form yêu cầu (countValidate tăng) + useEffect(() => { + if (countValidate > 0) { + handleSetMessage(); + } + }, [countValidate]); + + // Cập nhật trạng thái valid thầm lặng vào context mỗi khi dữ liệu thay đổi + useEffect(() => { + const result = handleValidate(); + setValidate((prev) => ({ + ...prev, + [name]: result.valid, + })); + }, [currentValue]); + + // ========================= + // EVENT HANDLERS + // ========================= + + const handleFocus = () => { + setIsFocus(true); + // Xóa thông báo lỗi khi người dùng bắt đầu sửa lại + setErrorText((prev) => ({ + ...prev, + [name]: null, + })); + }; + + const handleBlur = () => { + setIsFocus(false); + if (isBlur) { + handleSetMessage(); + } + }; + + const handleChange = (e: React.ChangeEvent) => { + const inputValue = e.target.value; + + // 1. Nếu có hàm xử lý riêng (như cập nhật vào mảng ở component cha) + if (onChangeValue) { + onChangeValue(inputValue); + return; + } + + // 2. Mặc định: cập nhật vào state chung của FormCustom qua Context + setForm((prev: any) => ({ + ...prev, + [name]: inputValue, + })); + + // Nếu form đã từng submit (countValidate > 0), thực hiện validate ngay lập tức (live validation) + if (countValidate > 0) { + handleSetMessage(inputValue); + } + }; + + // ========================= + // RENDER + // ========================= + + return ( +
    + {/* LABEL */} + {label && ( + + )} + + {/* TEXTAREA WRAPPER */} +