| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import { use } from '../utils';
- import { emit, inherit } from '../utils/functional';
- import { PopupMixin } from '../mixins/popup';
- import Icon from '../icon';
- import Loading from '../loading';
- import Popup from '../popup';
- // Types
- import { CreateElement, RenderContext } from 'vue/types';
- import { DefaultSlots } from '../utils/use/sfc';
- import { PopupMixinProps } from '../mixins/popup/type';
- export type ActionsheetItem = {
- name: string;
- subname?: string;
- loading?: boolean;
- disabled?: boolean;
- className?: string;
- callback?: (item: ActionsheetItem) => void;
- };
- export type ActionsheetProps = PopupMixinProps & {
- title?: string;
- actions: ActionsheetItem[];
- cancelText?: string;
- safeAreaInsetBottom?: boolean;
- };
- const [sfc, bem] = use('actionsheet');
- function Actionsheet(
- h: CreateElement,
- props: ActionsheetProps,
- slots: DefaultSlots,
- ctx: RenderContext<ActionsheetProps>
- ) {
- const { title, cancelText } = props;
- const onCancel = () => {
- emit(ctx, 'input', false);
- emit(ctx, 'cancel');
- };
- const Header = () => (
- <div class={[bem('header'), 'van-hairline--top-bottom']}>
- {title}
- <Icon name="close" class={bem('close')} onClick={onCancel} />
- </div>
- );
- const Option = (item: ActionsheetItem, index: number) => (
- <div
- class={[
- bem('item', { disabled: item.disabled || item.loading }),
- item.className,
- 'van-hairline--top'
- ]}
- onClick={(event: Event) => {
- event.stopPropagation();
- if (!item.disabled && !item.loading) {
- if (item.callback) {
- item.callback(item);
- }
- emit(ctx, 'select', item, index);
- }
- }}
- >
- {item.loading ? (
- <Loading class={bem('loading')} size="20px" />
- ) : (
- [
- <span class={bem('name')}>{item.name}</span>,
- item.subname && <span class={bem('subname')}>{item.subname}</span>
- ]
- )}
- </div>
- );
- return (
- <Popup
- class={bem({ 'safe-area-inset-bottom': props.safeAreaInsetBottom })}
- value={props.value}
- position="bottom"
- overlay={props.overlay}
- lazyRender={props.lazyRender}
- getContainer={props.getContainer}
- closeOnClickOverlay={props.closeOnClickOverlay}
- onInput={(value: boolean) => {
- emit(ctx, 'input', value);
- }}
- {...inherit(ctx)}
- >
- {title ? Header() : props.actions.map(Option)}
- {slots.default && <div class={bem('content')}>{slots.default()}</div>}
- {cancelText && (
- <div class={bem('cancel')} onClick={onCancel}>
- {cancelText}
- </div>
- )}
- </Popup>
- );
- }
- Actionsheet.props = {
- ...PopupMixin.props,
- title: String,
- actions: Array,
- cancelText: String,
- safeAreaInsetBottom: Boolean,
- overlay: {
- type: Boolean,
- default: true
- },
- closeOnClickOverlay: {
- type: Boolean,
- default: true
- }
- };
- export default sfc<ActionsheetProps>(Actionsheet);
|