Skip to content

Commit

Permalink
Merge pull request #271 from YujithIsura/main
Browse files Browse the repository at this point in the history
logging routing issue fixed
  • Loading branch information
YujithIsura authored Sep 2, 2023
2 parents 1c93a50 + b3e91e7 commit c621d9a
Show file tree
Hide file tree
Showing 16 changed files with 1,278 additions and 223 deletions.
5 changes: 5 additions & 0 deletions campus/frontend/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"githubPullRequests.ignoredPullRequestBranches": [
"main"
]
}
12 changes: 12 additions & 0 deletions campus/mobile/.vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,18 @@
// "development"
// ]
},
{
"name": "debug pysical device",
"request": "launch",
"type": "dart",
"flutterMode": "debug",
"deviceId": "TECNO KG5j",
"runTestsOnDevice": false,
// "args": [
// "--flavor",
// "development"
// ]
},
{
"name": "mobile (release mode)",
"request": "launch",
Expand Down
5 changes: 5 additions & 0 deletions campus/mobile/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"githubPullRequests.ignoredPullRequestBranches": [
"main"
]
}
4 changes: 2 additions & 2 deletions campus/mobile/assets/config/dev.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"campusProfileBffApiUrl" : "http://10.0.2.2:9090",
"campusAttendanceBffApiUrl" : "http://10.0.2.2:9091",
"campusProfileBffApiUrl" : "http://192.168.8.192:9090",
"campusAttendanceBffApiUrl" : "http://192.168.8.192:9091",
"campusPctiNotesBffApiUrl" : "http://10.0.2.2:9092",
"campusPctiFeedbackBffApiUrl" : "http://10.0.2.2:9093",
"campusAssetsBffApiUrl" : "http://10.0.2.2:9094",
Expand Down
54 changes: 49 additions & 5 deletions campus/mobile/lib/auth.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:convert';
import 'dart:developer';
// import 'dart:html';
import 'package:flutter_appauth/flutter_appauth.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:universal_html/html.dart';

Expand All @@ -18,17 +19,18 @@ import 'package:jwt_decoder/jwt_decoder.dart';
/// A mock authentication service
class CampusAppsPortalAuth extends ChangeNotifier {
bool _signedIn = false;
var _openid_tokens;

Future<bool> getSignedIn() async {
log("_guard signed in uuuuuu");
if (_signedIn)
return _signedIn; // already signed in -- todo - remove before production release
// var tokens = window.localStorage['openid_client:tokens'];
SharedPreferences prefs = await SharedPreferences.getInstance();
String accessToken = prefs.getString('access_token') ?? '';
String refreshToken = prefs.getString('refresh_token') ?? '';
String idToken = prefs.getString('id_token') ?? '';

log("_guard signed in uuuuuu");
if (_signedIn)
return _signedIn; // already signed in -- todo - remove before production release
// var tokens = window.localStorage['openid_client:tokens'];

if (accessToken.isNotEmpty && idToken.isNotEmpty) {
log("_guard signed in truetrue");
// _openid_tokens = json.decode(tokens);
Expand Down Expand Up @@ -198,6 +200,48 @@ class CampusAppsPortalAuth extends ChangeNotifier {
int get hashCode => _signedIn.hashCode;
}

Future<void> authenticate(Uri uri, String clientId, List<String> scopes,
String redirectURL, String discoveryUrl) async {
const FlutterAppAuth flutterAppAuth = FlutterAppAuth();

try {
final AuthorizationTokenResponse? result =
await flutterAppAuth.authorizeAndExchangeCode(
AuthorizationTokenRequest(
clientId,
redirectURL,
discoveryUrl: discoveryUrl,
promptValues: ['login'],
scopes: scopes,
),
);

print('Access token bla bla bla: ${result?.accessToken}');
String accessToken = result?.accessToken ?? '';
String refreshToken = result?.refreshToken ?? '';
String idToken = result?.idToken ?? '';
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setString('access_token', accessToken);
await prefs.setString('refresh_token', refreshToken);
await prefs.setString('id_token', idToken);

// final _auth = CampusAppsPortalAuth();
// final signedIn = await _auth.getSignedIn();

// setState(() {
// _isUserLoggedIn = true;
// _idToken = result?.idToken;
// _accessToken = result?.accessToken;
// _pageIndex = 2;
// });
} catch (e, s) {
print('Error while login to the system: $e - stack: $s');
// setState(() {
// _isUserLoggedIn = false;
// });
}
}

class SMSAuthScope extends InheritedNotifier<CampusAppsPortalAuth> {
const SMSAuthScope({
required super.notifier,
Expand Down
43 changes: 43 additions & 0 deletions campus/mobile/lib/avinya/attendance/lib/data/attendance_data.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// ignore_for_file: non_constant_identifier_names

class AttendanceData {
final int? activity_instance_id;
final int? person_id;
final String? preferred_name;
final String sign_in_time;
final String? sign_out_time;
final String? in_marked_by;

AttendanceData({
required this.activity_instance_id,
required this.person_id,
required this.preferred_name,
required this.sign_in_time,
required this.sign_out_time,
required this.in_marked_by,
});

// Factory constructor for deserialization
factory AttendanceData.fromJson(Map<String, dynamic> json) {
return AttendanceData(
activity_instance_id: json['activity_instance_id'],
person_id: json['person_id'],
preferred_name: json['preferred_name'],
sign_in_time: json['sign_in_time'],
sign_out_time: json['sign_out_time'],
in_marked_by: json['in_marked_by'],
);
}

// Method to convert the object to a Map for serialization
Map<String, dynamic> toJson() {
return {
'activity_instance_id': activity_instance_id,
'person_id': person_id,
'preferred_name': preferred_name,
'sign_in_time': sign_in_time,
'sign_out_time': sign_out_time,
'in_marked_by': in_marked_by,
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,21 @@ class _AttendanceMarkerScreenState extends State<AttendanceMarkerScreen> {
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text('Attendance Marker'),
title: const Text('Attendance Marker'),
),
body: SingleChildScrollView(
child: Center(
child: Column(
children: [
SizedBox(height: 40),
const SizedBox(height: 40),
AttendanceMarker(),
SizedBox(height: 20),
Text('Person Attendance Report'),
SizedBox(height: 5),
Container(
width: 500,
height: 500,
child: PersonAttendanceMarkerReport()
),
const SizedBox(height: 20),
const Text('Person Attendance Report'),
const SizedBox(height: 5),
const SizedBox(
width: 500,
height: 500,
child: PersonAttendanceMarkerReport()),
],
),
),
Expand Down
136 changes: 116 additions & 20 deletions campus/mobile/lib/avinya/attendance/lib/widgets/attedance_marker.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
// ignore_for_file: use_build_context_synchronously

import 'package:flutter/material.dart';
import 'package:mobile/avinya/attendance/lib/data/attendance_data.dart';
import '../data.dart';
import '../data/activity_attendance.dart';
import 'package:attendance/data/evaluation.dart';
// import 'package:attendance/widgets/evaluation_list.dart';
import 'package:mobile/avinya/attendance/lib/widgets/evaluation_list.dart';
import 'package:mobile/avinya/attendance/lib/widgets/qr_image.dart';
import 'dart:convert';

class AttendanceMarker extends StatefulWidget {
@override
Expand All @@ -27,24 +29,78 @@ class _AttendanceMarkerState extends State<AttendanceMarker> {
var activityInstance =
await campusAttendanceSystemInstance.getCheckinActivityInstance(
campusAppsPortalInstance.activityIds['school-day']);
// call the API to check-in
await createActivityAttendance(ActivityAttendance(

final AttendanceData data = AttendanceData(
activity_instance_id: activityInstance.id,
person_id: campusAppsPortalInstance.getUserPerson().id,
preferred_name: campusAppsPortalInstance.getUserPerson().preferred_name,
sign_in_time: DateTime.now().toString(),
sign_out_time: null,
in_marked_by: campusAppsPortalInstance.getUserPerson().digital_id,
);
// call the API to check-in
await createActivityAttendance(ActivityAttendance(
activity_instance_id: data.activity_instance_id,
person_id: data.person_id,
sign_in_time: data.sign_in_time,
in_marked_by: data.in_marked_by,
));
String dataJson = jsonEncode(data);
await refreshPersonActivityAttendanceToday();
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) {
return QRImage(sign_in_time);
return QRImage(dataJson);
}),
),
);
setState(() {
qrCodeData = sign_in_time;
qrCodeData = dataJson;
});
print('Checked in for today.');
}

Future<void> _handleQr() async {
var activityInstance =
await campusAttendanceSystemInstance.getCheckinActivityInstance(
campusAppsPortalInstance.activityIds['school-day']);
_personAttendanceToday = await getPersonActivityAttendanceToday(
campusAppsPortalInstance.getUserPerson().id!,
campusAppsPortalInstance.activityIds['school-day']!);

final AttendanceData data;
if (_personAttendanceToday.length == 1) {
data = AttendanceData(
activity_instance_id: activityInstance.id,
person_id: campusAppsPortalInstance.getUserPerson().id,
preferred_name: campusAppsPortalInstance.getUserPerson().preferred_name,
sign_in_time: _personAttendanceToday[0].sign_in_time.toString(),
sign_out_time: null,
in_marked_by: campusAppsPortalInstance.getUserPerson().digital_id,
);
} else {
data = AttendanceData(
activity_instance_id: activityInstance.id,
person_id: campusAppsPortalInstance.getUserPerson().id,
preferred_name: campusAppsPortalInstance.getUserPerson().preferred_name,
sign_in_time: _personAttendanceToday[0].sign_in_time.toString(),
sign_out_time: _personAttendanceToday[1].sign_out_time.toString(),
in_marked_by: campusAppsPortalInstance.getUserPerson().digital_id,
);
}

String dataJson = jsonEncode(data);
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) {
return QRImage(dataJson);
}),
),
);
setState(() {
qrCodeData = dataJson;
});
print('Checked in for today.');
}
Expand All @@ -53,17 +109,37 @@ class _AttendanceMarkerState extends State<AttendanceMarker> {
var activityInstance =
await campusAttendanceSystemInstance.getCheckoutActivityInstance(
campusAppsPortalInstance.activityIds['school-day']);
final AttendanceData data = AttendanceData(
activity_instance_id: activityInstance.id,
person_id: campusAppsPortalInstance.getUserPerson().id,
preferred_name: campusAppsPortalInstance.getUserPerson().preferred_name,
sign_in_time: DateTime.now().toString(),
sign_out_time: null,
in_marked_by: campusAppsPortalInstance.getUserPerson().digital_id,
);
// call the API to check-out
await createActivityAttendance(ActivityAttendance(
activity_instance_id: activityInstance.id,
person_id: campusAppsPortalInstance.getUserPerson().id,
sign_out_time: DateTime.now().toString(),
out_marked_by: campusAppsPortalInstance.getUserPerson().digital_id,
));
String dataJson = jsonEncode(data);
await refreshPersonActivityAttendanceToday();
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) {
return QRImage(dataJson);
}),
),
);
setState(() {
//_isCheckedOut = true;
qrCodeData = dataJson;
});
// setState(() {
// //_isCheckedOut = true;
// });
print('Checked out for today.');
}

Expand Down Expand Up @@ -184,13 +260,40 @@ class _AttendanceMarkerState extends State<AttendanceMarker> {
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Attendance marked for today.'),
if (_personAttendanceToday.isNotEmpty)
Text(
'Checked in at ${_personAttendanceToday[0].sign_in_time!}'),
if (_personAttendanceToday.length > 1)
Text(
'Checked out at ${_personAttendanceToday[1].sign_out_time!}'),
const SizedBox(width: 20),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_personAttendanceToday.isNotEmpty)
Text(
'Checked in at ${_personAttendanceToday[0].sign_in_time!}'),
const SizedBox(width: 20),
IconButton(
icon: const Icon(Icons.qr_code),
onPressed: () {
// Navigate to the QR code view screen when the button is clicked
_handleQr();
},
tooltip: 'View QR Code',
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_personAttendanceToday.length > 1)
Text(
'Checked out at ${_personAttendanceToday[1].sign_out_time!}'),
const SizedBox(width: 20),
IconButton(
icon: const Icon(Icons.qr_code),
onPressed: () {
// Navigate to the QR code view screen when the button is clicked
_handleQr();
},
tooltip: 'View QR Code',
),
],
),
],
)
else if (_isAbsent)
Expand All @@ -210,14 +313,7 @@ class _AttendanceMarkerState extends State<AttendanceMarker> {
icon: const Icon(Icons.qr_code),
onPressed: () {
// Navigate to the QR code view screen when the button is clicked
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return QRImage(qrCodeData);
},
),
);
_handleQr();
},
tooltip: 'View QR Code',
),
Expand Down
Loading

0 comments on commit c621d9a

Please sign in to comment.