@extends('layouts.subscriptions') @php $servicesCollection = $services instanceof \Illuminate\Support\Collection ? $services : collect($services); $servicesPayload = $servicesCollection->map(function ($service) { $planItems = $service->plans->map(function ($plan) { $features = $plan->features; if (is_string($features)) { $decoded = json_decode($features, true); $features = json_last_error() === JSON_ERROR_NONE ? $decoded : preg_split('/\r\n|\r|\n/', $features); } $features = collect($features) ->filter(fn ($feature) => filled($feature)) ->values() ->all(); return [ 'id' => (int) $plan->id, 'name' => (string) $plan->name, 'price' => (float) $plan->price, 'currency' => (string) ($plan->currency ?: 'USD'), 'max_slots' => max((int) ($plan->max_slots ?? 1), 1), 'features' => $features, ]; })->values(); $serviceName = (string) $service->name; $serviceInitials = collect(preg_split('/[\s\-_]+/', $serviceName)) ->filter() ->take(2) ->map(fn ($part) => strtoupper(substr($part, 0, 1))) ->implode(''); return [ 'id' => (int) $service->id, 'name' => $serviceName, 'description' => (string) ($service->description ?? ''), 'category_id' => (int) $service->category_id, 'logo' => $service->logo ? asset($service->logo) : null, 'initials' => $serviceInitials !== '' ? $serviceInitials : 'SV', 'plans' => $planItems, ]; })->values(); $rawCategoriesPayload = $categories->map(function ($category) use ($servicesCollection) { return [ 'id' => (int) $category->id, 'name' => (string) $category->name, 'icon' => (string) ($category->icon ?? ''), 'service_count' => (int) $servicesCollection->where('category_id', $category->id)->count(), ]; })->values(); $featuredCategoryDefinitions = collect([ [ 'label' => 'SVOD', 'candidates' => ['SVOD', 'Streaming'], 'icon_class' => 'fa-solid fa-tv', 'icon_color' => '#f1b22d', 'icon_bg' => '#fff0c8', ], [ 'label' => 'Music', 'candidates' => ['Music'], 'icon_class' => 'fa-solid fa-music', 'icon_color' => '#76a7ff', 'icon_bg' => '#edf4ff', ], [ 'label' => 'Security', 'candidates' => ['Security'], 'icon_class' => 'fa-solid fa-lock', 'icon_color' => '#d87e2d', 'icon_bg' => '#fff0df', ], [ 'label' => 'Software', 'candidates' => ['Software', 'Productivity'], 'icon_class' => 'fa-solid fa-laptop-code', 'icon_color' => '#6e9dcf', 'icon_bg' => '#eef5ff', ], [ 'label' => 'Reading', 'candidates' => ['Reading'], 'icon_class' => 'fa-solid fa-book-open', 'icon_color' => '#8b78d4', 'icon_bg' => '#f1edff', ], [ 'label' => 'Cloud', 'candidates' => ['Cloud'], 'icon_class' => 'fa-solid fa-cloud', 'icon_color' => '#b9b7b4', 'icon_bg' => '#f1efec', ], [ 'label' => 'Health', 'candidates' => ['Health'], 'icon_class' => 'fa-solid fa-user-doctor', 'icon_color' => '#f1a42d', 'icon_bg' => '#fff1d9', ], [ 'label' => 'Video games', 'candidates' => ['Video games'], 'icon_class' => 'fa-solid fa-gamepad', 'icon_color' => '#2c2c2c', 'icon_bg' => '#ededed', ], [ 'label' => 'e-Learning', 'candidates' => ['e-Learning', 'Education', 'E-learning'], 'icon_class' => 'fa-solid fa-graduation-cap', 'icon_color' => '#4f4f4f', 'icon_bg' => '#ece9e2', ], ]); $matchedCategoryIds = []; $featuredCategories = $featuredCategoryDefinitions->values()->map(function ($definition, $index) use ($rawCategoriesPayload, &$matchedCategoryIds) { $matchedCategory = $rawCategoriesPayload->first(function ($item) use ($definition) { return collect($definition['candidates'])->contains(function ($candidate) use ($item) { return strcasecmp((string) $item['name'], (string) $candidate) === 0; }); }); if ($matchedCategory) { $matchedCategoryIds[] = (int) $matchedCategory['id']; } return [ 'id' => $matchedCategory ? (int) $matchedCategory['id'] : -1 * ($index + 1), 'name' => (string) ($matchedCategory['name'] ?? $definition['label']), 'label' => (string) $definition['label'], 'icon' => (string) ($matchedCategory['icon'] ?? ''), 'icon_class' => (string) $definition['icon_class'], 'icon_color' => (string) $definition['icon_color'], 'icon_bg' => (string) $definition['icon_bg'], 'service_count' => (int) ($matchedCategory['service_count'] ?? 0), ]; })->values(); $remainingCategories = $rawCategoriesPayload ->reject(fn ($category) => in_array((int) $category['id'], $matchedCategoryIds, true)) ->filter(fn ($category) => (int) ($category['service_count'] ?? 0) > 0) ->map(function ($category) { return [ 'id' => (int) $category['id'], 'name' => (string) $category['name'], 'label' => (string) $category['name'], 'icon' => (string) ($category['icon'] ?? ''), 'icon_class' => 'fa-solid fa-shapes', 'icon_color' => 'var(--user-accent)', 'icon_bg' => 'rgba(var(--user-accent-rgb), 0.12)', 'service_count' => (int) $category['service_count'], ]; }) ->values(); $categoriesPayload = $featuredCategories->merge($remainingCategories)->values(); $defaultCategoryId = null; @endphp @push('style') @endpush @section('content')

Select the subscription to share

@if ($categoriesPayload->isEmpty() || $servicesPayload->isEmpty())
No active services are available right now.
@else
@foreach ($categoriesPayload as $category) @php $categoryIcon = $category['icon'] ?? ''; $isIconPath = filled($categoryIcon) && (str_contains($categoryIcon, '/') || str_contains($categoryIcon, '.')); @endphp @endforeach

Click any service to load its packages below.

@endif
@endsection @push('script') @endpush