152 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Vue
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Vue
		
	
	
		
			Executable File
		
	
	
	
	
| <template>
 | |
|     <div class="flex flex-col items-center justify-center w-full min-h-full">
 | |
|         <component :is="icon" class="w-16 h-16 mb-3 fill-primary-300" />
 | |
|         <dt class="text-lg font-medium text-center text-gray-800">
 | |
|             {{ title }}
 | |
|         </dt>
 | |
|         <dd class="text-sm text-center text-gray-800">
 | |
|             {{ desc }}
 | |
|         </dd>
 | |
|         <button v-if="props.type !== 'no_filter' && props.type !== 'not_found'"
 | |
|             class="px-3 py-2 mt-4 text-white rounded-lg bg-primary-500" @click="action">
 | |
|             {{ actionTitle }}
 | |
|         </button>
 | |
|     </div>
 | |
| </template>
 | |
| 
 | |
| <script setup lang="ts">
 | |
| import { computed } from 'vue'
 | |
| import {
 | |
|     IconFilter,
 | |
|     IconFileX,
 | |
|     IconNetworkDisconnected,
 | |
|     IconNetworkChange,
 | |
|     IconLinkBreak,
 | |
|     IconLockKey,
 | |
|     IconDatabase,
 | |
|     IconSmileySad
 | |
| } from '@/utils/icons'
 | |
| import { useRouter } from 'vue-router';
 | |
| 
 | |
| const router = useRouter()
 | |
| const props = defineProps({
 | |
|     type: {
 | |
|         type: String as () => "no_filter" | "not_found" | "disconnect" | "connection_change" | "error_404" | "error_403" | "error_500",
 | |
|         default: 'error_404',
 | |
|         required: true
 | |
|     },
 | |
|     action: {
 | |
|         type: Function as () => void,
 | |
|         default: () => { }
 | |
|     }
 | |
| })
 | |
| 
 | |
| const title = computed(() => {
 | |
|     switch (props.type) {
 | |
|         case 'no_filter':
 | |
|             return 'Pilih Filter'
 | |
|         case 'not_found':
 | |
|             return 'Tidak ditemukan'
 | |
|         case 'disconnect':
 | |
|             return 'Koneksi Terputus'
 | |
|         case 'connection_change':
 | |
|             return 'Perubahan Koneksi'
 | |
|         case 'error_404':
 | |
|             return 'Error 404'
 | |
|         case 'error_403':
 | |
|             return 'Error 403'
 | |
|         case 'error_500':
 | |
|             return 'Error 500'
 | |
|         default:
 | |
|             return 'Tidak ditemukan'
 | |
|     }
 | |
| })
 | |
| 
 | |
| const desc = computed(() => {
 | |
|     switch (props.type) {
 | |
|         case 'no_filter':
 | |
|             return 'Silahkan terapkan filter di atas untuk mulai menampilkan data'
 | |
|         case 'not_found':
 | |
|             return 'Data yang kamu cari tidak ditemukan'
 | |
|         case 'disconnect':
 | |
|             return 'Harap hubungkan perangkat ke jaringan internet'
 | |
|         case 'connection_change':
 | |
|             return 'Terjadinya perubahan koneksi, harap muat ulang halaman'
 | |
|         case 'error_404':
 | |
|             return 'Halaman yang kamu tuju tidak ditemukan'
 | |
|         case 'error_403':
 | |
|             return 'Kamu tidak punya akses ke halaman ini'
 | |
|         case 'error_500':
 | |
|             return 'Terjadi kesalahan, silahkan coba beberapa saat lagi'
 | |
|         default:
 | |
|             return 'Terjadi kesalahan, silahkan coba beberapa saat lagi'
 | |
|     }
 | |
| })
 | |
| 
 | |
| const icon = computed(() => {
 | |
|     switch (props.type) {
 | |
|         case 'no_filter':
 | |
|             return IconFilter
 | |
|         case 'not_found':
 | |
|             return IconFileX
 | |
|         case 'disconnect':
 | |
|             return IconNetworkDisconnected
 | |
|         case 'connection_change':
 | |
|             return IconNetworkChange
 | |
|         case 'error_404':
 | |
|             return IconLinkBreak
 | |
|         case 'error_403':
 | |
|             return IconLockKey
 | |
|         case 'error_500':
 | |
|             return IconDatabase
 | |
|         default:
 | |
|             return IconSmileySad
 | |
|     }
 | |
| })
 | |
| 
 | |
| const actionTitle = computed(() => {
 | |
|     switch (props.type) {
 | |
|         case 'disconnect':
 | |
|             return 'Coba Lagi'
 | |
|         case 'connection_change':
 | |
|             return 'Muat Ulang'
 | |
|         case 'error_404':
 | |
|             return 'Kembali'
 | |
|         case 'error_403':
 | |
|             return 'Kembali'
 | |
|         case 'error_500':
 | |
|             return 'Kembali'
 | |
|         default:
 | |
|             return 'Kembali'
 | |
|     }
 | |
| })
 | |
| 
 | |
| const action = () => {
 | |
|     switch (props.type) {
 | |
|         case 'disconnect':
 | |
|             return props.action
 | |
|         case 'connection_change':
 | |
|             return props.action
 | |
|         case 'error_404':
 | |
|             if (window.history.length > 1) {
 | |
|                 return window.history.back()
 | |
|             } else {
 | |
|                 return router.push('/home')
 | |
|             }
 | |
|         case 'error_403':
 | |
|             if (window.history.length > 1) {
 | |
|                 return window.history.back()
 | |
|             } else {
 | |
|                 return router.push('/home')
 | |
|             }
 | |
|         case 'error_500':
 | |
|             return props.action
 | |
|         default:
 | |
|             if (window.history.length > 1) {
 | |
|                 return window.history.back()
 | |
|             } else {
 | |
|                 return router.push('/home')
 | |
|             }
 | |
|     }
 | |
| }
 | |
| </script> |