diff --git a/lib/fileimport/curl/curl.dart b/lib/fileimport/curl/curl.dart deleted file mode 100644 index 73eb8909..00000000 --- a/lib/fileimport/curl/curl.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:apidash/consts.dart'; -import 'package:apidash/models/http_request_model.dart'; -import 'package:apidash/models/name_value_model.dart'; -import 'package:apidash/models/request_model.dart'; -import 'package:curl_converter/curl_converter.dart'; - -class CurlFileImport { - RequestModel? getRequestModel(String contents, String newId) { - if (contents.endsWith('\n')) { - contents = contents.substring(0, contents.length - 1); - } - - try { - final curl = Curl.parse(contents); - - final method = HTTPVerb.values.byName(curl.method.toLowerCase()); - - final uri = curl.uri.toString(); - final url = uri.substring(0, uri.lastIndexOf('?')); - - final headers = curl.headers?.entries - .map((entry) => NameValueModel( - name: entry.key, - value: entry.value, - )) - .toList(); - - final params = curl.uri.queryParameters.entries - .map((entry) => NameValueModel( - name: entry.key, - value: entry.value, - )) - .toList(); - - final body = curl.data; - - return RequestModel( - id: newId, - httpRequestModel: HttpRequestModel( - method: method, - url: url, - headers: headers, - params: params, - body: body, - ), - ); - } catch (e) { - print(e); - return null; - } - } -} diff --git a/lib/fileimport/fileimport.dart b/lib/fileimport/fileimport.dart deleted file mode 100644 index 53ed6ce6..00000000 --- a/lib/fileimport/fileimport.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:apidash/consts.dart'; -import 'package:apidash/fileimport/curl/curl.dart'; -import 'package:apidash/models/request_model.dart'; - -class FileImport { - Future getRequestModel( - ImportFormat fileType, String contents, String newId) async { - switch (fileType) { - case ImportFormat.curl: - return CurlFileImport().getRequestModel(contents, newId); - default: - return null; - } - } -} diff --git a/lib/importer/curl/curl.dart b/lib/importer/curl/curl.dart new file mode 100644 index 00000000..6807168b --- /dev/null +++ b/lib/importer/curl/curl.dart @@ -0,0 +1,42 @@ +import 'package:apidash/consts.dart'; +import 'package:apidash/models/models.dart'; +import 'package:apidash/utils/utils.dart'; +import 'package:curl_converter/curl_converter.dart'; + +class CurlFileImport { + HttpRequestModel? getHttpRequestModel(String content) { + content = content.trim(); + try { + final curl = Curl.parse(content); + final url = stripUriParams(curl.uri); + final method = HTTPVerb.values.byName(curl.method.toLowerCase()); + + final headers = curl.headers?.entries + .map((entry) => NameValueModel( + name: entry.key, + value: entry.value, + )) + .toList(); + + final params = curl.uri.queryParameters.entries + .map((entry) => NameValueModel( + name: entry.key, + value: entry.value, + )) + .toList(); + + // TODO: parse curl data to determine the type of body + final body = curl.data; + + return HttpRequestModel( + method: method, + url: url, + headers: headers, + params: params, + body: body, + ); + } catch (e) { + return null; + } + } +} diff --git a/lib/importer/importer.dart b/lib/importer/importer.dart new file mode 100644 index 00000000..b4388cd8 --- /dev/null +++ b/lib/importer/importer.dart @@ -0,0 +1,17 @@ +import 'package:apidash/consts.dart'; +import 'package:apidash/models/models.dart'; +import 'curl/curl.dart'; + +class Importer { + Future getHttpRequestModel( + ImportFormat fileType, + String content, + ) async { + switch (fileType) { + case ImportFormat.curl: + return CurlFileImport().getHttpRequestModel(content); + default: + return null; + } + } +} diff --git a/lib/screens/home_page/collection_pane.dart b/lib/screens/home_page/collection_pane.dart index d54b36fe..7e2f806e 100644 --- a/lib/screens/home_page/collection_pane.dart +++ b/lib/screens/home_page/collection_pane.dart @@ -1,5 +1,4 @@ -import 'package:apidash/fileimport/fileimport.dart'; -import 'package:apidash/widgets/drag_and_drop_area.dart'; +import 'package:apidash/importer/importer.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:apidash/providers/providers.dart'; @@ -9,7 +8,7 @@ import 'package:apidash/models/models.dart'; import 'package:apidash/consts.dart'; import '../common_widgets/common_widgets.dart'; -final fileImport = FileImport(); +final kImporter = Importer(); class CollectionPane extends ConsumerWidget { const CollectionPane({ @@ -37,48 +36,31 @@ class CollectionPane extends ConsumerWidget { ref.read(collectionStateNotifierProvider.notifier).add(); }, onImport: () { - showDialog( - context: context, - builder: (context) => AlertDialog( - contentPadding: const EdgeInsets.all(12), - content: DragAndDropArea( - onFileDropped: (file) { - ref.read(collectionStateNotifierProvider.notifier).add(); - final newId = ref.watch(selectedIdStateProvider)!; - final i = file.path.lastIndexOf('.') + 1; - final String ext = file.path.substring(i); - final fileType = ImportFormat.values.byName(ext); - file.readAsString().then((contents) { - fileImport - .getRequestModel(fileType, contents, newId) - .then((importedRequestModel) { - if (importedRequestModel == null) { - // could not parse the file - return; - } - final rM = importedRequestModel.httpRequestModel!; - ref - .read(collectionStateNotifierProvider.notifier) - .update( - newId, - method: rM.method, - url: rM.url, - headers: rM.headers, - params: rM.params, - body: rM.body, - ); - }); - }); - Navigator.of(context).pop(); - }, - ), - ), + showImportDialog( + context, + (file) { + final importFormatType = ref.read(importFormatStateProvider); + file.readAsString().then((content) { + kImporter + .getHttpRequestModel(importFormatType, content) + .then((importedRequestModel) { + if (importedRequestModel != null) { + ref + .read(collectionStateNotifierProvider.notifier) + .addRequestModel(importedRequestModel); + } else { + // TODO: Throw an error, unable to parse + } + }); + }); + Navigator.of(context).pop(); + }, ); }, ), kVSpacer10, SidebarFilter( - filterHintText: "Filter by name or url", + filterHintText: "Filter by name or url", onFilterFieldChanged: (value) { ref.read(collectionSearchQueryProvider.notifier).state = value.toLowerCase(); diff --git a/lib/widgets/dialog_import.dart b/lib/widgets/dialog_import.dart new file mode 100644 index 00000000..0ad328ed --- /dev/null +++ b/lib/widgets/dialog_import.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:file_selector/file_selector.dart'; +import 'drag_and_drop_area.dart'; + +showImportDialog( + BuildContext context, + Function(XFile) onFileDropped, +) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + contentPadding: const EdgeInsets.all(12), + content: DragAndDropArea( + onFileDropped: onFileDropped, + ), + ); + }, + ); +} diff --git a/lib/widgets/widgets.dart b/lib/widgets/widgets.dart index 800ebe22..4d8cd9ae 100644 --- a/lib/widgets/widgets.dart +++ b/lib/widgets/widgets.dart @@ -11,7 +11,9 @@ export 'checkbox.dart'; export 'code_previewer.dart'; export 'codegen_previewer.dart'; export 'dialog_about.dart'; +export 'dialog_import.dart'; export 'dialog_rename.dart'; +export 'drag_and_drop_area.dart'; export 'dropdown_codegen.dart'; export 'dropdown_content_type.dart'; export 'dropdown_formdata.dart';