__('portal::lang.customer_portal'), 'supplier' => __('portal::lang.supplier_portal'), 'marketer' => __('portal::lang.marketer_portal'), ]; $startUrls = [ 'customer' => url('/customer/dashboard'), 'supplier' => url('/supplier/dashboard'), 'marketer' => url('/marketer/dashboard'), ]; $colors = [ 'customer' => '#3c8dbc', 'supplier' => '#00a65a', 'marketer' => '#f39c12', ]; $businessName = session('business.name', config('app.name')); $logo = session('business.logo'); $icons = []; if (! empty($logo)) { $icons[] = [ 'src' => url('uploads/business_logos/'.$logo), 'sizes' => '192x192', 'type' => 'image/png', 'purpose' => 'any maskable', ]; } $manifest = [ 'name' => $businessName.' - '.($names[$type] ?? 'Portal'), 'short_name' => $names[$type] ?? 'Portal', 'description' => $names[$type] ?? 'Portal', 'start_url' => $startUrls[$type] ?? url('/login'), 'scope' => url('/'.$type), 'display' => 'standalone', 'orientation' => 'portrait-primary', 'background_color' => '#ffffff', 'theme_color' => $colors[$type] ?? '#3c8dbc', 'lang' => app()->getLocale(), 'dir' => in_array(app()->getLocale(), config('constants.langs_rtl', [])) ? 'rtl' : 'ltr', 'icons' => $icons ?: [[ 'src' => asset('img/default.png'), 'sizes' => '192x192', 'type' => 'image/png', ]], ]; return response()->json($manifest) ->header('Content-Type', 'application/manifest+json'); } public function serviceWorker() { $content = <<<'JS' const CACHE = 'portal-pwa-v1'; const ASSETS = ['/']; self.addEventListener('install', (e) => { e.waitUntil(caches.open(CACHE).then((c) => c.addAll(ASSETS)).then(() => self.skipWaiting())); }); self.addEventListener('activate', (e) => { e.waitUntil(self.clients.claim()); }); self.addEventListener('fetch', (e) => { if (e.request.method !== 'GET') return; e.respondWith( fetch(e.request).catch(() => caches.match(e.request)) ); }); JS; return response($content, 200, ['Content-Type' => 'application/javascript']); } }