Fix QC Kak Inno : tanggal 14 Oktober
Fitur Search bisa digunakan di 6 Menu, sisa 3 Menu Lagi
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user