// ignore_for_file: depend_on_referenced_packages, avoid_web_libraries_in_flutter import 'dart:async'; import 'dart:convert'; import 'package:didvan/services/storage/storage.dart'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import 'package:http_parser/http_parser.dart'; import 'package:image_picker/image_picker.dart'; import 'package:mime/mime.dart'; class AiApiService { static const String baseUrl = 'https://api.didvan.app/ai'; static Future initial( {required final String url, required final String message, final int? chatId, final XFile? file, final bool? edite}) async { final headers = { "Authorization": "Bearer ${await StorageService.getValue(key: 'token')}", 'Content-Type': 'multipart/form-data' }; var request = http.MultipartRequest('POST', Uri.parse(baseUrl + url)) ..headers.addAll(headers); request.fields['prompt'] = message; if (chatId != null) { request.fields['chatId'] = chatId.toString(); } if (edite != null) { request.fields['edit'] = edite.toString().toLowerCase(); } if (file != null) { // if (file.duration != null) { // request.fields['duration'] = file.duration!.inSeconds.toString(); // } Uint8List bytes; String filename; String mimeType; bytes = await file.readAsBytes(); filename = file.name; mimeType = lookupMimeType(filename) ?? 'application/octet-stream'; print("mimeType: $mimeType"); // switch (file.extname) { // case '.mp3': // mimeType = 'audio/mpeg'; // break; // case '.wav': // mimeType = 'audio/wav'; // break; // case '.aac': // mimeType = 'audio/aac'; // break; // case '.m4a': // mimeType = 'audio/x-m4a'; // or 'audio/aac' // break; // case '.ogg': // mimeType = 'audio/ogg'; // break; // case '.flac': // mimeType = 'audio/x-flac'; // break; // case '.wma': // mimeType = 'audio/x-ms-wma'; // break; // case '.amr': // mimeType = 'audio/amr'; // break; // case '.midi': // mimeType = 'audio/midi'; // break; // case '.weba': // mimeType = 'audio/webm'; // break; // case '.png': // mimeType = 'image/png'; // break; // case '.jpg': // mimeType = 'image/jpeg'; // break; // case '.pdf': // mimeType = 'application/pdf'; // break; // default: // mimeType = lookupMimeType(filename) ?? 'application/octet-stream'; // } request.files.add(http.MultipartFile.fromBytes( 'file', bytes, filename: filename, contentType: MediaType.parse(mimeType), )); } // print("req: ${request.fields}"); return request; } Future>> getResponse(http.MultipartRequest req) async { try { final response = await http.Client().send(req); if (response.statusCode == 400) { // Handle 400 response final errorResponse = await response.stream.bytesToString(); final errorJson = jsonDecode(errorResponse); throw Exception(errorJson['error'] ?? 'Bad Request'); } else if (response.statusCode != 200) { // Handle other non-200 responses throw Exception('Failed to load data'); } else { return response.stream.asBroadcastStream(); } } catch (e) { // Handle any other errors throw Exception('Failed to load data'); } } }