import React, { useState } from 'react'; import { HardDrive, Database, Plus, RefreshCw, Clock, RotateCcw, CheckCircle2, AlertTriangle, FolderTree, FileBox, ShieldCheck, } from 'lucide-react'; import type { ZfsPool, ZfsDataset, ZfsSnapshot, UnimportedPool } from '../types/index.js'; interface StorageViewProps { pools: ZfsPool[]; datasets: ZfsDataset[]; snapshots: ZfsSnapshot[]; unimportedPools: UnimportedPool[]; onRefresh: () => void; onImportPool: (poolName: string) => Promise; onScrubPool: (poolName: string) => Promise; onCreateSnapshot: (dataset: string, tag: string) => Promise; onRollbackSnapshot: (snapshotName: string) => Promise; } export const StorageView: React.FC = ({ pools, datasets, snapshots, unimportedPools, onRefresh, onImportPool, onScrubPool, onCreateSnapshot, onRollbackSnapshot, }) => { const [activeSubTab, setActiveSubTab] = useState<'pools' | 'datasets' | 'snapshots' | 'migration'>('pools'); const [selectedPool, setSelectedPool] = useState(pools[0]?.name || 'tank'); const [importingPoolName, setImportingPoolName] = useState(null); const [importSuccess, setImportSuccess] = useState(null); const handleImport = async (poolName: string) => { setImportingPoolName(poolName); try { await onImportPool(poolName); setImportSuccess(`Pool '${poolName}' was successfully imported without data loss!`); setTimeout(() => setImportSuccess(null), 6000); } finally { setImportingPoolName(null); } }; return (
{/* Sub-navigation Header */}

OpenZFS Storage Engine

Enterprise storage layout, datasets, snapshot policies, and foreign pool migration

{importSuccess && (
{importSuccess}
)} {/* Pools Tab */} {activeSubTab === 'pools' && (
{pools.map((pool) => (

{pool.name} {pool.health}

OpenZFS Pool • ashift=12 • Compression=lz4/zstd

{/* Pool Capacity Bar */}
Capacity Used: {pool.allocated} / {pool.size} ({pool.capacityPercent}%) Available Free: {pool.free}
{/* Status summary */}
Last Scrub: {pool.scanStatus || 'Completed with 0 errors'} Fragmentation: {pool.fragmentation}
))}
)} {/* Datasets Tab */} {activeSubTab === 'datasets' && (

ZFS Datasets & Mountpoints

Total {datasets.length} datasets
{datasets.map((ds) => ( ))}
Dataset Name Mountpoint Used Available Compression Record Size Quota
{ds.name} {ds.mountpoint} {ds.used} {ds.available} {ds.compression} {ds.recordsize} {ds.quota === 'none' ? None : ds.quota}
)} {/* Snapshots Tab */} {activeSubTab === 'snapshots' && (

ZFS Point-in-Time Snapshots

Total {snapshots.length} snapshots
{snapshots.map((snap) => ( ))}
Snapshot Name Dataset Created Unique Used Actions
{snap.name} {snap.dataset} {snap.creationTime} {snap.usedBytes}
)} {/* Foreign Pool Migration Wizard */} {activeSubTab === 'migration' && (
Zero-Data-Loss Migration Engine

NaxOS provides first-class support for discovering and safely importing existing ZFS storage pools created on TrueNAS CORE/SCALE or raw NixOS systems (such as nixos-lukas). The migration engine operates with safety-first guarantees: existing datasets, quotas, and critical application assets (such as your Immich photo library in tank/media/photos) are preserved untouched.

Detected Foreign ZFS Pools

Unimported pools ready for adoption

{unimportedPools.length === 0 ? (
No foreign unimported pools detected. All connected pools are currently active.
) : (
{unimportedPools.map((pool) => (
{pool.name} {pool.state} ID: {pool.id}

{pool.status}

Member Disks: {pool.disks.map((d) => ( {d} ))}
))}
)}
)}
); };