('unknown');
+ const appName = 'DST Collection';
+
useEffect(() => {
if ('Notification' in window) {
if (Notification.permission === 'granted') setNotifications('granted');
@@ -94,6 +124,7 @@ export default function Permissions() {
};
const isDenied = (status: PermissionStatus) => status === 'denied';
+ const deniedMessage = getDeniedMessage(appName);
return (
<>
@@ -112,7 +143,7 @@ export default function Permissions() {
{isDenied(notifications) && (
- Izin ditolak. Klik ikon gembok di address bar untuk mengaktifkannya.
+ {deniedMessage}
)}
@@ -136,7 +167,7 @@ export default function Permissions() {
{isDenied(camera) && (
- Izin ditolak. Klik ikon gembok di address bar untuk mengaktifkannya.
+ {deniedMessage}
)}
@@ -160,7 +191,7 @@ export default function Permissions() {
{isDenied(location) && (
- Izin ditolak. Klik ikon gembok di address bar untuk mengaktifkannya.
+ {deniedMessage}
)}
diff --git a/resources/js/types/vite-env.d.ts b/resources/js/types/vite-env.d.ts
index 11f02fe..c144533 100644
--- a/resources/js/types/vite-env.d.ts
+++ b/resources/js/types/vite-env.d.ts
@@ -1 +1,13 @@
///
+
+declare module 'virtual:pwa-register' {
+ export interface RegisterSWOptions {
+ immediate?: boolean;
+ onNeedRefresh?: () => void;
+ onOfflineReady?: () => void;
+ onRegisteredSW?: (swUrl: string, registration: ServiceWorkerRegistration | undefined) => void;
+ onRegisterError?: (error: Error) => void;
+ }
+
+ export function registerSW(options?: RegisterSWOptions): (reloadPage?: boolean) => void;
+}
diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php
index 20ce3be..6ed7979 100644
--- a/resources/views/app.blade.php
+++ b/resources/views/app.blade.php
@@ -33,13 +33,20 @@
+
+
+
+
+
+
+
@fonts
@viteReactRefresh
@vite(['resources/css/app.css', 'resources/js/app.tsx', "resources/js/pages/{$page['component']}.tsx"])
- {{ config('app.name', 'Laravel') }}
+ {{ config('app.name', 'DST Collection') }}
diff --git a/vite.config.ts b/vite.config.ts
index b855732..1848be5 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -5,6 +5,7 @@ import react from '@vitejs/plugin-react';
import laravel from 'laravel-vite-plugin';
import { bunny } from 'laravel-vite-plugin/fonts';
import { defineConfig } from 'vite';
+import { VitePWA } from 'vite-plugin-pwa';
export default defineConfig({
plugins: [
@@ -27,5 +28,52 @@ export default defineConfig({
wayfinder({
formVariants: true,
}),
+ VitePWA({
+ registerType: 'autoUpdate',
+ includeAssets: ['favicon.ico', 'favicon.svg', 'apple-touch-icon.png', 'assets/logo.png'],
+ manifest: false,
+ workbox: {
+ globPatterns: ['**/*.{js,css,html,ico,png,svg,woff,woff2}'],
+ runtimeCaching: [
+ {
+ urlPattern: /^https:\/\/fonts\.bunny\.net\/.*/i,
+ handler: 'CacheFirst',
+ options: {
+ cacheName: 'bunny-fonts-cache',
+ expiration: {
+ maxEntries: 10,
+ maxAgeSeconds: 60 * 60 * 24 * 365,
+ },
+ },
+ },
+ {
+ urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
+ handler: 'CacheFirst',
+ options: {
+ cacheName: 'google-fonts-cache',
+ expiration: {
+ maxEntries: 10,
+ maxAgeSeconds: 60 * 60 * 24 * 365,
+ },
+ },
+ },
+ {
+ urlPattern: /\/api\/.*/i,
+ handler: 'NetworkFirst',
+ options: {
+ cacheName: 'api-cache',
+ networkTimeoutSeconds: 10,
+ expiration: {
+ maxEntries: 50,
+ maxAgeSeconds: 60 * 60 * 24,
+ },
+ },
+ },
+ ],
+ },
+ devOptions: {
+ enabled: false,
+ },
+ }),
],
});