import 'package:flutter/material.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/services/update_service.dart'; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/buttons/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: Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: TitleBarTitleWidget( title: S.of(context).whatsNew, ), ), ), 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: S.of(context).continueLabel, 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: S.of(context).joinDiscord, // icon: Icons.discord_outlined, // iconColor: enteColorScheme.primary500, // onTap: () async { // unawaited( // launchUrlString( // "https://discord.com/invite/z2YVKkycX3", // mode: LaunchMode.externalApplication, // ), // ); // }, // ), ButtonWidget( buttonType: ButtonType.trailingIconSecondary, buttonSize: ButtonSize.large, labelText: S.of(context).rateTheApp, 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.addAll([ ChangeLogEntry( "Send links ✨", 'Introducing a beautiful way to share photos in original quality, end-to-end encrypted. Select your photos and click on "Send link" to see the magic!', ), ChangeLogEntry( "Video editor", "Crop, clip and flip your videos, with Ente's in-built video editor. The editor works fully offline and will help with all your basic editing tasks.", ), ChangeLogEntry( "Passkeys", "Now secure your Ente account with passkeys or hardware keys. You can add your keys within Settings > Security > Passkeys.", ), ChangeLogEntry( "View large files", "Find those items that take up the most amount of storage, and easily declutter your library. Open Settings > Backup > Free up space to learn more.", ), ]); 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, ), ), ); } }