Fosi Fossil Service
Small teams. Open source. Built on Fossil.

IaC / SwiftFlow

High-performance WMS with wave picking, smart routing, and real-time inventory visibility.

Public | Owner: IaC | Default branch: trunk | Last update: 2026-10-23 14:37

Artifact 806c91687cc69f1b2f35e74331729888f6d00133024f0a5864a17147471cbb6f:


import type { ReactNode } from 'react'
import { Navigate, Route, Routes } from 'react-router-dom'
import { can } from './api'
import { Account } from './pages/Account'
import { Audit } from './pages/Audit'
import { Dashboard } from './pages/Dashboard'
import { Documents } from './pages/Documents'
import { Inventory } from './pages/Inventory'
import { Locations } from './pages/Locations'
import { Moves } from './pages/Moves'
import { Login } from './pages/Login'
import { Orders } from './pages/Orders'
import { Putaway } from './pages/Putaway'
import { Products } from './pages/Products'
import { Shell } from './pages/Shell'
import { Users } from './pages/Users'
import { Waves } from './pages/Waves'
import { Warehouses } from './pages/Warehouses'
import { useSession } from './session'

function Guard({
  permission,
  children,
}: {
  permission?: string
  children: ReactNode
}) {
  const { user } = useSession()
  if (permission && !can(user, permission)) {
    return <p className="empty">没有权限查看此页面</p>
  }
  return children
}

export function App() {
  const { user, loading } = useSession()
  if (loading) return <p className="empty">正在确认登录状态…</p>
  return (
    <Routes>
      <Route path="/login" element={user ? <Navigate to="/" replace /> : <Login />} />
      <Route element={user ? <Shell /> : <Navigate to="/login" replace />}>
        <Route index element={<Dashboard />} />
        <Route path="account" element={<Account />} />
        <Route path="warehouses" element={<Guard permission="warehouse.view"><Warehouses /></Guard>} />
        <Route path="locations" element={<Guard permission="location.view"><Locations /></Guard>} />
        <Route path="products" element={<Guard permission="product.view"><Products /></Guard>} />
        <Route path="orders" element={<Guard permission="order.view"><Orders /></Guard>} />
        <Route path="orders/:billId" element={<Guard permission="order.view"><Orders /></Guard>} />
        <Route path="waves" element={<Guard permission="wave.manage"><Waves /></Guard>} />
        <Route path="waves/:waveId" element={<Guard permission="wave.manage"><Waves /></Guard>} />
        <Route
          path="receipts"
          element={<Guard permission="inbound.view"><Documents kind="receipt" /></Guard>}
        />
        <Route
          path="receipts/:billId"
          element={<Guard permission="inbound.view"><Documents kind="receipt" /></Guard>}
        />
        <Route
          path="inbounds"
          element={<Guard permission="inbound.view"><Documents kind="order" /></Guard>}
        />
        <Route
          path="inbounds/:billId"
          element={<Guard permission="inbound.view"><Documents kind="order" /></Guard>}
        />
        <Route path="inventory" element={<Guard permission="inventory.view"><Inventory /></Guard>} />
        <Route path="putaway" element={<Guard permission="putaway.execute"><Putaway /></Guard>} />
        <Route path="moves" element={<Guard permission="move.execute"><Moves /></Guard>} />
        <Route path="users" element={<Guard permission="user.manage"><Users /></Guard>} />
        <Route path="audit" element={<Guard permission="audit.view"><Audit /></Guard>} />
        <Route path="*" element={<Navigate to="/" replace />} />
      </Route>
    </Routes>
  )
}

Clone

You can clone this repository with the following command:

fossil clone https://fosi.dev/IaC/SwiftFlow

Contribute

The best way to contribute is through e-mail. See the project documentation for more details.