import "../../../../src/sass/helpers/animations.sass";
import "../../../../src/components/notices/sass/notices.sass";
import { constant } from 'fp-ts/lib/function';
import { useMessage, UseMessagePropsDefinition } from '../../../composables/message';
import { useNoticeController, UseNoticePropsDefinition } from '../../../composables/noticeController';
import { formatTransition } from '../../../composables/transition';
import { Transition, h, defineComponent, shallowRef, withDirectives, vShow } from 'vue';
import { constEmptyArray } from '../../../utils/helpers';
export const BNotificationPropsDefinition = { ...UseMessagePropsDefinition,
  ...UseNoticePropsDefinition,
  isNotice: {
    type: Boolean,
    default: false
  },
  icon: {
    type: [Object, Function]
  }
};

function generateCloseButton(props, messageController, noticeController) {
  return h('button', {
    class: 'delete',
    onClick: props.isNotice ? noticeController.close : messageController.setOff
  });
}

function generateIcon(messageController) {
  const icon = messageController.icon.value;
  return icon ? h('div', {
    class: 'media-left'
  }, [h(icon, {
    size: messageController.iconSize.value
  })]) : undefined;
}

function generateNoticeContent(context, message) {
  return h('div', {
    class: 'media-content'
  }, context.slots.default && context.slots.default() || h('p', message));
}

function generateNoticeBody(props, context, messageController, noticeController, message) {
  return h('div', {
    class: 'media'
  }, props.useIcon && messageController.icon.value ? [generateIcon(messageController), generateNoticeContent(context, message)] : [generateNoticeContent(context, message)]);
}

function getGenerateNotice(props, context, messageController, noticeController) {
  return options => () => {
    const notice = h('article', {
      class: ['notification', options.variant ?? props.variant, options.position ?? props.position]
    }, props.isClosable ? [generateCloseButton(props, messageController, noticeController), generateNoticeBody(props, context, messageController, noticeController, options.message ?? props.message)] : [generateNoticeBody(props, context, messageController, noticeController, options.message ?? props.message)]);
    return props.isNotice ? [notice] : [withDirectives(notice, [[vShow, messageController.isOn.value]])];
  };
}

export default defineComponent({
  name: 'b-notification',
  props: BNotificationPropsDefinition,

  setup(props, context) {
    const renderNotification = shallowRef(constant(constEmptyArray));
    const noticeController = useNoticeController(props, renderNotification);
    const messageController = useMessage(props);
    renderNotification.value = getGenerateNotice(props, context, messageController, noticeController);
    return () => props.isNotice ? context.slots.trigger && context.slots.trigger({
      open: noticeController.open,
      close: noticeController.close
    }) : h(Transition, props.transition ? formatTransition(props.transition) : {}, renderNotification.value({}));
  }

});
//# sourceMappingURL=BNotification.js.map