Skip to content

Commit

Permalink
✨ Add Holders tab in Event page
Browse files Browse the repository at this point in the history
  • Loading branch information
RockerFlower authored and RockerFlower committed Nov 6, 2022
1 parent 1c72852 commit 0c8cf92
Show file tree
Hide file tree
Showing 6 changed files with 325 additions and 16 deletions.
7 changes: 6 additions & 1 deletion lib/data/network/api/constant/poap.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ class POAPConstant {
static String scan(String address) => '/actions/scan/$address';
static String token(String tokenID) => '/token/$tokenID';
static String holders(int eventID) => '/event/$eventID/poaps';
static String holders(
int eventID, {
int limit = 10,
int offset = 0,
}) =>
'/event/$eventID/poaps?limit=$limit&offset=$offset';
static String event(int eventID) => '/events/id/$eventID';
}
12 changes: 10 additions & 2 deletions lib/data/network/api/poap.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,18 @@ class POAPAPI {
}
}

Future<Response> getHoldersOfEvent(int eventID) async {
Future<Response> getHoldersOfEvent(
int eventID, {
int limit = 10,
int offset = 0,
}) async {
try {
final Response response = await dioClient.get(
POAPConstant.holders(eventID),
POAPConstant.holders(
eventID,
limit: limit,
offset: offset,
),
isAuthorized: true,
);
return response;
Expand Down
12 changes: 10 additions & 2 deletions lib/data/repository/poap_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,17 @@ class POAPRepository {
}
}

Future<HolderResponse> getHoldersOfEvent(int eventID) async {
Future<HolderResponse> getHoldersOfEvent(
int eventID, {
int limit = 10,
int offset = 0,
}) async {
try {
final response = await poapAPI.getHoldersOfEvent(eventID);
final response = await poapAPI.getHoldersOfEvent(
eventID,
limit: limit,
offset: offset,
);
final holdersResponse = HolderResponse.fromJson(response.data);
return holdersResponse;
} on DioError {
Expand Down
101 changes: 91 additions & 10 deletions lib/ui/pages/event/controller.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
Expand Down Expand Up @@ -59,6 +60,18 @@ class EventDetailController extends BaseController {
);
int currentPageIndex = 0;

/// Holders -------------------------------------------------------------Start
List<Holder> holders = [];
int holdersCount = 0;

bool isLoadingHolders = true;

int offsetHolders = 0;
int limitHolders = 10;

bool isAllHoldersLoaded = false;

/// Holders -------------------------------------------------------------End
/// Moments -------------------------------------------------------------Start
final welookRepository = getIt.get<WelookRepository>();
List<Moment> moments = [];
Expand All @@ -74,6 +87,8 @@ class EventDetailController extends BaseController {

RefreshController refreshController =
RefreshController(initialRefresh: false);
RefreshController refreshHoldersController =
RefreshController(initialRefresh: false);

String? getPreviewImageURL(Moment previewMoment) {
if (previewMoment.bigImageUrl.isNotEmpty) {
Expand Down Expand Up @@ -157,6 +172,12 @@ class EventDetailController extends BaseController {
refreshController.loadComplete();
}

void onHoldersLoading() async {
if (isLoadingHolders) return;
await getHolders();
refreshHoldersController.loadComplete();
}

void launchWelook(int eventID) {
launchURL('https://welook.io/moments/$eventID');
}
Expand Down Expand Up @@ -217,7 +238,7 @@ class EventDetailController extends BaseController {
if (arguments != null &&
arguments['page'] != null &&
arguments['page'] is String) {
if (arguments['page'] == 'moments') {
if (arguments['page'] == 'holders') {
currentPageIndex = 1;
update();
Future.delayed(const Duration(milliseconds: 300), () {
Expand All @@ -227,6 +248,16 @@ class EventDetailController extends BaseController {
update();
});
}
if (arguments['page'] == 'moments') {
currentPageIndex = 2;
update();
Future.delayed(const Duration(milliseconds: 300), () {
pageController.animateToPage(2,
duration: const Duration(milliseconds: 300),
curve: Curves.easeIn);
update();
});
}
}

updateID(int.parse(parameters['id']!));
Expand All @@ -239,6 +270,11 @@ class EventDetailController extends BaseController {
);
_getMoments();

refreshHoldersController = RefreshController(
initialRefresh: false,
initialRefreshStatus: RefreshStatus.idle,
);

pageController.addListener(() {
currentPageIndex = pageController.page!.round();
update();
Expand Down Expand Up @@ -280,6 +316,59 @@ class EventDetailController extends BaseController {
return '';
}

getHolders() async {
isLoadingHolders = true;
if (offsetHolders == 0) {
holders.clear();
update();
}
if (isAllHoldersLoaded) {
return;
}
try {
var response = await poapRepository.getHoldersOfEvent(eventID,
limit: limitHolders, offset: offsetHolders);
offsetHolders = limitHolders + offsetHolders;
if (response.total > 0) {
holdersCount = response.total;
if (response.holders != null && response.holders!.isNotEmpty) {
holders.addAll(response.holders!);
}
if (response.holders!.isEmpty) {
isAllHoldersLoaded = true;
}
} else {
if (holdersCount == 0) {
holdersCount = 0;
holders = [];
}
isAllHoldersLoaded = true;
}
isLoadingHolders = false;
update();
if (isAllHoldersLoaded) {
refreshHoldersController.loadNoData();
}
} on DioError catch (e) {
if (e.response?.statusCode == 403) {
String token = await poapinRepository.refreshPOAPToken();
if (token.isNotEmpty) {
getHolders();
} else {
update();
}
}
}
}

String getHolderName(Holder holder) {
if (holder.owner.ens != null && holder.owner.ens!.isNotEmpty) {
return holder.owner.ens!;
} else {
return getSimpleAddress(holder.owner.id);
}
}

void getData() async {
if (eventID == 0) {
return;
Expand All @@ -303,15 +392,7 @@ class EventDetailController extends BaseController {
update();
});

poapRepository
.getHoldersOfEvent(eventID)
.then((HolderResponse holdersReponse) {
// todo
}).catchError((error) {
status.value = LoadingStatus.failed;
error.value = 'Oops, something went wrong';
update();
});
getHolders();
}

String getTimelineTitle(int index) {
Expand Down
5 changes: 4 additions & 1 deletion lib/ui/pages/event/page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:poapin/ui/pages/event/controller.dart';
import 'package:poapin/ui/pages/event/views/detail.dart';
import 'package:poapin/ui/pages/artwork/page.dart';
import 'package:poapin/ui/pages/event/views/page.base_info.dart';
import 'package:poapin/ui/pages/event/views/page.holders.dart';
import 'package:poapin/ui/pages/event/views/page.moments.dart';

class EventDetailPage extends BasePage<EventDetailController> {
Expand Down Expand Up @@ -165,13 +166,15 @@ class _VerticalView extends StatelessWidget {
children: [
PageView.builder(
controller: controller.pageController,
itemCount: 2,
itemCount: 3,
pageSnapping: true,
itemBuilder: (context, index) {
switch (index) {
case 0:
return const BaseInfoView();
case 1:
return const HoldersInEventPage();
case 2:
return const MomentsInEventPage();

default:
Expand Down
Loading

0 comments on commit 0c8cf92

Please sign in to comment.