From 916c59d7123e1d9158b40b03bbdeadcbd49e7277 Mon Sep 17 00:00:00 2001 From: Ziedelth Date: Sat, 20 Apr 2024 20:17:33 +0200 Subject: [PATCH] Add account_view.dart --- assets/avatar.jpg | Bin 0 -> 86090 bytes lib/components/anime_component.dart | 49 ++- .../episodes/episode_action_bar.dart | 2 +- lib/components/episodes/watchlist_button.dart | 101 ++++-- lib/components/followed_stream_builder.dart | 35 ++ lib/controllers/anime_details_controller.dart | 4 +- lib/controllers/anime_weekly_controller.dart | 12 +- lib/controllers/member_controller.dart | 128 +++++++ lib/dtos/member_dto.dart | 21 ++ lib/dtos/member_dto.freezed.dart | 309 ++++++++++++++++ lib/dtos/member_dto.g.dart | 35 ++ lib/main.dart | 48 +-- lib/utils/constant.dart | 4 +- lib/utils/http_request.dart | 74 +++- lib/views/account_view.dart | 340 ++++++++++++++++++ lib/views/anime_details_view.dart | 10 +- pubspec.lock | 84 ++++- pubspec.yaml | 3 + 18 files changed, 1183 insertions(+), 76 deletions(-) create mode 100644 assets/avatar.jpg create mode 100644 lib/components/followed_stream_builder.dart create mode 100644 lib/controllers/member_controller.dart create mode 100644 lib/dtos/member_dto.dart create mode 100644 lib/dtos/member_dto.freezed.dart create mode 100644 lib/dtos/member_dto.g.dart create mode 100644 lib/views/account_view.dart diff --git a/assets/avatar.jpg b/assets/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de599b01d16a2a979ae60a9cb1621c439d08ac1e GIT binary patch literal 86090 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

XM^6c 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 literal 0 HcmV?d00001 diff --git a/lib/components/anime_component.dart b/lib/components/anime_component.dart index b1c4056..a651280 100644 --- a/lib/components/anime_component.dart +++ b/lib/components/anime_component.dart @@ -1,4 +1,5 @@ import 'package:application/components/card_component.dart'; +import 'package:application/components/followed_stream_builder.dart'; import 'package:application/components/image_component.dart'; import 'package:application/components/lang_type_component.dart'; import 'package:application/dtos/anime_dto.dart'; @@ -27,13 +28,49 @@ class AnimeComponent extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ImageComponent( - uuid: anime.uuid, - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(16), - topRight: Radius.circular(16), - ), + SizedBox( height: 280, + child: Stack( + children: [ + ImageComponent( + uuid: anime.uuid, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), + ), + FollowedStreamBuilder( + anime: anime, + builder: (context, containsAnime, _) { + if (!containsAnime) { + return const SizedBox.shrink(); + } + + return Positioned( + top: 0, + right: 0, + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).scaffoldBackgroundColor, + borderRadius: const BorderRadius.only( + topRight: Radius.circular(16), + bottomLeft: Radius.circular(16), + ), + ), + child: Padding( + padding: const EdgeInsets.all(6), + child: Icon( + Icons.bookmark, + color: containsAnime ? bookmarkColor : null, + size: 16, + ), + ), + ), + ); + }, + ), + ], + ), ), const SizedBox(height: 4), Padding( diff --git a/lib/components/episodes/episode_action_bar.dart b/lib/components/episodes/episode_action_bar.dart index 98aa235..4be4a4d 100644 --- a/lib/components/episodes/episode_action_bar.dart +++ b/lib/components/episodes/episode_action_bar.dart @@ -27,7 +27,7 @@ class EpisodeActionBar extends StatelessWidget { ), ), ), - const WatchlistButton(), + WatchlistButton(episode: episode), ], ); } diff --git a/lib/components/episodes/watchlist_button.dart b/lib/components/episodes/watchlist_button.dart index 353ad05..f5deb24 100644 --- a/lib/components/episodes/watchlist_button.dart +++ b/lib/components/episodes/watchlist_button.dart @@ -1,3 +1,7 @@ +import 'package:application/components/followed_stream_builder.dart'; +import 'package:application/controllers/member_controller.dart'; +import 'package:application/dtos/anime_dto.dart'; +import 'package:application/dtos/episode_mapping_dto.dart'; import 'package:flutter/material.dart'; import 'package:like_button/like_button.dart'; import 'package:vibration/vibration.dart'; @@ -5,48 +9,73 @@ import 'package:vibration/vibration.dart'; const _bookmarkColor = Colors.yellow; class WatchlistButton extends StatelessWidget { - const WatchlistButton({super.key}); + final EpisodeMappingDto? episode; + final AnimeDto? anime; + + const WatchlistButton({ + super.key, + this.episode, + this.anime, + }); @override Widget build(BuildContext context) { - return LikeButton( - likeBuilder: (isLiked) { - return Icon( - isLiked ? Icons.bookmark : Icons.bookmark_border, - color: isLiked ? _bookmarkColor : null, - ); - }, - circleColor: const CircleColor( - start: _bookmarkColor, - end: _bookmarkColor, - ), - bubblesColor: const BubblesColor( - dotPrimaryColor: _bookmarkColor, - dotSecondaryColor: _bookmarkColor, - ), - onTap: (isLiked) async { - if (!isLiked) { - // Vibration.vibrate(duration: 100); - Vibration.vibrate(pattern: [0, 50, 125, 50, 125, 50]); + return FollowedStreamBuilder( + builder: (context, containsAnime, containsEpisode) { + return LikeButton( + isLiked: containsAnime || containsEpisode, + likeBuilder: (isLiked) { + return Icon( + isLiked ? Icons.bookmark : Icons.bookmark_border, + color: isLiked ? _bookmarkColor : null, + ); + }, + circleColor: const CircleColor( + start: _bookmarkColor, + end: _bookmarkColor, + ), + bubblesColor: const BubblesColor( + dotPrimaryColor: _bookmarkColor, + dotSecondaryColor: _bookmarkColor, + ), + onTap: (isLiked) async { + if (!isLiked) { + if (anime != null) { + MemberController.instance.followAnime(anime!); + } else { + MemberController.instance.followEpisode(episode!); + } - // Create snackbar - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.bookmark), - SizedBox(width: 8), - Text('Bookmarked'), - ], - ), - duration: Duration(seconds: 2), - ), - ); - } + Vibration.vibrate(pattern: [0, 50, 125, 50, 125, 50]); - return !isLiked; + // Create snackbar + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.bookmark), + SizedBox(width: 8), + Text('Bookmarked'), + ], + ), + duration: Duration(seconds: 2), + ), + ); + } else { + if (anime != null) { + MemberController.instance.unfollowAnime(anime!); + } else { + MemberController.instance.unfollowEpisode(episode!); + } + } + + return !isLiked; + }, + ); }, + anime: anime, + episode: episode, ); } } diff --git a/lib/components/followed_stream_builder.dart b/lib/components/followed_stream_builder.dart new file mode 100644 index 0000000..6718f1d --- /dev/null +++ b/lib/components/followed_stream_builder.dart @@ -0,0 +1,35 @@ +import 'package:application/controllers/member_controller.dart'; +import 'package:application/dtos/anime_dto.dart'; +import 'package:application/dtos/episode_mapping_dto.dart'; +import 'package:flutter/material.dart'; + +class FollowedStreamBuilder extends StatelessWidget { + final Widget Function(BuildContext, bool, bool) builder; + final AnimeDto? anime; + final EpisodeMappingDto? episode; + + const FollowedStreamBuilder({ + super.key, + required this.builder, + this.anime, + this.episode, + }); + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: MemberController.instance.streamController.stream, + initialData: null, + builder: (context, snapshot) { + final memberDto = MemberController.instance.member; + + final containsAnime = + anime != null && memberDto!.followedAnimes.contains(anime?.uuid); + final containsEpisode = episode != null && + memberDto!.followedEpisodes.contains(episode?.uuid); + + return builder(context, containsAnime, containsEpisode); + }, + ); + } +} diff --git a/lib/controllers/anime_details_controller.dart b/lib/controllers/anime_details_controller.dart index bbf39ce..8637be4 100644 --- a/lib/controllers/anime_details_controller.dart +++ b/lib/controllers/anime_details_controller.dart @@ -6,7 +6,9 @@ import 'package:application/utils/http_request.dart'; import 'package:flutter/material.dart'; enum Sort { - oldest(value: 'sort=season,episodeType,number&desc=episodeType'), + oldest( + value: 'sort=releaseDateTime,season,episodeType,number&desc=episodeType', + ), newest( value: 'sort=releaseDateTime,season,episodeType,number&desc=releaseDateTime,season,episodeType,number', diff --git a/lib/controllers/anime_weekly_controller.dart b/lib/controllers/anime_weekly_controller.dart index d19d07f..a939505 100644 --- a/lib/controllers/anime_weekly_controller.dart +++ b/lib/controllers/anime_weekly_controller.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:application/controllers/member_controller.dart'; import 'package:application/dtos/week_day_dto.dart'; import 'package:application/utils/http_request.dart'; import 'package:flutter/material.dart'; @@ -10,6 +11,7 @@ class AnimeWeeklyController { final scrollController = ScrollController(); final streamController = StreamController>.broadcast(); bool isLoading = false; + bool memberMode = false; Future init() async { weekDays.clear(); @@ -37,7 +39,15 @@ class AnimeWeeklyController { isLoading = true; try { - final json = await HttpRequest.instance.get('/v1/animes/weekly'); + String endpoint = '/v1/animes/weekly'; + String? token = ''; + + if (memberMode) { + endpoint = '/v1/animes/member-weekly'; + token = MemberController.instance.member!.token; + } + + final json = await HttpRequest.instance.get(endpoint, token: token); weekDays.addAll( json.map((e) => WeekDayDto.fromJson(e as Map)), diff --git a/lib/controllers/member_controller.dart b/lib/controllers/member_controller.dart new file mode 100644 index 0000000..8c9a72f --- /dev/null +++ b/lib/controllers/member_controller.dart @@ -0,0 +1,128 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:application/dtos/anime_dto.dart'; +import 'package:application/dtos/episode_mapping_dto.dart'; +import 'package:application/dtos/member_dto.dart'; +import 'package:application/utils/http_request.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class MemberController { + static MemberController instance = MemberController(); + late final SharedPreferences _sharedPreferences; + final streamController = StreamController.broadcast(); + String? identifier; + MemberDto? member; + + Future init() async { + _sharedPreferences = await SharedPreferences.getInstance(); + identifier = + _sharedPreferences.getString('identifier') ?? 'test-private-identifier'; + await login(); + } + + Future login() async { + final response = + await HttpRequest().post('/v1/members/private-login', identifier); + + if (response.statusCode != 200) { + throw Exception('Failed to login'); + } + + final json = jsonDecode(utf8.decode(response.bodyBytes)); + member = MemberDto.fromJson(json); + } + + Future followAnime(AnimeDto anime) async { + final response = await HttpRequest().put( + '/v1/members/animes', + jsonEncode({'uuid': anime.uuid}), + token: member!.token, + ); + + if (response.statusCode != 200) { + throw Exception('Failed to follow anime'); + } + + member!.followedAnimes.add(anime.uuid); + streamController.add(null); + } + + Future unfollowAnime(AnimeDto anime) async { + final response = await HttpRequest().delete( + '/v1/members/animes', + jsonEncode({'uuid': anime.uuid}), + token: member!.token, + ); + + if (response.statusCode != 200) { + throw Exception('Failed to unfollow anime'); + } + + member!.followedAnimes.remove(anime.uuid); + streamController.add(null); + } + + Future followEpisode(EpisodeMappingDto episode) async { + if (!member!.followedAnimes.contains(episode.anime.uuid)) { + await followAnime(episode.anime); + } + + final response = await HttpRequest().put( + '/v1/members/episodes', + jsonEncode({'uuid': episode.uuid}), + token: member!.token, + ); + + if (response.statusCode != 200) { + throw Exception('Failed to follow episode'); + } + + member!.followedEpisodes.add(episode.uuid); + member = member! + .copyWith(totalDuration: member!.totalDuration + episode.duration); + streamController.add(null); + } + + Future unfollowEpisode(EpisodeMappingDto episode) async { + final response = await HttpRequest().delete( + '/v1/members/episodes', + jsonEncode({'uuid': episode.uuid}), + token: member!.token, + ); + + if (response.statusCode != 200) { + throw Exception('Failed to unfollow episode'); + } + + member!.followedEpisodes.remove(episode.uuid); + member = member! + .copyWith(totalDuration: member!.totalDuration - episode.duration); + streamController.add(null); + } + + String buildTotalDuration() { + final duration = Duration(seconds: member!.totalDuration); + // Build string like '1d 2h 3m 4s' + // If a value is 0, it is not included + final parts = []; + + if (duration.inDays > 0) { + parts.add('${duration.inDays}j'); + } + + if (duration.inHours > 0) { + parts.add('${duration.inHours % 24}h'); + } + + if (duration.inMinutes > 0) { + parts.add('${duration.inMinutes % 60}m'); + } + + if (duration.inSeconds > 0) { + parts.add('${duration.inSeconds % 60}s'); + } + + return parts.join(' '); + } +} diff --git a/lib/dtos/member_dto.dart b/lib/dtos/member_dto.dart new file mode 100644 index 0000000..933dc03 --- /dev/null +++ b/lib/dtos/member_dto.dart @@ -0,0 +1,21 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'member_dto.freezed.dart'; +part 'member_dto.g.dart'; + +@Freezed(makeCollectionsUnmodifiable: false) +class MemberDto with _$MemberDto { + const factory MemberDto({ + required String uuid, + required String token, + required String creationDateTime, + required String lastUpdateDateTime, + required bool isPrivate, + required List followedAnimes, + required List followedEpisodes, + required int totalDuration, + }) = _MemberDto; + + factory MemberDto.fromJson(Map json) => + _$MemberDtoFromJson(json); +} diff --git a/lib/dtos/member_dto.freezed.dart b/lib/dtos/member_dto.freezed.dart new file mode 100644 index 0000000..8cbe9eb --- /dev/null +++ b/lib/dtos/member_dto.freezed.dart @@ -0,0 +1,309 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'member_dto.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +MemberDto _$MemberDtoFromJson(Map json) { + return _MemberDto.fromJson(json); +} + +/// @nodoc +mixin _$MemberDto { + String get uuid => throw _privateConstructorUsedError; + String get token => throw _privateConstructorUsedError; + String get creationDateTime => throw _privateConstructorUsedError; + String get lastUpdateDateTime => throw _privateConstructorUsedError; + bool get isPrivate => throw _privateConstructorUsedError; + List get followedAnimes => throw _privateConstructorUsedError; + List get followedEpisodes => throw _privateConstructorUsedError; + int get totalDuration => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $MemberDtoCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $MemberDtoCopyWith<$Res> { + factory $MemberDtoCopyWith(MemberDto value, $Res Function(MemberDto) then) = + _$MemberDtoCopyWithImpl<$Res, MemberDto>; + @useResult + $Res call( + {String uuid, + String token, + String creationDateTime, + String lastUpdateDateTime, + bool isPrivate, + List followedAnimes, + List followedEpisodes, + int totalDuration}); +} + +/// @nodoc +class _$MemberDtoCopyWithImpl<$Res, $Val extends MemberDto> + implements $MemberDtoCopyWith<$Res> { + _$MemberDtoCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? uuid = null, + Object? token = null, + Object? creationDateTime = null, + Object? lastUpdateDateTime = null, + Object? isPrivate = null, + Object? followedAnimes = null, + Object? followedEpisodes = null, + Object? totalDuration = null, + }) { + return _then(_value.copyWith( + uuid: null == uuid + ? _value.uuid + : uuid // ignore: cast_nullable_to_non_nullable + as String, + token: null == token + ? _value.token + : token // ignore: cast_nullable_to_non_nullable + as String, + creationDateTime: null == creationDateTime + ? _value.creationDateTime + : creationDateTime // ignore: cast_nullable_to_non_nullable + as String, + lastUpdateDateTime: null == lastUpdateDateTime + ? _value.lastUpdateDateTime + : lastUpdateDateTime // ignore: cast_nullable_to_non_nullable + as String, + isPrivate: null == isPrivate + ? _value.isPrivate + : isPrivate // ignore: cast_nullable_to_non_nullable + as bool, + followedAnimes: null == followedAnimes + ? _value.followedAnimes + : followedAnimes // ignore: cast_nullable_to_non_nullable + as List, + followedEpisodes: null == followedEpisodes + ? _value.followedEpisodes + : followedEpisodes // ignore: cast_nullable_to_non_nullable + as List, + totalDuration: null == totalDuration + ? _value.totalDuration + : totalDuration // ignore: cast_nullable_to_non_nullable + as int, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$MemberDtoImplCopyWith<$Res> + implements $MemberDtoCopyWith<$Res> { + factory _$$MemberDtoImplCopyWith( + _$MemberDtoImpl value, $Res Function(_$MemberDtoImpl) then) = + __$$MemberDtoImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String uuid, + String token, + String creationDateTime, + String lastUpdateDateTime, + bool isPrivate, + List followedAnimes, + List followedEpisodes, + int totalDuration}); +} + +/// @nodoc +class __$$MemberDtoImplCopyWithImpl<$Res> + extends _$MemberDtoCopyWithImpl<$Res, _$MemberDtoImpl> + implements _$$MemberDtoImplCopyWith<$Res> { + __$$MemberDtoImplCopyWithImpl( + _$MemberDtoImpl _value, $Res Function(_$MemberDtoImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? uuid = null, + Object? token = null, + Object? creationDateTime = null, + Object? lastUpdateDateTime = null, + Object? isPrivate = null, + Object? followedAnimes = null, + Object? followedEpisodes = null, + Object? totalDuration = null, + }) { + return _then(_$MemberDtoImpl( + uuid: null == uuid + ? _value.uuid + : uuid // ignore: cast_nullable_to_non_nullable + as String, + token: null == token + ? _value.token + : token // ignore: cast_nullable_to_non_nullable + as String, + creationDateTime: null == creationDateTime + ? _value.creationDateTime + : creationDateTime // ignore: cast_nullable_to_non_nullable + as String, + lastUpdateDateTime: null == lastUpdateDateTime + ? _value.lastUpdateDateTime + : lastUpdateDateTime // ignore: cast_nullable_to_non_nullable + as String, + isPrivate: null == isPrivate + ? _value.isPrivate + : isPrivate // ignore: cast_nullable_to_non_nullable + as bool, + followedAnimes: null == followedAnimes + ? _value.followedAnimes + : followedAnimes // ignore: cast_nullable_to_non_nullable + as List, + followedEpisodes: null == followedEpisodes + ? _value.followedEpisodes + : followedEpisodes // ignore: cast_nullable_to_non_nullable + as List, + totalDuration: null == totalDuration + ? _value.totalDuration + : totalDuration // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$MemberDtoImpl implements _MemberDto { + const _$MemberDtoImpl( + {required this.uuid, + required this.token, + required this.creationDateTime, + required this.lastUpdateDateTime, + required this.isPrivate, + required this.followedAnimes, + required this.followedEpisodes, + required this.totalDuration}); + + factory _$MemberDtoImpl.fromJson(Map json) => + _$$MemberDtoImplFromJson(json); + + @override + final String uuid; + @override + final String token; + @override + final String creationDateTime; + @override + final String lastUpdateDateTime; + @override + final bool isPrivate; + @override + final List followedAnimes; + @override + final List followedEpisodes; + @override + final int totalDuration; + + @override + String toString() { + return 'MemberDto(uuid: $uuid, token: $token, creationDateTime: $creationDateTime, lastUpdateDateTime: $lastUpdateDateTime, isPrivate: $isPrivate, followedAnimes: $followedAnimes, followedEpisodes: $followedEpisodes, totalDuration: $totalDuration)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$MemberDtoImpl && + (identical(other.uuid, uuid) || other.uuid == uuid) && + (identical(other.token, token) || other.token == token) && + (identical(other.creationDateTime, creationDateTime) || + other.creationDateTime == creationDateTime) && + (identical(other.lastUpdateDateTime, lastUpdateDateTime) || + other.lastUpdateDateTime == lastUpdateDateTime) && + (identical(other.isPrivate, isPrivate) || + other.isPrivate == isPrivate) && + const DeepCollectionEquality() + .equals(other.followedAnimes, followedAnimes) && + const DeepCollectionEquality() + .equals(other.followedEpisodes, followedEpisodes) && + (identical(other.totalDuration, totalDuration) || + other.totalDuration == totalDuration)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash( + runtimeType, + uuid, + token, + creationDateTime, + lastUpdateDateTime, + isPrivate, + const DeepCollectionEquality().hash(followedAnimes), + const DeepCollectionEquality().hash(followedEpisodes), + totalDuration); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$MemberDtoImplCopyWith<_$MemberDtoImpl> get copyWith => + __$$MemberDtoImplCopyWithImpl<_$MemberDtoImpl>(this, _$identity); + + @override + Map toJson() { + return _$$MemberDtoImplToJson( + this, + ); + } +} + +abstract class _MemberDto implements MemberDto { + const factory _MemberDto( + {required final String uuid, + required final String token, + required final String creationDateTime, + required final String lastUpdateDateTime, + required final bool isPrivate, + required final List followedAnimes, + required final List followedEpisodes, + required final int totalDuration}) = _$MemberDtoImpl; + + factory _MemberDto.fromJson(Map json) = + _$MemberDtoImpl.fromJson; + + @override + String get uuid; + @override + String get token; + @override + String get creationDateTime; + @override + String get lastUpdateDateTime; + @override + bool get isPrivate; + @override + List get followedAnimes; + @override + List get followedEpisodes; + @override + int get totalDuration; + @override + @JsonKey(ignore: true) + _$$MemberDtoImplCopyWith<_$MemberDtoImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/dtos/member_dto.g.dart b/lib/dtos/member_dto.g.dart new file mode 100644 index 0000000..32bb011 --- /dev/null +++ b/lib/dtos/member_dto.g.dart @@ -0,0 +1,35 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'member_dto.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$MemberDtoImpl _$$MemberDtoImplFromJson(Map json) => + _$MemberDtoImpl( + uuid: json['uuid'] as String, + token: json['token'] as String, + creationDateTime: json['creationDateTime'] as String, + lastUpdateDateTime: json['lastUpdateDateTime'] as String, + isPrivate: json['isPrivate'] as bool, + followedAnimes: (json['followedAnimes'] as List) + .map((e) => e as String) + .toList(), + followedEpisodes: (json['followedEpisodes'] as List) + .map((e) => e as String) + .toList(), + totalDuration: json['totalDuration'] as int, + ); + +Map _$$MemberDtoImplToJson(_$MemberDtoImpl instance) => + { + 'uuid': instance.uuid, + 'token': instance.token, + 'creationDateTime': instance.creationDateTime, + 'lastUpdateDateTime': instance.lastUpdateDateTime, + 'isPrivate': instance.isPrivate, + 'followedAnimes': instance.followedAnimes, + 'followedEpisodes': instance.followedEpisodes, + 'totalDuration': instance.totalDuration, + }; diff --git a/lib/main.dart b/lib/main.dart index ce3b5f4..31f4378 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,8 @@ import 'package:application/components/update_available_component.dart'; import 'package:application/controllers/anime_controller.dart'; import 'package:application/controllers/anime_search_controller.dart'; import 'package:application/controllers/anime_weekly_controller.dart'; +import 'package:application/controllers/member_controller.dart'; +import 'package:application/views/account_view.dart'; import 'package:application/views/calendar_view.dart'; import 'package:application/views/home_view.dart'; import 'package:application/controllers/episode_controller.dart'; @@ -29,6 +31,7 @@ Future main() async { .init() .then((value) => AnimeController.instance.init()), AnimeWeeklyController.instance.init(), + MemberController.instance.init(), ]); AnimeSearchController.instance.init(); @@ -177,6 +180,22 @@ class _MyHomePageState extends State { height: 36, ), actions: [ + if (_currentIndex == 2) + IconButton( + onPressed: () { + setState(() { + AnimeWeeklyController.instance.memberMode = + !AnimeWeeklyController.instance.memberMode; + }); + + AnimeWeeklyController.instance.init(); + }, + icon: Icon( + AnimeWeeklyController.instance.memberMode + ? Icons.filter_alt + : Icons.filter_alt_off, + ), + ), IconButton( onPressed: () { Navigator.of(context).push( @@ -196,30 +215,11 @@ class _MyHomePageState extends State { _currentIndex = index; }); }, - children: [ - const HomeView(), - const SimulcastView(), - const CalendarView(), - ListView( - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'My Account', - style: Theme.of(context).textTheme.bodyLarge, - ), - const SizedBox(height: 16), - Text( - 'WORK IN PROGRESS', - style: Theme.of(context).textTheme.bodyMedium, - ), - ], - ), - ], - ), + children: const [ + HomeView(), + SimulcastView(), + CalendarView(), + AccountView(), ], ), bottomNavigationBar: BottomNavigationBar( diff --git a/lib/utils/constant.dart b/lib/utils/constant.dart index c2ee916..149699f 100644 --- a/lib/utils/constant.dart +++ b/lib/utils/constant.dart @@ -1,4 +1,4 @@ class Constant { - static const apiUrl = 'https://api.shikkanime.fr'; - static const baseUrl = 'https://www.shikkanime.fr'; + static const apiUrl = 'http://192.168.1.71:37100/api'; + static const baseUrl = 'http://192.168.1.71:37100'; } diff --git a/lib/utils/http_request.dart b/lib/utils/http_request.dart index e87a588..ff2ce13 100644 --- a/lib/utils/http_request.dart +++ b/lib/utils/http_request.dart @@ -7,11 +7,18 @@ import 'package:http/http.dart' as http; class HttpRequest { static final instance = HttpRequest(); - Future get(String endpoint) async { + Future get(String endpoint, {String? token}) async { + final headers = {}; + + if (token != null) { + headers['Authorization'] = 'Bearer $token'; + } + final response = await http.get( Uri.parse( Constant.apiUrl + endpoint, ), + headers: headers, ); if (response.statusCode != 200) { @@ -24,4 +31,69 @@ class HttpRequest { Future getPage(String endpoint) async { return PageableDto.fromJson(await get>(endpoint)); } + + Future post(String endpoint, Object? body, + {String? token}) async { + final headers = {}; + + if (token != null) { + headers['Authorization'] = 'Bearer $token'; + } + + final response = await http.post( + Uri.parse( + Constant.apiUrl + endpoint, + ), + headers: headers, + body: body, + ); + + if (response.statusCode != 200) { + throw Exception('Failed to post data'); + } + + return response; + } + + Future put(String endpoint, Object? body, + {String? token}) async { + final headers = { + 'Content-Type': 'application/json', + }; + + if (token != null) { + headers['Authorization'] = 'Bearer $token'; + } + + final response = await http.put( + Uri.parse( + Constant.apiUrl + endpoint, + ), + headers: headers, + body: body, + ); + + return response; + } + + Future delete(String endpoint, Object? body, + {String? token}) async { + final headers = { + 'Content-Type': 'application/json', + }; + + if (token != null) { + headers['Authorization'] = 'Bearer $token'; + } + + final response = await http.delete( + Uri.parse( + Constant.apiUrl + endpoint, + ), + headers: headers, + body: body, + ); + + return response; + } } diff --git a/lib/views/account_view.dart b/lib/views/account_view.dart new file mode 100644 index 0000000..5ab5a6f --- /dev/null +++ b/lib/views/account_view.dart @@ -0,0 +1,340 @@ +import 'package:application/controllers/member_controller.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:vibration/vibration.dart'; + +class AccountView extends StatelessWidget { + const AccountView({super.key}); + + @override + Widget build(BuildContext context) { + final primaryColor = Theme.of(context).primaryColor; + + return ListView( + children: [ + Row( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Stack( + children: [ + const CircleAvatar( + radius: 40, + backgroundImage: AssetImage('assets/avatar.jpg'), + ), + Positioned( + bottom: 0, + right: 0, + child: Container( + decoration: const BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + ), + child: const Padding( + padding: EdgeInsets.all(4), + child: Icon( + Icons.edit, + size: 15, + color: Colors.grey, + ), + ), + ), + ), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flex( + direction: Axis.horizontal, + children: [ + const Text( + 'Compte anonyme', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + const SizedBox(width: 8), + GestureDetector( + child: const Icon( + Icons.info, + color: Colors.grey, + size: 20, + ), + onTap: () { + showAdaptiveDialog( + context: context, + builder: (context) { + return const AlertDialog( + title: Text( + 'Avertissement sur la sauvegarde de données', + ), + content: SingleChildScrollView( + child: Column( + children: [ + Text( + 'Nous sauvegardons vos données de manière anonyme sur nos serveurs. Chaque compte est associé à un identifiant unique. Cependant, il est important de noter que si vous perdez cet identifiant, vous risquez de perdre l\'accès à toutes vos données.', + ), + SizedBox(height: 16), + Text( + 'Vous trouverez votre identifiant unique dans la section "Compte" de l\'application.', + ), + SizedBox(height: 16), + Text( + 'Pour éviter toute perte de données, nous vous recommandons vivement de créer un compte sécurisé en enregistrant une adresse e-mail et un mot de passe. Cela vous permettra de récupérer facilement vos données en cas de besoin et de sécuriser votre compte contre toute perte accidentelle.', + ), + ], + ), + ), + ); + }, + ); + }, + ), + ], + ), + const Text( + 'Membre', + style: TextStyle( + fontSize: 16, + color: Colors.grey, + ), + ), + const SizedBox(height: 8), + ElevatedButton( + onPressed: () {}, + child: const Text('Créer un compte'), + ), + ], + ), + ], + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + Expanded( + child: DecoratedBox( + decoration: BoxDecoration( + color: primaryColor, + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + Text( + MemberController + .instance.member?.followedAnimes.length + .toString() ?? + '0', + style: const TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const Text( + 'Animés ajoutés', + style: TextStyle(color: Colors.white), + ), + ], + ), + ), + ), + ), + const SizedBox(width: 16), + Expanded( + child: DecoratedBox( + decoration: BoxDecoration( + color: primaryColor, + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + Text( + MemberController + .instance.member?.followedEpisodes.length + .toString() ?? + '0', + style: const TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const Text( + 'Épisodes ajoutés', + style: TextStyle(color: Colors.white), + ), + ], + ), + ), + ), + ), + ], + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + Expanded( + child: DecoratedBox( + decoration: BoxDecoration( + color: primaryColor, + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + Text( + MemberController.instance.buildTotalDuration(), + style: const TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const Text( + 'Temps de visionnage', + style: TextStyle(color: Colors.white), + ), + ], + ), + ), + ), + ), + ], + ), + ), + const SizedBox(height: 16), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 16), + child: Text( + 'Compte', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ), + ), + ListTile( + title: const Text('Identifiant unique'), + subtitle: const Text('Sauvegardez-le pour récupérer vos données'), + trailing: Text( + MemberController.instance.identifier ?? 'Aucun identifiant', + style: const TextStyle(fontSize: 14), + ), + onTap: () { + if (MemberController.instance.identifier == null) { + return; + } + + // Copy to clipboard + Clipboard.setData( + ClipboardData(text: MemberController.instance.identifier!), + ); + + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.check, color: Colors.white), + SizedBox(width: 8), + Text('Identifiant copié dans le presse-papiers'), + ], + ), + ), + ); + + Vibration.vibrate(duration: 200, amplitude: 255); + }, + ), + // const SizedBox(height: 16), + // // Preferences section + // const Padding( + // padding: EdgeInsets.symmetric(horizontal: 16), + // child: Text( + // 'Préférences', + // style: TextStyle( + // fontSize: 16, + // fontWeight: FontWeight.bold, + // color: Colors.grey, + // ), + // ), + // ), + // ListTile( + // title: const Text('Langue audio'), + // trailing: const Row( + // mainAxisSize: MainAxisSize.min, + // children: [ + // Text('Japonais', style: TextStyle(fontSize: 14)), + // SizedBox(width: 8), + // Icon(Icons.arrow_forward_ios), + // ], + // ), + // onTap: () {}, + // ), + // ListTile( + // title: const Text('Sous-titres'), + // trailing: const Row( + // mainAxisSize: MainAxisSize.min, + // children: [ + // Text('Français', style: TextStyle(fontSize: 14)), + // SizedBox(width: 8), + // Icon(Icons.arrow_forward_ios), + // ], + // ), + // onTap: () {}, + // ), + // ListTile( + // title: const Text('Plateforme de streaming'), + // trailing: const Row( + // mainAxisSize: MainAxisSize.min, + // children: [ + // Text('Crunchyroll', style: TextStyle(fontSize: 14)), + // SizedBox(width: 8), + // Icon(Icons.arrow_forward_ios), + // ], + // ), + // onTap: () {}, + // ), + // const SizedBox(height: 16), + // const Padding( + // padding: EdgeInsets.symmetric(horizontal: 16), + // child: Text( + // 'Autres', + // style: TextStyle( + // fontSize: 16, + // fontWeight: FontWeight.bold, + // color: Colors.grey, + // ), + // ), + // ), + // ListTile( + // title: const Text('Tri par défaut'), + // trailing: const Row( + // mainAxisSize: MainAxisSize.min, + // children: [ + // Text('Les plus anciens', style: TextStyle(fontSize: 14)), + // SizedBox(width: 8), + // Icon(Icons.arrow_forward_ios), + // ], + // ), + // onTap: () {}, + // ), + ], + ); + } +} diff --git a/lib/views/anime_details_view.dart b/lib/views/anime_details_view.dart index d06d93d..5890435 100644 --- a/lib/views/anime_details_view.dart +++ b/lib/views/anime_details_view.dart @@ -5,8 +5,10 @@ import 'package:application/components/lang_type_component.dart'; import 'package:application/controllers/anime_details_controller.dart'; import 'package:application/dtos/anime_dto.dart'; import 'package:application/dtos/episode_mapping_dto.dart'; +import 'package:application/utils/constant.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:share_plus/share_plus.dart'; class AnimeDetailsView extends StatefulWidget { final AnimeDto anime; @@ -70,7 +72,11 @@ class _AnimeDetailsViewState extends State { ]; }, onSelected: (int value) { - // Not implemented + if (value == 1) { + Share.share( + '${Constant.baseUrl}/animes/${widget.anime.slug}', + ); + } }, ), ], @@ -122,7 +128,7 @@ class _AnimeDetailsViewState extends State { maxLines: 2, ), ), - const WatchlistButton(), + WatchlistButton(anime: widget.anime), ], ), for (final langType in widget.anime.langTypes) diff --git a/pubspec.lock b/pubspec.lock index 26474ab..4e5bcee 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -217,6 +217,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + url: "https://pub.dev" + source: hosted + version: "0.3.4+1" crypto: dependency: transitive description: @@ -697,10 +705,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: "70fe966348fe08c34bf929582f1d8247d9d9408130723206472b4687227e4333" + sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" url: "https://pub.dev" source: hosted - version: "3.8.0" + version: "3.9.0" pool: dependency: transitive description: @@ -757,6 +765,78 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: fb5319f3aab4c5dda5ebb92dca978179ba21f8c783ee4380910ef4c1c6824f51 + url: "https://pub.dev" + source: hosted + version: "8.0.3" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496" + url: "https://pub.dev" + source: hosted + version: "3.4.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + url: "https://pub.dev" + source: hosted + version: "2.2.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + url: "https://pub.dev" + source: hosted + version: "2.3.5" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" shelf: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index fa060c4..75a746f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: json_annotation: ^4.8.1 like_button: ^2.0.5 restart_app: ^1.2.1 + share_plus: ^8.0.3 + shared_preferences: ^2.2.3 shorebird_code_push: ^1.1.3 url_launcher: ^6.2.6 vibration: ^1.8.4 @@ -54,6 +56,7 @@ flutter: assets: - assets/icon.png - assets/icon_128x128.png + - assets/avatar.jpg - shorebird.yaml fonts: - family: Satoshi