[Update/bugfix] Notification UI:

Adjust an animation.
Add localizations.
Fix stack behavior that was not updated correctly. (it still has an issue tho.)
This commit is contained in:
Sakamoto Shiina
2025-06-21 09:38:38 +09:00
parent 1623352c92
commit e02ed91721
6 changed files with 46 additions and 28 deletions

View File

@@ -269,6 +269,9 @@ config_page:
websocket_port: websocket_port:
label: "WebSocket Port" label: "WebSocket Port"
notifications:
save_success: "Settings have been saved"
plugin_notifications: plugin_notifications:
downloading: Downloading the plugin. downloading: Downloading the plugin.
downloaded_success: Downloaded successfully. downloaded_success: Downloaded successfully.

View File

@@ -269,6 +269,9 @@ config_page:
websocket_port: websocket_port:
label: "WebSocket Port" label: "WebSocket Port"
notifications:
save_success: "設定を保存しました。"
plugin_notifications: plugin_notifications:
downloading: プラグインをダウンロード中。 downloading: プラグインをダウンロード中。
downloaded_success: プラグインのダウンロードが完了しました。 downloaded_success: プラグインのダウンロードが完了しました。

View File

@@ -138,7 +138,7 @@
.fade_out { .fade_out {
opacity: 1; opacity: 1;
animation-name: fade_out; animation-name: fade_out;
animation-duration: 0.2s; animation-duration: 0.1s;
animation-timing-function: ease-out; animation-timing-function: ease-in;
animation-fill-mode: forwards; animation-fill-mode: forwards;
} }

View File

@@ -35,14 +35,13 @@ export const SnackbarController = () => {
} }
); );
let hideDuration = 5000; let hide_duration = 5000;
if (settings.options?.hide_duration === null) { if (settings.options?.hide_duration === null) {
hideDuration = false; hide_duration = false;
} else if (Number(settings.options?.hide_duration)) { } else if (Number(settings.options?.hide_duration)) {
hideDuration = Number(settings.options?.hide_duration); hide_duration = Number(settings.options?.hide_duration);
} }
const to_hide_progress_bar = (settings.options?.to_hide_progress_bar === true) ? true : false;
useEffect(() => { useEffect(() => {
if (!settings.is_open) return; if (!settings.is_open) return;
@@ -50,22 +49,29 @@ export const SnackbarController = () => {
const message_text = settings.message; const message_text = settings.message;
const category_id = settings.category_id ? settings.category_id : message_text; const category_id = settings.category_id ? settings.category_id : message_text;
setContainerKey(prevKey => prevKey + 1); const to_hide_progress_bar = (settings.options?.to_hide_progress_bar === true) ? true : false;
const asyncShowNotification = async () => {
setTimeout(() => {
toast(message_text, {
toastId: category_id,
type: settings.status,
autoClose: hide_duration,
transition: CustomTransition,
toastClassName: snackbar_classname,
hideProgressBar: to_hide_progress_bar,
progressClassName: styles.toast_progress,
closeButton: <CloseButtonContainer />,
onClose: () => {
closeNotification();
},
});
}, 100);
};
setContainerKey(prevKey => prevKey + 1);
asyncShowNotification();
setTimeout(() => {
toast(message_text, {
toastId: category_id,
type: settings.status,
autoClose: hideDuration,
transition: CustomTransition,
toastClassName: snackbar_classname,
progressClassName: styles.toast_progress,
closeButton: <CloseButtonContainer />,
onClose: () => {
closeNotification();
},
});
}, 50);
}, [settings]); }, [settings]);
return ( return (
@@ -73,7 +79,7 @@ export const SnackbarController = () => {
key={containerKey} key={containerKey}
position="bottom-left" position="bottom-left"
transition={CustomTransition} transition={CustomTransition}
hideProgressBar={to_hide_progress_bar} hideProgressBar={false}
newestOnTop={false} newestOnTop={false}
closeOnClick={false} closeOnClick={false}
pauseOnFocusLoss={false} pauseOnFocusLoss={false}

View File

@@ -1,7 +1,9 @@
import { useStore_NotificationStatus } from "@store"; import { useStore_NotificationStatus } from "@store";
import { useI18n } from "@useI18n";
export const useNotificationStatus = () => { export const useNotificationStatus = () => {
const { currentNotificationStatus, updateNotificationStatus } = useStore_NotificationStatus(); const { currentNotificationStatus, updateNotificationStatus } = useStore_NotificationStatus();
const { t } = useI18n();
const showNotification_Warning = (message, options = {}) => { const showNotification_Warning = (message, options = {}) => {
updateNotificationStatus({ updateNotificationStatus({
@@ -34,12 +36,12 @@ export const useNotificationStatus = () => {
}; };
const showNotification_SaveSuccess = (options = {}) => { const showNotification_SaveSuccess = (options = {}) => {
options = { hide_duration: 2000, to_hide_progress_bar: true, ...options }; options = { hide_duration: 1000, to_hide_progress_bar: true, ...options };
updateNotificationStatus({ updateNotificationStatus({
status: "success", status: "success",
is_open: true, is_open: true,
category_id: (options.category_id) ? options.category_id : null, category_id: "save_success",
message: "設定の適用と、保存が完了しました。", message: t("config_page.notifications.save_success"),
options: options, options: options,
}); });
}; };

View File

@@ -283,6 +283,10 @@ export const usePlugins = () => {
}; };
const toggleSavedPluginsStatus = (target_plugin_id) => { const toggleSavedPluginsStatus = (target_plugin_id) => {
const successPluginNotification = (message) => showNotification_Success(message, {
hide_duration: 1000,
category_id: "to_enable_plugin"
});
const is_exists = currentSavedPluginsStatus.data.some( const is_exists = currentSavedPluginsStatus.data.some(
(d) => d.plugin_id === target_plugin_id (d) => d.plugin_id === target_plugin_id
); );
@@ -292,8 +296,8 @@ export const usePlugins = () => {
if (d.plugin_id === target_plugin_id) { if (d.plugin_id === target_plugin_id) {
d.is_enabled = !d.is_enabled; d.is_enabled = !d.is_enabled;
(d.is_enabled) (d.is_enabled)
? showNotification_Success(t("plugin_notifications.is_enabled")) ? successPluginNotification(t("plugin_notifications.is_enabled"))
: showNotification_Success(t("plugin_notifications.is_disabled")); : successPluginNotification(t("plugin_notifications.is_disabled"));
} }
return d; return d;
}); });
@@ -303,7 +307,7 @@ export const usePlugins = () => {
plugin_id: target_plugin_id, plugin_id: target_plugin_id,
is_enabled: true, is_enabled: true,
}); });
showNotification_Success(t("plugin_notifications.is_enabled")) successPluginNotification(t("plugin_notifications.is_enabled"))
} }
// 「currentPluginsData.data」でis_downloadedがtrueのものだけ残す // 「currentPluginsData.data」でis_downloadedがtrueのものだけ残す