Skip to content

Commit c3da26e

Browse files
committed
Added resource view
1 parent f36ec7f commit c3da26e

File tree

11 files changed

+330
-6
lines changed

11 files changed

+330
-6
lines changed

lib/app/constants/api_endpoints.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ class ArchiveAPIEndpoints {
1818
static String course(String uuid) => '$base/courses/$uuid';
1919
static String professor(String uuid) => '$base/professors/$uuid';
2020
static String reference(String uuid) => '$base/references/$uuid';
21+
static String resource(String uuid) => '$base/resources/$uuid';
2122
}

lib/app/constants/strings.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ class ArchiveStrings {
7979
static const resources = 'منابع';
8080
static const resourcesTypeFilter = 'نوع';
8181

82+
static const resourceType = 'نوع';
83+
static const resourceNotes = '• توضیحات';
84+
static const resourceProfessors = '• اساتید';
85+
static const resourceDownload = 'دانلود فایل';
86+
static const resourceRelatedCourse = 'درس مرتبط';
87+
static const resourceRelatedProfessors = 'اساتید مرتبط';
88+
8289
static const references = 'مراجع';
8390
static const referencesTitleAuthorFilter = 'عنوان/نویسنده';
8491
static const referencesTypeFilter = 'نوع';

lib/app/controllers/resource.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import 'package:cse_archive/app/models/resource.dart';
2+
import 'package:cse_archive/app/services/api.dart';
3+
import 'package:get/get.dart';
4+
5+
class ResourceController extends GetxController with StateMixin {
6+
final String uuid;
7+
8+
ResourceController({required this.uuid});
9+
10+
ResourceModel? resource;
11+
12+
Future<void> fetchData() async {
13+
change(null, status: RxStatus.loading());
14+
15+
final result = await APIService.to.resource(uuid: uuid);
16+
17+
if (result != null) {
18+
resource = result;
19+
20+
change(null, status: RxStatus.success());
21+
} else {
22+
change(null, status: RxStatus.error());
23+
}
24+
}
25+
}

lib/app/models/resource.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class ResourceModel {
66
final String uuid;
77
final ResourceTypeModel type;
88
final ClassroomModel? classroom;
9+
final Uri? file;
910
final String? title;
1011
final String? notes;
1112
final DateTime? createdTime;
@@ -16,6 +17,7 @@ class ResourceModel {
1617
required this.uuid,
1718
required this.type,
1819
required this.classroom,
20+
this.file,
1921
this.title,
2022
this.notes,
2123
this.createdTime,
@@ -26,6 +28,7 @@ class ResourceModel {
2628
static ResourceModel? fromJson(dynamic json) {
2729
if (json == null) return null;
2830

31+
final file = json['file'];
2932
final createdTime = json['created_time'];
3033
final modifiedTime = json['modified_time'];
3134
final type = ResourceTypeModel.fromJson(json['type']);
@@ -35,6 +38,7 @@ class ResourceModel {
3538
title: json['title'],
3639
type: type,
3740
classroom: ClassroomModel.fromJson(json['classroom']),
41+
file: file == null ? null : Uri.parse(file),
3842
notes: json['notes'],
3943
createdTime: createdTime == null ? null : DateTime.parse(createdTime),
4044
modifiedTime: modifiedTime == null ? null : DateTime.parse(modifiedTime),

lib/app/routes/config.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:cse_archive/app/controllers/professors.dart';
77
import 'package:cse_archive/app/controllers/recordings.dart';
88
import 'package:cse_archive/app/controllers/reference.dart';
99
import 'package:cse_archive/app/controllers/references.dart';
10+
import 'package:cse_archive/app/controllers/resource.dart';
1011
import 'package:cse_archive/app/controllers/resources.dart';
1112
import 'package:cse_archive/app/controllers/search.dart';
1213
import 'package:cse_archive/app/routes/routes.dart';
@@ -20,6 +21,7 @@ import 'package:cse_archive/app/views/not_found.dart' deferred as not_found;
2021
import 'package:cse_archive/app/views/recordings.dart' deferred as recordings;
2122
import 'package:cse_archive/app/views/reference.dart' deferred as reference;
2223
import 'package:cse_archive/app/views/references.dart' deferred as references;
24+
import 'package:cse_archive/app/views/resource.dart' deferred as resource;
2325
import 'package:cse_archive/app/views/resources.dart' deferred as resources;
2426
import 'package:cse_archive/app/views/search.dart' deferred as search;
2527
import 'package:cse_archive/app/views/professor.dart' deferred as professor;
@@ -175,6 +177,39 @@ final kRouterConfig = GoRouter(
175177
),
176178
);
177179
},
180+
routes: [
181+
GoRoute(
182+
path: ':uuid',
183+
pageBuilder: (context, state) {
184+
PageTrackerService.to.activePage = ArchivePage.resource;
185+
186+
final uuid = state.pathParameters['uuid']!;
187+
188+
final controller = Get.put(
189+
ResourceController(uuid: uuid),
190+
tag: uuid,
191+
);
192+
193+
controller.fetchData().then(
194+
(_) {
195+
if (controller.resource == null) {
196+
context.go(ArchiveRoutes.resources);
197+
}
198+
},
199+
);
200+
201+
return _noTransitionBuilder(
202+
state: state,
203+
child: _viewLoader(
204+
future: resource.loadLibrary(),
205+
builder: () => resource.ResourceView(
206+
uuid: uuid,
207+
),
208+
),
209+
);
210+
},
211+
),
212+
],
178213
),
179214
GoRoute(
180215
path: ArchiveRoutes.references,

lib/app/services/api.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,4 +250,10 @@ class APIService extends GetxService {
250250
successStatusCode: HttpStatus.ok,
251251
successDecoder: ReferenceModel.fromJson,
252252
);
253+
254+
Future<ResourceModel?> resource({required String uuid}) => _requestHandler(
255+
request: () => _client.get(ArchiveAPIEndpoints.resource(uuid)),
256+
successStatusCode: HttpStatus.ok,
257+
successDecoder: ResourceModel.fromJson,
258+
);
253259
}

lib/app/services/pages_tracker.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ enum ArchivePage {
1111
recordings,
1212
reference,
1313
references,
14+
resource,
1415
resources,
1516
search,
1617
}

lib/app/views/course/components/expansion_tile.dart

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import 'package:cse_archive/app/extensions/text_theme.dart';
55
import 'package:cse_archive/app/models/classroom.dart';
66
import 'package:cse_archive/app/models/professor.dart';
77
import 'package:cse_archive/app/models/resource.dart';
8+
import 'package:cse_archive/app/routes/routes.dart';
89
import 'package:cse_archive/app/utils/en_to_fa_digits.dart';
910
import 'package:cse_archive/app/widgets/divider.dart';
1011
import 'package:cse_archive/app/widgets/expansion_tile.dart';
1112
import 'package:flutter/material.dart';
13+
import 'package:url_launcher/link.dart';
1214

1315
class CourseExpansionTile extends StatelessWidget {
1416
final int year;
@@ -76,10 +78,16 @@ class CourseExpansionTile extends StatelessWidget {
7678
runSpacing: kSizeDefault,
7779
children: resources
7880
.map(
79-
(resource) => ElevatedButton(
80-
onPressed: () {}, // TODO,
81-
child: Text(
82-
resource.title ?? resource.type.representation,
81+
(resource) => Link(
82+
uri: Uri(
83+
path: '${ArchiveRoutes.resources}/${resource.uuid}',
84+
),
85+
target: LinkTarget.blank,
86+
builder: (_, followLink) => ElevatedButton(
87+
onPressed: followLink,
88+
child: Text(
89+
resource.title ?? resource.type.representation,
90+
),
8391
),
8492
),
8593
)

lib/app/views/course/course.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ class CourseView extends GetView<CourseController> {
5555
SelectableText(
5656
course.title,
5757
style: context.headlineMedium.copyWith(
58-
fontWeight: FontWeight.bold,
5958
color: context.primaryColor,
59+
fontWeight: FontWeight.bold,
6060
),
6161
),
6262
if (course.titleEn != null) ...[

0 commit comments

Comments
 (0)