From 406c6f3c9f9f445b92aab9837f52e1fe1419f9c6 Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 2 Jul 2025 14:10:22 +0800 Subject: [PATCH] UI & API Menu Keamanan, Kontak Darurat --- bun.lockb | Bin 316067 -> 320554 bytes package.json | 4 +- .../keamanan/kontak-darurat-keamanan.ts | 259 +++++++++++++++++ .../keamanan/pencegahan-kriminalitas.ts | 0 .../kontak-darurat/[id]/edit/page.tsx | 269 ++++++++++++++++++ .../keamanan/kontak-darurat/[id]/page.tsx | 117 ++++++++ .../keamanan/kontak-darurat/create/page.tsx | 229 +++++++++++++-- .../keamanan/kontak-darurat/detail/page.tsx | 70 ----- .../keamanan/kontak-darurat/edit/page.tsx | 44 --- .../keamanan/kontak-darurat/page.tsx | 46 ++- .../keamanan/kontak-darurat-keamanan/del.ts | 21 +- .../kontak-darurat-keamanan/findUnique.ts | 6 +- .../keamanan/kontak-darurat-keamanan/index.ts | 2 +- 13 files changed, 916 insertions(+), 151 deletions(-) create mode 100644 src/app/admin/(dashboard)/_state/keamanan/kontak-darurat-keamanan.ts create mode 100644 src/app/admin/(dashboard)/_state/keamanan/pencegahan-kriminalitas.ts create mode 100644 src/app/admin/(dashboard)/keamanan/kontak-darurat/[id]/edit/page.tsx create mode 100644 src/app/admin/(dashboard)/keamanan/kontak-darurat/[id]/page.tsx delete mode 100644 src/app/admin/(dashboard)/keamanan/kontak-darurat/detail/page.tsx delete mode 100644 src/app/admin/(dashboard)/keamanan/kontak-darurat/edit/page.tsx diff --git a/bun.lockb b/bun.lockb index 347d9ab5aa371f5c5da89edbc09029c8c43143e9..4fd1477e6a1089aaf9878c88a12ec2c871c3f647 100755 GIT binary patch delta 50620 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 delta 47667 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 `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + kontakDaruratKeamananState.create.loading = true; + const res = await ApiFetch.api.keamanan.kontakdaruratkeamanan[ + "create" + ].post(kontakDaruratKeamananState.create.form); + if (res.status === 200) { + kontakDaruratKeamananState.findMany.load(); + return toast.success("success create"); + } + console.log(res); + return toast.error("failed create"); + } catch (error) { + console.log((error as Error).message); + } finally { + kontakDaruratKeamananState.create.loading = false; + } + }, + }, + findMany: { + data: null as + | Prisma.KontakDaruratKeamananGetPayload<{ + include: { + kontakItems: true; + image: true; + }; + }>[] + | null, + async load() { + const res = await ApiFetch.api.keamanan.kontakdaruratkeamanan[ + "find-many" + ].get(); + if (res.status === 200) { + kontakDaruratKeamananState.findMany.data = res.data?.data ?? []; + } + }, + }, + findUnique: { + data: null as Prisma.KontakDaruratKeamananGetPayload<{ + include: { + kontakItems: { + include: { + image: true; + }; + }; + image: true; + }; + }> | null, + loading: false, + async load(id: string) { + try { + const res = await fetch(`/api/keamanan/kontakdaruratkeamanan/${id}`); + if (res.ok) { + const data = await res.json(); + kontakDaruratKeamananState.findUnique.data = data.data ?? null; + } else { + console.error("Failed to fetch data", res.status, res.statusText); + kontakDaruratKeamananState.findUnique.data = null; + } + } catch (error) { + console.error("Error fetching data:", error); + kontakDaruratKeamananState.findUnique.data = null; + } + }, + }, + delete: { + loading: false, + async byId(id: string) { + if (!id) return toast.warn("ID tidak valid"); + try { + kontakDaruratKeamananState.delete.loading = true; + const response = await fetch( + `/api/keamanan/kontakdaruratkeamanan/del/${id}`, + { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + } + ); + + const result = await response.json(); + + if (response.ok && result?.success) { + toast.success(result.message || "Kontak darurat berhasil dihapus"); + await kontakDaruratKeamananState.findMany.load(); // refresh list + } else { + toast.error(result?.message || "Gagal menghapus kontak darurat"); + } + } catch (error) { + console.error("Gagal delete:", error); + toast.error("Terjadi kesalahan saat menghapus kontak darurat"); + } finally { + kontakDaruratKeamananState.delete.loading = false; + } + }, + }, + update: { + id: "", + form: { ...defaultForm }, + loading: false, + + async load(id: string) { + if (!id) { + toast.warn("ID tidak valid"); + return null; + } + + try { + const response = await fetch( + `/api/keamanan/kontakdaruratkeamanan/${id}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + } + ); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const result = await response.json(); + if (result?.success) { + const data = result.data; + this.id = data.id; + this.form = { + nama: data.nama, + imageId: data.imageId, + kontakItems: [ + { + nama: data.kontakItems.nama, + nomorTelepon: data.kontakItems.nomorTelepon, + imageId: data.kontakItems.imageId, + }, + ], + }; + return data; + } else { + throw new Error(result?.message || "Gagal memuat data"); + } + } catch (error) { + console.error("Error loading kontak darurat:", error); + toast.error( + error instanceof Error ? error.message : "Gagal memuat data" + ); + return null; + } + }, + + async update() { + const cek = templateForm.safeParse( + kontakDaruratKeamananState.update.form + ); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + + try { + kontakDaruratKeamananState.update.loading = true; + const response = await fetch( + `/api/keamanan/kontakdaruratkeamanan/${this.id}`, + { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + nama: this.form.nama, + imageId: this.form.imageId, + kontakItems: [ + { + nama: this.form.kontakItems[0].nama, + nomorTelepon: this.form.kontakItems[0].nomorTelepon, + imageId: this.form.kontakItems[0].imageId, + }, + ], + }), + } + ); + if (!response.ok) { + const errorData = await response.json().catch(() => ({})); + throw new Error( + errorData.message || `HTTP error! status: ${response.status}` + ); + } + const result = await response.json(); + if (result.success) { + toast.success("Berhasil update kontak darurat"); + await kontakDaruratKeamananState.findMany.load(); // refresh list + return true; + } else { + throw new Error(result.message || "Gagal mengupdate kontak darurat"); + } + } catch (error) { + console.error("Error updating kontak darurat:", error); + toast.error( + error instanceof Error + ? error.message + : "Gagal mengupdate kontak darurat" + ); + return false; + } finally { + kontakDaruratKeamananState.update.loading = false; + } + }, + reset() { + kontakDaruratKeamananState.update.id = ""; + kontakDaruratKeamananState.update.form = { ...defaultForm }; + }, + }, +}); + +export default kontakDaruratKeamananState; diff --git a/src/app/admin/(dashboard)/_state/keamanan/pencegahan-kriminalitas.ts b/src/app/admin/(dashboard)/_state/keamanan/pencegahan-kriminalitas.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/[id]/edit/page.tsx new file mode 100644 index 00000000..dd844bc5 --- /dev/null +++ b/src/app/admin/(dashboard)/keamanan/kontak-darurat/[id]/edit/page.tsx @@ -0,0 +1,269 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +'use client' +import kontakDaruratKeamananState from '@/app/admin/(dashboard)/_state/keamanan/kontak-darurat-keamanan'; +import colors from '@/con/colors'; +import ApiFetch from '@/lib/api-fetch'; +import { Box, Button, Group, Image, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; +import { Dropzone } from '@mantine/dropzone'; +import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; +import { useParams, useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; + + +function EditKontakDarurat() { + const router = useRouter(); + const kontakState = useProxy(kontakDaruratKeamananState) + const params = useParams() + + const [previewUtama, setPreviewUtama] = useState(null); + const [fileUtama, setFileUtama] = useState(null); + const [previewItem, setPreviewItem] = useState(null); + const [fileItem, setFileItem] = useState(null); + const [formData, setFormData] = useState({ + name: kontakState.update.form.nama || '', + imageId: kontakState.update.form.imageId || '', + kontakItem: { + nama: kontakState.update.form.kontakItems[0].nama || '', + nomorTelepon: kontakState.update.form.kontakItems[0].nomorTelepon || '', + imageId: kontakState.update.form.kontakItems[0].imageId || '', + } + }) + + useEffect(() => { + const loadKontakDarurat = async () => { + const id = params?.id as string; + if (!id) return; + + try { + const data = await kontakState.update.load(id); + if (data) { + setFormData({ + name: data.nama || '', + imageId: data.imageId || '', + kontakItem: { + nama: data.kontakItems[0].nama || '', + nomorTelepon: data.kontakItems[0].nomorTelepon || '', + imageId: data.kontakItems[0].imageId || '', + }, + }); + + if (data?.image?.link) { + setPreviewUtama(data.image.link); + } + if (data?.kontakItems[0].image?.link) { + setPreviewItem(data.kontakItems[0].image.link); + } + } + } catch (error) { + console.error("Error loading kontak darurat:", error); + toast.error("Gagal memuat data kontak darurat"); + } + }; + + loadKontakDarurat(); + }, [params?.id]); + + const handleSubmit = async () => { + try { + kontakState.update.form = { + ...kontakState.update.form, + nama: formData.name, + imageId: formData.imageId, + kontakItems: [ + { + nama: formData.kontakItem.nama, + nomorTelepon: formData.kontakItem.nomorTelepon, + imageId: formData.kontakItem.imageId, + }, + ], + } + + if(fileUtama) { + const res = await ApiFetch.api.fileStorage.create.post({ file: fileUtama, name: fileUtama.name }); + const uploaded = res.data?.data; + + if (!uploaded?.id) { + return toast.error("Gagal upload gambar"); + } + + kontakState.update.form.imageId = uploaded.id; + } + if(fileItem) { + const res = await ApiFetch.api.fileStorage.create.post({ file: fileItem, name: fileItem.name }); + const uploaded = res.data?.data; + + if (!uploaded?.id) { + return toast.error("Gagal upload gambar"); + } + + kontakState.update.form.kontakItems[0].imageId = uploaded.id; + } + + await kontakState.update.update(); + toast.success("Kontak Darurat berhasil diperbarui!"); + router.push("/admin/keamanan/kontak-darurat"); + } catch (error) { + console.error("Error updating kontak darurat:", error); + toast.error("Terjadi kesalahan saat memperbarui kontak darurat"); + } + } + + return ( + + + + + + + + Edit Kontak Darurat + { + setFormData({ ...formData, name: val.target.value }); + }} + label={Nama Kategori Darurat} + placeholder='Masukkan nama Kategori Darurat' + /> + + Gambar + + { + const selectedFile = files[0]; // Ambil file pertama + if (selectedFile) { + setFileUtama(selectedFile); + setPreviewUtama(URL.createObjectURL(selectedFile)); // Buat preview + } + }} + onReject={() => toast.error('File tidak valid.')} + maxSize={5 * 1024 ** 2} // Maks 5MB + accept={{ 'image/*': [] }} + > + + + + + + + + + + + +
+ + Drag gambar ke sini atau klik untuk pilih file + + + Maksimal 5MB dan harus format gambar + +
+
+
+ + {/* Tampilkan preview kalau ada */} + {previewUtama && ( + + Preview + + )} + +
+
+ Nama Kontak} + placeholder='Masukkan nama Kontak' + value={formData.kontakItem.nama} + onChange={(val) => { + setFormData({ ...formData, kontakItem: { ...formData.kontakItem, nama: val.target.value } }); + }} + /> + Nomor Telepon Kontak} + placeholder='Masukkan nomor telepon Kontak' + value={formData.kontakItem.nomorTelepon} + onChange={(val) => { + setFormData({ ...formData, kontakItem: { ...formData.kontakItem, nomorTelepon: val.target.value } }); + }} + /> + + Gambar + + { + const selectedFile = files[0]; // Ambil file pertama + if (selectedFile) { + setFileItem(selectedFile); + setPreviewItem(URL.createObjectURL(selectedFile)); // Buat preview + } + }} + onReject={() => toast.error('File tidak valid.')} + maxSize={5 * 1024 ** 2} // Maks 5MB + accept={{ 'image/*': [] }} + > + + + + + + + + + + + +
+ + Drag gambar ke sini atau klik untuk pilih file + + + Maksimal 5MB dan harus format gambar + +
+
+
+ + {/* Tampilkan preview kalau ada */} + {previewItem && ( + + Preview + + )} + +
+
+ + + +
+
+
+ ); +} + +export default EditKontakDarurat; diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/[id]/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/[id]/page.tsx new file mode 100644 index 00000000..eb7fbd31 --- /dev/null +++ b/src/app/admin/(dashboard)/keamanan/kontak-darurat/[id]/page.tsx @@ -0,0 +1,117 @@ +'use client' +import colors from '@/con/colors'; +import { Box, Button, Paper, Stack, Flex, Text, Image, Skeleton } from '@mantine/core'; +import { IconArrowBack, IconX, IconEdit } from '@tabler/icons-react'; +import { useRouter,useParams } from 'next/navigation'; +import React from 'react'; +// import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; +import { useProxy } from 'valtio/utils'; +import kontakDaruratKeamananState from '../../../_state/keamanan/kontak-darurat-keamanan'; +import { useShallowEffect } from '@mantine/hooks'; +import { useState } from 'react'; +import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; + +function DetailKontakDarurat() { + const [modalHapus, setModalHapus] = useState(false) + const [selectedId, setSelectedId] = useState(null) + const router = useRouter(); + const params = useParams() + const kontakState = useProxy(kontakDaruratKeamananState) + + useShallowEffect(() => { + kontakState.findUnique.load(params?.id as string) + }, []) + + const handleDelete = () => { + if (selectedId) { + kontakState.delete.byId(selectedId) + setModalHapus(false) + setSelectedId(null) + router.push("/admin/keamanan/kontak-darurat") + } + } + + if (!kontakState.findUnique.data) { + return ( + + + + ) + } + + return ( + + + + + + + Detail Kontak Darurat + {kontakState.findUnique.data ? ( + + + + Judul Kontak Darurat + {kontakState.findUnique.data?.nama} + + + Gambar + gambar + + + Kontak + + {kontakState.findUnique.data?.kontakItems.map((item, index) => ( + + {item.nama} + {item.nomorTelepon} + gambar + + ))} + + + + + + + + + ) : null} + + + + {/* Modal Konfirmasi Hapus */} + setModalHapus(false)} + onConfirm={handleDelete} + text='Apakah anda yakin ingin menghapus kontak darurat ini?' + /> + + ); +} + +export default DetailKontakDarurat; diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/create/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/create/page.tsx index b9b314ee..4928b908 100644 --- a/src/app/admin/(dashboard)/keamanan/kontak-darurat/create/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/kontak-darurat/create/page.tsx @@ -1,43 +1,236 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; -import { IconArrowBack, IconImageInPicture } from '@tabler/icons-react'; +import ApiFetch from '@/lib/api-fetch'; +import { Box, Button, Group, Image, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; +import { Dropzone } from '@mantine/dropzone'; +import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { KeamananEditor } from '../../_com/keamananEditor'; +import { useState } from 'react'; +import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; +import kontakDaruratKeamananState from '../../../_state/keamanan/kontak-darurat-keamanan'; + function CreateKontakDarurat() { + const kontakState = useProxy(kontakDaruratKeamananState) const router = useRouter(); + const [fileUtama, setFileUtama] = useState(null); + const [previewUtama, setPreviewUtama] = useState(null); + const [fileItem, setFileItem] = useState(null); + const [previewItem, setPreviewItem] = useState(null); + + + const resetForm = () => { + kontakState.create.form = { + nama: "", + imageId: "", + kontakItems: [ + { + nama: "", + nomorTelepon: "", + imageId: "", + }, + ], + } + setPreviewUtama(null); + setFileUtama(null); + setPreviewItem(null); + setFileItem(null); + } + + const handleSubmit = async () => { + if (!fileUtama) { + return toast.warn("Pilih file gambar terlebih dahulu"); + } + + const res = await ApiFetch.api.fileStorage.create.post({ + file: fileUtama, + name: fileUtama.name, + }) + + const uploaded = res.data?.data; + + if (!uploaded?.id) { + return toast.error("Gagal mengupload file"); + } + + kontakState.create.form.imageId = uploaded.id; + + if (!fileItem) { + return toast.error("Pilih file gambar terlebih dahulu"); + } + + const resItem = await ApiFetch.api.fileStorage.create.post({ + file: fileItem, + name: fileItem.name, + }) + + const uploadedItem = resItem.data?.data; + + if (!uploadedItem?.id) { + return toast.error("Gagal mengupload file"); + } + + kontakState.create.form.kontakItems[0].imageId = uploadedItem.id; + + await kontakState.create.create(); + + resetForm(); + router.push('/admin/keamanan/kontak-darurat'); + } return ( - + Create Kontak Darurat - - Masukkan Image - - Nama Kontak Darurat} - placeholder='Masukkan nama Kontak Darurat' + value={kontakState.create.form.nama} + onChange={(val) => { + kontakState.create.form.nama = val.target.value; + }} + label={Nama Kategori Darurat} + placeholder='Masukkan nama Kategori Darurat' /> - Deskripsi Kontak Darurat - + Gambar + + { + const selectedFile = files[0]; // Ambil file pertama + if (selectedFile) { + setFileUtama(selectedFile); + setPreviewUtama(URL.createObjectURL(selectedFile)); // Buat preview + } + }} + onReject={() => toast.error('File tidak valid.')} + maxSize={5 * 1024 ** 2} // Maks 5MB + accept={{ 'image/*': [] }} + > + + + + + + + + + + + +
+ + Drag gambar ke sini atau klik untuk pilih file + + + Maksimal 5MB dan harus format gambar + +
+
+
+ + {/* Tampilkan preview kalau ada */} + {previewUtama && ( + + Preview + + )} + +
+
+ Nama Kontak} + placeholder='Masukkan nama Kontak' + value={kontakState.create.form.kontakItems[0].nama} + onChange={(val) => { + kontakState.create.form.kontakItems[0].nama = val.target.value; + }} + /> + Nomor Telepon Kontak} + placeholder='Masukkan nomor telepon Kontak' + value={kontakState.create.form.kontakItems[0].nomorTelepon} + onChange={(val) => { + kontakState.create.form.kontakItems[0].nomorTelepon = val.target.value; + }} + /> + + Gambar + + { + const selectedFile = files[0]; // Ambil file pertama + if (selectedFile) { + setFileItem(selectedFile); + setPreviewItem(URL.createObjectURL(selectedFile)); // Buat preview + } + }} + onReject={() => toast.error('File tidak valid.')} + maxSize={5 * 1024 ** 2} // Maks 5MB + accept={{ 'image/*': [] }} + > + + + + + + + + + + + +
+ + Drag gambar ke sini atau klik untuk pilih file + + + Maksimal 5MB dan harus format gambar + +
+
+
+ + {/* Tampilkan preview kalau ada */} + {previewItem && ( + + Preview + + )} + +
- + -
+
-
+ ); } diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/detail/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/detail/page.tsx deleted file mode 100644 index e6473fe5..00000000 --- a/src/app/admin/(dashboard)/keamanan/kontak-darurat/detail/page.tsx +++ /dev/null @@ -1,70 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Paper, Stack, Flex, Text, Image } from '@mantine/core'; -import { IconArrowBack, IconX, IconEdit } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; -import React from 'react'; -// import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; - -function DetailKontakDarurat() { - const router = useRouter(); - return ( - - - - - - - Detail Kontak Darurat - - - - - Nama Kontak Darurat - Test Judul - - - Nomor Kontak Darurat - Test Kategori - - - Deskripsi - Test Deskripsi - - - Gambar - gambar - - - Konten - Test Konten - - - - - - - - - - - - - {/* Modal Hapus - setModalHapus(false)} - onConfirm={handleHapus} - text="Apakah anda yakin ingin menghapus potensi ini?" - /> */} - - ); -} - -export default DetailKontakDarurat; diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/edit/page.tsx deleted file mode 100644 index 06b4bf60..00000000 --- a/src/app/admin/(dashboard)/keamanan/kontak-darurat/edit/page.tsx +++ /dev/null @@ -1,44 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; -import { IconArrowBack, IconImageInPicture } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; -import { KeamananEditor } from '../../_com/keamananEditor'; - -function EditKontakDarurat() { - const router = useRouter(); - return ( - - - - - - - - Edit Kontak Darurat - - Masukkan Image - - - Nama Kontak Darurat} - placeholder='Masukkan nama Kontak Darurat' - /> - - Deskripsi Kontak Darurat - - - - - - - - - ); -} - -export default EditKontakDarurat; diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/page.tsx index 4d424d7a..391c388d 100644 --- a/src/app/admin/(dashboard)/keamanan/kontak-darurat/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/kontak-darurat/page.tsx @@ -1,10 +1,13 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Paper, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core'; +import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; import HeaderSearch from '../../_com/header'; import JudulList from '../../_com/judulList'; import { useRouter } from 'next/navigation'; +import { useProxy } from 'valtio/utils'; +import kontakDaruratKeamananState from '../../_state/keamanan/kontak-darurat-keamanan'; +import { useShallowEffect } from '@mantine/hooks'; function KontakDaurat() { return ( @@ -20,7 +23,20 @@ function KontakDaurat() { } function ListKontakDaurat() { + const kontakState = useProxy(kontakDaruratKeamananState) const router = useRouter(); + + useShallowEffect(() => { + kontakState.findMany.load() + }, []) + + if (!kontakState.findMany.data) { + return ( + + + + ) + } return ( @@ -31,23 +47,25 @@ function ListKontakDaurat() { - Nama Kontak Darurat - Nomor Kontak Darurat - Deskripsi + Nama Kategori Darurat + Nama Kontak + Nomor Kontak Detail - - Kontak Darurat 1 - 0896232831883 - Kontak Darurat 1 - - - - + {kontakState.findMany.data?.map((item) => ( + + {item.nama} + {item.kontakItems[0].nama} + {item.kontakItems[0].nomorTelepon} + + + + + ))}
diff --git a/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/del.ts b/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/del.ts index a9300da1..d329667f 100644 --- a/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/del.ts +++ b/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/del.ts @@ -1,5 +1,7 @@ import prisma from "@/lib/prisma"; import { Context } from "elysia"; +import fs from "fs/promises"; +import path from "path"; export default async function kontakDaruratKeamananDelete(context: Context){ const id = context.params?.id as string; @@ -19,6 +21,10 @@ export default async function kontakDaruratKeamananDelete(context: Context){ const kontakDaruratKeamanan = await prisma.kontakDaruratKeamanan.findUnique({ where: { id }, + include: { + kontakItems: true, + image: true, + } }); if (!kontakDaruratKeamanan) { @@ -28,12 +34,25 @@ export default async function kontakDaruratKeamananDelete(context: Context){ }; } + if (kontakDaruratKeamanan.image) { + try { + const filePath = path.join(kontakDaruratKeamanan.image.path, kontakDaruratKeamanan.image.name); + await fs.unlink(filePath); + await prisma.fileStorage.delete({ + where: { id: kontakDaruratKeamanan.image.id }, + }); + } catch (err) { + console.error("Gagal hapus file image:", err); + } + } + await prisma.kontakDaruratKeamanan.delete({ where: { id }, }); return { status: 200, - body: "Kontak darurat keamanan berhasil dihapus", + success: true, + message: "Kontak darurat keamanan berhasil dihapus", }; } \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/findUnique.ts b/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/findUnique.ts index 326d0319..0078b1b9 100644 --- a/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/findUnique.ts +++ b/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/findUnique.ts @@ -31,7 +31,11 @@ export default async function kontakDaruratKeamananFindUnique( const data = await prisma.kontakDaruratKeamanan.findUnique({ where: { id }, include: { - kontakItems: true, + kontakItems: { + include: { + image: true, + }, + }, image: true, }, }); diff --git a/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/index.ts b/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/index.ts index ab2417ee..8104e03a 100644 --- a/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/index.ts +++ b/src/app/api/[[...slugs]]/_lib/keamanan/kontak-darurat-keamanan/index.ts @@ -6,7 +6,7 @@ import kontakDaruratKeamananFindUnique from "./findUnique"; import kontakDaruratKeamananUpdate from "./updt"; const KontakDaruratKeamanan = new Elysia({ - prefix: "/kontak-darurat-keamanan", + prefix: "/kontakdaruratkeamanan", tags: ["Keamanan/Kontak Darurat"], }) .get("/find-many", kontakDaruratKeamananFindMany)