Bläddra i källkod

feat: add url validation in cell_editor (#2287)

* feat: add url validation in cell_editor

* fix: url validation in cell editor

* feat: add UriFailure in url_validator
Shubham Rawat 2 år sedan
förälder
incheckning
2af2621b49

+ 1 - 0
frontend/appflowy_flutter/lib/core/helpers/helpers.dart

@@ -1 +1,2 @@
 export 'target_platform.dart';
 export 'target_platform.dart';
+export 'url_validator.dart';

+ 21 - 0
frontend/appflowy_flutter/lib/core/helpers/url_validator.dart

@@ -0,0 +1,21 @@
+import 'package:dartz/dartz.dart';
+import 'package:freezed_annotation/freezed_annotation.dart';
+part 'url_validator.freezed.dart';
+
+Either<UriFailure, Uri> parseValidUrl(String url) {
+  try {
+    final uri = Uri.parse(url);
+    if (uri.scheme.isEmpty || uri.host.isEmpty) {
+      return left(const UriFailure.invalidSchemeHost());
+    }
+    return right(uri);
+  } on FormatException {
+    return left(const UriFailure.invalidUriFormat());
+  }
+}
+
+@freezed
+class UriFailure with _$UriFailure {
+  const factory UriFailure.invalidSchemeHost() = _InvalidSchemeHost;
+  const factory UriFailure.invalidUriFormat() = _InvalidUriFormat;
+}

+ 14 - 1
frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/url_cell/cell_editor.dart

@@ -1,4 +1,6 @@
+import 'package:appflowy/core/helpers/helpers.dart';
 import 'package:appflowy/plugins/database_view/application/cell/cell_controller_builder.dart';
 import 'package:appflowy/plugins/database_view/application/cell/cell_controller_builder.dart';
+import 'package:flowy_infra_ui/style_widget/snap_bar.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'dart:async';
 import 'dart:async';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
@@ -73,7 +75,18 @@ class _URLCellEditorState extends State<URLCellEditor> {
     if (mounted) {
     if (mounted) {
       if (_cellBloc.isClosed == false &&
       if (_cellBloc.isClosed == false &&
           _controller.text != _cellBloc.state.content) {
           _controller.text != _cellBloc.state.content) {
-        _cellBloc.add(URLCellEditorEvent.updateText(_controller.text));
+        final parseResult = parseValidUrl(_controller.text);
+
+        parseResult.fold(
+          (_) {
+            showSnapBar(
+              context,
+              "Enter a valid URL",
+              Theme.of(context).colorScheme.error,
+            );
+          },
+          (_) => _cellBloc.add(URLCellEditorEvent.updateText(_controller.text)),
+        );
       }
       }
     }
     }
   }
   }

+ 2 - 1
frontend/appflowy_flutter/packages/flowy_infra_ui/lib/style_widget/snap_bar.dart

@@ -1,6 +1,6 @@
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 
 
-void showSnapBar(BuildContext context, String title) {
+void showSnapBar(BuildContext context, String title, [Color? backgroundColor]) {
   ScaffoldMessenger.of(context).clearSnackBars();
   ScaffoldMessenger.of(context).clearSnackBars();
 
 
   ScaffoldMessenger.of(context)
   ScaffoldMessenger.of(context)
@@ -18,6 +18,7 @@ void showSnapBar(BuildContext context, String title) {
               ),
               ),
             ),
             ),
           ),
           ),
+          backgroundColor: backgroundColor,
         ),
         ),
       )
       )
       .closed
       .closed