import { nextTick, PropType, defineComponent } from 'vue'; // Utils import { pick, extend, truthProp, createNamespace } from '../utils'; // Components import { Icon } from '../icon'; import { Popup } from '../popup'; import { Loading } from '../loading'; import { popupSharedProps, popupSharedPropKeys } from '../popup/shared'; const [name, bem] = createNamespace('action-sheet'); export type ActionSheetAction = { name?: string; color?: string; subname?: string; loading?: boolean; disabled?: boolean; callback?: (action: ActionSheetAction) => void; className?: unknown; }; export default defineComponent({ name, props: extend({}, popupSharedProps, { title: String, round: truthProp, actions: Array as PropType, closeable: truthProp, cancelText: String, description: String, closeOnPopstate: Boolean, closeOnClickAction: Boolean, safeAreaInsetBottom: truthProp, closeIcon: { type: String, default: 'cross', }, }), emits: ['select', 'cancel', 'update:show'], setup(props, { slots, emit }) { const updateShow = (show: boolean) => emit('update:show', show); const onCancel = () => { updateShow(false); emit('cancel'); }; const renderHeader = () => { if (props.title) { return (
{props.title} {props.closeable && ( )}
); } }; const renderCancel = () => { if (slots.cancel || props.cancelText) { return [
, , ]; } }; const renderOption = (item: ActionSheetAction, index: number) => { const { name, color, subname, loading, callback, disabled, className, } = item; const Content = loading ? ( ) : ( [ {name}, subname &&
{subname}
, ] ); const onClick = () => { if (disabled || loading) { return; } if (callback) { callback(item); } if (props.closeOnClickAction) { updateShow(false); } nextTick(() => emit('select', item, index)); }; return ( ); }; const renderDescription = () => { if (props.description || slots.description) { const content = slots.description ? slots.description() : props.description; return
{content}
; } }; const renderOptions = () => { if (props.actions) { return props.actions.map(renderOption); } }; return () => ( {renderHeader()} {renderDescription()}
{renderOptions()} {slots.default?.()}
{renderCancel()}
); }, });