import "dart:io"; import 'package:flutter/material.dart'; import 'package:photos/services/update_service.dart'; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/button_widget.dart'; import 'package:photos/ui/components/divider_widget.dart'; import 'package:photos/ui/components/models/button_type.dart'; import 'package:photos/ui/components/title_bar_title_widget.dart'; import 'package:photos/ui/notification/update/change_log_entry.dart'; class ChangeLogPage extends StatefulWidget { const ChangeLogPage({ Key? key, }) : super(key: key); @override State createState() => _ChangeLogPageState(); } class _ChangeLogPageState extends State { @override void initState() { super.initState(); } @override Widget build(BuildContext context) { final enteColorScheme = getEnteColorScheme(context); return Scaffold( appBar: null, body: Container( color: enteColorScheme.backgroundElevated, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const SizedBox( height: 36, ), Container( alignment: Alignment.centerLeft, child: const Padding( padding: EdgeInsets.symmetric(horizontal: 16.0), child: TitleBarTitleWidget( title: "What's new", ), ), ), const SizedBox( height: 24, ), Expanded(child: _getChangeLog()), const DividerWidget( dividerType: DividerType.solid, ), SafeArea( child: Padding( padding: const EdgeInsets.only( left: 16.0, right: 16, top: 16, bottom: 8, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ButtonWidget( buttonType: ButtonType.trailingIconPrimary, buttonSize: ButtonSize.large, labelText: "Continue", icon: Icons.arrow_forward_outlined, onTap: () async { await UpdateService.instance.hideChangeLog(); if (mounted && Navigator.of(context).canPop()) { Navigator.of(context).pop(); } }, ), const SizedBox( height: 8, ), ButtonWidget( buttonType: ButtonType.trailingIconSecondary, buttonSize: ButtonSize.large, labelText: "Rate the app", icon: Icons.favorite_rounded, iconColor: enteColorScheme.primary500, onTap: () async { await UpdateService.instance.launchReviewUrl(); }, ), const SizedBox(height: 8), ], ), ), ), ], ), ), ); } Widget _getChangeLog() { final scrollController = ScrollController(); final List items = []; items.add( ChangeLogEntry( "Referrals ✨", "You can now double your storage by referring your friends and family. Both you and your loved ones will get 10 GB of storage when " "they upgrade to a paid plan.\n\nGo to Settings -> General -> " "Referrals to get started!", ), ); if (Platform.isAndroid) { items.add( ChangeLogEntry( "Pick Files", "While sharing photos and videos through other apps, ente will now " "be an option to pick files from. This means you can now easily" " attach files backed up to ente.\n\nConsider this the first " "step towards making ente your default gallery app!", ), ); } items.add( ChangeLogEntry( "Verification ID", "Security of your end-to-end encryption with those you are sharing your " "albums with can now be verified, with the help of Verification IDs." "\n\nPlease click on the Verify button on the album sharing page to learn more.", ), ); items.add( ChangeLogEntry( "Prettier Pixels", "This release is also packed with a bunch of user interface improvements suggested by our community." "\n\nWe have added more actions to your Memories section, introduced archived albums to your Archived section, improved the experience of the Trash screen and sprinkled a few more improvements here and there.", isFeature: false, ), ); return Container( padding: const EdgeInsets.only(left: 16), child: Scrollbar( controller: scrollController, thumbVisibility: true, thickness: 2.0, child: ListView.builder( physics: const BouncingScrollPhysics(), itemBuilder: (context, index) { return Padding( padding: const EdgeInsets.only(right: 16.0), child: ChangeLogEntryWidget(entry: items[index]), ); }, itemCount: items.length, ), ), ); } }