import React, { useCallback } from 'react' import type { ChatMessageMeta } from '../types/chat' interface ReorgPanelProps { meta: ChatMessageMeta onReply: (text: string) => void responded: boolean } const SCOPE_LABELS: Record = { task_adjustment: 'Task Adjustment', runtime_replan: 'Runtime Replan', org_mutation: 'Org Mutation', } const RISK_COLORS: Record = { low: 'var(--green)', medium: 'var(--yellow)', high: 'var(--red)', } export const ReorgPanel = React.memo(function ReorgPanel({ meta, onReply, responded, }: ReorgPanelProps) { const isResponded = responded const handleApprove = useCallback(() => { if (isResponded) return onReply('approve') }, [isResponded, onReply]) const handleDeny = useCallback(() => { if (isResponded) return onReply('deny') }, [isResponded, onReply]) const roleChanges = meta.role_changes ?? [] const projectionChanges = meta.work_item_projection_changes ?? [] const scope = meta.scope || 'org_mutation' const risk = meta.risk_level || 'medium' const impact = meta.impact_summary || {} return (
{meta.title || 'Company Reorg'}
{isResponded && Responded}
{SCOPE_LABELS[scope] || scope} Risk: {risk.charAt(0).toUpperCase() + risk.slice(1)}
{meta.summary &&
{meta.summary}
} {meta.rationale &&
{meta.rationale}
} {roleChanges.length > 0 && (
Role Changes
{roleChanges.map((rc, i) => (
{rc.action} {rc.role_id} {rc.replacement_role_id && ( <> {rc.replacement_role_id} )} {rc.reason && {rc.reason}}
))}
)} {projectionChanges.length > 0 && (
Work Item Projection Changes
{projectionChanges.map((change, i) => (
{change.action} {change.work_item_projection_id} {change.replacement_work_item_projection_id && ( <> {change.replacement_work_item_projection_id} )} {change.reason && {change.reason}}
))}
)} {Object.keys(impact).length > 0 && (
{impact.affected_tasks != null && Tasks affected: {impact.affected_tasks}} {impact.affected_roles != null && Roles affected: {impact.affected_roles}} {impact.migration_count != null && Migrations: {impact.migration_count}}
)} {!isResponded && (
)}
) })