import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/core/utils/toasts.dart'; import 'package:eatvio_app/core/widgets/custom_outlined_button.dart'; import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:eatvio_app/features/dev_tools/test_cases.dart'; import 'package:flutter/material.dart'; class DevToolsScreen extends StatelessWidget { const DevToolsScreen({super.key}); static const name = 'devToolsScreen'; static const path = '/dev-tools-screen'; @override Widget build(BuildContext context) { return const DevToolsScreenContent(); } } class DevToolsScreenContent extends StatefulWidget { const DevToolsScreenContent({super.key}); @override State createState() => _DevToolsScreenContentState(); } class _DevToolsScreenContentState extends State { String baseUrlForTest = ''; final List testCases = [Test850task()]; final controller = TextEditingController(); late final List testsStates; @override void initState() { super.initState(); setState(() { this.baseUrlForTest = baseUrl; }); testsStates = List.generate(testCases.length, (index) => TestState.notRun); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Column( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ Text('BaseUrl: ${baseUrlForTest}'), ], ), ), Row( children: [ Expanded( child: CustomTextFormField( controller: controller, hintText: 'type new base url', ), ), IconButton( onPressed: () { setState(() { baseUrlForTest = controller.text; controller.clear(); }); }, icon: const Icon(Icons.done), ), ], ), SizedBox( height: 10, ), if (baseUrlForTest != 'https://eatvio.ru') ListView.builder( shrinkWrap: true, itemCount: testCases.length, itemBuilder: (context, index) => Row( children: [ Text('${index + 1}. ${testCases[index].name}'), SizedBox( width: 50, ), Expanded( child: CustomOutlinedButton( text: 'run', height: 20, width: 60, onPressed: () async { if (testsStates[index] == TestState.loading) return; setState(() { testsStates[index] = TestState.loading; }); final result = await testCases[index].run(baseUrl: baseUrlForTest); if (result) { setState(() { testsStates[index] = TestState.success; }); showSuccessToast('${testCases[index].name} passed'); } else { setState(() { testsStates[index] = TestState.fail; }); showErrorToast('${testCases[index].name} failed'); } }, buttonStyle: ButtonStyle(), ), ), SizedBox( width: 30, ), switch (testsStates[index]) { TestState.success => Expanded( child: Container( height: 20, color: Colors.green, ), ), TestState.fail => Expanded( child: Container( height: 20, color: Colors.red, ), ), TestState.notRun => Expanded( child: Container( height: 20, color: Colors.grey, ), ), TestState.loading => Expanded( child: Container( height: 20, child: SizedBox(height: 20, width: 20, child: Center(child: CircularProgressIndicator())), ), ), }, ], ), ), ], ), ), ), ); } } enum TestState { success, fail, notRun, loading }