unipo-ui 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.0",
2
+ "version": "1.2.0",
3
3
  "versions": {
4
4
  "sass": "1.108.2",
5
5
  "tsup": "8.5.1",
@@ -14,7 +14,7 @@
14
14
  "@base-ui/react": "1.9.0",
15
15
  "lucide-react": "1.73.0",
16
16
  "country-flag-icons": "1.6.20",
17
- "unipo-ui-tokens": "1.1.0"
17
+ "unipo-ui-tokens": "1.2.0"
18
18
  },
19
19
  "files": {
20
20
  "components/actions.tsx": {
@@ -666,6 +666,26 @@
666
666
  "unipo-siakad-sdk"
667
667
  ]
668
668
  },
669
+ "siakad/berkas.tsx": {
670
+ "exports": [
671
+ "BerkasTerunggah",
672
+ "InfoBerkas",
673
+ "OpsiUnggahBerkas",
674
+ "useInfoBerkas",
675
+ "useUnggahBerkas",
676
+ "useUrlBerkas",
677
+ "UnggahBerkasProps",
678
+ "UnggahBerkas"
679
+ ],
680
+ "local": [
681
+ "components/calendar.tsx",
682
+ "siakad/provider.tsx"
683
+ ],
684
+ "npm": [
685
+ "react",
686
+ "unipo-siakad-sdk"
687
+ ]
688
+ },
669
689
  "siakad/cari.tsx": {
670
690
  "exports": [
671
691
  "CariProps",
@@ -1628,6 +1648,14 @@
1628
1648
  "FormAplikasiProps": "siakad/aplikasi.tsx",
1629
1649
  "FormAplikasi": "siakad/aplikasi.tsx",
1630
1650
  "SheetUbahAplikasi": "siakad/aplikasi.tsx",
1651
+ "BerkasTerunggah": "siakad/berkas.tsx",
1652
+ "InfoBerkas": "siakad/berkas.tsx",
1653
+ "OpsiUnggahBerkas": "siakad/berkas.tsx",
1654
+ "useInfoBerkas": "siakad/berkas.tsx",
1655
+ "useUnggahBerkas": "siakad/berkas.tsx",
1656
+ "useUrlBerkas": "siakad/berkas.tsx",
1657
+ "UnggahBerkasProps": "siakad/berkas.tsx",
1658
+ "UnggahBerkas": "siakad/berkas.tsx",
1631
1659
  "CariProps": "siakad/cari.tsx",
1632
1660
  "MahasiswaOption": "siakad/cari.tsx",
1633
1661
  "CariMahasiswaProps": "siakad/cari.tsx",
package/dist/siakad.cjs CHANGED
@@ -7502,6 +7502,129 @@ function PilihEntitas({ jenis, value, defaultValue, onValueChange, query, load,
7502
7502
  }
7503
7503
  );
7504
7504
  }
7505
+ var tunggu = (ms) => new Promise((r) => setTimeout(r, ms));
7506
+ async function unggahKeBerkas(siakad, info, file, opsi2 = {}, onProgress, signal) {
7507
+ const { paralel = 3, ...atribut } = opsi2;
7508
+ const attr = Object.fromEntries(Object.entries(atribut).filter(([, v]) => v !== void 0));
7509
+ if (file.size <= info.batas_sekali_unggah_byte) {
7510
+ onProgress?.(0);
7511
+ const r = await siakad.request({ method: "POST", path: "/v1/berkas", body: { berkas: file, ...attr }, multipart: true }, { signal, timeout: 3e5 });
7512
+ onProgress?.(100);
7513
+ return r.data;
7514
+ }
7515
+ const sesi = (await siakad.request({ method: "POST", path: "/v1/berkas/bertahap", body: { nama: file.name, ukuran: file.size, ...attr } }, { signal })).data;
7516
+ const { ukuran_potongan: ukuran, jumlah_potongan: jumlah } = sesi.sesi;
7517
+ const antre = Array.from({ length: jumlah }, (_, i) => i);
7518
+ let terkirim = 0;
7519
+ const kirim = async (ke) => {
7520
+ const bagian = file.slice(ke * ukuran, Math.min(file.size, (ke + 1) * ukuran));
7521
+ for (let coba = 0; ; coba++) {
7522
+ try {
7523
+ await siakad.request({ method: "POST", path: `/v1/berkas/${sesi.id}/potongan/${ke}`, body: { potongan: { data: bagian, filename: `${ke}.part` } }, multipart: true }, { signal, timeout: 3e5 });
7524
+ terkirim += bagian.size;
7525
+ onProgress?.(Math.min(99, Math.round(terkirim / file.size * 100)));
7526
+ return;
7527
+ } catch (e) {
7528
+ if (coba >= 3 || signal?.aborted) throw e;
7529
+ await tunggu(500 * 2 ** coba);
7530
+ }
7531
+ }
7532
+ };
7533
+ await Promise.all(
7534
+ Array.from({ length: Math.max(1, Math.min(paralel, jumlah)) }, async () => {
7535
+ for (let ke = antre.shift(); ke !== void 0; ke = antre.shift()) await kirim(ke);
7536
+ })
7537
+ );
7538
+ const hasil = (await siakad.request({ method: "POST", path: `/v1/berkas/${sesi.id}/selesai` }, { signal, timeout: 3e5 })).data;
7539
+ onProgress?.(100);
7540
+ return hasil;
7541
+ }
7542
+ function useInfoBerkas() {
7543
+ return useSiakadQuery(["berkas-info"], (s, signal) => s.request({ method: "GET", path: "/v1/berkas/info" }, { signal }), { staleTime: 6e5 });
7544
+ }
7545
+ function useUnggahBerkas(opsi2 = {}) {
7546
+ const siakad = useSiakad();
7547
+ const { data: info } = useInfoBerkas();
7548
+ const ref = React17__namespace.useRef(opsi2);
7549
+ ref.current = opsi2;
7550
+ return React17__namespace.useCallback(
7551
+ async (file, onProgress, signal) => {
7552
+ const i = info ?? (await siakad.request({ method: "GET", path: "/v1/berkas/info" })).data;
7553
+ return unggahKeBerkas(siakad, i, file, ref.current, onProgress, signal);
7554
+ },
7555
+ [siakad, info]
7556
+ );
7557
+ }
7558
+ function useUrlBerkas(id, ttl = 900) {
7559
+ return useSiakadQuery(
7560
+ ["berkas-url", id ?? "", ttl],
7561
+ (s, signal) => s.request({ method: "GET", path: `/v1/berkas/${encodeURIComponent(id ?? "")}/url`, query: { ttl } }, { signal }),
7562
+ { enabled: Boolean(id), staleTime: Math.max(30, ttl - 60) * 1e3 }
7563
+ );
7564
+ }
7565
+ function UnggahBerkas({
7566
+ onSelesai,
7567
+ onGalat,
7568
+ accept,
7569
+ multiple,
7570
+ maxSize,
7571
+ disabled,
7572
+ title,
7573
+ hint,
7574
+ sembunyikanSelesai,
7575
+ className,
7576
+ ...opsi2
7577
+ }) {
7578
+ const unggah = useUnggahBerkas(opsi2);
7579
+ const { data: info } = useInfoBerkas();
7580
+ const [daftar2, setDaftar] = React17__namespace.useState([]);
7581
+ const batal = React17__namespace.useRef(/* @__PURE__ */ new Map());
7582
+ React17__namespace.useEffect(() => () => batal.current.forEach((c) => c.abort()), []);
7583
+ const ubah2 = (id, p) => setDaftar((d) => d.map((f) => f.id === id ? { ...f, ...p } : f));
7584
+ const mulai = (files) => {
7585
+ for (const file of files) {
7586
+ const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
7587
+ const ctl = new AbortController();
7588
+ batal.current.set(id, ctl);
7589
+ setDaftar((d) => [...multiple ? d : d.filter((f) => f.progress != null), { id, name: file.name, size: file.size, progress: 0 }]);
7590
+ unggah(file, (persen) => ubah2(id, { progress: persen }), ctl.signal).then((b) => {
7591
+ ubah2(id, { progress: void 0, url: b.url ?? void 0 });
7592
+ if (sembunyikanSelesai) setDaftar((d) => d.filter((f) => f.id !== id));
7593
+ onSelesai?.(b);
7594
+ }).catch((e) => {
7595
+ if (ctl.signal.aborted) return;
7596
+ const pesan = pesanGalat(e);
7597
+ ubah2(id, { progress: void 0, error: pesan });
7598
+ onGalat?.(pesan, file);
7599
+ }).finally(() => batal.current.delete(id));
7600
+ }
7601
+ };
7602
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, style: { display: "grid", gap: "var(--u-space-3, 12px)" }, children: [
7603
+ /* @__PURE__ */ jsxRuntime.jsx(
7604
+ chunkDEF5CA7C_cjs.Dropzone,
7605
+ {
7606
+ onFiles: mulai,
7607
+ accept,
7608
+ multiple,
7609
+ maxSize: maxSize ?? info?.maks_byte,
7610
+ disabled,
7611
+ title,
7612
+ hint,
7613
+ onReject: (m) => onGalat?.(m, new File([], ""))
7614
+ }
7615
+ ),
7616
+ /* @__PURE__ */ jsxRuntime.jsx(
7617
+ chunkDEF5CA7C_cjs.FileList,
7618
+ {
7619
+ files: daftar2,
7620
+ onRemove: (id) => {
7621
+ batal.current.get(id)?.abort();
7622
+ setDaftar((d) => d.filter((f) => f.id !== id));
7623
+ }
7624
+ }
7625
+ )
7626
+ ] });
7627
+ }
7505
7628
 
7506
7629
  exports.AKSES_ARSIP = AKSES_ARSIP;
7507
7630
  exports.AgendaLms = AgendaLms;
@@ -7698,6 +7821,7 @@ exports.TindakanArsip = TindakanArsip;
7698
7821
  exports.TindakanSpmi = TindakanSpmi;
7699
7822
  exports.TranskripMahasiswa = TranskripMahasiswa;
7700
7823
  exports.TugasMendatang = TugasMendatang;
7824
+ exports.UnggahBerkas = UnggahBerkas;
7701
7825
  exports.UnipoProvider = UnipoProvider;
7702
7826
  exports.UsiaPegawai = UsiaPegawai;
7703
7827
  exports.ValidasiKurikulum = ValidasiKurikulum;
@@ -7728,6 +7852,7 @@ exports.pesanGalat = pesanGalat;
7728
7852
  exports.sisaTenggat = sisaTenggat;
7729
7853
  exports.teksEnv = teksEnv;
7730
7854
  exports.terjawab = terjawab;
7855
+ exports.unggahKeBerkas = unggahKeBerkas;
7731
7856
  exports.useAnggotaKelas = useAnggotaKelas;
7732
7857
  exports.useAplikasiRbac = useAplikasiRbac;
7733
7858
  exports.useAplikasiTerpadu = useAplikasiTerpadu;
@@ -7741,6 +7866,7 @@ exports.useDasborSpmi = useDasborSpmi;
7741
7866
  exports.useDosen = useDosen;
7742
7867
  exports.useEkuivalensi = useEkuivalensi;
7743
7868
  exports.useFilterFields = useFilterFields;
7869
+ exports.useInfoBerkas = useInfoBerkas;
7744
7870
  exports.useJadwalDosen = useJadwalDosen;
7745
7871
  exports.useKalenderLms = useKalenderLms;
7746
7872
  exports.useKatalogScope = useKatalogScope;
@@ -7785,6 +7911,8 @@ exports.useTahunOptions = useTahunOptions;
7785
7911
  exports.useTranskrip = useTranskrip;
7786
7912
  exports.useTrenAkademik = useTrenAkademik;
7787
7913
  exports.useUjianSaya = useUjianSaya;
7914
+ exports.useUnggahBerkas = useUnggahBerkas;
7915
+ exports.useUrlBerkas = useUrlBerkas;
7788
7916
  exports.useValidasiKurikulum = useValidasiKurikulum;
7789
7917
  //# sourceMappingURL=siakad.cjs.map
7790
7918
  //# sourceMappingURL=siakad.cjs.map