Top-level application component and single owner of server state.
On mount it loads routes, policies, plugin types, and script files in
parallel via the api client and keeps them in local state; every
mutation (create/delete route, save policy, reload config) round-trips
through the Admin API and then re-fetches everything, so the UI never
holds edits the gateway has not accepted.
Data flow: route selection lives here as selectedRoute; the routes
list and selection callbacks go down to Sidebar, while the policy
resolved from the selected route (plus the plugin/script catalogs) goes
down to GraphCanvas, which hands edited policies back via
onSavePolicy. Dialog state for route creation/deletion and toast
notifications are also owned here. If the initial load fails, the whole
screen is replaced by a connection-error panel with a retry button.
Creating a route also creates a matching <name>-policy seeded with a
listener.out -> client.in edge; deleting a route keeps its policy.
Returns Element
Remarks
The Admin API served from src/admin/ persists these changes into the
gateway's shared state (src/state.rs) used by the data plane.
Top-level application component and single owner of server state.
On mount it loads routes, policies, plugin types, and script files in parallel via the api client and keeps them in local state; every mutation (create/delete route, save policy, reload config) round-trips through the Admin API and then re-fetches everything, so the UI never holds edits the gateway has not accepted.
Data flow: route selection lives here as
selectedRoute; the routes list and selection callbacks go down to Sidebar, while the policy resolved from the selected route (plus the plugin/script catalogs) goes down to GraphCanvas, which hands edited policies back viaonSavePolicy. Dialog state for route creation/deletion and toast notifications are also owned here. If the initial load fails, the whole screen is replaced by a connection-error panel with a retry button.Creating a route also creates a matching
<name>-policyseeded with alistener.out -> client.inedge; deleting a route keeps its policy.