From e7b8dac36da56983757dc4c829e97a659f5a65cd Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Sun, 8 Dec 2024 17:02:19 +0900 Subject: [PATCH] [Update] Config Page: Add notification ui. show error messages. --- src-ui/app/App.jsx | 2 + .../setting_box/translation/Translation.jsx | 2 +- .../SnackbarController.jsx | 41 ++++++++++++++++++ .../SnackbarController.module.scss | 16 +++++++ src-ui/logics/common/index.js | 1 + src-ui/logics/common/useNotificationStatus.js | 42 +++++++++++++++++++ src-ui/logics/useReceiveRoutes.js | 8 ++++ src-ui/store.js | 6 +++ 8 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src-ui/app/snackbar_controller/SnackbarController.jsx create mode 100644 src-ui/app/snackbar_controller/SnackbarController.module.scss create mode 100644 src-ui/logics/common/useNotificationStatus.js diff --git a/src-ui/app/App.jsx b/src-ui/app/App.jsx index 896cbb34..e9d12d08 100644 --- a/src-ui/app/App.jsx +++ b/src-ui/app/App.jsx @@ -8,6 +8,7 @@ import { ConfigPage } from "./config_page/ConfigPage"; import { SplashComponent } from "./splash_component/SplashComponent"; import { UpdatingComponent } from "./updating_component/UpdatingComponent"; import { ModalController } from "./modal_controller/ModalController"; +import { SnackbarController } from "./snackbar_controller/SnackbarController"; import styles from "./App.module.scss"; import { useIsBackendReady, useIsSoftwareUpdating } from "@logics_common"; @@ -45,6 +46,7 @@ const Contents = () => { + : diff --git a/src-ui/app/config_page/setting_section/setting_box/translation/Translation.jsx b/src-ui/app/config_page/setting_section/setting_box/translation/Translation.jsx index 724e73b3..95ebdb54 100644 --- a/src-ui/app/config_page/setting_section/setting_box/translation/Translation.jsx +++ b/src-ui/app/config_page/setting_section/setting_box/translation/Translation.jsx @@ -170,4 +170,4 @@ const findKeyByDeviceValue = (devices, target_value) => { } } return null; -}; +}; \ No newline at end of file diff --git a/src-ui/app/snackbar_controller/SnackbarController.jsx b/src-ui/app/snackbar_controller/SnackbarController.jsx new file mode 100644 index 00000000..c6433293 --- /dev/null +++ b/src-ui/app/snackbar_controller/SnackbarController.jsx @@ -0,0 +1,41 @@ +import { useState } from "react"; +import Button from "@mui/material/Button"; +import Snackbar from "@mui/material/Snackbar"; +import Slide from "@mui/material/Slide"; + +import styles from "./SnackbarController.module.scss"; +import { useNotificationStatus } from "@logics_common"; +import { clsx } from "clsx"; + +export const SnackbarController = () => { + const { currentNotificationStatus, closeNotification } = useNotificationStatus(); + + const handleClose = (event, reason) => { + closeNotification(event, reason); + }; + + const snackbar_classname = clsx(styles.snackbar_content, { + [styles.is_success]: currentNotificationStatus.data.status === "success", + [styles.is_error]: currentNotificationStatus.data.status === "error", + }); + + return ( +
+ +
+

{currentNotificationStatus.data.message}

+
+
+
+ ); +}; + +const SlideTransition = (props) => { + return ; +}; diff --git a/src-ui/app/snackbar_controller/SnackbarController.module.scss b/src-ui/app/snackbar_controller/SnackbarController.module.scss new file mode 100644 index 00000000..2db44fa9 --- /dev/null +++ b/src-ui/app/snackbar_controller/SnackbarController.module.scss @@ -0,0 +1,16 @@ +.snackbar_content { + width: 100%; + height: 100%; + padding: 2rem; + color: #fff; + &.is_success { + background-color: #368777; + } + &.is_error { + background-color: #bb4448; + } +} + +.snackbar_message { + font-size: 1.4rem; +} \ No newline at end of file diff --git a/src-ui/logics/common/index.js b/src-ui/logics/common/index.js index 8f1cd737..e63b28db 100644 --- a/src-ui/logics/common/index.js +++ b/src-ui/logics/common/index.js @@ -5,6 +5,7 @@ export { useWindow } from "./useWindow"; export { useIsOpenedConfigPage } from "./useIsOpenedConfigPage"; export { useIsSoftwareUpdateAvailable } from "./useIsSoftwareUpdateAvailable"; export { useIsSoftwareUpdating } from "./useIsSoftwareUpdating"; +export { useNotificationStatus } from "./useNotificationStatus"; export { useOpenFolder } from "./useOpenFolder"; export { useMessage } from "./useMessage"; export { useUpdateSoftware } from "./useUpdateSoftware"; diff --git a/src-ui/logics/common/useNotificationStatus.js b/src-ui/logics/common/useNotificationStatus.js new file mode 100644 index 00000000..f36c0c45 --- /dev/null +++ b/src-ui/logics/common/useNotificationStatus.js @@ -0,0 +1,42 @@ +import { useStore_NotificationStatus } from "@store"; + +export const useNotificationStatus = () => { + const { currentNotificationStatus, updateNotificationStatus } = useStore_NotificationStatus(); + + const generateRandomKey = () => Math.random(); + + const showNotification_Error = (message) => { + updateNotificationStatus({ + status: "error", + is_open: true, + key: generateRandomKey(), + message: message, + }); + }; + + const showNotification_Success = (message) => { + updateNotificationStatus({ + status: "success", + is_open: true, + key: generateRandomKey(), + message: message, + }); + }; + + const closeNotification = (event, reason) => { + if (reason === "clickaway") return; + updateNotificationStatus((prev) => ({ + ...prev.data, + is_open: false, + })); + }; + + return { + currentNotificationStatus, + updateNotificationStatus, + + showNotification_Error, + showNotification_Success, + closeNotification, + }; +}; \ No newline at end of file diff --git a/src-ui/logics/useReceiveRoutes.js b/src-ui/logics/useReceiveRoutes.js index 748b5061..0c09da4f 100644 --- a/src-ui/logics/useReceiveRoutes.js +++ b/src-ui/logics/useReceiveRoutes.js @@ -2,6 +2,9 @@ import { translator_status } from "@ui_configs"; import { arrayToObject } from "@utils"; import { + useNotificationStatus, + + useComputeMode, useInitProgress, useIsBackendReady, @@ -167,6 +170,10 @@ export const useReceiveRoutes = () => { const { updateOscIpAddress } = useOscIpAddress(); const { updateOscPort } = useOscPort(); + + + const { showNotification_Success, showNotification_Error } = useNotificationStatus(); + const routes = { // Common "/run/feed_watchdog": () => {}, @@ -494,6 +501,7 @@ export const useReceiveRoutes = () => { const error_route = error_routes[parsed_data.endpoint]; (error_route) ? error_route(parsed_data.result.data) : console.error(`Invalid endpoint: ${parsed_data.endpoint}\nresult: ${JSON.stringify(parsed_data.result)}`); console.error(`status 400: ${JSON.stringify(parsed_data.result)}`); + showNotification_Error(parsed_data.result.message); break; case 348: diff --git a/src-ui/store.js b/src-ui/store.js index cf63e236..878911cc 100644 --- a/src-ui/store.js +++ b/src-ui/store.js @@ -115,6 +115,12 @@ export const { atomInstance: Atom_IsSoftwareUpdateAvailable, useHook: useStore_I export const { atomInstance: Atom_InitProgress, useHook: useStore_InitProgress } = createAtomWithHook(0, "InitProgress"); export const { atomInstance: Atom_IsBreakPoint, useHook: useStore_IsBreakPoint } = createAtomWithHook(false, "IsBreakPoint"); export const { atomInstance: Atom_IsSoftwareUpdating, useHook: useStore_IsSoftwareUpdating } = createAtomWithHook(false, "IsSoftwareUpdating"); +export const { atomInstance: Atom_NotificationStatus, useHook: useStore_NotificationStatus } = createAtomWithHook({ + status: "", + is_open: false, + key: 0, + message: "", +}, "NotificationStatus"); // Main Page // Functions