import React,{useState,useEffect} from 'react';import{createRoot}from'react-dom/client';import{MessageSquareWarning,ClipboardList,ArrowRight,ArrowLeft,Send,Inbox,ShieldCheck,LogOut,CheckCircle,Upload,Home,Lock,RefreshCcw}from'lucide-react';import './style.css';
const API='/api/index.php';async function call(action,data={},method='POST'){const r=await fetch(`${API}?action=${action}`,{method,headers:{...(method==='POST'?{'Content-Type':'application/json'}:{})},credentials:'same-origin',...(method==='POST'?{body:JSON.stringify(data)}:{})});const j=await r.json().catch(()=>({error:'Respons server tidak valid'}));if(!r.ok||j.error)throw Error(j.error||'Permintaan gagal');return j}
const sources=['Teman/Keluarga/Rekan kerja','Instagram','Facebook','Google','Telegram','Pesan SMS','WhatsApp','Iklan / Promosi','Lainnya'];const mainQuestions=[['Bagaimana kemudahan proses pendaftaran akun?',['Sangat Mudah','Mudah','Sulit','Sangat Sulit']],['Bagaimana kecepatan proses transaksi Deposit?',['Sangat Cepat','Cepat','Lama','Sangat Lama']],['Bagaimana kecepatan proses transaksi Withdraw?',['Sangat Cepat','Cepat','Lama','Sangat Lama']],['Bagaimana pelayanan CS PMTOTO?',['Ramah','Sangat Ramah','Buruk','Sangat Buruk']]];const gameQuestions=[['Bagaimana pengalaman bermain di PMTOTO?',['Sangat Nyaman','Nyaman','Tidak Nyaman','Tidak Bermain']],['Bagaimana pengalaman bermain slot di PMTOTO?',['Jackpot Terus','Lancar Tanpa Gangguan','Rungkad Terus','Sering Gangguan','Tidak Bermain']],['Bagaimana pengalaman bermain casino di PMTOTO?',['Jackpot Terus','Lancar Tanpa Gangguan','Rungkad Terus','Sering Gangguan','Tidak Bermain']],['Bagaimana kemudahan akses link / permainan PMTOTO?',['Mudah Diakses dan Lancar','Loading Cepat','Sering Lambat Loading','Terkadang Tidak Bisa Diakses']]];const lastQuestions=[['Apakah kamu akan merekomendasikan PMTOTO ke rekan-rekan kamu?',['Pasti','Sudah','Belum Tahu','Tidak akan']],['Selama bermain apakah kamu merasa aman dengan data yang didaftarkan di PMTOTO?',['Aman','Sangat Aman','Tidak Aman']],['Pernahkah Anda mengalami kendala saat melakukan withdraw?',['Tidak Ada Kendala','Rekening tidak valid','Withdraw sering pending','Lama proses Withdraw']],['Media apa yang paling sering kamu gunakan untuk berkomunikasi dengan CS PMTOTO?',['WhatsApp','Telegram','Livechat','Instagram']]];
function Header({go}){return }
function Field({label,value,onChange,placeholder,type='text',required=true}){return }
function Question({title,options,value,onChange}){return
{title} *
{options.map(o=>)}
}
function Survey({go}){const [step,setStep]=useState(0),[values,setValues]=useState({}),[busy,setBusy]=useState(false),[error,setError]=useState(''),[done,setDone]=useState(false);const set=(k,v)=>setValues(p=>({...p,[k]:v}));const groups=step===1?[...mainQuestions,...gameQuestions]:lastQuestions;function next(){setError('');if(step===0&&(!values.userid?.trim()||!values.whatsapp?.trim()||!values.source)){setError('Lengkapi User ID, WhatsApp, dan sumber informasi.');return}if(step>0&&groups.some(q=>!values[q[0]])){setError('Jawab semua pertanyaan bertanda * sebelum melanjutkan.');return}if(step===2){submit();return}setStep(s=>s+1);window.scrollTo({top:0,behavior:'smooth'})}async function submit(){setBusy(true);try{await call('survey',{answers:values});setDone(true)}catch(e){setError(e.message)}finally{setBusy(false)}}if(done)return
Terima kasih!
Survei kepuasan kamu berhasil dikirim.
;return
◉
Penilaian Layanan Pelanggan PMTOTO
PMTOTO selalu berupaya mengutamakan layanan terbaik. Mohon luangkan waktu sebentar untuk mengisi survei berikut.
Langkah {step+1} dari 3
{step===0?<>
Selamat datang 👋
Survei ini terdiri dari 3 langkah singkat. Waktu pengisian ±1–2 menit. Data digunakan untuk meningkatkan kualitas layanan.
Tuliskan saran terbaik Anda untuk meningkatkan kualitas layanan kami
>}{error&&
{error}
}
{step>0?:}
}
function Complaint({go}){const [v,setV]=useState({priority:'Normal',site:'PMTOTO'}),[file,setFile]=useState(null),[busy,setBusy]=useState(false),[error,setError]=useState(''),[ticket,setTicket]=useState('');const set=(k,val)=>setV(p=>({...p,[k]:val}));async function send(e){e.preventDefault();setError('');if(file&&(!['image/png','image/jpeg','image/webp'].includes(file.type)||file.size>3*1024*1024)){setError('Bukti harus JPG, PNG, atau WebP maksimal 3 MB.');return}setBusy(true);try{let attachment=null;if(file){const data=await new Promise((resolve,reject)=>{const r=new FileReader();r.onload=()=>resolve(r.result);r.onerror=reject;r.readAsDataURL(file)});attachment={name:file.name,data}}const r=await call('complaint',{...v,attachment});setTicket(r.ticket)}catch(e){setError(e.message)}finally{setBusy(false)}}if(ticket)return
Laporan berhasil dikirim!
Simpan nomor tiket ini untuk mengecek balasan admin.
{ticket}
;return
Laporkan Masalah
}
function InboxPage({go}){const [ticket,setTicket]=useState(''),[whatsapp,setWhatsapp]=useState(''),[data,setData]=useState(null),[error,setError]=useState(''),[busy,setBusy]=useState(false);async function check(e){e.preventDefault();setBusy(true);setError('');try{setData(await call('track',{ticket,whatsapp}))}catch(e){setError(e.message);setData(null)}finally{setBusy(false)}}return
Inbox Keluhan
}
function Admin({go}){const [auth,setAuth]=useState(false),[password,setPassword]=useState(''),[rows,setRows]=useState([]),[tab,setTab]=useState('complaints'),[selected,setSelected]=useState(null),[reply,setReply]=useState(''),[status,setStatus]=useState('Baru'),[error,setError]=useState(''),[loading,setLoading]=useState(false);async function load(t=tab){try{const r=await call('admin_list',{type:t});setRows(r.items);setAuth(true)}catch(e){setError(e.message);setAuth(false)}}async function login(e){e.preventDefault();setLoading(true);setError('');try{await call('admin_login',{password});setPassword('');await load()}catch(e){setError(e.message)}finally{setLoading(false)}}async function save(){try{await call('admin_update',{ticket:selected.ticket,status,reply});setSelected(null);await load()}catch(e){setError(e.message)}}async function logout(){await call('admin_logout');setAuth(false);setRows([])}if(!auth)return