Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 16 additions & 18 deletions lib/config/router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ import 'package:lacquer/presentation/pages/auth/login_page.dart';
import 'package:lacquer/presentation/pages/auth/verify_page.dart';
import 'package:lacquer/presentation/pages/camera/camera_page.dart';
import 'package:lacquer/presentation/pages/camera/about_screen.dart';
import 'package:lacquer/services/ai_service.dart';
import 'package:lacquer/presentation/pages/home/add_new_word_page.dart';
import 'package:lacquer/presentation/pages/home/edit_card_list_page.dart';
import 'package:lacquer/presentation/pages/home/dictionary_page.dart';
import 'package:lacquer/presentation/pages/home/revise_flashcard_page.dart';
import 'package:lacquer/presentation/pages/home/quiz_page.dart';
import 'package:lacquer/presentation/pages/profile/profile_page.dart';
import 'package:lacquer/presentation/pages/home/flashcard_page.dart';
Expand All @@ -21,8 +21,6 @@ import 'package:lacquer/presentation/pages/friends/friends_page.dart';
import 'package:lacquer/features/profile/bloc/profile_bloc.dart';
import 'package:lacquer/features/profile/bloc/profile_event.dart';
import 'package:lacquer/presentation/pages/home/translator_page.dart';
import 'package:lacquer/presentation/pages/chat/chat_screen.dart';
import 'package:lacquer/presentation/pages/profile/badge_collection_page_simple.dart';

import 'package:lacquer/presentation/pages/mainscreen.dart';
import 'package:flutter/widgets.dart';
Expand All @@ -38,14 +36,13 @@ class RouteName {
static const String profile = '/profile';
static const String flashcards = '/flashcards';
static String learn(String deckId) => '/learn/$deckId';
static String revise(String deckId) => '/revise/$deckId';
static String edit(String deckId) => '/edit/$deckId';
static const String dictionary = '/dictionary';
static const String translator = '/translator';
static const String friends = '/friends';
static const String quiz = '/quiz';
static String addNewWord(String deckId) => '/add-new-word/$deckId';
static const String chat = '/chat';
static const String badges = '/badges';

static const publicRoutes = [login, forgotPassword, verify, register];
}
Expand Down Expand Up @@ -103,10 +100,8 @@ final router = GoRouter(
noTransitionRoute(
path: RouteName.about,
builder: (context, state) {
final extra = state.extra as Map<String, dynamic>;
final imagePath = extra['imagePath'] as String;
final aiResult = extra['aiResult'] as AIResult?;
return AboutScreen(imagePath: imagePath, aiResult: aiResult);
final imagePath = state.extra as String;
return AboutScreen(imagePath: imagePath);
},
),
noTransitionRoute(
Expand Down Expand Up @@ -136,6 +131,17 @@ final router = GoRouter(
return LearningFlashcardPage(deckId: deckId);
},
),
noTransitionRoute(
path: '/revise/:deckId',
builder: (context, state) {
final deckId = state.pathParameters['deckId']!;
return ReviseFlashcardPage(deckId: deckId);
},
),
noTransitionRoute(
path: RouteName.translator,
builder: (context, state) => const TranslatorScreen(),
),
noTransitionRoute(
path: RouteName.translator,
builder: (context, state) => const TranslatorScreen(),
Expand All @@ -154,13 +160,5 @@ final router = GoRouter(
return AddNewWordPage(deckId: deckId);
},
),
noTransitionRoute(
path: RouteName.chat,
builder: (context, state) => const ChatScreen(),
),
noTransitionRoute(
path: RouteName.badges,
builder: (context, state) => const BadgeCollectionPage(),
),
],
);
);
166 changes: 91 additions & 75 deletions lib/presentation/pages/home/flashcard_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,84 +51,100 @@ class _FlashcardPageState extends State<FlashcardPage> {

@override
Widget build(BuildContext context) {
return PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) async {
if (didPop) return;
context.go('/');
},
child: Scaffold(
backgroundColor: CustomTheme.lightbeige,
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildAppBar(context),
const SizedBox(height: 16),
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: _buildSearchBar(),
),
BlocBuilder<FlashcardBloc, FlashcardState>(
builder: (context, state) {
if (state.status == FlashcardStatus.loading) {
return const Padding(
padding: EdgeInsets.only(top: 16.0),
child: Center(child: CircularProgressIndicator()),
);
} else if (state.status == FlashcardStatus.failure) {
return Center(
child: Text(
'Error: ${state.errorMessage ?? 'Unknown error'}',
),
);
} else if (state.status == FlashcardStatus.success) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (!state.searchResult)
SizedBox(
height: 30,
child: Center(
child: Text(
'No result',
style: TextStyle(
fontSize: 18,
color: Colors.grey.shade600,
return Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: <Color>[
CustomTheme.loginGradientStart,
CustomTheme.loginGradientEnd,
],
begin: FractionalOffset(0.5, 0.0),
end: FractionalOffset(0.5, 1.0),
stops: <double>[0.0, 1.0],
tileMode: TileMode.clamp,
),
),
child: PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) async {
if (didPop) return;
context.go('/');
},
child: Scaffold(
backgroundColor: Colors.transparent,
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildAppBar(context),
const SizedBox(height: 16),
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: _buildSearchBar(),
),
BlocBuilder<FlashcardBloc, FlashcardState>(
builder: (context, state) {
if (state.status == FlashcardStatus.loading) {
return const Padding(
padding: EdgeInsets.only(top: 16.0),
child: Center(child: CircularProgressIndicator()),
);
} else if (state.status == FlashcardStatus.failure) {
return Center(
child: Text(
'Error: ${state.errorMessage ?? 'Unknown error'}',
),
);
} else if (state.status == FlashcardStatus.success) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (!state.searchResult)
SizedBox(
height: 30,
child: Center(
child: Text(
'No result',
style: TextStyle(
fontSize: 18,
color: Colors.grey.shade600,
),
),
),
),
),
if (state.groupedDecks != null &&
state.groupedDecks!.data.isNotEmpty)
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children:
state.groupedDecks!.data.map((group) {
return group.decks.isNotEmpty
? FlashcardTag(
key: ValueKey(group.tag.id),
tagId: group.tag.id,
title: group.tag.name,
decks: group.decks,
)
: const SizedBox.shrink();
}).toList(),
)
else if (state.groupedDecks == null)
const Padding(
padding: EdgeInsets.only(left: 16.0, top: 8.0),
child: Text('No decks available'),
),
],
);
} else {
return const SizedBox.shrink();
}
},
),
const SizedBox(height: 20),
],
if (state.groupedDecks != null &&
state.groupedDecks!.data.isNotEmpty)
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children:
state.groupedDecks!.data.map((group) {
return group.decks.isNotEmpty
? FlashcardTag(
key: ValueKey(group.tag.id),
tagId: group.tag.id,
title: group.tag.name,
decks: group.decks,
)
: const SizedBox.shrink();
}).toList(),
)
else if (state.groupedDecks == null)
const Padding(
padding: EdgeInsets.only(left: 16.0, top: 8.0),
child: Text('No decks available'),
),
],
);
} else {
return const SizedBox.shrink();
}
},
),
const SizedBox(height: 20),
],
),
),
),
),
Expand Down
Loading
Loading