Fix QC Kak Inno : tanggal 14 Oktober

Fitur Search bisa digunakan di 6 Menu, sisa 3 Menu Lagi
This commit is contained in:
2025-10-15 17:29:57 +08:00
parent ccf39bc778
commit 0b574406e2
16 changed files with 1300 additions and 407 deletions

View File

@@ -4,7 +4,7 @@ import prisma from "@/lib/prisma";
export default async function searchFindMany(context: Context) {
const { query, page = 1, limit = 10, type } = context.query as any;
// Convert to numbers
const pageNum = parseInt(String(page), 10) || 1;
const limitNum = parseInt(String(limit), 10) || 10;
@@ -304,6 +304,403 @@ export default async function searchFindMany(context: Context) {
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= LAYANAN DESA ========================================= //
if (type === "pelayananSuratKeterangan") {
const data = await prisma.pelayananSuratKeterangan.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
if (type === "pelayananPerizinanBerusaha") {
const data = await prisma.pelayananPerizinanBerusaha.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
if (type === "pelayananTelunjukSaktiDesa") {
const data = await prisma.pelayananTelunjukSaktiDesa.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
if (type === "pelayananPendudukNonPermanen") {
const data = await prisma.pelayananPendudukNonPermanen.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= PENGHARGAAN ========================================= //
if (type === "penghargaan") {
const data = await prisma.penghargaan.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= MENU KESEHATAN ========================================= //
// ========================================= POSYANDU ========================================= //
if (type === "posyandu") {
const data = await prisma.posyandu.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= DATA KESEHATAN WARGA ========================================= //
// ========================================= FASILITAS KESEHATAN ========================================= //
if (type === "fasilitasKesehatan") {
const data = await prisma.fasilitasKesehatan.findMany({
where: {
name: { contains: query, mode: "insensitive" },
informasiumum: { fasilitas: { contains: query, mode: "insensitive" } },
layananunggulan: { content: { contains: query, mode: "insensitive" } },
dokterdantenagamedis: {
name: { contains: query, mode: "insensitive" },
},
fasilitaspendukung: {
content: { contains: query, mode: "insensitive" },
},
prosedurpendaftaran: {
content: { contains: query, mode: "insensitive" },
},
tarifdanlayanan: { layanan: { contains: query, mode: "insensitive" } },
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= JADWAL KEGIATAN ========================================= //
if (type === "jadwalKegiatan") {
const data = await prisma.jadwalKegiatan.findMany({
where: {
content: { contains: query, mode: "insensitive" },
informasijadwalkegiatan: {
name: { contains: query, mode: "insensitive" },
},
deskripsijadwalkegiatan: {
deskripsi: { contains: query, mode: "insensitive" },
},
layananjadwalkegiatan: {
content: { contains: query, mode: "insensitive" },
},
syaratketentuanjadwalkegiatan: {
content: { contains: query, mode: "insensitive" },
},
dokumenjadwalkegiatan: {
content: { contains: query, mode: "insensitive" },
},
pendaftaranjadwalkegiatan: {
name: { contains: query, mode: "insensitive" },
},
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= ARTIKEL KESEHATAN ========================================= //
if (type === "artikelKesehatan") {
const data = await prisma.artikelKesehatan.findMany({
where: {
title: { contains: query, mode: "insensitive" },
content: { contains: query, mode: "insensitive" },
introduction: {
content: { contains: query, mode: "insensitive" },
},
symptom: {
title: { contains: query, mode: "insensitive" },
},
prevention: {
title: { contains: query, mode: "insensitive" },
},
firstaid: {
title: { contains: query, mode: "insensitive" },
},
mythvsfact: {
title: { contains: query, mode: "insensitive" },
},
doctorsign: {
content: { contains: query, mode: "insensitive" },
},
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= PUSKESMAS ========================================= //
if (type === "puskesmas") {
const data = await prisma.puskesmas.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= PROGRAM KESEHATAN ========================================= //
if (type === "programKesehatan") {
const data = await prisma.programKesehatan.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= PENANGANAN DARURAT ========================================= //
if (type === "penangananDarurat") {
const data = await prisma.penangananDarurat.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= KONTAK DARURAT ========================================= //
if (type === "kontakDarurat") {
const data = await prisma.kontakDarurat.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= INFO WABAH PENYAKIT ========================================= //
if (type === "infoWabahPenyakit") {
const data = await prisma.infoWabahPenyakit.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= MENU KEAMANAN ========================================= //
// ========================================= KEAMANAN LINGKUNGAN ========================================= //
if (type === "keamananLingkungan") {
const data = await prisma.keamananLingkungan.findMany({
where: { name: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= POLSEK TERDEKAT ========================================= //
if (type === "polsekTerdekat") {
const data = await prisma.polsekTerdekat.findMany({
where: { nama: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= KONTAK DARURAT ========================================= //
if (type === "kontakDaruratKeamanan") {
const data = await prisma.kontakDaruratKeamanan.findMany({
where: { nama: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= PENCEGAHAN KRIMINALITAS ========================================= //
if (type === "pencegahanKriminalitas") {
const data = await prisma.pencegahanKriminalitas.findMany({
where: { judul: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= LAPORAN PUBLIK ========================================= //
if (type === "laporanPublik") {
const data = await prisma.laporanPublik.findMany({
where: { judul: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= TIPS KEAMANAN ========================================= //
if (type === "tipsKeamanan") {
const data = await prisma.menuTipsKeamanan.findMany({
where: { judul: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= MENU EKONOMI ========================================= //
// ========================================= PASAR DESA ========================================= //
if (type === "pasarDesa") {
const data = await prisma.pasarDesa.findMany({
where: { nama: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= LOWONGAN KERJA LOKAL ========================================= //
if (type === "lowonganKerjaLokal") {
const data = await prisma.lowonganPekerjaan.findMany({
where: {
OR: [
{ posisi: { contains: query, mode: "insensitive" } },
{ namaPerusahaan: { contains: query, mode: "insensitive" } },
{ lokasi: { contains: query, mode: "insensitive" } },
{ tipePekerjaan: { contains: query, mode: "insensitive" } },
{ gaji: { contains: query, mode: "insensitive" } },
{ deskripsi: { contains: query, mode: "insensitive" } },
{ kualifikasi: { contains: query, mode: "insensitive" } },
{ notelp: { contains: query, mode: "insensitive" } },
],
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= STRUKTUR ORGANISASI ========================================= //
if (type === "strukturOrganisasi") {
const data = await prisma.strukturBumDes.findMany({
where: {
OR: [
{ name: { contains: query, mode: "insensitive" } },
{ PosisiOrganisasiBumDes: { nama: { contains: query, mode: "insensitive" } } },
{ PegawaiBumDes: { namaLengkap: { contains: query, mode: "insensitive" } } },
],
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= JUMLAH PENDUDUK USIA KERJA YANG MENGANGGUR ========================================= //
if (type === "jumlahPendudukUsiaKerjaYangMenganggurUsia") {
const data = await prisma.grafikMenganggurBerdasarkanUsia.findMany({
where: {
OR: [
{ usia18_25: { contains: query, mode: "insensitive" } },
{ usia26_35: { contains: query, mode: "insensitive" } },
{ usia36_45: { contains: query, mode: "insensitive" } },
{ usia46_keatas: { contains: query, mode: "insensitive" } },
],
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= JUMLAH PENDUDUK USIA KERJA YANG MENGANGGUR ========================================= //
if (type === "jumlahPendudukUsiaKerjaYangMenganggurPendidikan") {
const data = await prisma.grafikMenganggurBerdasarkanPendidikan.findMany({
where: {
OR: [
{ SD: { contains: query, mode: "insensitive" } },
{ SMP: { contains: query, mode: "insensitive" } },
{ SMA: { contains: query, mode: "insensitive" } },
{ D3: { contains: query, mode: "insensitive" } },
{ S1: { contains: query, mode: "insensitive" } },
],
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= JUMLAH PENDUDUK MISKIN ========================================= //
if (type === "jumlahPendudukMiskin") {
const data = await prisma.grafikJumlahPendudukMiskin.findMany({
where: {
OR: [
// Convert year to string for partial matching
...(isNaN(Number(query)) ? [] : [
{ year: { equals: Number(query) } }
]),
// Convert totalPoorPopulation to string for partial matching
...(isNaN(Number(query)) ? [] : [
{ totalPoorPopulation: { equals: Number(query) } }
])
].filter(Boolean), // Remove any empty arrays from the spread
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= PROGRAM KEMISKINAN ========================================= //
if (type === "programKemiskinan") {
const data = await prisma.programKemiskinan.findMany({
where: {
OR: [
{ nama: { contains: query, mode: "insensitive" } },
{ deskripsi: { contains: query, mode: "insensitive" } },
],
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= SEKTOR UNGGULAN DESA ========================================= //
if (type === "sektorUnggulanDesa") {
const data = await prisma.sektorUnggulanDesa.findMany({
where: {
OR: [
{ name: { contains: query, mode: "insensitive" } },
{ description: { contains: query, mode: "insensitive" } }
],
},
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// ========================================= DEMOGRAFI PEKERJAAN ========================================= //
if (type === "demografiPekerjaan") {
const data = await prisma.dataDemografiPekerjaan.findMany({
where: { pekerjaan: { contains: query, mode: "insensitive" } },
skip,
take: limitNum,
});
return { data, nextPage: data.length < limitNum ? null : pageNum + 1 };
}
// 🌍 GLOBAL SEARCH — cari di beberapa modul sekaligus
const [
pejabatdesa,
@@ -337,8 +734,32 @@ export default async function searchFindMany(context: Context) {
pelayananSuratKeterangan,
pelayananPerizinanBerusaha,
pelayananTelunjukSaktiDesa,
pelayananPendudukNonPermanent,
penghargaan
pelayananPendudukNonPermanen,
penghargaan,
posyandu,
fasilitasKesehatan,
jadwalKegiatan,
artikelKesehatan,
puskesmas,
programKesehatan,
penangananDarurat,
kontakDarurat,
infoWabahPenyakit,
keamananLingkungan,
polsekTerdekat,
kontakDaruratKeamanan,
pencegahanKriminalitas,
laporanPublik,
tipsKeamanan,
pasarDesa,
lowonganKerjaLokal,
strukturOrganisasi,
jumlahPendudukUsiaKerjaYangMenganggurUsia,
jumlahPendudukUsiaKerjaYangMenganggurPendidikan,
jumlahPendudukMiskin,
programKemiskinan,
sektorUnggulanDesa,
demografiPekerjaan,
] = await Promise.all([
prisma.pejabatDesa.findMany({
where: { name: { contains: query, mode: "insensitive" } },
@@ -486,6 +907,197 @@ export default async function searchFindMany(context: Context) {
where: { name: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.posyandu.findMany({
where: { name: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.fasilitasKesehatan.findMany({
where: {
name: { contains: query, mode: "insensitive" },
informasiumum: { fasilitas: { contains: query, mode: "insensitive" } },
layananunggulan: { content: { contains: query, mode: "insensitive" } },
dokterdantenagamedis: {
name: { contains: query, mode: "insensitive" },
},
fasilitaspendukung: {
content: { contains: query, mode: "insensitive" },
},
prosedurpendaftaran: {
content: { contains: query, mode: "insensitive" },
},
tarifdanlayanan: { layanan: { contains: query, mode: "insensitive" } },
},
take: limitNum,
}),
prisma.jadwalKegiatan.findMany({
where: {
content: { contains: query, mode: "insensitive" },
informasijadwalkegiatan: {
name: { contains: query, mode: "insensitive" },
},
deskripsijadwalkegiatan: {
deskripsi: { contains: query, mode: "insensitive" },
},
layananjadwalkegiatan: {
content: { contains: query, mode: "insensitive" },
},
syaratketentuanjadwalkegiatan: {
content: { contains: query, mode: "insensitive" },
},
dokumenjadwalkegiatan: {
content: { contains: query, mode: "insensitive" },
},
pendaftaranjadwalkegiatan: {
name: { contains: query, mode: "insensitive" },
},
},
take: limitNum,
}),
prisma.artikelKesehatan.findMany({
where: {
title: { contains: query, mode: "insensitive" },
content: { contains: query, mode: "insensitive" },
introduction: {
content: { contains: query, mode: "insensitive" },
},
symptom: {
title: { contains: query, mode: "insensitive" },
},
prevention: {
title: { contains: query, mode: "insensitive" },
},
firstaid: {
title: { contains: query, mode: "insensitive" },
},
mythvsfact: {
title: { contains: query, mode: "insensitive" },
},
doctorsign: {
content: { contains: query, mode: "insensitive" },
},
},
take: limitNum,
}),
prisma.puskesmas.findMany({
where: { name: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.programKesehatan.findMany({
where: { name: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.penangananDarurat.findMany({
where: { name: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.kontakDarurat.findMany({
where: { name: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.infoWabahPenyakit.findMany({
where: { name: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.keamananLingkungan.findMany({
where: { name: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.polsekTerdekat.findMany({
where: { nama: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.kontakDaruratKeamanan.findMany({
where: { nama: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.pencegahanKriminalitas.findMany({
where: { judul: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.laporanPublik.findMany({
where: { judul: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.menuTipsKeamanan.findMany({
where: { judul: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.pasarDesa.findMany({
where: { nama: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.lowonganPekerjaan.findMany({
where: { posisi: { contains: query, mode: "insensitive" } },
take: limitNum,
}),
prisma.strukturBumDes.findMany({
where: {
OR: [
{ name: { contains: query, mode: "insensitive" } },
{ PosisiOrganisasiBumDes: { nama: { contains: query, mode: "insensitive" } } },
{ PegawaiBumDes: { namaLengkap: { contains: query, mode: "insensitive" } } },
],
},
take: limitNum,
}),
prisma.grafikMenganggurBerdasarkanUsia.findMany({
where: {
OR: [
{ usia18_25: { contains: query, mode: "insensitive" } },
{ usia26_35: { contains: query, mode: "insensitive" } },
{ usia36_45: { contains: query, mode: "insensitive" } },
{ usia46_keatas: { contains: query, mode: "insensitive" } },
],
},
take: limitNum,
}),
prisma.grafikMenganggurBerdasarkanPendidikan.findMany({
where: {
OR: [
{ SD: { contains: query, mode: "insensitive" } },
{ SMP: { contains: query, mode: "insensitive" } },
{ SMA: { contains: query, mode: "insensitive" } },
{ D3: { contains: query, mode: "insensitive" } },
{ S1: { contains: query, mode: "insensitive" } },
],
},
take: limitNum,
}),
prisma.grafikJumlahPendudukMiskin.findMany({
where: {
OR: [
...(isNaN(Number(query)) ? [] : [
{ year: { equals: Number(query) } },
{ totalPoorPopulation: { equals: Number(query) } }
])
].filter(Boolean),
},
take: limitNum,
}),
prisma.programKemiskinan.findMany({
where: {
OR: [
{ nama: { contains: query, mode: "insensitive" } },
{ deskripsi: { contains: query, mode: "insensitive" } },
],
},
take: limitNum,
}),
prisma.sektorUnggulanDesa.findMany({
where: {
OR: [
{ name: { contains: query, mode: "insensitive" } },
{ description: { contains: query, mode: "insensitive" } }
],
},
take: limitNum,
}),
prisma.dataDemografiPekerjaan.findMany({
where: {
pekerjaan: { contains: query, mode: "insensitive" }
},
take: limitNum,
})
]);
return {
@@ -527,11 +1139,48 @@ export default async function searchFindMany(context: Context) {
...pengumuman.map((b) => ({ type: "pengumuman", ...b })),
...galleryFoto.map((b) => ({ type: "galleryFoto", ...b })),
...galleryVideo.map((b) => ({ type: "galleryVideo", ...b })),
...pelayananSuratKeterangan.map((b) => ({ type: "pelayananSuratKeterangan", ...b })),
...pelayananPerizinanBerusaha.map((b) => ({ type: "pelayananPerizinanBerusaha", ...b })),
...pelayananTelunjukSaktiDesa.map((b) => ({ type: "pelayananTelunjukSaktiDesa", ...b })),
...pelayananPendudukNonPermanent.map((b) => ({ type: "pelayananPendudukNonPermanent", ...b })),
...pelayananSuratKeterangan.map((b) => ({
type: "pelayananSuratKeterangan",
...b,
})),
...pelayananPerizinanBerusaha.map((b) => ({
type: "pelayananPerizinanBerusaha",
...b,
})),
...pelayananTelunjukSaktiDesa.map((b) => ({
type: "pelayananTelunjukSaktiDesa",
...b,
})),
...pelayananPendudukNonPermanen.map((b) => ({
type: "pelayananPendudukNonPermanen",
...b,
})),
...penghargaan.map((b) => ({ type: "penghargaan", ...b })),
...posyandu.map((b) => ({ type: "posyandu", ...b })),
...fasilitasKesehatan.map((b) => ({ type: "fasilitasKesehatan", ...b })),
...jadwalKegiatan.map((b) => ({ type: "jadwalKegiatan", ...b })),
...artikelKesehatan.map((b) => ({ type: "artikelKesehatan", ...b })),
...puskesmas.map((b) => ({ type: "puskesmas", ...b })),
...programKesehatan.map((b) => ({ type: "programKesehatan", ...b })),
...penangananDarurat.map((b) => ({ type: "penangananDarurat", ...b })),
...kontakDarurat.map((b) => ({ type: "kontakDarurat", ...b })),
...infoWabahPenyakit.map((b) => ({ type: "infoWabahPenyakit", ...b })),
...keamananLingkungan.map((b) => ({ type: "keamananLingkungan", ...b })),
...polsekTerdekat.map((b) => ({ type: "polsekTerdekat", ...b })),
...kontakDaruratKeamanan.map((b) => ({ type: "kontakDaruratKeamanan", ...b })),
...pencegahanKriminalitas.map((b) => ({ type: "pencegahanKriminalitas", ...b })),
...laporanPublik.map((b) => ({ type: "laporanPublik", ...b })),
...tipsKeamanan.map((b) => ({ type: "tipsKeamanan", ...b })),
...pasarDesa.map((b) => ({ type: "pasarDesa", ...b })),
...lowonganKerjaLokal.map((b) => ({ type: "lowonganKerjaLokal", ...b })),
...strukturOrganisasi.map((b) => ({ type: "strukturOrganisasi", ...b })),
...jumlahPendudukUsiaKerjaYangMenganggurUsia.map((b) => ({ type: "jumlahPendudukUsiaKerjaYangMenganggurUsia", ...b })),
...jumlahPendudukUsiaKerjaYangMenganggurPendidikan.map((b) => ({ type: "jumlahPendudukUsiaKerjaYangMenganggurPendidikan", ...b })),
...jumlahPendudukMiskin.map((b) => ({ type: "jumlahPendudukMiskin", ...b })),
...programKemiskinan.map((b) => ({ type: "programKemiskinan", ...b })),
...sektorUnggulanDesa.map((b) => ({ type: "sektorUnggulanDesa", ...b })),
...demografiPekerjaan.map((b) => ({ type: "demografiPekerjaan", ...b })),
],
nextPage: null, // bisa dibuat lebih kompleks kalau perlu
};

View File

@@ -1,11 +1,11 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
'use client';
import { proxy, subscribe } from 'valtio';
import { proxy } from 'valtio';
import { debounce } from 'lodash';
import ApiFetch from '@/lib/api-fetch';
interface SearchResult {
type?: string; // optional biar gak error
type?: string;
id: string | number;
title?: string;
[key: string]: any;
@@ -21,36 +21,30 @@ const searchState = proxy({
loading: false,
async fetch() {
if (!searchState.query) return;
if (!searchState.query) {
searchState.results = [];
return;
}
searchState.loading = true;
try {
const res = await ApiFetch.api.search.findMany.get({
query: {
query: searchState.query,
page: searchState.page,
limit: searchState.limit,
type: searchState.type,
},
});
const res = await ApiFetch.api.search.findMany.get({
query: {
query: searchState.query,
page: searchState.page,
limit: searchState.limit,
type: searchState.type,
},
});
const data = (res.data?.data || []).map((item: any) => ({
type: item.type ?? 'unknown', // pastikan selalu ada type
...item,
}));
if (searchState.page === 1) {
searchState.results = data;
} else {
searchState.results.push(...data);
}
searchState.nextPage = res.data?.nextPage || null;
} catch (e) {
console.error('Search fetch error:', e);
} finally {
searchState.loading = false;
if (searchState.page === 1) {
searchState.results = res.data?.data || [];
} else {
searchState.results.push(...(res.data?.data || []));
}
searchState.nextPage = res.data?.nextPage || null;
searchState.loading = false;
},
async next() {
@@ -60,15 +54,95 @@ const searchState = proxy({
},
});
// 🔁 Auto debounce search trigger
const debouncedFetch = debounce(() => {
if (!searchState.query) return;
// 🕒 debounce-nya tetap kita export biar bisa dipanggil manual
export const debouncedFetch = debounce(() => {
searchState.page = 1;
searchState.fetch();
}, 500);
subscribe(searchState, () => {
debouncedFetch();
});
export default searchState;
// 'use client';
// import { proxy, subscribe } from 'valtio';
// import { debounce } from 'lodash';
// import ApiFetch from '@/lib/api-fetch';
// interface SearchResult {
// type?: string;
// id: string | number;
// title?: string;
// [key: string]: any;
// }
// const searchState = proxy({
// query: '',
// page: 1,
// limit: 10,
// type: '', // kosong = global search
// results: [] as SearchResult[],
// nextPage: null as number | null,
// loading: false,
// // --- fetch utama ---
// async fetch() {
// if (!searchState.query.trim()) {
// // 🧹 kalau query kosong, kosongin data dan stop
// searchState.results = [];
// searchState.nextPage = null;
// searchState.loading = false;
// return;
// }
// searchState.loading = true;
// try {
// const res = await ApiFetch.api.search.findMany.get({
// query: {
// query: searchState.query,
// page: searchState.page,
// limit: searchState.limit,
// type: searchState.type,
// },
// });
// const newData = res.data?.data || [];
// // Kalau ini page pertama, replace data
// if (searchState.page === 1) {
// searchState.results = newData;
// } else {
// // Kalau page berikutnya, append data
// searchState.results = [...searchState.results, ...newData];
// }
// searchState.nextPage = res.data?.nextPage || null;
// } catch (err) {
// console.error('Search fetch error:', err);
// } finally {
// searchState.loading = false;
// }
// },
// // --- load next page (infinite scroll) ---
// async next() {
// if (!searchState.nextPage || searchState.loading) return;
// searchState.page = searchState.nextPage;
// await searchState.fetch();
// },
// });
// // --- debounce agar gak fetch tiap ketik ---
// const debouncedFetch = debounce(() => {
// // reset pagination setiap query berubah
// searchState.page = 1;
// searchState.fetch();
// }, 500);
// // --- auto trigger setiap query berubah ---
// subscribe(searchState, () => {
// // kalau query berubah, jalankan debounce fetch
// debouncedFetch();
// });
// export default searchState;