Skip to content

Commit 0dafe23

Browse files
Merge pull request #233 from rupeshhh007/staging
feat: add PWA install button for desktop version
2 parents 09e972e + 9b275e8 commit 0dafe23

File tree

3 files changed

+53
-22
lines changed

3 files changed

+53
-22
lines changed

src/components/Navbar.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import ModeToggle from "@/components/toggle-theme";
99
import { ArrowDownLeftIcon, StarIcon } from "lucide-react";
1010
import NavDropdownButton from "./NavDropdownButton";
1111
import FloatingNavbar from "./FloatingNavbar";
12+
import PWAInstallButton from "./ui/PWAInstallButton";
1213

1314
function Navbar() {
1415
const pathname = usePathname();
@@ -69,6 +70,10 @@ function Navbar() {
6970
<ModeToggle />
7071
</div>
7172

73+
<div className="hidden md:block max-w-[200px]">
74+
<PWAInstallButton />
75+
</div>
76+
7277
<Link href={pathname === "/upload" ? "/" : "/upload"}>
7378
<div className="flex items-center gap-2 rounded-full border border-[#3A3745] px-4 py-2 text-sm font-semibold text-white transition hover:bg-[#1A1823]">
7479
<ArrowDownLeftIcon className="h-4 w-4 rotate-90" />
@@ -84,7 +89,6 @@ function Navbar() {
8489
isOpen={open}
8590
onClick={() => setOpen((prev) => !prev)}
8691
/>
87-
8892
<div
8993
className={`transition-all duration-300 ease-in-out ${
9094
open ? "block" : "hidden"

src/components/screens/Info.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ function Info() {
9292
</Button>
9393
</Link>
9494
</section>
95-
<div className="z-50 flex justify-center py-4">
95+
<div className=" md:hidden z-50 flex justify-center py-4">
9696
<PWAInstallButton />
9797
</div>
9898
</>

src/components/ui/PWAInstallButton.tsx

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
21
"use client";
32

43
import { useEffect, useState } from "react";
54
import Image from "next/image";
65
import { Download } from "lucide-react";
76

8-
97
interface BeforeInstallPromptEvent extends Event {
108
prompt: () => Promise<void>;
119
userChoice: Promise<{
@@ -16,46 +14,75 @@ interface BeforeInstallPromptEvent extends Event {
1614

1715
const 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

Comments
 (0)