This implements the mobile optimization agent (P3 - Enhancement) with: PWA Configuration: - Add next-pwa integration with offline caching strategies - Create web app manifest for installability - Add service worker with background sync support - Create offline fallback page Mobile Components: - BottomNav: Touch-friendly bottom navigation bar - MobileHeader: Responsive header with back navigation - InstallPrompt: Smart PWA install prompt (iOS & Android) - SwipeableCard: Gesture-based swipeable cards - PullToRefresh: Native-like pull to refresh - QRScanner: Camera-based QR code scanning Mobile Library: - camera.ts: Camera access and photo capture utilities - offline.ts: IndexedDB-based offline storage and sync - gestures.ts: Touch gesture detection (swipe, pinch, tap) - pwa.ts: PWA status, install prompts, service worker management Mobile Pages: - /m: Mobile dashboard with quick actions and stats - /m/scan: QR code scanner for plant lookup - /m/quick-add: Streamlined plant registration form - /m/profile: User profile with offline status Dependencies added: next-pwa, idb
41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
import * as React from "react"
|
|
import Router from "next/router"
|
|
import { QueryClient, QueryClientProvider, Hydrate } from "@tanstack/react-query"
|
|
import NProgress from "nprogress"
|
|
import { syncDrupalPreviewRoutes } from "next-drupal"
|
|
import "nprogress/nprogress.css"
|
|
|
|
import "styles/globals.css"
|
|
import "styles/mobile.css"
|
|
|
|
import { initPWA } from "lib/mobile/pwa"
|
|
|
|
NProgress.configure({ showSpinner: false })
|
|
|
|
Router.events.on("routeChangeStart", function (path) {
|
|
syncDrupalPreviewRoutes(path)
|
|
NProgress.start()
|
|
})
|
|
Router.events.on("routeChangeComplete", () => NProgress.done())
|
|
Router.events.on("routeChangeError", () => NProgress.done())
|
|
|
|
export default function App({ Component, pageProps }) {
|
|
const queryClientRef = React.useRef<QueryClient>()
|
|
if (!queryClientRef.current) {
|
|
queryClientRef.current = new QueryClient()
|
|
}
|
|
|
|
// Initialize PWA
|
|
React.useEffect(() => {
|
|
const cleanup = initPWA()
|
|
return cleanup
|
|
}, [])
|
|
|
|
return (
|
|
<QueryClientProvider client={queryClientRef.current}>
|
|
<Hydrate state={pageProps.dehydratedState}>
|
|
<Component {...pageProps} />
|
|
</Hydrate>
|
|
</QueryClientProvider>
|
|
)
|
|
}
|