import { snackbar as mduiSnackbar, Snackbar } from "mdui" import ApiCallbackMessage from "../api/ApiCallbackMessage.ts" interface Options { /** * Snackbar 出现的位置。默认为 `bottom`。可选值为: * * `top`:位于顶部,居中对齐 * * `top-start`:位于顶部,左对齐 * * `top-end`:位于顶部,右对齐 * * `bottom`:位于底部,居中对齐 * * `bottom-start`:位于底部,左对齐 * * `bottom-end`:位于底部,右对齐 */ placement?: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end'; /** * 操作按钮的文本 */ action?: string; /** * 是否在右侧显示关闭按钮 */ closeable?: boolean; /** * 消息文本最多显示几行。默认不限制行数。可选值为 * * `1`:消息文本最多显示一行 * * `2`:消息文本最多显示两行 */ messageLine?: 1 | 2; /** * 在多长时间后自动关闭(单位为毫秒)。设置为 0 时,不自动关闭。默认为 5 秒后自动关闭。 */ autoCloseDelay?: number; /** * 点击或触摸 Snackbar 以外的区域时是否关闭 Snackbar */ closeOnOutsideClick?: boolean; /** * 队列名称。 * 默认不启用队列,在多次调用该函数时,将同时显示多个 snackbar。 * 可在该参数中传入一个队列名称,具有相同队列名称的 snackbar 函数,将在上一个 snackbar 关闭后才打开下一个 snackbar。 */ queue?: string; /** * 点击 Snackbar 时的回调函数。 * 函数参数为 snackbar 实例,`this` 也指向 snackbar 实例。 * @param snackbar */ onClick?: (snackbar: Snackbar) => void; /** * 点击操作按钮时的回调函数。 * 函数参数为 snackbar 实例,`this` 也指向 snackbar 实例。 * 默认点击后会关闭 snackbar;若返回值为 false,则不关闭 snackbar;若返回值为 promise,则将在 promise 被 resolve 后,关闭 snackbar。 * @param snackbar */ onActionClick?: (snackbar: Snackbar) => void | boolean | Promise; /** * Snackbar 开始显示时的回调函数。 * 函数参数为 snackbar 实例,`this` 也指向 snackbar 实例。 * @param snackbar */ onOpen?: (snackbar: Snackbar) => void; /** * Snackbar 显示动画完成时的回调函数。 * 函数参数为 snackbar 实例,`this` 也指向 snackbar 实例。 * @param snackbar */ onOpened?: (snackbar: Snackbar) => void; /** * Snackbar 开始隐藏时的回调函数。 * 函数参数为 snackbar 实例,`this` 也指向 snackbar 实例。 * @param snackbar */ onClose?: (snackbar: Snackbar) => void; /** * Snackbar 隐藏动画完成时的回调函数。 * 函数参数为 snackbar 实例,`this` 也指向 snackbar 实例。 * @param snackbar */ onClosed?: (snackbar: Snackbar) => void; } interface SnackbarOptions extends Options { message: string } export function checkApiSuccessOrSncakbar(re: ApiCallbackMessage, msg_ahead: string, opinions_override: Options = {}): Snackbar | null { return re.code != 200 ? snackbar( Object.assign({ message: `${msg_ahead}: ${re.msg.indexOf("Failed to fetch") != -1 ? "HTTP 请求失败" : re.msg } [${re.code}]`, placement: "top", } as SnackbarOptions, opinions_override) ) : null } export function snackbar(opinions: SnackbarOptions) { opinions.autoCloseDelay == null && (opinions.autoCloseDelay = 3500) return mduiSnackbar(opinions) }