(&self, frame: &mut Frame, area: Rect, theme: &Theme)
| 197 | } |
| 198 | |
| 199 | pub fn render(&self, frame: &mut Frame, area: Rect, theme: &Theme) { |
| 200 | if !self.is_open || self.requests.is_empty() { |
| 201 | return; |
| 202 | } |
| 203 | |
| 204 | let request = match self.current_request() { |
| 205 | Some(r) => r, |
| 206 | None => return, |
| 207 | }; |
| 208 | |
| 209 | let height = 8u16; |
| 210 | let width = area.width.saturating_sub(2).min(80); |
| 211 | |
| 212 | // Render inline at the bottom of the session area |
| 213 | let popup_area = Rect::new( |
| 214 | area.x + 1, |
| 215 | area.y + area.height.saturating_sub(height + 1), |
| 216 | width, |
| 217 | height, |
| 218 | ); |
| 219 | |
| 220 | self.last_rendered_area.set(Some(popup_area)); |
| 221 | |
| 222 | let title = format!( |
| 223 | "{} {} - Permission Request", |
| 224 | request.permission_type.icon(), |
| 225 | request.permission_type.label() |
| 226 | ); |
| 227 | |
| 228 | let content = vec![ |
| 229 | Line::from(Span::styled( |
| 230 | &title, |
| 231 | Style::default().fg(theme.primary).bold(), |
| 232 | )), |
| 233 | Line::from(""), |
| 234 | Line::from(vec![ |
| 235 | Span::styled("Tool: ", Style::default().fg(theme.text_muted)), |
| 236 | Span::styled(&request.tool_name, Style::default().fg(theme.text)), |
| 237 | ]), |
| 238 | Line::from(vec![ |
| 239 | Span::styled("Resource: ", Style::default().fg(theme.text_muted)), |
| 240 | Span::styled(&request.resource, Style::default().fg(theme.text)), |
| 241 | ]), |
| 242 | Line::from(""), |
| 243 | Line::from(vec![ |
| 244 | Span::styled("[y] Allow ", Style::default().fg(theme.success)), |
| 245 | Span::styled("[n] Deny ", Style::default().fg(theme.error)), |
| 246 | Span::styled("[a] Always allow", Style::default().fg(theme.primary)), |
| 247 | ]), |
| 248 | ]; |
| 249 | |
| 250 | let paragraph = Paragraph::new(content) |
| 251 | .block( |
| 252 | Block::default() |
| 253 | .title(" Permission ") |
| 254 | .borders(Borders::ALL) |
| 255 | .border_style(Style::default().fg(theme.warning)), |
| 256 | ) |
nothing calls this directly
no test coverage detected