| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 | import 'package:appflowy/core/frameless_window.dart';import 'package:dartz/dartz.dart' as dartz;import 'package:easy_localization/easy_localization.dart';import 'package:flowy_infra/size.dart';import 'package:flowy_infra_ui/flowy_infra_ui.dart';import 'package:appflowy_backend/dispatch/dispatch.dart';import 'package:appflowy_backend/log.dart';import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';import 'package:appflowy_backend/protobuf/flowy-folder2/protobuf.dart';import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';import 'package:flutter/material.dart';import 'package:url_launcher/url_launcher.dart';import '../../generated/locale_keys.g.dart';import '../../main.dart';import '../../startup/launch_configuration.dart';import '../../startup/startup.dart';import '../application/auth_service.dart';import 'folder/folder_widget.dart';import 'router.dart';import 'widgets/background.dart';class SkipLogInScreen extends StatefulWidget {  final AuthRouter router;  final AuthService authService;  const SkipLogInScreen({    Key? key,    required this.router,    required this.authService,  }) : super(key: key);  @override  State<SkipLogInScreen> createState() => _SkipLogInScreenState();}class _SkipLogInScreenState extends State<SkipLogInScreen> {  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: const _SkipLoginMoveWindow(),      body: Center(        child: _renderBody(context),      ),    );  }  Widget _renderBody(BuildContext context) {    return Column(      mainAxisAlignment: MainAxisAlignment.center,      children: [        FlowyLogoTitle(          title: LocaleKeys.welcomeText.tr(),          logoSize: const Size.square(60),        ),        const VSpace(40),        Row(          mainAxisAlignment: MainAxisAlignment.center,          children: [            GoButton(              onPressed: () => _autoRegister(context),            ),          ],        ),        const VSpace(20),        SizedBox(          width: MediaQuery.of(context).size.width * 0.8,          child: FolderWidget(            createFolderCallback: () async {              await FlowyRunner.run(                FlowyApp(),                config: const LaunchConfiguration(                  autoRegistrationSupported: true,                ),              );            },          ),        ),        const Spacer(),        _buildSubscribeButtons(context),      ],    );  }  Row _buildSubscribeButtons(BuildContext context) {    return Row(      mainAxisAlignment: MainAxisAlignment.center,      children: [        FlowyTextButton(          LocaleKeys.githubStarText.tr(),          fontWeight: FontWeight.w500,          fontColor: Theme.of(context).colorScheme.primary,          decoration: TextDecoration.underline,          hoverColor: Colors.transparent,          fillColor: Colors.transparent,          onPressed: () =>              _launchURL('https://github.com/AppFlowy-IO/appflowy'),        ),        const HSpace(20),        FlowyTextButton(          LocaleKeys.subscribeNewsletterText.tr(),          fontWeight: FontWeight.w500,          fontColor: Theme.of(context).colorScheme.primary,          decoration: TextDecoration.underline,          hoverColor: Colors.transparent,          fillColor: Colors.transparent,          onPressed: () => _launchURL('https://www.appflowy.io/blog'),        ),      ],    );  }  _launchURL(String url) async {    final uri = Uri.parse(url);    if (await canLaunchUrl(uri)) {      await launchUrl(uri);    } else {      throw 'Could not launch $url';    }  }  Future<void> _autoRegister(BuildContext context) async {    final result = await widget.authService.autoSignUp();    result.fold(      (user) {        FolderEventReadCurrentWorkspace().send().then((result) {          _openCurrentWorkspace(context, user, result);        });      },      (error) {        Log.error(error);      },    );  }  void _openCurrentWorkspace(    BuildContext context,    UserProfilePB user,    dartz.Either<WorkspaceSettingPB, FlowyError> workspacesOrError,  ) {    workspacesOrError.fold(      (workspaceSetting) {        widget.router.pushHomeScreen(context, user, workspaceSetting);      },      (error) {        Log.error(error);      },    );  }}class GoButton extends StatelessWidget {  final VoidCallback onPressed;  const GoButton({    super.key,    required this.onPressed,  });  @override  Widget build(BuildContext context) {    return FlowyTextButton(      LocaleKeys.letsGoButtonText.tr(),      fontSize: FontSizes.s16,      padding: const EdgeInsets.symmetric(horizontal: 80, vertical: 12.0),      onPressed: onPressed,      fillColor: Theme.of(context).colorScheme.primary,      fontColor: Theme.of(context).colorScheme.onPrimary,      hoverColor: Theme.of(context).colorScheme.primaryContainer,    );  }}class _SkipLoginMoveWindow extends StatelessWidget    implements PreferredSizeWidget {  const _SkipLoginMoveWindow();  @override  Widget build(BuildContext context) {    return Row(      children: const [        Expanded(          child: MoveWindowDetector(),        ),      ],    );  }  @override  Size get preferredSize => const Size.fromHeight(55.0);}
 |