Skip to content

Commit

Permalink
caching of subject wise attendance data
Browse files Browse the repository at this point in the history
  • Loading branch information
Ahmedazim7804 committed Jan 27, 2024
1 parent 635f84b commit 31356bc
Show file tree
Hide file tree
Showing 9 changed files with 245 additions and 176 deletions.
24 changes: 12 additions & 12 deletions lib/router/router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:imsnsit/root_scaffold.dart';
import 'package:imsnsit/screens/about_screen.dart';
import 'package:imsnsit/screens/attandance_screen.dart';
import 'package:imsnsit/screens/attendance/attandance_screen.dart';
import 'package:imsnsit/screens/authentication/login_screen.dart';
import 'package:imsnsit/screens/authentication/manual_relogin.dart';
import 'package:imsnsit/screens/faculty/faculty_search.dart';
import 'package:imsnsit/screens/faculty/faculty_time_table.dart';
import 'package:imsnsit/screens/initial_screen.dart';
import 'package:imsnsit/screens/profile_screen.dart';
import 'package:imsnsit/screens/rooms_screen.dart';
import 'package:imsnsit/screens/subject_attendance_screen.dart';
import 'package:imsnsit/screens/attendance/subject_attendance_screen.dart';
import 'package:imsnsit/widgets/update_dialog.dart';

final _rootNavigatorKey = GlobalKey<NavigatorState>();
Expand Down Expand Up @@ -41,10 +41,19 @@ class MyAppRouter {
navigatorKey: _shellNavigatorAttendanceKey,
routes: [
GoRoute(
path: '/attandance',
path: '/attendance/total',
pageBuilder: (context, state) => const MaterialPage(
child: AttandanceScreen(), maintainState: true),
),
GoRoute(
name: 'subject_attendance',
path: '/attendance/subject_wise/:subject/:subjectCode',
pageBuilder: (context, state) => MaterialPage(
child: SubjectAttandanceScreen(
subject: state.pathParameters['subject']!,
subjectCode: state.pathParameters['subjectCode']!,
)),
),
]),
StatefulShellBranch(
navigatorKey: _shellNavigatorRoomsKey,
Expand Down Expand Up @@ -112,14 +121,5 @@ class MyAppRouter {
maintainState: true,
child: UpdateDialog()),
),
GoRoute(
name: 'subject_attendance',
path: '/subject_attendance/:subject/:subjectCode',
pageBuilder: (context, state) => MaterialPage(
child: SubjectAttandanceScreen(
subject: state.pathParameters['subject']!,
subjectCode: state.pathParameters['subjectCode']!,
)),
),
]);
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,18 @@ class AttandanceCard extends StatelessWidget {

@override
Widget build(BuildContext context) {
final _isOffline = context.read<ModeProvider>().offline;

late final bool attendanceCardClickable;

if (_isOffline) {
attendanceCardClickable = context
.read<SharedPreferences>()
.containsKey('subjectWiseAttendanceDataLastUpdated');
} else {
attendanceCardClickable = true;
}

final Color red = Colors.redAccent.withAlpha(150);
final Color green = Colors.greenAccent.withAlpha(150);

Expand All @@ -146,8 +158,12 @@ class AttandanceCard extends StatelessWidget {
Color cardColor = attendancePerc > 75 ? green : red;

return InkWell(
onTap: () => context.pushNamed('subject_attendance',
pathParameters: {'subject': data.subject, 'subjectCode': data.code}),
onTap: attendanceCardClickable
? () => context.pushNamed('subject_attendance', pathParameters: {
'subject': data.subject,
'subjectCode': data.code
})
: null,
child: SizedBox(
height: 170,
child: Card(
Expand Down
136 changes: 136 additions & 0 deletions lib/screens/attendance/subject_attendance_screen.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:imsnsit/model/functions.dart';
import 'package:imsnsit/provider/ims_provider.dart';
import 'package:imsnsit/provider/mode_provider.dart';
import 'package:imsnsit/widgets/outdated_data_overlay.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';

class SubjectAttandanceScreen extends StatelessWidget {
const SubjectAttandanceScreen(
{super.key, required this.subjectCode, required this.subject});

final String subjectCode;
final String subject;

@override
Widget build(BuildContext context) {
final bool _isOffline = context.read<ModeProvider>().offline;
final OverlayPortalController overlayPortalController =
OverlayPortalController();
final lastUpdated = context
.read<SharedPreferences>()
.getString('subjectWiseAttendanceDataLastUpdated');

WidgetsBinding.instance.addPostFrameCallback((_) {
if (_isOffline) {
overlayPortalController.show();
} else {
overlayPortalController.hide();
}
});

return OverlayPortal(
controller: overlayPortalController,
overlayChildBuilder: (ctx) => outdatedDataOverlay(ctx,
lastUpdated: lastUpdated,
action: () => context.go('/initial_screen')),
child: FutureBuilder(
future: _isOffline
? Functions.getJsonFromFile(DataType.absoluteAttendance)
: context.read<ImsProvider>().ims.getAbsoulteAttandanceData(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Scaffold(
body: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20, vertical: 64),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Card(
color: Theme.of(context).colorScheme.secondary,
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 16, horizontal: 24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
subject,
style: GoogleFonts.lexend(fontSize: 16),
),
Text(subjectCode,
style: GoogleFonts.lexend(fontSize: 14)),
],
),
),
),
GridView.builder(
shrinkWrap: true,
itemCount: snapshot.data![subjectCode]!.length,
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 5),
itemBuilder: (context, index) {
final entry = snapshot.data![subjectCode].entries
.elementAt(index);
return AttandanceDayCard(
day: entry.key,
value: "${entry.value}",
);
},
)
],
),
),
);
} else {
return Center(
child: CircularProgressIndicator(
color: Theme.of(context).colorScheme.onBackground,
),
);
}
}),
);
}
}

class AttandanceDayCard extends StatelessWidget {
const AttandanceDayCard({super.key, required this.day, required this.value});

final String day;
final String value;

Color? get cardColor {
if (value.contains('1')) {
return Colors.green.withAlpha(150);
} else if (value.contains('0')) {
return Colors.red.withAlpha(150);
}
return null;
}

@override
Widget build(BuildContext context) {
return Card(
color: cardColor ?? Theme.of(context).colorScheme.surface,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
day,
style: GoogleFonts.lexend(),
),
Text(
value,
style: GoogleFonts.lexend(),
),
],
),
);
}
}
2 changes: 1 addition & 1 deletion lib/screens/authentication/login_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ class _LoginScreenState extends State<LoginScreen> {
prefs.setString('password', password);

overlayPortalController.hide();
context.go('/attandance');
context.go('/attendance/total');
} else {
if (authenticationStatus == LoginProperties.wrongPassword) {
overlayPortalController.hide();
Expand Down
Loading

0 comments on commit 31356bc

Please sign in to comment.