diff --git a/frontend/appflowy_flutter/lib/plugins/database/widgets/cell/card_cell_skeleton/url_card_cell.dart b/frontend/appflowy_flutter/lib/plugins/database/widgets/cell/card_cell_skeleton/url_card_cell.dart index 92b210d184434..af84bb73c95e9 100644 --- a/frontend/appflowy_flutter/lib/plugins/database/widgets/cell/card_cell_skeleton/url_card_cell.dart +++ b/frontend/appflowy_flutter/lib/plugins/database/widgets/cell/card_cell_skeleton/url_card_cell.dart @@ -4,7 +4,10 @@ import 'package:appflowy/plugins/database/application/database_controller.dart'; import 'package:appflowy/plugins/database/application/cell/bloc/url_cell_bloc.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter/services.dart'; +import 'package:universal_platform/universal_platform.dart'; +import '../editable_cell_skeleton/url.dart'; import 'card_cell.dart'; class URLCardCellStyle extends CardCellStyle { @@ -32,6 +35,34 @@ class URLCardCell extends CardCell { } class _URLCellState extends State { + bool isLinkClickable = false; + + @override + void initState() { + super.initState(); + if (UniversalPlatform.isDesktop) { + HardwareKeyboard.instance.addHandler(_handleGlobalKeyEvent); + } + } + + @override + void dispose() { + if (UniversalPlatform.isDesktop) { + HardwareKeyboard.instance.removeHandler(_handleGlobalKeyEvent); + } + super.dispose(); + } + + bool _handleGlobalKeyEvent(KeyEvent event) { + final keyboard = HardwareKeyboard.instance; + final canOpenLink = event is KeyDownEvent && + (keyboard.isControlPressed || keyboard.isMetaPressed); + if (canOpenLink != isLinkClickable) { + setState(() => isLinkClickable = canOpenLink); + } + return false; + } + @override Widget build(BuildContext context) { return BlocProvider( @@ -49,12 +80,28 @@ class _URLCellState extends State { if (state.content.isEmpty) { return const SizedBox.shrink(); } - return Container( - alignment: AlignmentDirectional.centerStart, - padding: widget.style.padding, - child: Text( - state.content, - style: widget.style.textStyle, + return GestureDetector( + onTap: () { + if (UniversalPlatform.isDesktop) { + if (isLinkClickable) { + openUrlCellLink(state.content); + } + } else { + openUrlCellLink(state.content); + } + }, + child: MouseRegion( + cursor: isLinkClickable || UniversalPlatform.isMobile + ? SystemMouseCursors.click + : SystemMouseCursors.basic, + child: Container( + alignment: AlignmentDirectional.centerStart, + padding: widget.style.padding, + child: Text( + state.content, + style: widget.style.textStyle, + ), + ), ), ); },