import * as icon from '@mdi/js'; import Head from 'next/head'; import React, { ReactElement } from 'react'; import BaseButton from '../components/BaseButton'; import BaseIcon from '../components/BaseIcon'; import CardBox from '../components/CardBox'; import LayoutAuthenticated from '../layouts/Authenticated'; import SectionMain from '../components/SectionMain'; import SectionTitleLineWithButton from '../components/SectionTitleLineWithButton'; import { getPageTitle } from '../config'; import { useAppSelector } from '../stores/hooks'; type SynapseNode = { id: number; name: string; city: string; type: 'Creator Hub' | 'Fulfillment' | 'Retail Partner' | 'Drop Point'; health: number; capacity: number; latency: string; }; type AffiliatePartner = { id: number; name: string; tier: string; sales: number; commissionRate: number; status: 'Aktif' | 'Butuh Follow Up' | 'Review Fraud'; }; type CreativeDrop = { id: number; title: string; creator: string; channel: string; inventory: number; sold: number; margin: number; }; type LogisticsJob = { id: number; code: string; destination: string; status: 'Routing' | 'Dikirim' | 'Terkirim' | 'Tahan QC'; eta: string; courier: string; risk: 'Rendah' | 'Sedang' | 'Tinggi'; }; type LedgerEvent = { id: number; module: string; title: string; detail: string; time: string; }; const fallbackIcon = icon.mdiViewDashboardOutline; const resolveIcon = (name: string) => (name in icon ? icon[name as keyof typeof icon] : fallbackIcon) as string; const formatCurrency = (value: number) => new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', maximumFractionDigits: 0, }).format(value); const formatNumber = (value: number) => new Intl.NumberFormat('id-ID', { maximumFractionDigits: 0, }).format(value); const VortaSynapsePage = () => { const { currentUser } = useAppSelector((state) => state.auth); const iconsColor = useAppSelector((state) => state.style.iconsColor); const [activeNodeId, setActiveNodeId] = React.useState(1); const [campaignInput, setCampaignInput] = React.useState('Drop merchandise kreator lokal Batch 04'); const [selectedDropId, setSelectedDropId] = React.useState(1); const [distributionBudget, setDistributionBudget] = React.useState('7500000'); const [commissionPool, setCommissionPool] = React.useState(18250000); const [routingEfficiency, setRoutingEfficiency] = React.useState(86); const [nodes, setNodes] = React.useState([ { id: 1, name: 'Jakarta Creator Hub', city: 'Jakarta', type: 'Creator Hub', health: 96, capacity: 78, latency: '12 ms', }, { id: 2, name: 'Bandung Micro Fulfillment', city: 'Bandung', type: 'Fulfillment', health: 91, capacity: 64, latency: '18 ms', }, { id: 3, name: 'Surabaya Affiliate Gate', city: 'Surabaya', type: 'Retail Partner', health: 88, capacity: 72, latency: '24 ms', }, { id: 4, name: 'Bali Pop-Up Drop Point', city: 'Denpasar', type: 'Drop Point', health: 83, capacity: 55, latency: '31 ms', }, ]); const [partners, setPartners] = React.useState([ { id: 1, name: 'Nara Studio Circle', tier: 'Creator Lead', sales: 146, commissionRate: 14, status: 'Aktif', }, { id: 2, name: 'Kolektif Musik Indie', tier: 'Community Partner', sales: 92, commissionRate: 11, status: 'Aktif', }, { id: 3, name: 'Micro Seller Timur', tier: 'Regional Affiliate', sales: 51, commissionRate: 9, status: 'Butuh Follow Up', }, { id: 4, name: 'Promo Flash Network', tier: 'Performance', sales: 18, commissionRate: 7, status: 'Review Fraud', }, ]); const [drops, setDrops] = React.useState([ { id: 1, title: 'Hoodie Tur Konser Virtual', creator: 'Aksara Nada', channel: 'TikTok Shop + Komunitas', inventory: 420, sold: 287, margin: 38, }, { id: 2, title: 'Print Art Edisi 04', creator: 'Maya Visual Lab', channel: 'Marketplace Kolektor', inventory: 180, sold: 119, margin: 44, }, { id: 3, title: 'Paket Kelas Mini Creator', creator: 'Ruang Cerita', channel: 'Affiliate Academy', inventory: 650, sold: 312, margin: 52, }, ]); const [jobs, setJobs] = React.useState([ { id: 1, code: 'VSP-0401', destination: 'Jakarta Selatan', status: 'Routing', eta: '2 jam', courier: 'Vorta Route AI', risk: 'Rendah', }, { id: 2, code: 'VSP-0402', destination: 'Bandung Kota', status: 'Dikirim', eta: '5 jam', courier: 'Synapse Express', risk: 'Sedang', }, { id: 3, code: 'VSP-0403', destination: 'Surabaya Timur', status: 'Tahan QC', eta: '12 jam', courier: 'Partner Fleet', risk: 'Tinggi', }, ]); const [ledger, setLedger] = React.useState([ { id: 1, module: 'Distribusi', title: 'Batch 04 disinkronkan', detail: '287 unit hoodie dialokasikan dari Jakarta Creator Hub ke 3 node regional.', time: 'Baru saja', }, { id: 2, module: 'Afiliasi', title: 'Komisi kreator dihitung', detail: 'Pool komisi minggu ini siap dibagi ke 4 partner aktif.', time: '8 menit lalu', }, { id: 3, module: 'Logistik', title: 'Rute risiko tinggi ditahan', detail: 'Paket VSP-0403 masuk antrian QC sebelum dilanjutkan ke Surabaya Timur.', time: '14 menit lalu', }, ]); const userName = currentUser?.firstName || currentUser?.email || 'Operator Vorta'; const activeNode = nodes.find((node) => node.id === activeNodeId) || nodes[0]; const selectedDrop = drops.find((drop) => drop.id === selectedDropId) || drops[0]; const totalInventory = drops.reduce((sum, drop) => sum + drop.inventory, 0); const totalSold = drops.reduce((sum, drop) => sum + drop.sold, 0); const sellThrough = Math.round((totalSold / totalInventory) * 100); const partnerSales = partners.reduce((sum, partner) => sum + partner.sales, 0); const averageCommission = Math.round( partners.reduce((sum, partner) => sum + partner.commissionRate, 0) / partners.length, ); const openJobs = jobs.filter((job) => job.status !== 'Terkirim').length; const addLedgerEvent = (module: string, title: string, detail: string) => { setLedger((current) => [ { id: Date.now(), module, title, detail, time: 'Baru saja', }, ...current.slice(0, 6), ]); }; const launchCampaign = () => { const trimmedCampaign = campaignInput.trim(); const budget = Number(distributionBudget); if (!trimmedCampaign || !budget || budget <= 0) { return; } const nextDrop: CreativeDrop = { id: Date.now(), title: trimmedCampaign, creator: String(userName), channel: `${activeNode.city} Synapse Node`, inventory: Math.max(80, Math.round(budget / 50000)), sold: 0, margin: selectedDrop.margin, }; setDrops((current) => [nextDrop, ...current]); setSelectedDropId(nextDrop.id); setCommissionPool((current) => current + Math.round(budget * 0.18)); setCampaignInput(''); setDistributionBudget(''); addLedgerEvent( 'Distribusi', 'Kampanye kreator diluncurkan', `${nextDrop.title} masuk node ${activeNode.name} dengan estimasi stok ${formatNumber(nextDrop.inventory)} unit.`, ); }; const optimizeRoute = () => { setRoutingEfficiency((current) => Math.min(99, current + 3)); setNodes((current) => current.map((node) => node.id === activeNodeId ? { ...node, health: Math.min(99, node.health + 2), capacity: Math.max(35, node.capacity - 4), } : node, ), ); setJobs((current) => current.map((job, index) => index === 0 ? { ...job, status: 'Dikirim', eta: '90 menit', risk: 'Rendah', } : job, ), ); addLedgerEvent( 'Logistik', 'Rute pintar dioptimalkan', `${activeNode.name} menurunkan ETA prioritas dan meningkatkan efisiensi rute menjadi ${Math.min(99, routingEfficiency + 3)}%.`, ); }; const settleCommissions = () => { if (commissionPool <= 0) { return; } setPartners((current) => current.map((partner) => ({ ...partner, sales: partner.sales + Math.round(partner.sales * 0.06), status: partner.status === 'Review Fraud' ? 'Butuh Follow Up' : 'Aktif', })), ); addLedgerEvent( 'Afiliasi', 'Settlement komisi diproses', `${formatCurrency(commissionPool)} dialokasikan ke partner dengan rata-rata komisi ${averageCommission}%.`, ); setCommissionPool(0); }; const dispatchShipment = (jobId: number) => { setJobs((current) => current.map((job) => job.id === jobId ? { ...job, status: job.status === 'Terkirim' ? 'Terkirim' : 'Terkirim', eta: 'Selesai', risk: 'Rendah', } : job, ), ); const completedJob = jobs.find((job) => job.id === jobId); if (completedJob) { addLedgerEvent( 'Logistik', 'Paket diselesaikan', `${completedJob.code} ke ${completedJob.destination} ditandai terkirim dan siap settlement kreator.`, ); } }; const boostSelectedDrop = () => { setDrops((current) => current.map((drop) => drop.id === selectedDropId ? { ...drop, sold: Math.min(drop.inventory, drop.sold + 24), margin: Math.min(70, drop.margin + 1), } : drop, ), ); addLedgerEvent( 'Distribusi', 'Afiliasi boost diterapkan', `${selectedDrop.title} mendapat 24 proyeksi penjualan baru lewat partner performa tinggi.`, ); }; return ( <> {getPageTitle('04 Vorta Synapse')}
Protokol distribusi, afiliasi, dan logistik pintar untuk ekonomi kreator

Halo {userName}, sinkronkan drop kreator dari kampanye sampai paket terkirim.

Vorta Synapse menyatukan node distribusi, partner afiliasi, pool komisi, alokasi stok, dan rute logistik adaptif agar kreator bisa menjual lebih luas tanpa kehilangan kontrol operasional.

{[ { label: 'Sell-through', value: `${sellThrough}%`, iconName: 'mdiChartTimelineVariant' }, { label: 'Penjualan afiliasi', value: formatNumber(partnerSales), iconName: 'mdiAccountMultipleCheckOutline' }, { label: 'Komisi siap', value: formatCurrency(commissionPool), iconName: 'mdiCashSync' }, { label: 'Job logistik', value: openJobs, iconName: 'mdiTruckFastOutline' }, ].map((item) => (
{item.label}
{item.value}
))}

Synapse health

{routingEfficiency}% route efficiency

Protocol Live
{ledger.slice(0, 4).map((event) => (
{event.module} {event.time}

{event.title}

{event.detail}

))}

Node aktif

{activeNode.name}

{activeNode.type} di {activeNode.city} • kapasitas {activeNode.capacity}% terpakai

Health score

{activeNode.health}%

Node siap menerima batch dan menjaga SLA fulfillment.

Routing efficiency

{routingEfficiency}%

Optimasi mempertimbangkan stok, risiko, jarak, dan kapasitas mitra.

Average commission

{averageCommission}%

Tarif dinamis mengikuti performa dan kualitas traffic partner.

Launcher kampanye kreator

Buat batch distribusi baru dan isi pool afiliasi otomatis.

setCampaignInput(event.target.value)} className="h-11 rounded-xl border border-gray-200 bg-white px-3 text-sm outline-none focus:border-blue-400 focus:ring dark:border-dark-700 dark:bg-dark-800 md:col-span-2" placeholder="Nama drop atau kampanye kreator" /> setDistributionBudget(event.target.value)} className="h-11 rounded-xl border border-gray-200 bg-white px-3 text-sm outline-none focus:border-blue-400 focus:ring dark:border-dark-700 dark:bg-dark-800" placeholder="Budget distribusi" inputMode="numeric" />

Template margin mengikuti {selectedDrop.title} ({selectedDrop.margin}%).

Komisi Afiliasi

Pool komisi untuk kreator, komunitas, dan reseller.

Pool siap settlement

{formatCurrency(commissionPool)}

Partner aktif: {partners.filter((partner) => partner.status === 'Aktif').length}/{partners.length}

{partners.map((partner) => (

{partner.name}

{partner.tier}

{partner.status}
Sales

{formatNumber(partner.sales)}

Rate

{partner.commissionRate}%

))}

Drop Kreator

Produk digital/fisik yang sedang didorong oleh protokol distribusi.

{drops.map((drop) => { const progress = Math.round((drop.sold / drop.inventory) * 100); return ( ); })}

Boost afiliasi terpilih

{selectedDrop.title}

Simulasi ini menambah proyeksi penjualan dan menaikkan margin drop pilihan.

Logistik Pintar

Queue pengiriman dengan ETA, risiko, dan aksi penyelesaian.

{jobs.map((job) => (

{job.code}

Risiko {job.risk}

{job.destination} • {job.courier}

{job.status}

ETA {job.eta}

dispatchShipment(job.id)} />
))}
); }; VortaSynapsePage.getLayout = function getLayout(page: ReactElement) { return {page}; }; export default VortaSynapsePage;