Skip to content
This repository was archived by the owner on Apr 4, 2025. It is now read-only.
Open
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
32 changes: 20 additions & 12 deletions lib/data/repository/rest/user_rest.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,42 @@ import 'package:hackatrix/data/repository/user_repository.dart';
import 'package:hackatrix/data/repository/util/api.dart';
import 'package:hackatrix/data/repository/util/network_util.dart';
import 'package:hackatrix/domain/model/user.dart';
import 'package:hackatrix/presentation/profile/login/bloc/authenticate/login_bloc.dart';

class UserRest implements UserRepository {

NetworkUtil _netUtil = new NetworkUtil();

@override
Future<String> authenticate(String username, String password){
return _netUtil.post(API_USER_AUTHENTICATE, body: {"username": username, "password": password}).then((dynamic response) {
Future<String> authenticate(LoginCredentials credentials) {
return _netUtil.post(API_USER_AUTHENTICATE, body: {
"username": credentials.username,
"password": credentials.password
}).then((dynamic response) {
String token = response['token'];
if (token != null && token.isNotEmpty){
if (token != null && token.isNotEmpty) {
return token;
}
throw new Exception("Email/Contraseña incorrectos");
if (response["non_field_errors"] != null) {
throw ("Unable to log in with provided credentials");
}

throw ("Email/Contraseña incorrectos");
});
}

@override
Future<User> profile(String token) {
return _netUtil.get(API_USER_PROFILE, headers: {"Authorization" : "Token $token"}).then((dynamic response) {
return _netUtil.get(API_USER_PROFILE,
headers: {"Authorization": "Token $token"}).then((dynamic response) {
Map<String, dynamic> data = response as Map<String, dynamic>;
return User.fromJson(data['user']);
});
}

@override
Future<bool> logout() {
return _netUtil.post(API_USER_LOGOUT).then((dynamic response) {
return true;
});
}
}
Future<bool> logout() {
return _netUtil.post(API_USER_LOGOUT).then((dynamic response) {
return true;
});
}
}
3 changes: 2 additions & 1 deletion lib/data/repository/user_repository.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import 'dart:async';

import 'package:hackatrix/domain/model/user.dart';
import 'package:hackatrix/presentation/profile/login/bloc/authenticate/login_bloc.dart';

abstract class UserRepository {
Future<String> authenticate(String username, String password);
Future<String> authenticate(LoginCredentials credentials);
Future<User> profile(String token);
Future<bool> logout();
}
12 changes: 7 additions & 5 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:hackatrix/presentation/home/home_page.dart';
import 'package:hackatrix/data/repository/rest/event_rest.dart';
import 'package:hackatrix/presentation/home/bloc/home_bloc.dart';
import 'package:hackatrix/presentation/home/bloc/home_page_2.dart';
import 'package:hackatrix/presentation/home/bloc/home_provider.dart';
import 'package:hackatrix/presentation/util/theme.dart' as theme;

void main() => runApp(new HackatrixApp());

class HackatrixApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
config();
return new MaterialApp(
home: new HomePage(),
return MaterialApp(
home:
HomeProvider(homeBloc: HomeBloc(EventRest()), child: HomePage2(true)),
theme: theme.CompanyThemeData,
);
}
Expand Down
24 changes: 24 additions & 0 deletions lib/presentation/home/bloc/home_bloc.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import 'dart:async';
import 'package:hackatrix/data/repository/event_repository.dart';
import 'package:hackatrix/domain/model/event.dart';
import 'package:rxdart/rxdart.dart';

class HomeBloc {
final EventRepository repository;

Stream<List<Event>> _results = Stream.empty();
ReplaySubject<int> _query = ReplaySubject<int>();

// Getters
Stream<List<Event>> get results => _results;

Sink<int> get query => _query;

HomeBloc(this.repository) {
_results = _query.asyncMap(repository.getEventList).asBroadcastStream();
}

void dispose() {
_query.close();
}
}
95 changes: 95 additions & 0 deletions lib/presentation/home/bloc/home_page_2.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:hackatrix/domain/model/event.dart';
import 'package:hackatrix/presentation/event_detail/event_detail_page.dart';
import 'package:hackatrix/presentation/home/bloc/home_bloc.dart';
import 'package:hackatrix/presentation/home/home_item.dart';
import 'package:hackatrix/presentation/home/bloc/home_provider.dart';
import 'package:hackatrix/presentation/menu/menu_page.dart';
import 'package:hackatrix/presentation/util/constants.dart';
import 'package:hackatrix/presentation/util/custom_widgets/my_scaffold.dart';

class HomePage2 extends StatelessWidget {
//Completer<Null> _completer;

final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =
new GlobalKey<RefreshIndicatorState>();
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
Completer<Null> _completer;

bool isFirstLaunched;

// Events
void _onTapEvent(Event event, BuildContext context) {
print("event tapped: ${event.title}");
Navigator.push(
context,
new MaterialPageRoute(
builder: (BuildContext context) => new EventDetailPage(event),
),
);
}

HomePage2(this.isFirstLaunched);

@override
Widget build(BuildContext context) {
final HomeBloc homeBloc = HomeProvider.of(context);

if (isFirstLaunched) {
homeBloc.query.add(1);
isFirstLaunched = false;
}

return MyScaffold(
key: _scaffoldKey,
title: APP_NAME,
drawer: Drawer(
child: MenuSidePage(_scaffoldKey),
),
body: buildStaggeredGridView(homeBloc),
);
}

Widget buildStaggeredGridView(HomeBloc homeBloc) {
return StreamBuilder(
stream: homeBloc.results,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
);
} else {
return RefreshIndicator(
key: _refreshIndicatorKey,
child: StaggeredGridView.countBuilder(
crossAxisCount: 2,
padding: EdgeInsets.all(4.0),
itemCount: snapshot.data == null ? 0 : snapshot.data.length,
staggeredTileBuilder: (int index) =>
new StaggeredTile.count(index == 0 ? 2 : 1, 1.2),
mainAxisSpacing: 5.0,
crossAxisSpacing: 5.0,
itemBuilder: (BuildContext context, int index) => new HomeItem(
snapshot.data[index], context,
callBack: _onTapEvent)),
onRefresh: () async {
_completer = new Completer<Null>();

homeBloc.query.add(1);

homeBloc.results.listen((List<Event> list) {
if (_completer != null && !_completer.isCompleted)
_completer.complete();
});

return _completer.future;
},
);
}
},
);
}
}
22 changes: 22 additions & 0 deletions lib/presentation/home/bloc/home_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import 'package:flutter/widgets.dart';
import 'package:hackatrix/data/repository/rest/event_rest.dart';
import 'package:hackatrix/presentation/home/bloc/home_bloc.dart';

// InheritedWidget Allows to pass its sates to his child widgets
class HomeProvider extends InheritedWidget {
final HomeBloc homeBloc;

@override
bool updateShouldNotify(InheritedWidget oldWidget) {
return true;
}

// To access the block from anywhere in the application
static HomeBloc of(BuildContext context) =>
(context.inheritFromWidgetOfExactType(HomeProvider) as HomeProvider)
.homeBloc;

HomeProvider({Key key, HomeBloc homeBloc, Widget child})
: this.homeBloc = homeBloc ?? HomeBloc(EventRest()),
super(child: child, key: key);
}
28 changes: 17 additions & 11 deletions lib/presentation/home/home_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:hackatrix/domain/model/event.dart';

typedef void OnTapItemCallBack(Event item);
typedef void OnTapItemCallBack(Event item, BuildContext context);

class HomeItem extends StatelessWidget {
HomeItem(this._event, {this.callBack});
HomeItem(this._event, this.context,{this.callBack});

final Event _event;
final BuildContext context;
final OnTapItemCallBack callBack;

@override
Expand All @@ -21,25 +23,29 @@ class HomeItem extends StatelessWidget {
);

return new Container(
key: new Key("${_event.id}"),
child: new Stack(children: <Widget>[
key: new Key("${_event.id}"),
child: new Stack(
children: <Widget>[
new GridTile(
child: imageHero,
footer: new GridTileBar(
title: new Text(_event.title, overflow: TextOverflow.clip, style: new TextStyle(
color: Colors.white,
fontSize: 14.0,
fontWeight: FontWeight.w400
)),
title: new Text(_event.title,
overflow: TextOverflow.clip,
style: new TextStyle(
color: Colors.white,
fontSize: 14.0,
fontWeight: FontWeight.w400)),
backgroundColor: Colors.black38,
),
),
new Positioned.fill(
child: new Material(
color: Colors.transparent,
child: new InkWell(
onTap: () => callBack(_event),
onTap: () => callBack(_event,context),
))),
]));
],
),
);
}
}
30 changes: 15 additions & 15 deletions lib/presentation/home/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ class _HomePageState extends State<HomePage> implements HomeView {
List<Event> _elements = List();
Completer<Null> _completer;
final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =
new GlobalKey<RefreshIndicatorState>();
new GlobalKey<RefreshIndicatorState>();
final GlobalKey<ScaffoldState> _scaffoldKey =
new GlobalKey<ScaffoldState>();
new GlobalKey<ScaffoldState>();

_HomePageState() {
_presenter = new HomePresenter(this, new EventRest());
Expand Down Expand Up @@ -53,11 +53,11 @@ class _HomePageState extends State<HomePage> implements HomeView {
});
}

void _onTapEvent(Event event){
void _onTapEvent(Event event, BuildContext context) {
print("event tapped: ${event.title}");
Navigator.push(context, new MaterialPageRoute(
builder: (BuildContext context) => new EventDetailPage(event),
),);
builder: (BuildContext context) => new EventDetailPage(event),
),);
}

@override
Expand All @@ -76,20 +76,20 @@ class _HomePageState extends State<HomePage> implements HomeView {
return new RefreshIndicator(
key: _refreshIndicatorKey,
child: StaggeredGridView.countBuilder(
crossAxisCount: 2,
padding: EdgeInsets.all(4.0),
itemCount: _elements.length,
staggeredTileBuilder: (int index) =>
new StaggeredTile.count(index == 0 ? 2 : 1, 1.2),
mainAxisSpacing: 5.0,
crossAxisSpacing: 5.0,
itemBuilder: (BuildContext context, int index) =>
new HomeItem(_elements[index], callBack: _onTapEvent)
crossAxisCount: 2,
padding: EdgeInsets.all(4.0),
itemCount: _elements.length,
staggeredTileBuilder: (int index) =>
new StaggeredTile.count(index == 0 ? 2 : 1, 1.2),
mainAxisSpacing: 5.0,
crossAxisSpacing: 5.0,
itemBuilder: (BuildContext context, int index) =>
new HomeItem(_elements[index], context, callBack: _onTapEvent)
),
onRefresh: _refreshList,
);
}


}

Loading