skip_log_in_screen.dart 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import 'package:appflowy/core/frameless_window.dart';
  2. import 'package:appflowy/startup/entry_point.dart';
  3. import 'package:appflowy/user/application/auth/auth_service.dart';
  4. import 'package:dartz/dartz.dart' as dartz;
  5. import 'package:easy_localization/easy_localization.dart';
  6. import 'package:flowy_infra/size.dart';
  7. import 'package:flowy_infra_ui/flowy_infra_ui.dart';
  8. import 'package:appflowy_backend/dispatch/dispatch.dart';
  9. import 'package:appflowy_backend/log.dart';
  10. import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
  11. import 'package:appflowy_backend/protobuf/flowy-folder2/protobuf.dart';
  12. import 'package:appflowy_backend/protobuf/flowy-user/user_profile.pb.dart';
  13. import 'package:flutter/material.dart';
  14. import 'package:url_launcher/url_launcher.dart';
  15. import '../../generated/locale_keys.g.dart';
  16. import '../../startup/launch_configuration.dart';
  17. import '../../startup/startup.dart';
  18. import 'folder/folder_widget.dart';
  19. import 'router.dart';
  20. import 'widgets/background.dart';
  21. class SkipLogInScreen extends StatefulWidget {
  22. final AuthRouter router;
  23. final AuthService authService;
  24. const SkipLogInScreen({
  25. Key? key,
  26. required this.router,
  27. required this.authService,
  28. }) : super(key: key);
  29. @override
  30. State<SkipLogInScreen> createState() => _SkipLogInScreenState();
  31. }
  32. class _SkipLogInScreenState extends State<SkipLogInScreen> {
  33. @override
  34. Widget build(BuildContext context) {
  35. return Scaffold(
  36. appBar: const _SkipLoginMoveWindow(),
  37. body: Center(
  38. child: _renderBody(context),
  39. ),
  40. );
  41. }
  42. Widget _renderBody(BuildContext context) {
  43. return Column(
  44. mainAxisAlignment: MainAxisAlignment.center,
  45. children: [
  46. FlowyLogoTitle(
  47. title: LocaleKeys.welcomeText.tr(),
  48. logoSize: const Size.square(60),
  49. ),
  50. const VSpace(40),
  51. Row(
  52. mainAxisAlignment: MainAxisAlignment.center,
  53. children: [
  54. GoButton(
  55. onPressed: () => _autoRegister(context),
  56. ),
  57. ],
  58. ),
  59. const VSpace(20),
  60. SizedBox(
  61. width: MediaQuery.of(context).size.width * 0.8,
  62. child: FolderWidget(
  63. createFolderCallback: () async {
  64. await FlowyRunner.run(
  65. FlowyApp(),
  66. config: const LaunchConfiguration(
  67. autoRegistrationSupported: true,
  68. ),
  69. );
  70. },
  71. ),
  72. ),
  73. const Spacer(),
  74. _buildSubscribeButtons(context),
  75. ],
  76. );
  77. }
  78. Row _buildSubscribeButtons(BuildContext context) {
  79. return Row(
  80. mainAxisAlignment: MainAxisAlignment.center,
  81. children: [
  82. FlowyTextButton(
  83. LocaleKeys.githubStarText.tr(),
  84. fontWeight: FontWeight.w500,
  85. fontColor: Theme.of(context).colorScheme.primary,
  86. decoration: TextDecoration.underline,
  87. hoverColor: Colors.transparent,
  88. fillColor: Colors.transparent,
  89. onPressed: () =>
  90. _launchURL('https://github.com/AppFlowy-IO/appflowy'),
  91. ),
  92. const HSpace(20),
  93. FlowyTextButton(
  94. LocaleKeys.subscribeNewsletterText.tr(),
  95. fontWeight: FontWeight.w500,
  96. fontColor: Theme.of(context).colorScheme.primary,
  97. decoration: TextDecoration.underline,
  98. hoverColor: Colors.transparent,
  99. fillColor: Colors.transparent,
  100. onPressed: () => _launchURL('https://www.appflowy.io/blog'),
  101. ),
  102. ],
  103. );
  104. }
  105. _launchURL(String url) async {
  106. final uri = Uri.parse(url);
  107. if (await canLaunchUrl(uri)) {
  108. await launchUrl(uri);
  109. } else {
  110. throw 'Could not launch $url';
  111. }
  112. }
  113. Future<void> _autoRegister(BuildContext context) async {
  114. final result = await widget.authService.signUpAsGuest();
  115. result.fold(
  116. (error) {
  117. Log.error(error);
  118. },
  119. (user) {
  120. FolderEventReadCurrentWorkspace().send().then((result) {
  121. _openCurrentWorkspace(context, user, result);
  122. });
  123. },
  124. );
  125. }
  126. void _openCurrentWorkspace(
  127. BuildContext context,
  128. UserProfilePB user,
  129. dartz.Either<WorkspaceSettingPB, FlowyError> workspacesOrError,
  130. ) {
  131. workspacesOrError.fold(
  132. (workspaceSetting) {
  133. widget.router
  134. .pushHomeScreenWithWorkSpace(context, user, workspaceSetting);
  135. },
  136. (error) {
  137. Log.error(error);
  138. },
  139. );
  140. }
  141. }
  142. class GoButton extends StatelessWidget {
  143. final VoidCallback onPressed;
  144. const GoButton({
  145. super.key,
  146. required this.onPressed,
  147. });
  148. @override
  149. Widget build(BuildContext context) {
  150. return FlowyTextButton(
  151. LocaleKeys.letsGoButtonText.tr(),
  152. fontSize: FontSizes.s16,
  153. padding: const EdgeInsets.symmetric(horizontal: 80, vertical: 12.0),
  154. onPressed: onPressed,
  155. fillColor: Theme.of(context).colorScheme.primary,
  156. fontColor: Theme.of(context).colorScheme.onPrimary,
  157. hoverColor: Theme.of(context).colorScheme.primaryContainer,
  158. );
  159. }
  160. }
  161. class _SkipLoginMoveWindow extends StatelessWidget
  162. implements PreferredSizeWidget {
  163. const _SkipLoginMoveWindow();
  164. @override
  165. Widget build(BuildContext context) {
  166. return const Row(
  167. children: [
  168. Expanded(
  169. child: MoveWindowDetector(),
  170. ),
  171. ],
  172. );
  173. }
  174. @override
  175. Size get preferredSize => const Size.fromHeight(55.0);
  176. }