Skip to content

Commit

Permalink
Merge pull request #107 from fga-eps-mds/feat#65/Trilha
Browse files Browse the repository at this point in the history
Feat#65/trilha
  • Loading branch information
GabrielCostaDeOliveira authored Feb 1, 2025
2 parents 674e886 + 8c6889f commit 4cfd14f
Show file tree
Hide file tree
Showing 8 changed files with 226 additions and 4 deletions.
2 changes: 2 additions & 0 deletions lib/core/di/locator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:aranduapp/ui/recover_account/di/di_recover_account.dart';
import 'package:aranduapp/ui/register_account/di/di_register_account.dart';
import 'package:aranduapp/ui/join_subjects/di/di_join_subjects.dart';
import 'package:aranduapp/ui/subjects/di/di.dart';
import 'package:aranduapp/ui/trails/di/di.dart';
import 'package:get_it/get_it.dart';

final GetIt locator = GetIt.instance;
Expand All @@ -31,4 +32,5 @@ void setupLocator() {
setupAuthDI();
setupEditDeleteUser();
setupJoinSubjectsDI();
setupTrailsDI();
}
13 changes: 9 additions & 4 deletions lib/ui/journey/view/journey_view.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import 'package:aranduapp/core/log/log.dart';
//import 'package:aranduapp/core/log/log.dart';
import 'package:aranduapp/ui/journey/viewmodel/journey_viewmodel.dart';
import 'package:aranduapp/ui/shared/erro_screen.dart';
import 'package:aranduapp/ui/shared/loading_widget.dart';
import 'package:aranduapp/ui/subjects/model/subject_model.dart';
import 'package:aranduapp/ui/trails/view/trails_view.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:provider/provider.dart';
Expand Down Expand Up @@ -95,15 +96,19 @@ class _JourneyScreen extends StatelessWidget {
color: Theme.of(context).colorScheme.primary,
size: 32,
),
title: Text(journey.title?? "NUll"),
subtitle: Text(journey.description?? "NULL"),
title: Text(journey.title),
subtitle: Text(journey.description?? "Sem descrição"),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).colorScheme.primary,
size: 32,
),
onTap: () {
Log.d("tap");
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => Trails(journey: journey),
),
);
},
);
});
Expand Down
11 changes: 11 additions & 0 deletions lib/ui/trails/di/di.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'package:aranduapp/ui/trails/service/trails_service.dart';
import 'package:aranduapp/ui/trails/viewmodel/trails_viewmodel.dart';
import 'package:get_it/get_it.dart';


void setupTrailsDI() {

GetIt.instance.registerLazySingleton(() => TrailsService());
GetIt.instance.registerFactory(() => TrailsViewmodel());

}
8 changes: 8 additions & 0 deletions lib/ui/trails/model/trails_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class TrailsModel {
final String id;
final String name;
final String? contectId;

TrailsModel({required this.id, required this.name, this.contectId});
}

23 changes: 23 additions & 0 deletions lib/ui/trails/model/trails_request.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import 'dart:convert';

class TrailsRequest {
final String journeyId;

TrailsRequest({
required this.journeyId,
});

Map<String, dynamic> toJson() {
return <String, dynamic>{
'journeyId': journeyId,
};
}

factory TrailsRequest.fromJsonString(String jsonString) {
final json = jsonDecode(jsonString);

return TrailsRequest(
journeyId: json['journeyId']! as String,
);
}
}
31 changes: 31 additions & 0 deletions lib/ui/trails/service/trails_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import 'package:aranduapp/core/log/log.dart';
import 'package:aranduapp/core/network/studio_maker_api.dart';
import 'package:aranduapp/ui/trails/model/trails_model.dart';
import 'package:aranduapp/ui/trails/model/trails_request.dart';
import 'package:dio/dio.dart';

class TrailsService {
Future<List<TrailsModel>> getTrails(TrailsRequest trailsRequest) async {
Response response = await StudioMakerApi.getInstance()
.get(path: '/trails/journey/${trailsRequest.journeyId}');

List<dynamic> journeyList = response.data as List<dynamic>;

Log.i(journeyList);

var res = journeyList.map((e) {
final Map<String, dynamic> trailsMap = e as Map<String, dynamic>;

final list = trailsMap['contents'] as List<dynamic>;

return TrailsModel(
id: trailsMap['_id']! as String,
name: trailsMap['name']! as String,
contectId: list.isNotEmpty ? list[0] as String : null,
);

}).toList();

return res;
}
}
120 changes: 120 additions & 0 deletions lib/ui/trails/view/trails_view.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import 'package:aranduapp/core/log/log.dart';
import 'package:aranduapp/ui/content/view/content_view.dart';
import 'package:aranduapp/ui/journey/model/journey_model.dart';
import 'package:aranduapp/ui/shared/erro_screen.dart';
import 'package:aranduapp/ui/shared/loading_widget.dart';
import 'package:aranduapp/ui/trails/viewmodel/trails_viewmodel.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:provider/provider.dart';

class Trails extends StatelessWidget {
final JourneyModel journey;

const Trails({super.key, required this.journey});

@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<TrailsViewmodel>.value(
value: GetIt.instance<TrailsViewmodel>(),
child: _TrailsScreen(journey: journey),
);
}
}

class _TrailsScreen extends StatelessWidget {
final JourneyModel journey;

const _TrailsScreen({required this.journey});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: _buildAppBar(context),
body: _buildTrails(context),
);
}

AppBar _buildAppBar(BuildContext context) {
return AppBar(
backgroundColor: Theme.of(context).colorScheme.onPrimary,
scrolledUnderElevation: 0,
title: Text(
journey.title,
style: Theme.of(context).textTheme.headlineSmall?.copyWith(
color: Theme.of(context).colorScheme.onSurface,
),
),
centerTitle: true,
leading: IconButton(
icon: Icon(
Icons.chevron_left,
color: Theme.of(context).colorScheme.primary,
size: 32,
),
onPressed: () {
Navigator.of(context).pop();
},
),
);
}

Widget _buildTrails(BuildContext context) {
TrailsViewmodel viewModel = Provider.of<TrailsViewmodel>(context);

viewModel.getTrailsCommand.execute(journey.id);

return RefreshIndicator(
onRefresh: () => viewModel.getTrailsCommand.execute(journey.id),
child: ListenableBuilder(
listenable: viewModel.getTrailsCommand,
builder: (context, child) {
if (viewModel.getTrailsCommand.isOk) {
return _buildListView(context);
} else if (viewModel.getTrailsCommand.isError) {
return ErrorScreen(
message:
"Deslize para baixo\n\n ${viewModel.getTrailsCommand.result!.asError!.error.toString()}");
} else {
return const LoadingWidget();
}
},
),
);
}

ListView _buildListView(BuildContext context) {
TrailsViewmodel viewModel = Provider.of<TrailsViewmodel>(context);

return ListView.builder(
itemCount: viewModel.getTrailsCommand.result!.asValue!.value.length,
shrinkWrap: true,
itemBuilder: (context, index) {
var trails = viewModel.getTrailsCommand.result!.asValue!.value[index];
return ListTile(
leading: Icon(
Icons.collections_bookmark_rounded,
color: Theme.of(context).colorScheme.primary,
size: 32,
),
title: Text(trails.name),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).colorScheme.primary,
size: 32,
),
onTap: () {
if (trails.contectId != null) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => ContentView(
contentID: trails.contectId!,
),
),
);
}
},
);
});
}
}
22 changes: 22 additions & 0 deletions lib/ui/trails/viewmodel/trails_viewmodel.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import 'package:aranduapp/core/state/command.dart';
import 'package:aranduapp/ui/trails/model/trails_model.dart';
import 'package:aranduapp/ui/trails/model/trails_request.dart';
import 'package:aranduapp/ui/trails/service/trails_service.dart';
import 'package:async/async.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';

class TrailsViewmodel extends ChangeNotifier {
late Command1<List<TrailsModel>, String> getTrailsCommand;

TrailsViewmodel() {
getTrailsCommand = Command1(getTrails);
}

Future<Result<List<TrailsModel>>> getTrails(String journeyId) async {
List<TrailsModel> res = await GetIt.instance<TrailsService>()
.getTrails(TrailsRequest(journeyId: journeyId));

return Result.value(res);
}
}

0 comments on commit 4cfd14f

Please sign in to comment.