- Tambah ringkasan-pendidikan.ts: state valtio fetch GET /api/pendidikan/ringkasan/stats - Tambah ringkasan-beasiswa.ts: state valtio fetch ringkasan stats + beasiswaConfig find/update - Expand beasiswa-pendaftar.json dari 3 → 45 entry (nama Bali, NIK unik, enum valid) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
92 lines
2.9 KiB
TypeScript
92 lines
2.9 KiB
TypeScript
import { toast } from "react-toastify";
|
|
import { proxy } from "valtio";
|
|
|
|
type StatsBeasiswa = {
|
|
jumlahPenerima: number;
|
|
danaTersalurkan: string;
|
|
tahunAjaran: string;
|
|
};
|
|
|
|
type BeasiswaConfig = {
|
|
id: string;
|
|
tahunAjaran: string;
|
|
danaTersalurkan: string;
|
|
};
|
|
|
|
const ringkasanBeasiswaState = proxy({
|
|
findStats: {
|
|
data: null as StatsBeasiswa | null,
|
|
loading: false,
|
|
async load() {
|
|
try {
|
|
ringkasanBeasiswaState.findStats.loading = true;
|
|
const res = await fetch(`/api/pendidikan/beasiswa/ringkasan/stats`);
|
|
if (res.ok) {
|
|
const result = await res.json();
|
|
ringkasanBeasiswaState.findStats.data = result?.data ?? null;
|
|
} else {
|
|
ringkasanBeasiswaState.findStats.data = null;
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching ringkasan beasiswa:", error);
|
|
ringkasanBeasiswaState.findStats.data = null;
|
|
} finally {
|
|
ringkasanBeasiswaState.findStats.loading = false;
|
|
}
|
|
},
|
|
},
|
|
|
|
beasiswaConfig: {
|
|
data: null as BeasiswaConfig | null,
|
|
loading: false,
|
|
async find() {
|
|
try {
|
|
ringkasanBeasiswaState.beasiswaConfig.loading = true;
|
|
const res = await fetch(`/api/pendidikan/beasiswa/beasiswaconfig/find`);
|
|
if (res.ok) {
|
|
const result = await res.json();
|
|
ringkasanBeasiswaState.beasiswaConfig.data = result?.data ?? null;
|
|
} else {
|
|
ringkasanBeasiswaState.beasiswaConfig.data = null;
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching beasiswa config:", error);
|
|
ringkasanBeasiswaState.beasiswaConfig.data = null;
|
|
} finally {
|
|
ringkasanBeasiswaState.beasiswaConfig.loading = false;
|
|
}
|
|
},
|
|
|
|
update: {
|
|
loading: false,
|
|
async submit(tahunAjaran: string, danaTersalurkan: string) {
|
|
try {
|
|
ringkasanBeasiswaState.beasiswaConfig.update.loading = true;
|
|
const res = await fetch(`/api/pendidikan/beasiswa/beasiswaconfig/update`, {
|
|
method: "PUT",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ tahunAjaran, danaTersalurkan }),
|
|
});
|
|
const result = await res.json();
|
|
if (result.success) {
|
|
toast.success("Konfigurasi beasiswa berhasil disimpan");
|
|
await ringkasanBeasiswaState.beasiswaConfig.find();
|
|
await ringkasanBeasiswaState.findStats.load();
|
|
return true;
|
|
}
|
|
toast.error(result.message || "Gagal menyimpan konfigurasi");
|
|
return false;
|
|
} catch (error) {
|
|
console.error("Error updating beasiswa config:", error);
|
|
toast.error("Gagal menyimpan konfigurasi beasiswa");
|
|
return false;
|
|
} finally {
|
|
ringkasanBeasiswaState.beasiswaConfig.update.loading = false;
|
|
}
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
export default ringkasanBeasiswaState;
|