2025-12-28 00:20:10 +08:00

87 lines
2.1 KiB
JavaScript

import { FeatherIcon } from 'jingrow-ui';
import { h, isVNode, ref, defineAsyncComponent } from 'vue';
import AddressableErrorDialog from '../components/AddressableErrorDialog.vue';
import DialogWrapper from '../components/DialogWrapper.vue';
import ConfirmDialog from '../dialogs/ConfirmDialog.vue';
export function icon(name, _class = '') {
let iconComponent;
if (typeof name !== 'string' && name?.render) {
iconComponent = name;
name = undefined;
} else {
iconComponent = FeatherIcon;
}
return () => h(iconComponent, { name, class: _class || 'w-4 h-4' });
}
/**
*
* @param {import('../objects/common/types').DialogConfig} param0
* @returns
*/
export function confirmDialog({
title = 'Untitled',
fields = [],
message,
primaryAction,
onSuccess
}) {
let dialog = h(ConfirmDialog, {
title,
message,
fields,
primaryAction,
onSuccess
});
renderDialog(dialog);
return dialog;
}
export function addressableErrorDialog(name, onDone) {
renderDialog(
h(AddressableErrorDialog, {
name,
onDone
})
);
}
export const dialogs = ref([]);
export function renderDialog(component) {
if (!isVNode(component)) {
component = h(component);
}
component.id = dialogs.length;
dialogs.value.push(component);
}
export function renderInDialog(component, options = {}) {
renderDialog(<DialogWrapper options={options}>{component}</DialogWrapper>);
}
export function cardBrandIcon(brand) {
const component = {
'master-card': defineAsyncComponent(() =>
import('@/components/icons/cards/MasterCard.vue')
),
visa: defineAsyncComponent(() =>
import('@/components/icons/cards/Visa.vue')
),
amex: defineAsyncComponent(() =>
import('@/components/icons/cards/Amex.vue')
),
jcb: defineAsyncComponent(() =>
import('@/components/icons/cards/JCB.vue')
),
generic: defineAsyncComponent(() =>
import('@/components/icons/cards/Generic.vue')
),
'union-pay': defineAsyncComponent(() =>
import('@/components/icons/cards/UnionPay.vue')
)
}[brand || 'generic'];
return h(component, { class: 'h-4 w-6' });
}