Three problems, and the first one is the reason the other two were hard to see. THERE WAS NO DASHBOARD. "/" redirected to the underwriting queue — one stage, usually empty, and belonging to somebody else. Every screen in the app answered "show me this queue"; none answered "how is the book doing, and is anything waiting on me?", which is the only question a person has before they have picked a queue. So: a Today page. Three blocks, in the order somebody cares about them. What is waiting on a person, as three cards that colour only when they have something in them. Renewals running out, worst first, capped at 30 days because a renewal six months away is not a thing to look at today. Then every stage with its count, zeroes included — a stage quietly receiving nothing is only visible if its zero is on screen. It is one list call, counted in the browser. That is honest at this size and it is the same call the queues already make. If the book outgrows it the answer is a counts endpoint, not a bigger page. THE WORDS WERE WRITTEN FOR WHOEVER BUILT THE WORKFLOW. "What happens next" was followed by "these are the only activities this state allows — but the workflow decides, server-side, whether you may". A failed list said "this queue has no record view yet". Panels were called "Flow details". A closed lead read "nothing runs from here". None of that is wrong; all of it is addressed to the wrong reader. Now: "What you can do", "Lead details", "History", "This queue could not be loaded". Queue names say what they want — "Documents needed", "Underwriter to review", "Payment to confirm". The sidebar group called "Not yet" says "Not due yet", and "Running by itself" says "The agents have it", which is the actual claim being made. THE QUEUE HAD NINE COLUMNS AND LED WITH THE WRONG ONE. Two were internal vocabulary: attribution status renders "clear" or "contested" and means nothing to an operator, and the channel is background rather than something anyone scans a queue for. Both fold into a subtitle under the customer. That leaves six columns and puts the renewal countdown — the number that decides whether to act today — second instead of fifth. Also: the timeline printed a raw slug when a step came back without a name. It is the screen this product is demonstrated on, so a "zk-act-doc-reminder" in the middle of an otherwise readable story is expensive. It now reads as English.
37 lines
1.2 KiB
JavaScript
37 lines
1.2 KiB
JavaScript
import { Navigate, Route, Routes } from 'react-router-dom'
|
|
import { useZino } from './api/provider.jsx'
|
|
import Login from './pages/Login.jsx'
|
|
import Shell from './layout/Shell.jsx'
|
|
import Overview from './screens/Overview.jsx'
|
|
import Pipeline from './screens/Pipeline.jsx'
|
|
import Lead from './screens/Lead.jsx'
|
|
import AddLead from './screens/AddLead.jsx'
|
|
|
|
export default function App() {
|
|
const { isAuthed } = useZino()
|
|
|
|
if (!isAuthed) {
|
|
return (
|
|
<Routes>
|
|
<Route path="/login" element={<Login />} />
|
|
<Route path="*" element={<Login />} />
|
|
</Routes>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<Routes>
|
|
<Route path="/login" element={<Navigate to="/" replace />} />
|
|
<Route element={<Shell />}>
|
|
{/* The morning page. This used to redirect to the underwriting queue —
|
|
one stage, usually empty, and somebody else's. */}
|
|
<Route path="/" element={<Overview />} />
|
|
<Route path="/stage/:stageUid" element={<Pipeline />} />
|
|
<Route path="/add" element={<AddLead />} />
|
|
<Route path="/lead/:instanceId" element={<Lead />} />
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
</Route>
|
|
</Routes>
|
|
)
|
|
}
|