API & UI Menu Lingkungan, Submenu Edukas Lingkungan

This commit is contained in:
2025-07-18 21:24:51 +08:00
parent f05a096633
commit e2f75ff3ad
30 changed files with 1176 additions and 255 deletions

View File

@@ -0,0 +1,240 @@
import ApiFetch from "@/lib/api-fetch";
import { Prisma } from "@prisma/client";
import { toast } from "react-toastify";
import { proxy } from "valtio";
import { z } from "zod";
const templateTujuanEdukasiForm = z.object({
judul: z.string().min(3, "Judul minimal 3 karakter"),
deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"),
});
type TujuanEdukasiForm = Prisma.TujuanEdukasiLingkunganGetPayload<{
select: {
id: true;
judul: true;
deskripsi: true;
};
}>;
const stateTujuanEdukasi = proxy({
findById: {
data: null as TujuanEdukasiForm | null,
loading: false,
initialize() {
stateTujuanEdukasi.findById.data = {
id: '',
judul: '',
deskripsi: '',
} as TujuanEdukasiForm;
},
async load(id: string) {
try {
stateTujuanEdukasi.findById.loading = true;
const res = await ApiFetch.api.lingkungan.edukasilingkungan.tujuanedukasilingkungan["find-by-id"].get({
query: { id },
});
if (res.status === 200) {
stateTujuanEdukasi.findById.data = res.data?.data ?? null;
} else {
toast.error("Gagal mengambil data tujuan edukasi");
}
} catch (error) {
console.error((error as Error).message);
toast.error("Terjadi kesalahan saat mengambil data tujuan edukasi");
} finally {
stateTujuanEdukasi.findById.loading = false;
}
},
},
update: {
loading: false,
async save(data: TujuanEdukasiForm) {
const cek = templateTujuanEdukasiForm.safeParse(data);
if (!cek.success) {
const errors = cek.error.issues
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
.join(", ");
toast.error(`Form tidak valid: ${errors}`);
return;
}
try {
stateTujuanEdukasi.update.loading = true;
const res = await ApiFetch.api.lingkungan.edukasilingkungan.tujuanedukasilingkungan["update"].post(data);
if (res.status === 200) {
toast.success("Data tujuan edukasi berhasil diubah");
await stateTujuanEdukasi.findById.load(data.id);
} else {
toast.error("Gagal mengubah data tujuan edukasi");
}
} catch (error) {
console.error((error as Error).message);
toast.error("Terjadi kesalahan saat mengubah data tujuan edukasi");
} finally {
stateTujuanEdukasi.update.loading = false;
}
},
},
});
const templateMateriEdukasiLingkunganForm = z.object({
judul: z.string().min(3, "Judul minimal 3 karakter"),
deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"),
});
type MateriEdukasiLingkunganForm = Prisma.MateriEdukasiLingkunganGetPayload<{
select: {
id: true;
judul: true;
deskripsi: true;
};
}>;
const stateMateriEdukasiLingkungan = proxy({
findById: {
data: null as MateriEdukasiLingkunganForm | null,
loading: false,
initialize() {
stateMateriEdukasiLingkungan.findById.data = {
id: '',
judul: '',
deskripsi: '',
} as MateriEdukasiLingkunganForm;
},
async load(id: string) {
try {
stateMateriEdukasiLingkungan.findById.loading = true;
const res = await ApiFetch.api.lingkungan.edukasilingkungan.materiedukasilingkungan["find-by-id"].get({
query: { id },
});
if (res.status === 200) {
stateMateriEdukasiLingkungan.findById.data = res.data?.data ?? null;
} else {
toast.error("Gagal mengambil data materi edukasi");
}
} catch (error) {
console.error((error as Error).message);
toast.error("Terjadi kesalahan saat mengambil data materi edukasi");
} finally {
stateMateriEdukasiLingkungan.findById.loading = false;
}
},
},
update: {
loading: false,
async save(data: MateriEdukasiLingkunganForm) {
const cek = templateMateriEdukasiLingkunganForm.safeParse(data);
if (!cek.success) {
const errors = cek.error.issues
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
.join(", ");
toast.error(`Form tidak valid: ${errors}`);
return;
}
try {
stateMateriEdukasiLingkungan.update.loading = true;
const res = await ApiFetch.api.lingkungan.edukasilingkungan.materiedukasilingkungan["update"].post(data);
if (res.status === 200) {
toast.success("Data materi edukasi berhasil diubah");
await stateMateriEdukasiLingkungan.findById.load(data.id);
} else {
toast.error("Gagal mengubah data materi edukasi");
}
} catch (error) {
console.error((error as Error).message);
toast.error("Terjadi kesalahan saat mengubah data materi edukasi");
} finally {
stateMateriEdukasiLingkungan.update.loading = false;
}
},
},
});
const templateContohEdukasiLingkunganForm = z.object({
judul: z.string().min(3, "Judul minimal 3 karakter"),
deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"),
});
type ContohEdukasiLingkunganForm = Prisma.ContohEdukasiLingkunganGetPayload<{
select: {
id: true;
judul: true;
deskripsi: true;
};
}>;
const stateContohEdukasiLingkungan = proxy({
findById: {
data: null as ContohEdukasiLingkunganForm | null,
loading: false,
initialize() {
stateContohEdukasiLingkungan.findById.data = {
id: '',
judul: '',
deskripsi: '',
} as ContohEdukasiLingkunganForm;
},
async load(id: string) {
try {
stateContohEdukasiLingkungan.findById.loading = true;
const res = await ApiFetch.api.lingkungan.edukasilingkungan.contohkegiatandesa["find-by-id"].get({
query: { id },
});
if (res.status === 200) {
stateContohEdukasiLingkungan.findById.data = res.data?.data ?? null;
} else {
toast.error("Gagal mengambil data contoh edukasi");
}
} catch (error) {
console.error((error as Error).message);
toast.error("Terjadi kesalahan saat mengambil data contoh edukasi");
} finally {
stateContohEdukasiLingkungan.findById.loading = false;
}
},
},
update: {
loading: false,
async save(data: ContohEdukasiLingkunganForm) {
const cek = templateContohEdukasiLingkunganForm.safeParse(data);
if (!cek.success) {
const errors = cek.error.issues
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
.join(", ");
toast.error(`Form tidak valid: ${errors}`);
return;
}
try {
stateContohEdukasiLingkungan.update.loading = true;
const res = await ApiFetch.api.lingkungan.edukasilingkungan.contohkegiatandesa["update"].post(data);
if (res.status === 200) {
toast.success("Data contoh edukasi berhasil diubah");
await stateContohEdukasiLingkungan.findById.load(data.id);
} else {
toast.error("Gagal mengubah data contoh edukasi");
}
} catch (error) {
console.error((error as Error).message);
toast.error("Terjadi kesalahan saat mengubah data contoh edukasi");
} finally {
stateContohEdukasiLingkungan.update.loading = false;
}
},
},
});
const stateEdukasiLingkungan = proxy({
stateTujuanEdukasi,
stateMateriEdukasiLingkungan,
stateContohEdukasiLingkungan
})
export default stateEdukasiLingkungan;