1-
21"use client" ;
32
43import { useEffect , useState } from "react" ;
54import Image from "next/image" ;
65import { Download } from "lucide-react" ;
76
8-
97interface BeforeInstallPromptEvent extends Event {
108 prompt : ( ) => Promise < void > ;
119 userChoice : Promise < {
@@ -16,46 +14,75 @@ interface BeforeInstallPromptEvent extends Event {
1614
1715const PWAInstallButton = ( ) => {
1816 const [ deferredPrompt , setDeferredPrompt ] = useState < BeforeInstallPromptEvent | null > ( null ) ;
19- const [ showInstall , setShowInstall ] = useState ( false ) ;
17+ const [ canInstall , setCanInstall ] = useState ( false ) ;
18+ const [ isMobile , setIsMobile ] = useState ( false ) ;
2019
2120 useEffect ( ( ) => {
21+ const checkMobile = ( ) => {
22+ setIsMobile ( window . innerWidth < 768 ) ;
23+ } ;
24+
25+ checkMobile ( ) ;
26+ window . addEventListener ( "resize" , checkMobile ) ;
27+
2228 const handler = ( e : Event ) => {
2329 e . preventDefault ( ) ;
2430 setDeferredPrompt ( e as BeforeInstallPromptEvent ) ;
25- setShowInstall ( true ) ;
31+ setCanInstall ( true ) ;
2632 } ;
2733
2834 window . addEventListener ( "beforeinstallprompt" , handler ) ;
29- return ( ) => window . removeEventListener ( "beforeinstallprompt" , handler ) ;
35+
36+ return ( ) => {
37+ window . removeEventListener ( "resize" , checkMobile ) ;
38+ window . removeEventListener ( "beforeinstallprompt" , handler ) ;
39+ } ;
3040 } , [ ] ) ;
3141
3242 const handleInstall = async ( ) => {
3343 if ( ! deferredPrompt ) return ;
34-
3544 deferredPrompt . prompt ( ) ;
3645 const { outcome } = await deferredPrompt . userChoice ;
3746 if ( outcome === "accepted" ) {
38- setShowInstall ( false ) ;
47+ setCanInstall ( false ) ;
3948 setDeferredPrompt ( null ) ;
4049 }
4150 } ;
4251
43- if ( ! showInstall ) return null ;
52+ if ( ! canInstall ) return null ;
4453
4554 return (
46- < div className = "md:hidden flex items-center justify-between rounded-full bg-[#2b2343] px-4 py-2 shadow-md text-white w-fit" >
47- < div className = "flex items-center gap-3" >
48- < Image src = "/papers_logo.png" alt = "Papers App" width = { 32 } height = { 32 } />
49- < span className = "font-semibold text-lg" > Papers App</ span >
55+ < >
56+
57+ < div className = "md:hidden flex items-center justify-between rounded-full bg-[#2b2343] px-4 py-2 shadow-md text-white w-fit" >
58+ < div className = "flex items-center gap-3" >
59+ < Image src = "/papers_logo.png" alt = "Papers App" width = { 32 } height = { 32 } />
60+ < span className = "font-semibold text-lg" > Papers App</ span >
61+ </ div >
62+ < button
63+ onClick = { handleInstall }
64+ className = "ml-6 flex items-center gap-2 rounded-full border border-gray-500 bg-[#1e1e24] px-4 py-1 text-sm font-semibold transition hover:bg-[#2b2b30]"
65+ >
66+ < Download className = "h-4 w-4" />
67+ Install
68+ </ button >
69+ </ div >
70+
71+
72+ < div
73+ onClick = { handleInstall }
74+ className = "hidden md:flex items-center gap-3 rounded-full px-5 py-2 text-white cursor-pointer bg-[#130e1f] border border-[#FFFFFF26] border-[1.5px]"
75+ >
76+
77+ < Image
78+ src = "/papers_logo.png"
79+ alt = "Papers App"
80+ width = { 28 }
81+ height = { 28 }
82+ />
83+ < span className = "font-semibold text-sm" > Papers App</ span >
5084 </ div >
51- < button
52- onClick = { handleInstall }
53- className = "ml-6 flex items-center gap-2 rounded-full border border-gray-500 bg-[#1e1e24] px-4 py-1 text-sm font-semibold transition hover:bg-[#2b2b30]"
54- >
55- < Download className = "h-4 w-4" />
56- Install
57- </ button >
58- </ div >
85+ </ >
5986 ) ;
6087} ;
6188
0 commit comments