payfrit-app/lib/screens/service_point_select_screen.dart
2025-12-28 22:31:56 -08:00

149 lines
4.1 KiB
Dart

// lib/screens/service_point_select_screen.dart
import "package:flutter/material.dart";
import "../services/api.dart";
import "../models/service_point.dart";
class ServicePointSelectScreen extends StatefulWidget {
const ServicePointSelectScreen({super.key});
@override
State<ServicePointSelectScreen> createState() => _ServicePointSelectScreenState();
}
class _ServicePointSelectScreenState extends State<ServicePointSelectScreen> {
late Future<List<ServicePoint>> _future;
// MVP HARD CODE
static const int _mvpBusinessId = 17;
@override
void initState() {
super.initState();
_future = _load();
}
Future<List<ServicePoint>> _load() {
return Api.listServicePoints(businessId: _mvpBusinessId);
}
String _tryGetString(dynamic obj, String field) {
try {
final v = obj == null ? null : (obj as dynamic).__getattribute__(field);
if (v == null) return "";
final s = v.toString().trim();
return s;
} catch (_) {
// Dart doesn't actually support __getattribute__; this block is never reached in that way.
// We keep it here because we also attempt direct dynamic access below.
return "";
}
}
String _nameFor(ServicePoint sp, int index) {
final d = sp as dynamic;
// Try common getters without compile-time assumptions.
try {
final v = d.servicePointName;
if (v != null) {
final s = v.toString().trim();
if (s.isNotEmpty) return s;
}
} catch (_) {}
try {
final v = d.name;
if (v != null) {
final s = v.toString().trim();
if (s.isNotEmpty) return s;
}
} catch (_) {}
try {
final v = d.ServicePointName;
if (v != null) {
final s = v.toString().trim();
if (s.isNotEmpty) return s;
}
} catch (_) {}
try {
final v = d.SERVICEPOINTNAME;
if (v != null) {
final s = v.toString().trim();
if (s.isNotEmpty) return s;
}
} catch (_) {}
return "Service Point ${index + 1}";
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Select Service Point"),
),
body: FutureBuilder<List<ServicePoint>>(
future: _future,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
}
if (snapshot.hasError) {
return Center(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Text(
"Failed to load service points.",
style: TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
Text(
snapshot.error.toString(),
textAlign: TextAlign.center,
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () => setState(() => _future = _load()),
child: const Text("Retry"),
),
],
),
),
);
}
final items = snapshot.data ?? const <ServicePoint>[];
if (items.isEmpty) {
return const Center(child: Text("No service points found."));
}
return ListView.separated(
itemCount: items.length,
separatorBuilder: (_, __) => const Divider(height: 1),
itemBuilder: (context, i) {
final sp = items[i];
final name = _nameFor(sp, i);
return ListTile(
title: Text(name),
trailing: const Icon(Icons.chevron_right),
onTap: () {
// Return the selected service point to the previous screen.
Navigator.of(context).pop<ServicePoint>(sp);
},
);
},
);
},
),
);
}
}