1
-
2
1
"use client" ;
3
2
4
3
import { useEffect , useState } from "react" ;
5
4
import Image from "next/image" ;
6
5
import { Download } from "lucide-react" ;
7
6
8
-
9
7
interface BeforeInstallPromptEvent extends Event {
10
8
prompt : ( ) => Promise < void > ;
11
9
userChoice : Promise < {
@@ -16,46 +14,75 @@ interface BeforeInstallPromptEvent extends Event {
16
14
17
15
const PWAInstallButton = ( ) => {
18
16
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 ) ;
20
19
21
20
useEffect ( ( ) => {
21
+ const checkMobile = ( ) => {
22
+ setIsMobile ( window . innerWidth < 768 ) ;
23
+ } ;
24
+
25
+ checkMobile ( ) ;
26
+ window . addEventListener ( "resize" , checkMobile ) ;
27
+
22
28
const handler = ( e : Event ) => {
23
29
e . preventDefault ( ) ;
24
30
setDeferredPrompt ( e as BeforeInstallPromptEvent ) ;
25
- setShowInstall ( true ) ;
31
+ setCanInstall ( true ) ;
26
32
} ;
27
33
28
34
window . addEventListener ( "beforeinstallprompt" , handler ) ;
29
- return ( ) => window . removeEventListener ( "beforeinstallprompt" , handler ) ;
35
+
36
+ return ( ) => {
37
+ window . removeEventListener ( "resize" , checkMobile ) ;
38
+ window . removeEventListener ( "beforeinstallprompt" , handler ) ;
39
+ } ;
30
40
} , [ ] ) ;
31
41
32
42
const handleInstall = async ( ) => {
33
43
if ( ! deferredPrompt ) return ;
34
-
35
44
deferredPrompt . prompt ( ) ;
36
45
const { outcome } = await deferredPrompt . userChoice ;
37
46
if ( outcome === "accepted" ) {
38
- setShowInstall ( false ) ;
47
+ setCanInstall ( false ) ;
39
48
setDeferredPrompt ( null ) ;
40
49
}
41
50
} ;
42
51
43
- if ( ! showInstall ) return null ;
52
+ if ( ! canInstall ) return null ;
44
53
45
54
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 >
50
84
</ 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
+ </ >
59
86
) ;
60
87
} ;
61
88
0 commit comments