// Utils import { createNamespace } from '../utils'; // Mixins import { popupMixinProps } from '../mixins/popup'; // Components import Icon from '../icon'; import Popup from '../popup'; import Loading from '../loading'; const [createComponent, bem] = createNamespace('action-sheet'); export default createComponent({ props: { ...popupMixinProps, title: String, actions: Array, duration: [Number, String], cancelText: String, description: String, getContainer: [String, Function], closeOnPopstate: Boolean, closeOnClickAction: Boolean, round: { type: Boolean, default: true, }, closeIcon: { type: String, default: 'cross', }, safeAreaInsetBottom: { type: Boolean, default: true, }, overlay: { type: Boolean, default: true, }, closeOnClickOverlay: { type: Boolean, default: true, }, }, emits: [ 'open', 'close', 'opened', 'closed', 'cancel', 'select', 'update:show', 'click-overlay', ], setup(props, { slots, emit }) { function onCancel() { emit('update:show', false); emit('cancel'); } const createEmitter = (name) => () => emit(name); const listeners = { onOpen: createEmitter('open'), onClose: createEmitter('close'), onOpened: createEmitter('opened'), onClosed: createEmitter('closed'), 'onClick-overlay': createEmitter('click-overlay'), 'onUpdate:show': (show) => { emit('update:show', show); }, }; return function () { const { title, cancelText } = props; function Header() { if (title) { return (
{title}
); } } function Content() { if (slots.default) { return
{slots.default()}
; } } function Option(item, index) { const { disabled, loading, callback } = item; function onClickOption(event) { event.stopPropagation(); if (disabled || loading) { return; } if (callback) { callback(item); } emit('select', item, index); if (props.closeOnClickAction) { emit('update:show', false); } } function OptionContent() { if (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()} ); }; }, });