import { createNamespace } from '../utils'; import { emit, inherit } from '../utils/functional'; import { BORDER_TOP, BORDER_BOTTOM } from '../utils/constant'; import { PopupMixin } from '../mixins/popup'; import Icon from '../icon'; import Popup from '../popup'; import Loading from '../loading'; // Types import { CreateElement, RenderContext } from 'vue/types'; import { DefaultSlots } from '../utils/types'; import { PopupMixinProps } from '../mixins/popup/type'; export type ActionSheetItem = { name: string; color?: string; subname?: string; loading?: boolean; disabled?: boolean; className?: string; callback?: (item: ActionSheetItem) => void; }; export type ActionSheetProps = PopupMixinProps & { round: boolean; title?: string; actions?: ActionSheetItem[]; duration: number; closeIcon: string; cancelText?: string; description?: string; closeOnClickAction?: boolean; safeAreaInsetBottom?: boolean; }; const [createComponent, bem] = createNamespace('action-sheet'); function ActionSheet( h: CreateElement, props: ActionSheetProps, slots: DefaultSlots, ctx: RenderContext ) { const { title, cancelText } = props; function onCancel() { emit(ctx, 'input', false); emit(ctx, 'cancel'); } function Header() { if (title) { return (
{title}
); } } function Content() { if (slots.default) { return
{slots.default()}
; } } function Option(item: ActionSheetItem, index: number) { const disabled = item.disabled || item.loading; function onClickOption(event: MouseEvent) { event.stopPropagation(); if (item.disabled || item.loading) { return; } if (item.callback) { item.callback(item); } emit(ctx, 'select', item, index); if (props.closeOnClickAction) { emit(ctx, 'input', false); } } function OptionContent() { if (item.loading) { return ; } return [ {item.name}, item.subname && {item.subname} ]; } return ( ); } function CancelText() { if (cancelText) { return ( ); } } const Description = props.description && (
{props.description}
); return ( {Header()} {Description} {props.actions && props.actions.map(Option)} {Content()} {CancelText()} ); } ActionSheet.props = { ...PopupMixin.props, title: String, actions: Array, duration: Number, cancelText: String, description: String, getContainer: [String, Function], closeOnClickAction: Boolean, round: { type: Boolean, default: true }, closeIcon: { type: String, default: 'close' }, safeAreaInsetBottom: { type: Boolean, default: true }, overlay: { type: Boolean, default: true }, closeOnClickOverlay: { type: Boolean, default: true } }; export default createComponent(ActionSheet);