Fix local dev bug; bump to v0.0.17 (#230)
This commit is contained in:
parent
03fd3588ef
commit
3d38b89c32
@ -2,7 +2,7 @@
|
|||||||
"name": "open-seo",
|
"name": "open-seo",
|
||||||
"private": true,
|
"private": true,
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"version": "0.0.16",
|
"version": "0.0.17",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"packageManager": "pnpm@10.30.1",
|
"packageManager": "pnpm@10.30.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
11
release-notes/v0.0.17.md
Normal file
11
release-notes/v0.0.17.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
Bug fixes and an internal code cleanup.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Fixed an infinite redirect loop between `/verify-email` and the app when `BYPASS_EMAIL_VERIFICATION=true` (local dev). The email-verification bypass is now honored consistently across the auth route guard, onboarding redirect, and verify-email page. Production behavior is unchanged.
|
||||||
|
|
||||||
|
## Improved
|
||||||
|
|
||||||
|
- Simplified complex client code across audit, backlinks, domain, keywords, and rank-tracking features (removed single-use wrappers, dead helpers, and redundant guards) while preserving type safety and behavior.
|
||||||
|
|
||||||
|
Full Changelog: https://github.com/every-app/open-seo/compare/v0.0.16...v0.0.17
|
||||||
@ -1,7 +1,10 @@
|
|||||||
import { useNavigate } from "@tanstack/react-router";
|
import { useNavigate } from "@tanstack/react-router";
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { useSession } from "@/lib/auth-client";
|
import { useSession } from "@/lib/auth-client";
|
||||||
import { isHostedClientAuthMode } from "@/lib/auth-mode";
|
import {
|
||||||
|
isEmailVerificationBypassed,
|
||||||
|
isHostedClientAuthMode,
|
||||||
|
} from "@/lib/auth-mode";
|
||||||
import {
|
import {
|
||||||
getCurrentAuthRedirectFromHref,
|
getCurrentAuthRedirectFromHref,
|
||||||
getSignInSearch,
|
getSignInSearch,
|
||||||
@ -12,6 +15,8 @@ export function useHostedAuthRouteGuard() {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { data: session, isPending } = useSession();
|
const { data: session, isPending } = useSession();
|
||||||
const isHostedMode = isHostedClientAuthMode();
|
const isHostedMode = isHostedClientAuthMode();
|
||||||
|
const emailVerified =
|
||||||
|
session?.user?.emailVerified === true || isEmailVerificationBypassed();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isPending || !isHostedMode) {
|
if (isPending || !isHostedMode) {
|
||||||
@ -29,7 +34,7 @@ export function useHostedAuthRouteGuard() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!session.user.emailVerified) {
|
if (!emailVerified) {
|
||||||
void navigate({
|
void navigate({
|
||||||
to: "/verify-email",
|
to: "/verify-email",
|
||||||
search: getVerifyEmailSearch(session.user.email, redirectTo),
|
search: getVerifyEmailSearch(session.user.email, redirectTo),
|
||||||
@ -39,16 +44,14 @@ export function useHostedAuthRouteGuard() {
|
|||||||
}, [
|
}, [
|
||||||
isPending,
|
isPending,
|
||||||
isHostedMode,
|
isHostedMode,
|
||||||
|
emailVerified,
|
||||||
session?.user?.email,
|
session?.user?.email,
|
||||||
session?.user?.emailVerified,
|
|
||||||
session?.user?.id,
|
session?.user?.id,
|
||||||
navigate,
|
navigate,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const hasVerifiedHostedSession =
|
const hasVerifiedHostedSession =
|
||||||
!isPending &&
|
!isPending && Boolean(session?.user?.id) && emailVerified;
|
||||||
Boolean(session?.user?.id) &&
|
|
||||||
session?.user?.emailVerified === true;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
isHostedMode,
|
isHostedMode,
|
||||||
|
|||||||
@ -3,13 +3,17 @@ import { useNavigate } from "@tanstack/react-router";
|
|||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { onboardingAnswersQueryOptions } from "@/client/features/onboarding/onboardingModel";
|
import { onboardingAnswersQueryOptions } from "@/client/features/onboarding/onboardingModel";
|
||||||
import { useSession } from "@/lib/auth-client";
|
import { useSession } from "@/lib/auth-client";
|
||||||
import { isHostedClientAuthMode } from "@/lib/auth-mode";
|
import {
|
||||||
|
isEmailVerificationBypassed,
|
||||||
|
isHostedClientAuthMode,
|
||||||
|
} from "@/lib/auth-mode";
|
||||||
|
|
||||||
export function useOnboardingRedirect() {
|
export function useOnboardingRedirect() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { data: session } = useSession();
|
const { data: session } = useSession();
|
||||||
const isHostedMode = isHostedClientAuthMode();
|
const isHostedMode = isHostedClientAuthMode();
|
||||||
const isEmailVerified = session?.user?.emailVerified === true;
|
const isEmailVerified =
|
||||||
|
session?.user?.emailVerified === true || isEmailVerificationBypassed();
|
||||||
const onboardingQuery = useQuery({
|
const onboardingQuery = useQuery({
|
||||||
...onboardingAnswersQueryOptions(),
|
...onboardingAnswersQueryOptions(),
|
||||||
enabled: isHostedMode && Boolean(session?.user?.id) && isEmailVerified,
|
enabled: isHostedMode && Boolean(session?.user?.id) && isEmailVerified,
|
||||||
|
|||||||
@ -22,3 +22,7 @@ export function isHostedClientAuthMode() {
|
|||||||
// AUTH_MODE=hosted in both the client build environment and the runtime.
|
// AUTH_MODE=hosted in both the client build environment and the runtime.
|
||||||
return isHostedAuthMode(import.meta.env.AUTH_MODE);
|
return isHostedAuthMode(import.meta.env.AUTH_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isEmailVerificationBypassed() {
|
||||||
|
return import.meta.env.BYPASS_EMAIL_VERIFICATION === "true";
|
||||||
|
}
|
||||||
|
|||||||
@ -8,7 +8,10 @@ import {
|
|||||||
} from "@/client/features/auth/AuthPage";
|
} from "@/client/features/auth/AuthPage";
|
||||||
import { captureClientEvent } from "@/client/lib/posthog";
|
import { captureClientEvent } from "@/client/lib/posthog";
|
||||||
import { authClient, useSession } from "@/lib/auth-client";
|
import { authClient, useSession } from "@/lib/auth-client";
|
||||||
import { isHostedClientAuthMode } from "@/lib/auth-mode";
|
import {
|
||||||
|
isEmailVerificationBypassed,
|
||||||
|
isHostedClientAuthMode,
|
||||||
|
} from "@/lib/auth-mode";
|
||||||
import { getSignInSearch, normalizeAuthRedirect } from "@/lib/auth-redirect";
|
import { getSignInSearch, normalizeAuthRedirect } from "@/lib/auth-redirect";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
@ -102,8 +105,7 @@ function VerifyEmailPage() {
|
|||||||
const redirectTo = normalizeAuthRedirect(search.redirect);
|
const redirectTo = normalizeAuthRedirect(search.redirect);
|
||||||
const isHostedMode = isHostedClientAuthMode();
|
const isHostedMode = isHostedClientAuthMode();
|
||||||
const { data: session, isPending } = useSession();
|
const { data: session, isPending } = useSession();
|
||||||
const bypassEmailVerification =
|
const bypassEmailVerification = isEmailVerificationBypassed();
|
||||||
import.meta.env.BYPASS_EMAIL_VERIFICATION === "true";
|
|
||||||
const errorMessage = getVerificationErrorMessage(search.error);
|
const errorMessage = getVerificationErrorMessage(search.error);
|
||||||
const verificationIssueType = search.error
|
const verificationIssueType = search.error
|
||||||
? verificationIssueSchema.parse(search.error)
|
? verificationIssueSchema.parse(search.error)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user