Add PWAServiceProvider and pwa-install.js for PWA integration
This commit is contained in:
@@ -97,89 +97,89 @@ class AdminPanelProvider extends PanelProvider
|
||||
->plugin(FilamentSpatieRolesPermissionsPlugin::make());
|
||||
}
|
||||
|
||||
public function boot(): void
|
||||
{
|
||||
// public function boot(): void
|
||||
// {
|
||||
|
||||
FilamentView::registerRenderHook(
|
||||
'panels::head.end',
|
||||
fn() => '
|
||||
<link rel="manifest" href="' . asset('manifest.json') . '">
|
||||
<meta name="theme-color" content="#007bff">
|
||||
<script>
|
||||
if ("serviceWorker" in navigator) {
|
||||
navigator.serviceWorker.register("/sw.js")
|
||||
.then(reg => console.log("Service Worker registered:", reg.scope))
|
||||
.catch(err => console.error("Service Worker registration failed:", err));
|
||||
}
|
||||
</script>
|
||||
'
|
||||
);
|
||||
// FilamentView::registerRenderHook(
|
||||
// 'panels::head.end',
|
||||
// fn() => '
|
||||
// <link rel="manifest" href="' . asset('manifest.json') . '">
|
||||
// <meta name="theme-color" content="#007bff">
|
||||
// <script>
|
||||
// if ("serviceWorker" in navigator) {
|
||||
// navigator.serviceWorker.register("/sw.js")
|
||||
// .then(reg => console.log("Service Worker registered:", reg.scope))
|
||||
// .catch(err => console.error("Service Worker registration failed:", err));
|
||||
// }
|
||||
// </script>
|
||||
// '
|
||||
// );
|
||||
|
||||
/**
|
||||
* ✅ 2. Add install popup for mobile/desktop
|
||||
*/
|
||||
FilamentView::registerRenderHook(
|
||||
'panels::body.end',
|
||||
fn() => '
|
||||
<script>
|
||||
let deferredPrompt;
|
||||
// /**
|
||||
// * ✅ 2. Add install popup for mobile/desktop
|
||||
// */
|
||||
// FilamentView::registerRenderHook(
|
||||
// 'panels::body.end',
|
||||
// fn() => '
|
||||
// <script>
|
||||
// let deferredPrompt;
|
||||
|
||||
window.addEventListener("beforeinstallprompt", (e) => {
|
||||
e.preventDefault();
|
||||
deferredPrompt = e;
|
||||
// window.addEventListener("beforeinstallprompt", (e) => {
|
||||
// e.preventDefault();
|
||||
// deferredPrompt = e;
|
||||
|
||||
if (document.getElementById("install-banner")) return;
|
||||
// if (document.getElementById("install-banner")) return;
|
||||
|
||||
const banner = document.createElement("div");
|
||||
banner.id = "install-banner";
|
||||
banner.innerHTML = `
|
||||
<div style="
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
left: 20px;
|
||||
right: 20px;
|
||||
background: var(--fi-color-primary, #007bff);
|
||||
color: white;
|
||||
padding: 15px;
|
||||
border-radius: 10px;
|
||||
text-align: center;
|
||||
font-family: system-ui, sans-serif;
|
||||
box-shadow: 0 4px 10px rgba(0,0,0,0.3);
|
||||
z-index: 99999;
|
||||
">
|
||||
<span style="font-size: 16px;">📱 Install <b>Quality Dashboard</b> App?</span><br>
|
||||
<button id="installBtn" style="
|
||||
margin-top: 10px;
|
||||
background: white;
|
||||
color: var(--fi-color-primary, #007bff);
|
||||
border: none;
|
||||
padding: 8px 16px;
|
||||
border-radius: 6px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
">Install</button>
|
||||
</div>
|
||||
`;
|
||||
document.body.appendChild(banner);
|
||||
// const banner = document.createElement("div");
|
||||
// banner.id = "install-banner";
|
||||
// banner.innerHTML = `
|
||||
// <div style="
|
||||
// position: fixed;
|
||||
// bottom: 20px;
|
||||
// left: 20px;
|
||||
// right: 20px;
|
||||
// background: var(--fi-color-primary, #007bff);
|
||||
// color: white;
|
||||
// padding: 15px;
|
||||
// border-radius: 10px;
|
||||
// text-align: center;
|
||||
// font-family: system-ui, sans-serif;
|
||||
// box-shadow: 0 4px 10px rgba(0,0,0,0.3);
|
||||
// z-index: 99999;
|
||||
// ">
|
||||
// <span style="font-size: 16px;">📱 Install <b>Quality Dashboard</b> App?</span><br>
|
||||
// <button id="installBtn" style="
|
||||
// margin-top: 10px;
|
||||
// background: white;
|
||||
// color: var(--fi-color-primary, #007bff);
|
||||
// border: none;
|
||||
// padding: 8px 16px;
|
||||
// border-radius: 6px;
|
||||
// font-weight: 600;
|
||||
// cursor: pointer;
|
||||
// ">Install</button>
|
||||
// </div>
|
||||
// `;
|
||||
// document.body.appendChild(banner);
|
||||
|
||||
document.getElementById("installBtn").addEventListener("click", async () => {
|
||||
banner.remove();
|
||||
deferredPrompt.prompt();
|
||||
const { outcome } = await deferredPrompt.userChoice;
|
||||
console.log("User install choice:", outcome);
|
||||
deferredPrompt = null;
|
||||
});
|
||||
});
|
||||
// document.getElementById("installBtn").addEventListener("click", async () => {
|
||||
// banner.remove();
|
||||
// deferredPrompt.prompt();
|
||||
// const { outcome } = await deferredPrompt.userChoice;
|
||||
// console.log("User install choice:", outcome);
|
||||
// deferredPrompt = null;
|
||||
// });
|
||||
// });
|
||||
|
||||
window.addEventListener("appinstalled", () => {
|
||||
console.log("🎉 PWA installed successfully!");
|
||||
const banner = document.getElementById("install-banner");
|
||||
if (banner) banner.remove();
|
||||
});
|
||||
</script>
|
||||
'
|
||||
);
|
||||
}
|
||||
// window.addEventListener("appinstalled", () => {
|
||||
// console.log("🎉 PWA installed successfully!");
|
||||
// const banner = document.getElementById("install-banner");
|
||||
// if (banner) banner.remove();
|
||||
// });
|
||||
// </script>
|
||||
// '
|
||||
// );
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
||||
43
app/Providers/PWAServiceProvider.php
Normal file
43
app/Providers/PWAServiceProvider.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Filament\Support\Facades\FilamentView;
|
||||
|
||||
class PWAServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register services.
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Bootstrap services.
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
FilamentView::registerRenderHook(
|
||||
'panels::head.end',
|
||||
fn() => '
|
||||
<link rel="manifest" href="' . asset('manifest.json') . '">
|
||||
<meta name="theme-color" content="#007bff">
|
||||
<script>
|
||||
if ("serviceWorker" in navigator) {
|
||||
navigator.serviceWorker.register("/sw.js")
|
||||
.then(reg => console.log("Service Worker registered:", reg.scope))
|
||||
.catch(err => console.error("Service Worker registration failed:", err));
|
||||
}
|
||||
</script>
|
||||
'
|
||||
);
|
||||
|
||||
FilamentView::registerRenderHook('panels::body.end', function () {
|
||||
return '<script src="' . asset('js/pwa-install.js') . '"></script>';
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
55
public/js/pwa-install.js
Normal file
55
public/js/pwa-install.js
Normal file
@@ -0,0 +1,55 @@
|
||||
let deferredPrompt;
|
||||
|
||||
window.addEventListener("beforeinstallprompt", (e) => {
|
||||
e.preventDefault();
|
||||
deferredPrompt = e;
|
||||
|
||||
// Prevent duplicate banner
|
||||
if (document.getElementById("install-banner")) return;
|
||||
|
||||
const banner = document.createElement("div");
|
||||
banner.id = "install-banner";
|
||||
banner.innerHTML = `
|
||||
<div style="
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
left: 20px;
|
||||
right: 20px;
|
||||
background: var(--fi-color-primary, #007bff);
|
||||
color: white;
|
||||
padding: 15px;
|
||||
border-radius: 10px;
|
||||
text-align: center;
|
||||
font-family: system-ui, sans-serif;
|
||||
box-shadow: 0 4px 10px rgba(0,0,0,0.3);
|
||||
z-index: 99999;
|
||||
">
|
||||
<span style="font-size: 16px;">📱 Install <b>Quality App</b> App?</span><br>
|
||||
<button id="installBtn" style="
|
||||
margin-top: 10px;
|
||||
background: white;
|
||||
color: var(--fi-color-primary, #007bff);
|
||||
border: none;
|
||||
padding: 8px 16px;
|
||||
border-radius: 6px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
">Install</button>
|
||||
</div>
|
||||
`;
|
||||
document.body.appendChild(banner);
|
||||
|
||||
document.getElementById("installBtn").addEventListener("click", async () => {
|
||||
banner.remove();
|
||||
deferredPrompt.prompt();
|
||||
const { outcome } = await deferredPrompt.userChoice;
|
||||
console.log("User install choice:", outcome);
|
||||
deferredPrompt = null;
|
||||
});
|
||||
});
|
||||
|
||||
window.addEventListener("appinstalled", () => {
|
||||
console.log("🎉 PDS installed successfully!");
|
||||
const banner = document.getElementById("install-banner");
|
||||
if (banner) banner.remove();
|
||||
});
|
||||
Reference in New Issue
Block a user