import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../../about/internal/application/TextType.dart'; import '../../../designs/Responsive.dart'; import '../../../designs/buttons/Buttons.dart'; import '../../../designs/text/Text.dart'; import '../../../utils/Colors.dart'; import 'ConnectUpdateMe.dart'; import 'UpdateMe.dart'; import 'ViewUpdateMe.dart'; class UpdateMeState extends State implements ConnectUpdateMe { ViewUpdateMe? _model; @override Widget build(BuildContext context) { return ViewModelBuilder.reactive( viewModelBuilder: () => ViewUpdateMe(context, this), onViewModelReady: (viewModel) { _model = viewModel; _initiate(); }, builder: (context, viewModel, child) => PopScope( canPop: false, child: Scaffold( backgroundColor: colorPrimaryDark, body: LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { return Responsive( mobile: _mobileView(constraints), tablet: _mobileView(constraints), desktop: _mobileView(constraints), ); }, ), ), ), ); } void _initiate() {} void _onUpdate() { _model?.openStore(); } Widget _mobileView(BoxConstraints constraints) { return SafeArea( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 28, vertical: 32), child: Column( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ text("GROUNDED", 10, TextType.Bold, color: colorWhite.withValues(alpha: 0.45), letterSpacing: 2.0), Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: 60, height: 60, alignment: Alignment.center, decoration: BoxDecoration( color: colorWhite.withValues(alpha: 0.10), borderRadius: BorderRadius.circular(18), ), child: Icon(CupertinoIcons.arrow_up_circle_fill, size: 24, color: colorWhite), ), const SizedBox(height: 28), text("UPDATE REQUIRED", 10, TextType.Bold, color: colorWhite.withValues(alpha: 0.45), letterSpacing: 1.2), const SizedBox(height: 10), text("This version is out of date.", 34, TextType.Light, color: colorWhite, height: 1.15), const SizedBox(height: 14), text( "Update to continue. Your commitments, debt and history are on the server and will be waiting.", 14, TextType.Regular, color: colorWhite.withValues(alpha: 0.60), height: 1.55, ), ], ), SizedBox( width: double.infinity, child: roundedCornerButton( "Update now", _onUpdate, background: colorWhite, foreground: colorPrimaryDark, icon: CupertinoIcons.cloud_download_fill, ), ), ], ), ), ); } @override void onStoreOpened() async { final Uri store = Uri.parse("https://grounded.app/download"); if (await canLaunchUrl(store)) { await launchUrl(store, mode: LaunchMode.externalApplication); } } }