import React, { useState, useEffect } from 'react'; import { Stack, Title, Card, TextInput, Textarea, Button, Group, Text, Alert, Badge, Divider, Select, MultiSelect, Code, Grid, Loader, JsonInput, } from '@mantine/core'; import { IconTestPipe, IconCheck, IconX, IconAlertCircle, IconClock, IconUser, IconKey, } from '@tabler/icons-react'; import { useForm } from '@mantine/form'; import { notifications } from '@mantine/notifications'; import { apiService, Application, VerifyRequest, VerifyResponse, } from '../services/apiService'; import dayjs from 'dayjs'; const TokenTester: React.FC = () => { const [applications, setApplications] = useState([]); const [testing, setTesting] = useState(false); const [result, setResult] = useState(null); const form = useForm({ initialValues: { app_id: '', user_id: '', token: '', permissions: [], }, validate: { app_id: (value) => value.length < 1 ? 'Application is required' : null, token: (value) => value.length < 1 ? 'Token is required' : null, }, }); const availablePermissions = [ 'app.read', 'app.write', 'app.delete', 'token.read', 'token.create', 'token.revoke', 'repo.read', 'repo.write', 'repo.admin', 'permission.read', 'permission.write', ]; useEffect(() => { loadApplications(); }, []); const loadApplications = async () => { try { const response = await apiService.getApplications(100, 0); setApplications(response.data); } catch (error) { console.error('Failed to load applications:', error); } }; const handleSubmit = async (values: VerifyRequest) => { try { setTesting(true); setResult(null); // Clean up the request - remove empty fields const cleanedValues = { ...values, user_id: values.user_id || undefined, permissions: values.permissions && values.permissions.length > 0 ? values.permissions : undefined, }; const response = await apiService.verifyToken(cleanedValues); setResult(response); if (response.valid) { notifications.show({ title: 'Token Verified', message: `Token is ${response.permitted ? 'valid and permitted' : 'valid but not permitted'}`, color: response.permitted ? 'green' : 'orange', }); } else { notifications.show({ title: 'Token Invalid', message: response.error || 'Token verification failed', color: 'red', }); } } catch (error) { console.error('Failed to verify token:', error); notifications.show({ title: 'Error', message: 'Failed to verify token', color: 'red', }); } finally { setTesting(false); } }; const getStatusColor = (result: VerifyResponse) => { if (!result.valid) return 'red'; if (result.valid && result.permitted) return 'green'; return 'orange'; }; const getStatusIcon = (result: VerifyResponse) => { if (!result.valid) return IconX; if (result.valid && result.permitted) return IconCheck; return IconAlertCircle; }; return ( Test Configuration