♻️ Full screen signin and signup
This commit is contained in:
		@@ -8,6 +8,8 @@ import 'package:solian/screens/account/friend.dart';
 | 
			
		||||
import 'package:solian/screens/account/personalize.dart';
 | 
			
		||||
import 'package:solian/screens/account/profile_page.dart';
 | 
			
		||||
import 'package:solian/screens/account/stickers.dart';
 | 
			
		||||
import 'package:solian/screens/auth/signin.dart';
 | 
			
		||||
import 'package:solian/screens/auth/signup.dart';
 | 
			
		||||
import 'package:solian/screens/channel/channel_chat.dart';
 | 
			
		||||
import 'package:solian/screens/channel/channel_detail.dart';
 | 
			
		||||
import 'package:solian/screens/channel/channel_organize.dart';
 | 
			
		||||
@@ -259,6 +261,24 @@ abstract class AppRouter {
 | 
			
		||||
          name: state.pathParameters['name']!,
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
      GoRoute(
 | 
			
		||||
        path: '/auth/sign-in',
 | 
			
		||||
        name: 'signin',
 | 
			
		||||
        builder: (context, state) => TitleShell(
 | 
			
		||||
          state: state,
 | 
			
		||||
          isCenteredTitle: true,
 | 
			
		||||
          child: const SignInScreen(),
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
      GoRoute(
 | 
			
		||||
        path: '/auth/sign-up',
 | 
			
		||||
        name: 'signup',
 | 
			
		||||
        builder: (context, state) => TitleShell(
 | 
			
		||||
          state: state,
 | 
			
		||||
          isCenteredTitle: true,
 | 
			
		||||
          child: const SignUpScreen(),
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
    ],
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,6 @@ import 'package:solian/providers/auth.dart';
 | 
			
		||||
import 'package:solian/providers/account_status.dart';
 | 
			
		||||
import 'package:solian/providers/relation.dart';
 | 
			
		||||
import 'package:solian/router.dart';
 | 
			
		||||
import 'package:solian/screens/auth/signin.dart';
 | 
			
		||||
import 'package:solian/screens/auth/signup.dart';
 | 
			
		||||
import 'package:solian/widgets/account/account_heading.dart';
 | 
			
		||||
import 'package:solian/widgets/sized_container.dart';
 | 
			
		||||
import 'package:badges/badges.dart' as badges;
 | 
			
		||||
@@ -73,13 +71,7 @@ class _AccountScreenState extends State<AccountScreen> {
 | 
			
		||||
                    title: 'signin'.tr,
 | 
			
		||||
                    caption: 'signinCaption'.tr,
 | 
			
		||||
                    onTap: () {
 | 
			
		||||
                      showModalBottomSheet(
 | 
			
		||||
                        useRootNavigator: true,
 | 
			
		||||
                        isDismissible: false,
 | 
			
		||||
                        isScrollControlled: true,
 | 
			
		||||
                        context: context,
 | 
			
		||||
                        builder: (context) => const SignInPopup(),
 | 
			
		||||
                      ).then((val) async {
 | 
			
		||||
                      AppRouter.instance.pushNamed('signin').then((val) async {
 | 
			
		||||
                        if (val == true) {
 | 
			
		||||
                          await auth.refreshUserProfile();
 | 
			
		||||
                        }
 | 
			
		||||
@@ -94,13 +86,7 @@ class _AccountScreenState extends State<AccountScreen> {
 | 
			
		||||
                    title: 'signup'.tr,
 | 
			
		||||
                    caption: 'signupCaption'.tr,
 | 
			
		||||
                    onTap: () {
 | 
			
		||||
                      showModalBottomSheet(
 | 
			
		||||
                        useRootNavigator: true,
 | 
			
		||||
                        isDismissible: false,
 | 
			
		||||
                        isScrollControlled: true,
 | 
			
		||||
                        context: context,
 | 
			
		||||
                        builder: (context) => const SignUpPopup(),
 | 
			
		||||
                      ).then((_) {
 | 
			
		||||
                      AppRouter.instance.pushNamed('signup').then((_) {
 | 
			
		||||
                        setState(() {});
 | 
			
		||||
                      });
 | 
			
		||||
                    },
 | 
			
		||||
 
 | 
			
		||||
@@ -7,17 +7,18 @@ import 'package:solian/exts.dart';
 | 
			
		||||
import 'package:solian/providers/websocket.dart';
 | 
			
		||||
import 'package:solian/providers/auth.dart';
 | 
			
		||||
import 'package:solian/services.dart';
 | 
			
		||||
import 'package:solian/widgets/sized_container.dart';
 | 
			
		||||
import 'package:url_launcher/url_launcher.dart';
 | 
			
		||||
import 'package:url_launcher/url_launcher_string.dart';
 | 
			
		||||
 | 
			
		||||
class SignInPopup extends StatefulWidget {
 | 
			
		||||
  const SignInPopup({super.key});
 | 
			
		||||
class SignInScreen extends StatefulWidget {
 | 
			
		||||
  const SignInScreen({super.key});
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  State<SignInPopup> createState() => _SignInPopupState();
 | 
			
		||||
  State<SignInScreen> createState() => _SignInScreenState();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class _SignInPopupState extends State<SignInPopup> with ProtocolListener {
 | 
			
		||||
class _SignInScreenState extends State<SignInScreen> with ProtocolListener {
 | 
			
		||||
  bool _isBusy = false;
 | 
			
		||||
 | 
			
		||||
  final _usernameController = TextEditingController();
 | 
			
		||||
@@ -130,12 +131,10 @@ class _SignInPopupState extends State<SignInPopup> with ProtocolListener {
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    return SizedBox(
 | 
			
		||||
      height: MediaQuery.of(context).size.height * 0.9,
 | 
			
		||||
      child: Center(
 | 
			
		||||
        child: Container(
 | 
			
		||||
          width: MediaQuery.of(context).size.width * 0.6,
 | 
			
		||||
          constraints: const BoxConstraints(maxWidth: 360),
 | 
			
		||||
    return Material(
 | 
			
		||||
      color: Theme.of(context).colorScheme.surface,
 | 
			
		||||
      child: CenteredContainer(
 | 
			
		||||
        maxWidth: 360,
 | 
			
		||||
        child: Column(
 | 
			
		||||
          mainAxisSize: MainAxisSize.min,
 | 
			
		||||
          crossAxisAlignment: CrossAxisAlignment.start,
 | 
			
		||||
@@ -204,7 +203,6 @@ class _SignInPopupState extends State<SignInPopup> with ProtocolListener {
 | 
			
		||||
          ],
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
      ),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,15 +3,16 @@ import 'package:gap/gap.dart';
 | 
			
		||||
import 'package:get/get.dart';
 | 
			
		||||
import 'package:solian/exts.dart';
 | 
			
		||||
import 'package:solian/services.dart';
 | 
			
		||||
import 'package:solian/widgets/sized_container.dart';
 | 
			
		||||
 | 
			
		||||
class SignUpPopup extends StatefulWidget {
 | 
			
		||||
  const SignUpPopup({super.key});
 | 
			
		||||
class SignUpScreen extends StatefulWidget {
 | 
			
		||||
  const SignUpScreen({super.key});
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  State<SignUpPopup> createState() => _SignUpPopupState();
 | 
			
		||||
  State<SignUpScreen> createState() => _SignUpScreenState();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class _SignUpPopupState extends State<SignUpPopup> {
 | 
			
		||||
class _SignUpScreenState extends State<SignUpScreen> {
 | 
			
		||||
  final _emailController = TextEditingController();
 | 
			
		||||
  final _usernameController = TextEditingController();
 | 
			
		||||
  final _nicknameController = TextEditingController();
 | 
			
		||||
@@ -61,12 +62,10 @@ class _SignUpPopupState extends State<SignUpPopup> {
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    return SizedBox(
 | 
			
		||||
      height: MediaQuery.of(context).size.height * 0.9,
 | 
			
		||||
      child: Center(
 | 
			
		||||
        child: Container(
 | 
			
		||||
          width: MediaQuery.of(context).size.width * 0.6,
 | 
			
		||||
          constraints: const BoxConstraints(maxWidth: 360),
 | 
			
		||||
    return Material(
 | 
			
		||||
      color: Theme.of(context).colorScheme.surface,
 | 
			
		||||
      child: CenteredContainer(
 | 
			
		||||
        maxWidth: 360,
 | 
			
		||||
        child: Column(
 | 
			
		||||
          mainAxisSize: MainAxisSize.min,
 | 
			
		||||
          crossAxisAlignment: CrossAxisAlignment.start,
 | 
			
		||||
@@ -156,7 +155,6 @@ class _SignUpPopupState extends State<SignUpPopup> {
 | 
			
		||||
          ],
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
      ),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -102,7 +102,7 @@ class _ChatScreenState extends State<ChatScreen> {
 | 
			
		||||
        body: Obx(() {
 | 
			
		||||
          if (auth.isAuthorized.isFalse) {
 | 
			
		||||
            return SigninRequiredOverlay(
 | 
			
		||||
              onSignedIn: () => _channels.refreshAvailableChannel(),
 | 
			
		||||
              onDone: () => _channels.refreshAvailableChannel(),
 | 
			
		||||
            );
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -151,7 +151,7 @@ class _FeedScreenState extends State<FeedScreen>
 | 
			
		||||
                          );
 | 
			
		||||
                        } else {
 | 
			
		||||
                          return SigninRequiredOverlay(
 | 
			
		||||
                            onSignedIn: () => _postController.reloadAllOver(),
 | 
			
		||||
                            onDone: () => _postController.reloadAllOver(),
 | 
			
		||||
                          );
 | 
			
		||||
                        }
 | 
			
		||||
                      }),
 | 
			
		||||
 
 | 
			
		||||
@@ -84,7 +84,7 @@ class _RealmListScreenState extends State<RealmListScreen> {
 | 
			
		||||
        body: Obx(() {
 | 
			
		||||
          if (auth.isAuthorized.isFalse) {
 | 
			
		||||
            return SigninRequiredOverlay(
 | 
			
		||||
              onSignedIn: () => _getRealms(),
 | 
			
		||||
              onDone: () => _getRealms(),
 | 
			
		||||
            );
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,8 @@ class TitleShell extends StatelessWidget {
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    assert(state != null || title != null);
 | 
			
		||||
 | 
			
		||||
    return Scaffold(
 | 
			
		||||
      appBar: showAppBar
 | 
			
		||||
          ? AppBar(
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,19 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:gap/gap.dart';
 | 
			
		||||
import 'package:get/get.dart';
 | 
			
		||||
import 'package:solian/screens/auth/signin.dart';
 | 
			
		||||
import 'package:solian/router.dart';
 | 
			
		||||
import 'package:solian/widgets/sized_container.dart';
 | 
			
		||||
 | 
			
		||||
class SigninRequiredOverlay extends StatelessWidget {
 | 
			
		||||
  final Function onSignedIn;
 | 
			
		||||
  final Function onDone;
 | 
			
		||||
 | 
			
		||||
  const SigninRequiredOverlay({super.key, required this.onSignedIn});
 | 
			
		||||
  const SigninRequiredOverlay({super.key, required this.onDone});
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    return GestureDetector(
 | 
			
		||||
      child: Center(
 | 
			
		||||
        child: Container(
 | 
			
		||||
          constraints: const BoxConstraints(maxWidth: 280),
 | 
			
		||||
      child: CenteredContainer(
 | 
			
		||||
        maxWidth: 280,
 | 
			
		||||
        child: Column(
 | 
			
		||||
          mainAxisSize: MainAxisSize.min,
 | 
			
		||||
          children: [
 | 
			
		||||
@@ -35,15 +35,9 @@ class SigninRequiredOverlay extends StatelessWidget {
 | 
			
		||||
          ],
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
      ),
 | 
			
		||||
      onTap: () {
 | 
			
		||||
        showModalBottomSheet(
 | 
			
		||||
          useRootNavigator: true,
 | 
			
		||||
          isScrollControlled: true,
 | 
			
		||||
          context: context,
 | 
			
		||||
          builder: (context) => const SignInPopup(),
 | 
			
		||||
        ).then((value) {
 | 
			
		||||
          if (value != null) onSignedIn();
 | 
			
		||||
        AppRouter.instance.pushNamed('signin').then((value) {
 | 
			
		||||
          if (value != null) onDone();
 | 
			
		||||
        });
 | 
			
		||||
      },
 | 
			
		||||
    );
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user