Skip to content

Commit

Permalink
fix: pwa prompt should be propagated via context
Browse files Browse the repository at this point in the history
  • Loading branch information
ArtemSBulgakov committed Feb 1, 2025
1 parent c4a686d commit e118dbf
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 17 deletions.
5 changes: 4 additions & 1 deletion src/app/app.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { useMe } from "@/api/accounts/user.ts";
import { AuthManager } from "@/api/helpers/AuthManager.tsx";
import { PwaPromptProvider } from "@/app/pwa-prompt.tsx";
import { queryClient } from "@/app/query-client.ts";
import { GoogleAnalytics } from "@/lib/tracking/GoogleAnalytics.tsx";
import { UserInfoTracker } from "@/lib/tracking/UserInfoTracker.tsx";
Expand All @@ -13,7 +14,9 @@ import { useTernaryDarkMode } from "usehooks-ts";
export function App({ router }: { router: Register["router"] }) {
return (
<QueryClientProvider client={queryClient}>
<AppRouter router={router} />
<PwaPromptProvider>
<AppRouter router={router} />
</PwaPromptProvider>

<YandexMetrika />
<GoogleAnalytics />
Expand Down
2 changes: 0 additions & 2 deletions src/app/entry-client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import { App } from "./app.tsx";
import { registerServiceWorker } from "./register-sw.ts";
import { getRouter } from "./router.ts";

import "./pwa-prompt.ts"; // Import here to handle event

// Init service worker
registerServiceWorker();

Expand Down
13 changes: 0 additions & 13 deletions src/app/pwa-prompt.ts

This file was deleted.

26 changes: 26 additions & 0 deletions src/app/pwa-prompt.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// null - pwa prompt is not supported by this browser or platform
// BeforeInstallPromptEvent - we can trigger the prompt with the prompt() method
import { createContext, PropsWithChildren, useContext, useState } from "react";
import { useEventListener } from "usehooks-ts";

export const PwaPromptContext = createContext<any>(null);

export function PwaPromptProvider({ children }: PropsWithChildren) {
const [deferredPrompt, setDeferredPrompt] = useState<any>(null);

useEventListener("beforeinstallprompt" as any, (e) => {
console.log(e);
// Remember the event in global variable, so we can trigger the prompt later
setDeferredPrompt(e);
});

return (
<PwaPromptContext.Provider value={deferredPrompt}>
{children}
</PwaPromptContext.Provider>
);
}

export function usePwaPrompt() {
return useContext(PwaPromptContext);
}
2 changes: 1 addition & 1 deletion src/components/dashboard/PwaWidget.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { usePwaPrompt } from "@/app/pwa-prompt.ts";
import { usePwaPrompt } from "@/app/pwa-prompt.tsx";

export function PwaWidget() {
const deferredPrompt = usePwaPrompt();
Expand Down

0 comments on commit e118dbf

Please sign in to comment.