From eb0255ba7365367734a809df4ee8a9c7b678c814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikola=20Dere=C5=BEi=C4=87?= Date: Thu, 7 Mar 2024 13:18:44 +0100 Subject: [PATCH 1/2] npm: added webview detector --- package-lock.json | 6 ++++++ package.json | 1 + 2 files changed, 7 insertions(+) diff --git a/package-lock.json b/package-lock.json index 9aeb81d..1c3da12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "bcrypt": "^5.1.1", "clsx": "^2.0.0", "daisyui": "^4.5.0", + "is-ua-webview": "^1.1.2", "mongodb": "^6.3.0", "next": "^14.0.2", "next-auth": "^5.0.0-beta.4", @@ -4803,6 +4804,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-ua-webview": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-ua-webview/-/is-ua-webview-1.1.2.tgz", + "integrity": "sha512-xX3WpvJGmT0EjmGRQxs4AgaBd4EWNr4lWCWGOgd40by6DWOQZN9RIOCsEaVp41crZqzWr8AsM+2x8UC2ZAuLPA==" + }, "node_modules/is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", diff --git a/package.json b/package.json index 1c89582..e64b394 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "bcrypt": "^5.1.1", "clsx": "^2.0.0", "daisyui": "^4.5.0", + "is-ua-webview": "^1.1.2", "mongodb": "^6.3.0", "next": "^14.0.2", "next-auth": "^5.0.0-beta.4", From a4b687d1f7764de5dea576598a53c650adb3b6fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikola=20Dere=C5=BEi=C4=87?= Date: Thu, 7 Mar 2024 13:19:19 +0100 Subject: [PATCH 2/2] implemented webview detection & warning --- app/[locale]/login/page.tsx | 39 +++++++++++++++++++++++++++++++------ messages/en.json | 1 + messages/hr.json | 7 ++++--- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/app/[locale]/login/page.tsx b/app/[locale]/login/page.tsx index 8c8b87e..0a3385d 100644 --- a/app/[locale]/login/page.tsx +++ b/app/[locale]/login/page.tsx @@ -1,10 +1,13 @@ -import { FC } from 'react'; +import { FC, ReactNode } from 'react'; import { Main } from '@/app/ui/Main'; import { authConfig } from "@/app/lib/auth"; import { SignInButton } from '@/app/ui/SignInButton'; import Image from 'next/image'; import { getTranslations } from "next-intl/server"; +import isWebview from "is-ua-webview"; +import { headers } from 'next/headers' +import { ExclamationTriangleIcon } from "@heroicons/react/24/outline"; type Provider = { id: string; @@ -37,6 +40,12 @@ const Page:FC = async () => { const providers = await getProviders(); const t = await getTranslations("login-page"); + // get userAgent from NextJS + + const headersList = headers(); + const userAgent = headersList.get("user-agent") as string; + + const insideWebeview = isWebview(userAgent); return (
@@ -47,14 +56,32 @@ const Page:FC = async () => {

{t("main-card.text-1")}

{t("main-card.text-2")}

- { - Object.values(providers).map((provider) => ( -
- + // Google will refuse OAuth signin if it's inside a webview (i.e. Facebook) + insideWebeview && +
+
+ +
+
+ { + t.rich("main-card.in-app-browser-warning", { + br: () =>
, + strong: (chunks:ReactNode) => {chunks}, + hint: (chunks:ReactNode) => {chunks} + }) + }
- )) +
} + + { + Object.values(providers).map((provider) => ( +
+ +
+ )) + }