From 6e25e378e3a0da94c0fa57c3c19defb32aeaafe3 Mon Sep 17 00:00:00 2001 From: goku Date: Sun, 12 Jul 2026 22:45:00 +0200 Subject: [PATCH 1/2] restore marketplace --- .../presentation/screens/settings_screen.dart | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/lib/modules/settings/presentation/screens/settings_screen.dart b/lib/modules/settings/presentation/screens/settings_screen.dart index ff39878..7242776 100644 --- a/lib/modules/settings/presentation/screens/settings_screen.dart +++ b/lib/modules/settings/presentation/screens/settings_screen.dart @@ -1,3 +1,5 @@ +import 'package:defyx_vpn/modules/settings/presentation/widgets/settings_donate_widget.dart'; +import 'package:defyx_vpn/modules/settings/presentation/widgets/settings_premium_widget.dart'; import 'package:defyx_vpn/shared/providers/connection_state_provider.dart'; import 'package:defyx_vpn/shared/layout/main_screen_background.dart'; import 'package:defyx_vpn/l10n/app_localizations.dart'; @@ -18,6 +20,9 @@ class SettingsScreen extends ConsumerStatefulWidget { class _SettingsScreenState extends ConsumerState { late final ScrollController _scrollController; + late final ScrollController _horizontalSliderScrollController; + final GlobalKey _premiumWidgetKey = GlobalKey(); + final GlobalKey _donateWidgetKey = GlobalKey(); bool _isMiddleMouseScrolling = false; Offset _middleMouseStartPosition = Offset.zero; bool _hasAppliedLocalization = false; @@ -26,6 +31,7 @@ class _SettingsScreenState extends ConsumerState { void initState() { super.initState(); _scrollController = ScrollController(); + _horizontalSliderScrollController = ScrollController(); } @override @@ -45,6 +51,7 @@ class _SettingsScreenState extends ConsumerState { @override void dispose() { _scrollController.dispose(); + _horizontalSliderScrollController.dispose(); super.dispose(); } @@ -126,7 +133,9 @@ class _SettingsScreenState extends ConsumerState { children: [ SizedBox(height: 45.h), _buildHeaderSection(), - SizedBox(height: 60.h), + SizedBox(height: 30.h), + _buildSliderSection(), + SizedBox(height: 30.h), _buildSettingsContent(ref, context), SizedBox(height: 130.h), ], @@ -222,6 +231,64 @@ class _SettingsScreenState extends ConsumerState { ); } + bool _handlePremiumWidgetTap() { + if (_isWidgetVisibleInHorizontalScroll(_premiumWidgetKey)) { + return true; + } else { + _scrollToShowWidget(_premiumWidgetKey); + return false; + } + } + + bool _handleDonateWidgetTap() { + if (_isWidgetVisibleInHorizontalScroll(_donateWidgetKey)) { + return true; + } else { + _scrollToShowWidget(_donateWidgetKey); + return false; + } + } + + Widget _buildSliderSection() { + return Listener( + onPointerMove: (event) {}, + onPointerSignal: (event) {}, + child: NotificationListener( + onNotification: (notification) { + return false; + }, + child: SingleChildScrollView( + controller: _horizontalSliderScrollController, + scrollDirection: Axis.horizontal, + child: IntrinsicHeight( + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + key: _premiumWidgetKey, + child: SettingsPremiumWidget( + ref: ref, + shouldExecuteAction: true, + onTapBefore: _handlePremiumWidgetTap, + ), + ), + SizedBox(width: 15.w), + Container( + key: _donateWidgetKey, + child: SettingsDonateWidget( + ref: ref, + shouldExecuteAction: true, + onTapBefore: _handleDonateWidgetTap, + ), + ), + ], + ), + ), + ), + ), + ); + } + Widget _buildSettingsContent(WidgetRef ref, BuildContext context) { final settingsState = ref.watch(settingsProvider); final settingsNotifier = ref.read(settingsProvider.notifier); From 67a58d1f3b497c1812a80bd1be9f3cbef1a83417 Mon Sep 17 00:00:00 2001 From: Julius Caesar Date: Sun, 12 Jul 2026 16:00:59 -0700 Subject: [PATCH 2/2] fix: some functions restored --- .../presentation/screens/settings_screen.dart | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/lib/modules/settings/presentation/screens/settings_screen.dart b/lib/modules/settings/presentation/screens/settings_screen.dart index 7242776..d48bcd7 100644 --- a/lib/modules/settings/presentation/screens/settings_screen.dart +++ b/lib/modules/settings/presentation/screens/settings_screen.dart @@ -89,6 +89,40 @@ class _SettingsScreenState extends ConsumerState { } } + bool _isWidgetVisibleInHorizontalScroll(GlobalKey key) { + try { + final RenderBox? renderBox = + key.currentContext?.findRenderObject() as RenderBox?; + if (renderBox == null) { + return true; + } + + final size = renderBox.size; + final offset = renderBox.localToGlobal(Offset.zero); + + // Get the scroll position + final scrollOffset = _horizontalSliderScrollController.offset; + + // The widget's center in content coordinates + final widgetCenterInContent = offset.dx + scrollOffset + (size.width / 2); + + // Get the viewport bounds + final viewportLeft = scrollOffset; + final viewportRight = + scrollOffset + + _horizontalSliderScrollController.position.viewportDimension; + + // Check if widget's CENTER is within viewport (more lenient, allows partial visibility) + final isVisible = + widgetCenterInContent >= viewportLeft && + widgetCenterInContent <= viewportRight; + + return isVisible; + } catch (e) { + return true; + } + } + @override Widget build(BuildContext context) { final connectionState = ref.watch(connectionStateProvider); @@ -231,6 +265,40 @@ class _SettingsScreenState extends ConsumerState { ); } + void _scrollToShowWidget(GlobalKey key) { + try { + final RenderBox? renderBox = + key.currentContext?.findRenderObject() as RenderBox?; + if (renderBox == null) { + return; + } + + final size = renderBox.size; + final offset = renderBox.localToGlobal(Offset.zero); + final scrollOffset = _horizontalSliderScrollController.offset; + final viewportWidth = + _horizontalSliderScrollController.position.viewportDimension; + + // Widget's position in content coordinates + final widgetLeftInContent = offset.dx + scrollOffset; + final widgetCenterInContent = widgetLeftInContent + (size.width / 2); + + // Calculate scroll offset to center the widget + final newScrollOffset = widgetCenterInContent - (viewportWidth / 2); + + _horizontalSliderScrollController.animateTo( + newScrollOffset.clamp( + _horizontalSliderScrollController.position.minScrollExtent, + _horizontalSliderScrollController.position.maxScrollExtent, + ), + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + } catch (e) { + debugPrint('[Scroll] Error: $e'); + } + } + bool _handlePremiumWidgetTap() { if (_isWidgetVisibleInHorizontalScroll(_premiumWidgetKey)) { return true;