update onboarding; add missing safe areas

This commit is contained in:
Fabian Freund
2026-03-17 08:46:09 +01:00
parent 79b68f137e
commit 25f4d27f0d
49 changed files with 3938 additions and 2430 deletions
@@ -53,70 +53,74 @@ class BangCategoriesScreen extends HookConsumerWidget {
),
],
),
body: categoriesAsync.when(
skipLoadingOnReload: true,
data: (categories) {
return FadingScroll(
fadingSize: 25,
builder: (context, controller) {
return SingleChildScrollView(
controller: controller,
child: HookBuilder(
builder: (context) {
final expanded = useState(<String>{});
body: SafeArea(
child: categoriesAsync.when(
skipLoadingOnReload: true,
data: (categories) {
return FadingScroll(
fadingSize: 25,
builder: (context, controller) {
return SingleChildScrollView(
controller: controller,
child: HookBuilder(
builder: (context) {
final expanded = useState(<String>{});
return ExpansionPanelList(
expansionCallback: (index, expand) {
final key = categories.keys.elementAt(index);
if (!expanded.value.contains(key)) {
expanded.value = {...expanded.value, key};
} else {
expanded.value = {...expanded.value}..remove(key);
}
},
children: categories.entries
.map(
(category) => ExpansionPanel(
canTapOnHeader: true,
isExpanded: expanded.value.contains(category.key),
headerBuilder: (context, isExpanded) =>
ListTile(title: Text(category.key)),
body: Padding(
padding: const EdgeInsets.only(left: 16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: category.value
.map(
(subCategory) => ListTile(
title: Text(subCategory),
onTap: () async {
await BangSubCategoryRoute(
category: category.key,
subCategory: subCategory,
).push(context);
},
),
)
.toList(),
return ExpansionPanelList(
expansionCallback: (index, expand) {
final key = categories.keys.elementAt(index);
if (!expanded.value.contains(key)) {
expanded.value = {...expanded.value, key};
} else {
expanded.value = {...expanded.value}..remove(key);
}
},
children: categories.entries
.map(
(category) => ExpansionPanel(
canTapOnHeader: true,
isExpanded: expanded.value.contains(
category.key,
),
headerBuilder: (context, isExpanded) =>
ListTile(title: Text(category.key)),
body: Padding(
padding: const EdgeInsets.only(left: 16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: category.value
.map(
(subCategory) => ListTile(
title: Text(subCategory),
onTap: () async {
await BangSubCategoryRoute(
category: category.key,
subCategory: subCategory,
).push(context);
},
),
)
.toList(),
),
),
),
),
)
.toList(),
);
},
),
);
},
);
},
error: (error, stackTrace) => Center(
child: FailureWidget(
title: 'Failed to load Bang Categories',
exception: error,
)
.toList(),
);
},
),
);
},
);
},
error: (error, stackTrace) => Center(
child: FailureWidget(
title: 'Failed to load Bang Categories',
exception: error,
),
),
loading: () => const Center(child: CircularProgressIndicator()),
),
loading: () => const Center(child: CircularProgressIndicator()),
),
);
}
@@ -29,33 +29,35 @@ class BangMenuScreen extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
appBar: AppBar(title: const Text('Bangs')),
body: ListView(
children: [
ListTile(
leading: const Icon(MdiIcons.accountAlert),
title: const Text('Manage User Bangs'),
trailing: const Icon(Icons.chevron_right),
onTap: () async {
await const UserBangsRoute().push(context);
},
),
ListTile(
leading: const Icon(Icons.search),
title: const Text('Search Bangs'),
trailing: const Icon(Icons.chevron_right),
onTap: () async {
await const BangSearchRoute().push(context);
},
),
ListTile(
leading: const Icon(MdiIcons.fileTree),
title: const Text('Browse Categories'),
trailing: const Icon(Icons.chevron_right),
onTap: () async {
await const BangCategoriesRoute().push(context);
},
),
],
body: SafeArea(
child: ListView(
children: [
ListTile(
leading: const Icon(MdiIcons.accountAlert),
title: const Text('Manage User Bangs'),
trailing: const Icon(Icons.chevron_right),
onTap: () async {
await const UserBangsRoute().push(context);
},
),
ListTile(
leading: const Icon(Icons.search),
title: const Text('Search Bangs'),
trailing: const Icon(Icons.chevron_right),
onTap: () async {
await const BangSearchRoute().push(context);
},
),
ListTile(
leading: const Icon(MdiIcons.fileTree),
title: const Text('Browse Categories'),
trailing: const Icon(Icons.chevron_right),
onTap: () async {
await const BangCategoriesRoute().push(context);
},
),
],
),
),
);
}
@@ -76,30 +76,32 @@ class BangSearchScreen extends HookConsumerWidget {
),
],
),
body: resultsAsync.when(
skipLoadingOnReload: true,
data: (bangs) => FadingScroll(
fadingSize: 25,
builder: (context, controller) {
return ListView.builder(
controller: controller,
itemCount: bangs.length,
itemBuilder: (context, index) {
final bang = bangs[index];
return BangDetails(
bang,
onTap: () {
context.pop(bang.toKey());
},
);
},
);
},
body: SafeArea(
child: resultsAsync.when(
skipLoadingOnReload: true,
data: (bangs) => FadingScroll(
fadingSize: 25,
builder: (context, controller) {
return ListView.builder(
controller: controller,
itemCount: bangs.length,
itemBuilder: (context, index) {
final bang = bangs[index];
return BangDetails(
bang,
onTap: () {
context.pop(bang.toKey());
},
);
},
);
},
),
error: (error, stackTrace) => Center(
child: FailureWidget(title: 'Bang Search failed', exception: error),
),
loading: () => const Center(child: CircularProgressIndicator()),
),
error: (error, stackTrace) => Center(
child: FailureWidget(title: 'Bang Search failed', exception: error),
),
loading: () => const Center(child: CircularProgressIndicator()),
),
);
}