import React from 'react' import type { AccessControl } from '../../core/types' import { ChevronDown, ChevronRight, Refresh } from '../components/icons' import { JsonTree } from '../components/json-tree' import { DetailEmpty, FilterBar, ListItem, ListShell, Section, SplitView } from '../components/layout' import { Alert, Badge, Button } from '../components/ui' import type { IamIDevtoolsEngine } from '../lib/types' export function IamPoliciesPanel({ engine }: { engine: IamIDevtoolsEngine }) { const [policies, setPolicies] = React.useState([]) const [selected, setSelected] = React.useState(null) const [error, setError] = React.useState(null) const [filter, setFilter] = React.useState('') const load = React.useCallback(async () => { try { setError(null) setPolicies(await engine.admin.listPolicies()) } catch (err) { setError(err instanceof Error ? err.message : String(err)) } }, [engine]) React.useEffect(() => { void load() }, [load]) const filtered = policies.filter( (p) => p.id.toLowerCase().includes(filter.toLowerCase()) || (p.name ?? '').toLowerCase().includes(filter.toLowerCase()), ) const current = policies.find((p) => p.id === selected) ?? null return ( refresh }> {error && {error}} {filtered.length === 0 && !error && } {filtered.map((p) => ( setSelected(p.id)} primary={p.id} secondary={ {p.rules.length} rules {p.algorithm} } trailing={{p.algorithm}} /> ))} } right={ !current ? ( ) : (
{current.id} {current.name} {current.algorithm} {current.version != null && v{current.version}} {current.rules.length} rules
{current.description && (

{current.description}

)}
{current.rules.map((r) => ( ))}
) } /> ) } function RuleRow({ rule }: { rule: AccessControl.IRule }) { const [open, setOpen] = React.useState(false) return (
{open && (
{rule.description && (

{rule.description}

)} {rule.conditions && }
)}
) }