Added search

This commit is contained in:
Juan Gilsanz Polo
2024-02-24 01:08:53 +01:00
parent a11355227c
commit a2d621ba9b
20 changed files with 834 additions and 103 deletions

View File

@@ -0,0 +1,18 @@
import 'package:linkdy/i18n/strings.g.dart';
String dateToString(DateTime date) {
String addZeros(int value) {
return value.toString().padLeft(2, '0');
}
final today = DateTime.now();
final yesterday = DateTime.now().subtract(const Duration(days: 1));
if (date.day == today.day && date.month == today.month && date.year == today.year) {
return t.links.dates.todayAt(time: "${addZeros(date.hour)}:${addZeros(date.minute)}");
} else if (date.day == yesterday.day && date.month == yesterday.month && date.year == yesterday.year) {
return t.links.dates.yesterdayAt(time: "${addZeros(date.hour)}:${addZeros(date.minute)}");
} else {
return "${date.day}/${date.month}/${date.year} - ${addZeros(date.hour)}:${addZeros(date.minute)}";
}
}

View File

@@ -0,0 +1,134 @@
import 'package:flutter/material.dart';
import 'package:linkdy/constants/enums.dart';
class CustomTabContentList extends StatelessWidget {
final Widget Function() loadingGenerator;
final int itemsCount;
final Widget Function(int index) contentWidget;
final Widget noData;
final Widget Function() errorGenerator;
final LoadStatus loadStatus;
final Future<void> Function() onRefresh;
final double? refreshIndicatorOffset;
final bool? fabVisible;
final bool? noSliver;
final EdgeInsets? listPadding;
final double? heightFabHidden;
const CustomTabContentList({
super.key,
required this.loadingGenerator,
required this.itemsCount,
required this.contentWidget,
required this.noData,
required this.errorGenerator,
required this.loadStatus,
required this.onRefresh,
this.refreshIndicatorOffset,
this.fabVisible,
this.noSliver,
this.listPadding,
this.heightFabHidden,
});
@override
Widget build(BuildContext context) {
switch (loadStatus) {
case LoadStatus.loading:
if (noSliver == true) {
return Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: loadingGenerator());
} else {
return SafeArea(
top: false,
child: Builder(
builder: (BuildContext context) => CustomScrollView(
slivers: [
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
SliverFillRemaining(
child: Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: loadingGenerator()),
),
],
),
),
);
}
case LoadStatus.loaded:
if (noSliver == true) {
if (itemsCount > 0) {
return SafeArea(
child: ListView.builder(
padding: listPadding,
itemCount: itemsCount,
itemBuilder: (context, index) => contentWidget(index),
),
);
} else {
return SafeArea(
child: noData,
);
}
} else {
return SafeArea(
top: false,
bottom: false,
child: Builder(
builder: (BuildContext context) {
return RefreshIndicator(
onRefresh: onRefresh,
edgeOffset: refreshIndicatorOffset ?? 70,
child: CustomScrollView(
slivers: <Widget>[
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
if (itemsCount > 0)
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => contentWidget(index),
childCount: itemsCount,
),
),
if (itemsCount == 0)
SliverFillRemaining(
child: noData,
),
],
),
);
},
),
);
}
case LoadStatus.error:
if (noSliver == true) {
return Padding(padding: const EdgeInsets.only(top: 95, left: 16, right: 16), child: errorGenerator());
} else {
return SafeArea(
top: false,
child: Builder(
builder: (BuildContext context) => CustomScrollView(
slivers: [
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
SliverFillRemaining(
child: Padding(
padding: const EdgeInsets.only(top: 95, left: 16, right: 16),
child: errorGenerator(),
),
),
],
),
),
);
}
default:
return const SizedBox();
}
}
}