feat: legacy mobile apps created

This commit is contained in:
Achintha Isuru
2025-12-02 23:51:04 -05:00
parent 850441ca64
commit 8e7753b324
1519 changed files with 0 additions and 16 deletions

View File

@@ -0,0 +1,67 @@
import 'package:auto_route/annotations.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:gap/gap.dart';
import 'package:krow/core/presentation/styles/kw_text_styles.dart';
import 'package:krow/features/earning/domain/bloc/earnings_bloc.dart';
import 'package:krow/features/earning/domain/entities/earning_shift_entity.dart';
import 'package:krow/features/earning/presentation/widget/earnings_appbar.dart';
import 'package:krow/features/earning/presentation/widget/list_item/earning_card_compact_widget.dart';
import '../widget/earnings_history_header.dart';
@RoutePage()
class EarningsHistoryScreen extends StatelessWidget {
const EarningsHistoryScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
physics: const ClampingScrollPhysics(),
child: SafeArea(
top: false,
child: BlocBuilder<EarningsBloc, EarningsState>(
builder: (context, state) {
List<EarningShiftEntity> items = state.currentTab.items;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const EarningsAppBar(
leading: true,
child: EarningsHistoryHeader(),
),
const Gap(24),
Padding(
padding: const EdgeInsets.only(left: 16.0),
child: Text(
'your_shifts'.tr(),
style: AppTextStyles.bodySmallMed,
),
),
_buildListView(items),
],
);
},
),
),
),
);
}
ListView _buildListView(List<EarningShiftEntity> items) {
return ListView.builder(
padding: const EdgeInsets.only(top: 24),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: items.length,
itemBuilder: (context, index) {
return EarningCardCompactWidget(
earningEntity: items[index],
);
},
);
}
}

View File

@@ -0,0 +1,78 @@
import 'package:auto_route/annotations.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:krow/core/presentation/styles/theme.dart';
import 'package:krow/features/earning/domain/bloc/earnings_bloc.dart';
import 'package:krow/features/earning/presentation/slivers/bottom_earnings_sliver.dart';
import 'package:krow/features/earning/presentation/slivers/earnings_header_sliver.dart';
import 'package:krow/features/earning/presentation/slivers/earnings_list_sliver.dart';
@RoutePage()
class EarningsScreen extends StatefulWidget {
const EarningsScreen({super.key});
@override
State<EarningsScreen> createState() => _EarningsScreenState();
}
class _EarningsScreenState extends State<EarningsScreen> {
final _scrollController = ScrollController();
bool allowPagination = true;
@override
void initState() {
super.initState();
_scrollController.addListener(
() {
if (allowPagination &&
_scrollController.position.userScrollDirection ==
ScrollDirection.reverse &&
_scrollController.position.extentAfter < 50) {
context.read<EarningsBloc>().add(const LoadAdditionalEarnings());
allowPagination = false;
}
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
extendBody: true,
body: RefreshIndicator(
displacement: 80,
backgroundColor: AppColors.bgColorLight,
color: AppColors.bgColorDark,
triggerMode: RefreshIndicatorTriggerMode.anywhere,
onRefresh: () {
context.read<EarningsBloc>().add(const ReloadCurrentEarnings());
return Future.delayed(const Duration(seconds: 1));
},
child: BlocListener<EarningsBloc, EarningsState>(
listenWhen: (previous, current) =>
previous.currentTab.status != current.currentTab.status,
listener: (context, state) {
allowPagination = state.currentTab.status.allowLoad;
},
child: CustomScrollView(
controller: _scrollController,
physics: const ClampingScrollPhysics(),
slivers: [
const EarningsHeaderSliver(),
const EarningsListSliver(),
const BottomEarningsSliver(),
],
),
),
),
);
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
}