Skip to content

Commit

Permalink
Merge pull request #28 from avuenja/21-visualização-do-perfil-de-outr…
Browse files Browse the repository at this point in the history
…os-usuários

feat(profile): Visualizar perfis de usuários
  • Loading branch information
avuenja committed Nov 26, 2022
2 parents ec85fc4 + 1997dd1 commit 9a389b0
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 11 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Isto irá rodar o projeto no seu emulador/simulador ou dispositivo real conectad
- [x] Criação de conta pelo App
- [ ] Resposta dos conteúdos
- [x] Postagens de conteúdos
- [ ] Visualização do perfil de outros usuários
- [x] Visualização do perfil de outros usuários
- [ ] Favoritos (local database)
- [ ] Opção ler mais tarde (local database)
- [ ] Buscar conteúdos (?)
Expand Down
20 changes: 20 additions & 0 deletions lib/src/services/user.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'dart:convert';
import 'package:http/http.dart' as http;

import 'package:tabnews/src/models/user.dart';

class UserService {
final apiUrl = 'https://www.tabnews.com.br/api/v1';

Future<User> fetchUser(String username) async {
final response = await http.get(
Uri.parse('$apiUrl/users/$username'),
);

if (response.statusCode == 200) {
return User.fromJson(jsonDecode(response.body));
} else {
throw Exception('Failed to get public user');
}
}
}
116 changes: 116 additions & 0 deletions lib/src/ui/pages/profile_user.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import 'package:flutter/material.dart';
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:tabnews/src/models/content.dart';
import 'package:tabnews/src/models/user.dart';
import 'package:tabnews/src/services/api.dart';
import 'package:tabnews/src/services/user.dart';
import 'package:tabnews/src/ui/layouts/page.dart';
import 'package:tabnews/src/ui/widgets/item_content.dart';
import 'package:tabnews/src/ui/widgets/progress_indicator.dart';

class ProfileUserPage extends StatefulWidget {
final String username;

const ProfileUserPage({super.key, required this.username});

@override
State<ProfileUserPage> createState() => _ProfileUserPageState();
}

class _ProfileUserPageState extends State<ProfileUserPage> {
final userService = UserService();
final contentService = Api();
bool _isLoading = true;
late User _user;

static const _perPage = 30;
final PagingController<int, Content> _pagingController =
PagingController(firstPageKey: 1);

final ScrollController _controller = ScrollController();

@override
void initState() {
super.initState();

_getUser();
_pagingController.addPageRequestListener((pageKey) {
_getContents(pageKey);
});
}

@override
void dispose() {
_controller.dispose();
_pagingController.dispose();

super.dispose();
}

Future<void> _getContents(int page) async {
final content = await contentService.fetchMyContents(
page: page,
user: widget.username,
);

final isLastPage = content.length < _perPage;

if (isLastPage) {
_pagingController.appendLastPage(content);
} else {
final nextPage = page + 1;

_pagingController.appendPage(content, nextPage);
}
}

_getUser() async {
var userRet = await userService.fetchUser(widget.username);

setState(() {
_user = userRet;
_isLoading = false;
});
}

@override
Widget build(BuildContext context) {
return PageLayout(
onRefresh: () async {},
body: _isLoading
? const AppProgressIndicator()
: SingleChildScrollView(
controller: _controller,
padding: const EdgeInsets.all(15.0),
child: Column(
children: [
Text(
'${_user.username}',
style: const TextStyle().copyWith(
fontSize: 24.0,
fontWeight: FontWeight.w700,
),
),
const SizedBox(height: 15.0),
const Divider(),
const SizedBox(height: 15.0),
PagedListView<int, Content>(
shrinkWrap: true,
scrollController: _controller,
pagingController: _pagingController,
builderDelegate: PagedChildBuilderDelegate<Content>(
itemBuilder: (context, item, index) {
return ItemContent(index: index, content: item);
},
firstPageProgressIndicatorBuilder: (_) =>
const AppProgressIndicator(),
newPageProgressIndicatorBuilder: (_) =>
const AppProgressIndicator(),
),
),
],
),
),
);
}
}
28 changes: 21 additions & 7 deletions lib/src/ui/widgets/item_comment.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:tabnews/src/ui/pages/profile_user.dart';
import 'package:tabnews/src/ui/widgets/comments_children.dart';
import 'package:tabnews/src/utils/navigation.dart';
import 'package:timeago/timeago.dart' as timeago;

import 'package:tabnews/src/extensions/dark_mode.dart';
Expand All @@ -25,13 +27,25 @@ class ItemComment extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'${comment.ownerUsername} · ${timeago.format(DateTime.parse(comment.publishedAt!), locale: "pt-BR")}',
style: const TextStyle().copyWith(
color: context.isDarkMode
? Colors.grey.shade400
: Colors.grey.shade700,
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
InkWell(
onTap: () => Navigation.push(
context,
ProfileUserPage(username: '${comment.ownerUsername}'),
),
child: Text('${comment.ownerUsername}'),
),
Text(
' · ${timeago.format(DateTime.parse(comment.publishedAt!), locale: "pt-BR")}',
style: const TextStyle().copyWith(
color: context.isDarkMode
? Colors.grey.shade400
: Colors.grey.shade700,
),
),
],
),
MarkedownReader(
body: comment.body!,
Expand Down
19 changes: 16 additions & 3 deletions lib/src/ui/widgets/item_content.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:timeago/timeago.dart' as timeago;

import 'package:tabnews/src/ui/pages/content.dart';
import 'package:tabnews/src/ui/pages/profile_user.dart';
import 'package:tabnews/src/utils/navigation.dart';
import 'package:tabnews/src/extensions/dark_mode.dart';
import 'package:tabnews/src/models/content.dart';
Expand Down Expand Up @@ -43,6 +44,8 @@ class ItemContent extends StatelessWidget {
borderRadius: BorderRadius.circular(10.0),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
Expand All @@ -67,11 +70,21 @@ class ItemContent extends StatelessWidget {
],
),
const SizedBox(height: 15.0),
Row(
mainAxisAlignment: MainAxisAlignment.end,
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
InkWell(
onTap: () => Navigation.push(
context,
ProfileUserPage(
username: '${content.ownerUsername}',
),
),
child: Text('${content.ownerUsername}'),
),
const SizedBox(height: 5.0),
Text(
'${content.tabcoins} tabcoins · ${content.ownerUsername} · ${timeago.format(date, locale: "pt-BR")}',
'${content.tabcoins} tabcoins · ${content.childrenDeepCount} comentários · ${timeago.format(date, locale: "pt-BR")}',
style: TextStyle(
color: context.isDarkMode
? Colors.grey.shade400
Expand Down

0 comments on commit 9a389b0

Please sign in to comment.