feat: expand station cards with detailed information and add live statistics endpoint
- Add `/stats/live` endpoint returning station count and latest price timestamp with 5-minute cache - Transform StationCard into expandable component with click/keyboard interaction showing full details - Display brand label, badges (24h/Supermarket/Motorway), fuel types, amenities, opening hours, and price delta vs average - Add brand filter dropdown to StationList with dynamic brand extraction from results - Calculate and display price comparison against filtered stations average - Redesign map markers to simpler price display; move directions link to popup alongside station details - Add "locate-me" button to SearchBar for geolocation trigger - Show "Live" indicator with station count and last-update time on homepage hero - Remove standalone directions link from marker HTML; consolidate in popup with click propagation handling - Persist `avgPence` calculation across StationList and pass to cards for delta display - Add `@iconify-json/lucide` dev dependency and register collection on app mount - Stop click propagation on card action buttons (directions, remove)
This commit is contained in:
@@ -4,11 +4,33 @@ namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Search;
|
||||
use App\Models\Station;
|
||||
use App\Models\StationPrice;
|
||||
use Carbon\CarbonImmutable;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
class StatsController extends Controller
|
||||
{
|
||||
public function live(): JsonResponse
|
||||
{
|
||||
$payload = Cache::remember('api:stats:live', now()->addMinutes(5), function (): array {
|
||||
$stationCount = Station::query()
|
||||
->where('permanent_closure', false)
|
||||
->count();
|
||||
|
||||
$latestPriceAt = StationPrice::query()->max('recorded_at');
|
||||
|
||||
return [
|
||||
'station_count' => $stationCount,
|
||||
'latest_price_at' => $latestPriceAt ? CarbonImmutable::parse($latestPriceAt)->toIso8601String() : null,
|
||||
];
|
||||
});
|
||||
|
||||
return response()->json($payload);
|
||||
}
|
||||
|
||||
public function searches(Request $request): JsonResponse
|
||||
{
|
||||
$period = $request->input('period', 'week');
|
||||
|
||||
Reference in New Issue
Block a user