mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-03 14:03:18 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			173 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <div
 | 
						|
    :class="success || info ? 'bg-white' : 'bg-red-50'"
 | 
						|
    class="
 | 
						|
      max-w-sm
 | 
						|
      mb-3
 | 
						|
      rounded-lg
 | 
						|
      shadow-lg
 | 
						|
      cursor-pointer
 | 
						|
      pointer-events-auto
 | 
						|
      w-full
 | 
						|
      md:w-96
 | 
						|
    "
 | 
						|
    @click.stop="hideNotificationAction"
 | 
						|
    @mouseenter="clearNotificationTimeOut"
 | 
						|
    @mouseleave="setNotificationTimeOut"
 | 
						|
  >
 | 
						|
    <div class="overflow-hidden rounded-lg shadow-xs">
 | 
						|
      <div class="p-4">
 | 
						|
        <div class="flex items-start">
 | 
						|
          <div class="shrink-0">
 | 
						|
            <svg
 | 
						|
              v-if="success"
 | 
						|
              class="w-6 h-6 text-green-400"
 | 
						|
              fill="none"
 | 
						|
              viewBox="0 0 24 24"
 | 
						|
              stroke="currentColor"
 | 
						|
            >
 | 
						|
              <path
 | 
						|
                stroke-linecap="round"
 | 
						|
                stroke-linejoin="round"
 | 
						|
                stroke-width="2"
 | 
						|
                d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"
 | 
						|
              />
 | 
						|
            </svg>
 | 
						|
            <svg
 | 
						|
              v-if="info"
 | 
						|
              class="w-6 h-6 text-blue-400"
 | 
						|
              fill="currentColor"
 | 
						|
              viewBox="0 0 20 20"
 | 
						|
              xmlns="http://www.w3.org/2000/svg"
 | 
						|
            >
 | 
						|
              <path
 | 
						|
                fill-rule="evenodd"
 | 
						|
                d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z"
 | 
						|
                clip-rule="evenodd"
 | 
						|
              ></path>
 | 
						|
            </svg>
 | 
						|
            <svg
 | 
						|
              v-if="error"
 | 
						|
              class="w-6 h-6 text-red-400"
 | 
						|
              fill="currentColor"
 | 
						|
              viewBox="0 0 24 24"
 | 
						|
            >
 | 
						|
              <path
 | 
						|
                fill-rule="evenodd"
 | 
						|
                d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z"
 | 
						|
                clip-rule="evenodd"
 | 
						|
              />
 | 
						|
            </svg>
 | 
						|
          </div>
 | 
						|
          <div class="flex-1 w-0 ml-3 text-left">
 | 
						|
            <p
 | 
						|
              :class="`text-sm leading-5 font-medium ${
 | 
						|
                success || info ? 'text-gray-900' : 'text-red-800'
 | 
						|
              }`"
 | 
						|
            >
 | 
						|
              {{
 | 
						|
                notification.title
 | 
						|
                  ? notification.title
 | 
						|
                  : success
 | 
						|
                  ? 'Success!'
 | 
						|
                  : 'Error'
 | 
						|
              }}
 | 
						|
            </p>
 | 
						|
            <p
 | 
						|
              :class="`mt-1 text-sm leading-5 ${
 | 
						|
                success || info ? 'text-gray-500' : 'text-red-700'
 | 
						|
              }`"
 | 
						|
            >
 | 
						|
              {{
 | 
						|
                notification.message
 | 
						|
                  ? notification.message
 | 
						|
                  : success
 | 
						|
                  ? 'Successful'
 | 
						|
                  : 'Something went wrong'
 | 
						|
              }}
 | 
						|
            </p>
 | 
						|
          </div>
 | 
						|
          <div class="flex shrink-0">
 | 
						|
            <button
 | 
						|
              :class="
 | 
						|
                success || info
 | 
						|
                  ? ' text-gray-400 focus:text-gray-500'
 | 
						|
                  : 'text-red-400 focus:text-red-500'
 | 
						|
              "
 | 
						|
              class="
 | 
						|
                inline-flex
 | 
						|
                w-5
 | 
						|
                h-5
 | 
						|
                transition
 | 
						|
                duration-150
 | 
						|
                ease-in-out
 | 
						|
                focus:outline-none
 | 
						|
              "
 | 
						|
              @click="hideNotificationAction"
 | 
						|
            >
 | 
						|
              <svg
 | 
						|
                class="w-6 h-6"
 | 
						|
                fill="currentColor"
 | 
						|
                viewBox="0 0 20 20"
 | 
						|
                xmlns="http://www.w3.org/2000/svg"
 | 
						|
              >
 | 
						|
                <path
 | 
						|
                  fill-rule="evenodd"
 | 
						|
                  d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
 | 
						|
                  clip-rule="evenodd"
 | 
						|
                ></path>
 | 
						|
              </svg>
 | 
						|
            </button>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
 | 
						|
<script setup>
 | 
						|
import { onMounted, computed, ref } from 'vue'
 | 
						|
import { useNotificationStore } from '@/scripts/stores/notification'
 | 
						|
 | 
						|
const props = defineProps({
 | 
						|
  notification: {
 | 
						|
    type: Object,
 | 
						|
    default: null,
 | 
						|
  },
 | 
						|
})
 | 
						|
 | 
						|
const notificationStore = useNotificationStore()
 | 
						|
 | 
						|
let notiTimeOut = ref('')
 | 
						|
 | 
						|
const success = computed(() => {
 | 
						|
  return props.notification.type == 'success'
 | 
						|
})
 | 
						|
 | 
						|
const error = computed(() => {
 | 
						|
  return props.notification.type == 'error'
 | 
						|
})
 | 
						|
 | 
						|
const info = computed(() => {
 | 
						|
  return props.notification.type == 'info'
 | 
						|
})
 | 
						|
 | 
						|
function hideNotificationAction() {
 | 
						|
  notificationStore.hideNotification(props.notification)
 | 
						|
}
 | 
						|
 | 
						|
function clearNotificationTimeOut() {
 | 
						|
  clearTimeout(notiTimeOut)
 | 
						|
}
 | 
						|
 | 
						|
function setNotificationTimeOut() {
 | 
						|
  notiTimeOut = setTimeout(() => {
 | 
						|
    notificationStore.hideNotification(props.notification)
 | 
						|
  }, props.notification.time || 5000)
 | 
						|
}
 | 
						|
 | 
						|
onMounted(() => {
 | 
						|
  setNotificationTimeOut()
 | 
						|
})
 | 
						|
</script>
 |