diff --git a/.omo/plans/features-plan.md b/.omo/plans/features-plan.md new file mode 100644 index 0000000..ef4d035 --- /dev/null +++ b/.omo/plans/features-plan.md @@ -0,0 +1,166 @@ +# IPFS Portal Feature Plan + +## A. Payment / Blockchain Features + +### A1. Multi-chain Support +- **Status**: `getWalletClient()` en `getPublicClient()` hardcoden naar `zkSyncLocal` +- **Wijzigingen**: + - `src/lib/payment/read-service.ts`: `getPublicClient()` chain parameter toevoegen + - `src/lib/payment/write-service.ts`: `getWalletClient()` chain configurable maken + - `src/lib/payment/abi.ts`: `ChainConfig[]` type, default chains (zkSync Local + optioneel Polygon/Arbitrum) + - `src/lib/payment/service.ts`: chain selector in constructor + - `src/components/PaymentPanel.tsx`: chain switcher UI + - `src/app/admin/payment/page.tsx`: multi-chain admin overzicht +- **Bestanden**: `src/lib/payment/read-service.ts`, `write-service.ts`, `abi.ts`, `service.ts`, `src/components/PaymentPanel.tsx`, `src/app/admin/payment/page.tsx` + +### A2. Gas Estimator +- **Status**: Geen indicatie van transactiekosten voor gebruiker +- **Wijzigingen**: + - `src/lib/payment/read-service.ts`: `estimateGas()` methode + - `src/lib/payment/write-service.ts`: gas estimation voor `payWithETH`, `approveAndPayWithToken` + - `src/components/PaymentPanel.tsx`: gas fee display naast prijs +- **Bestanden**: `src/lib/payment/read-service.ts`, `write-service.ts`, `src/components/PaymentPanel.tsx` + +### A3. Batch Upload + Single Payment +- **Status**: 1 file → 1 upload → 1 tx (sequentieel via `startUpload()`) +- **Wijzigingen**: + - `src/lib/payment/write-service.ts`: `payWithBatch(provider, cids[], totalBytes, priceWei)` — encodet meerdere CIDs in 1 tx + - `src/app/upload/page.tsx`: batch selectie in crypto tab + - `src/components/PaymentPanel.tsx`: multiple files support +- **Bestanden**: `src/lib/payment/write-service.ts`, `src/app/upload/page.tsx`, `src/components/PaymentPanel.tsx` + +### A4. Storage Quota UI +- **Status**: `getUserStats()` returned `totalBytes/uploadCount/remainingFree` maar nergens getoond als overzicht +- **Wijzigingen**: + - Nieuw component: `src/components/StorageQuota.tsx` — balkje met used/free/total + - `src/app/dashboard/page.tsx`: storage quota card toevoegen + - `src/components/PaymentPanel.tsx`: quota status in payment panel +- **Bestanden**: NIEUW `src/components/StorageQuota.tsx`, `src/app/dashboard/page.tsx`, `src/components/PaymentPanel.tsx` + +### A5. On-chain Transaction History +- **Status**: History page gebruikt alleen localStorage; contract heeft `getUserUploads(address)` met records +- **Wijzigingen**: + - `src/lib/payment/read-service.ts`: `getUserUploads()` bestaat al — wordt gebruikt in UsersPage + - `src/app/history/page.tsx`: "On-chain History" tab toevoegen naast localStorage tab + - Nieuw component: `src/components/ChainHistory.tsx` +- **Bestanden**: `src/app/history/page.tsx`, NIEUW `src/components/ChainHistory.tsx` + +### A6. Token Auto-router +- **Status**: Gebruiker kiest handmatig token in PaymentPanel +- **Wijzigingen**: + - `src/components/PaymentPanel.tsx`: auto-select goedkoopste token op basis van `finalWei` / `weiPerToken` + - Optioneel: "Auto" button naast token lijst +- **Bestanden**: `src/components/PaymentPanel.tsx` + +### A7. Subscription / Pre-paid Tegoed +- **Status**: Per-file betaling; contract heeft `getUserStats()` met `remainingFree` +- **Wijzigingen**: + - Nieuw component: `src/components/DepositPanel.tsx` — stort ETH/tokens op contract + - Nieuw component: `src/components/BalanceDisplay.tsx` — toon tegoed + - `src/app/dashboard/page.tsx`: balance card + - `src/lib/payment/write-service.ts`: `deposit(provider, amount)` methode +- **Bestanden**: NIEUW `src/components/DepositPanel.tsx`, NIEUW `src/components/BalanceDisplay.tsx`, `src/app/dashboard/page.tsx`, `src/lib/payment/write-service.ts` + +--- + +## B. IPFS Explorer — Content Viewing + +### B1. Video Preview (.mp4, .webm, .mov) +- **Status**: valt onder `'other'` → "Preview not available" +- **Wijzigingen**: + - `src/app/explorer/components/FilePreview.tsx`: `detectFileType()` uitbreiden met `'video'` type + - `src/app/explorer/components/FilePreview.tsx`: `