/* INDIEKOS — Penghuni mobile app */ const ME = D.me; function StatusBar({ onBrand }) { return (
9:41
); } /* ---- Home (3 variations) ---- */ function PHome({ go, pending, openPay, variant }) { const cur = ME.current; const status = pending ? "pending" : cur.status; // open => due const dueState = status === "pending" ? "pending" : "due"; const heroClass = status === "pending" ? "due" : "due"; // amber for due/pending const greeting = "Halo, " + ME.name.split(" ")[0]; const Hero = (
Tagihan {cur.period} {status === "pending" ? Menunggu verifikasi : Jatuh tempo H-{cur.dueInDays}}
{D.rp(cur.total)}
Jatuh tempo 5 Juli 2025 · Kamar {ME.room}
{status === "pending" ?
Bukti terkirim. Menunggu owner.
: }
); return ( <>
{greeting} 👋

Kamar {ME.room}

{variant !== "minimal" && Hero} {variant === "minimal" && (
Tagihan {cur.period}
{D.rp(cur.total)}
{status === "pending" ? : H-{cur.dueInDays}}
{status !== "pending" && }
)} {/* my room card */}
Kamar {ME.room} · {ME.type}
{ME.prop}
{D.rp(ME.price)}
/ bulan
{/* deposit + since */}
Deposit
{D.rp(ME.deposit)}
tersimpan
Sejak
{ME.since}
10 bulan
{variant === "feed" && (
Aktivitas
{[["checkCircle", "var(--success)", "Bayar Mei diverifikasi", "5 Mei"], ["wrench", "var(--info-fg)", "Keluhan keran selesai", "2 Jun"], ["invoice", "var(--gold-fg)", "Tagihan Juli terbit", "1 Jul"]].map(([ic, c, t, d], i) => (
{t}{d}
))}
)} {/* shortcuts */}
); } /* ---- Tagihan ---- */ function PTagihan({ openPay, pending }) { const cur = ME.current; return ( <>

Tagihan

{cur.period}{pending ? : H-{cur.dueInDays}}
{D.rp(cur.total)}
Jatuh tempo 5 Juli 2025
{pending ?
Bukti sedang ditinjau owner.
: }
Riwayat
{ME.invoices.map(inv => (
{inv.period}
{inv.id}
{D.rp(inv.total)}
))}
); } /* ---- Keluhan ---- */ function PKeluhan({ openComplaint, complaints }) { const stMeta = { done: ["success", "Selesai"], in_progress: ["info", "Dikerjakan"], open: ["warning", "Menunggu"] }; return ( <>

Keluhan

{complaints.length === 0 && } {complaints.map(c => { const [clr, lbl] = stMeta[c.status]; return (
{c.id} · {c.cat}{lbl}
{c.title}
{new Date(c.date).toLocaleDateString("id-ID", { day: "numeric", month: "long" })}
); })}
); } /* ---- Profil ---- */ function PProfil() { return ( <>

Profil

{ME.name}
Kamar {ME.room} · {ME.prop}
{[["phone", "Telepon", ME.phone], ["door", "Kamar", ME.room + " · " + ME.type], ["calendar", "Bergabung", ME.since]].map(([ic, l, v], i) => (
{l}{v}
))}
); } /* ---- Upload bukti bottom sheet ---- */ function PaySheet({ open, onClose, onSubmit }) { const [step, setStep] = useState(1); const [amt, setAmt] = useState(String(ME.current.total)); const [method, setMethod] = useState("Transfer BCA"); const [hasPhoto, setHasPhoto] = useState(false); useEffect(() => { if (open) { setStep(1); setAmt(String(ME.current.total)); setHasPhoto(false); } }, [open]); return ( <>

Unggah bukti bayar

Tagihan {ME.current.period}{D.rp(ME.current.total)}
Rp setAmt(e.target.value.replace(/\D/g, ""))} />
{+amt < ME.current.total && +amt > 0 &&
Pembayaran sebagian · sisa {D.rp(ME.current.total - +amt)}
}
{hasPhoto ? (
bukti_transfer.jpg
) : (
setHasPhoto(true)}>Ambil foto dari kameraatau pilih dari galeri
)}
Status akan jadi "Menunggu verifikasi" sampai owner menyetujui.
); } /* ---- Complaint sheet ---- */ function ComplaintSheet({ open, onClose, onSubmit }) { const cats = [["AC", "wind"], ["Bocor", "droplet"], ["Listrik", "zap"], ["Perbaikan", "wrench"], ["Lainnya", "receipt"]]; const [cat, setCat] = useState("AC"); const [desc, setDesc] = useState(""); const [photo, setPhoto] = useState(false); useEffect(() => { if (open) { setDesc(""); setPhoto(false); } }, [open]); return ( <>

Lapor keluhan

{cats.map(([c, ic]) => ())}