);
}
export function AuthPageShell({ children }: { children: React.ReactNode }) {
return (
-
-
- {children}
-
+
+ {children}
);
}
diff --git a/src/client/features/billing/HostedBillingContent.tsx b/src/client/features/billing/HostedBillingContent.tsx
index 8cb0c22..bb52885 100644
--- a/src/client/features/billing/HostedBillingContent.tsx
+++ b/src/client/features/billing/HostedBillingContent.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable max-lines */
import type { UseCustomerResult } from "autumn-js/react";
import { ExternalLink, LoaderCircle } from "lucide-react";
import { useState } from "react";
diff --git a/src/routes/_auth.sign-in.tsx b/src/routes/_auth.sign-in.tsx
index 600b057..7a435ab 100644
--- a/src/routes/_auth.sign-in.tsx
+++ b/src/routes/_auth.sign-in.tsx
@@ -23,20 +23,11 @@ export const Route = createFileRoute("/_auth/sign-in")({
component: SignInPage,
});
-function getHelperText(isHostedMode: boolean) {
- if (!isHostedMode) {
- return "Sign-in isn't available right now.";
- }
-
- return "Sign in to your OpenSEO account.";
-}
-
function SignInPage() {
const search = Route.useSearch();
const { redirectTo, isHostedMode, isSessionPending } = useAuthPageState(
search.redirect,
);
- const helperText = getHelperText(isHostedMode);
const [verificationEmail, setVerificationEmail] = useState
(
null,
);
@@ -127,19 +118,24 @@ function SignInPage() {
return (
- Need an account?{" "}
+
+
+ Forgot password?
+
Create account
-
+
) : null
}
>
@@ -150,69 +146,53 @@ function SignInPage() {
void form.handleSubmit();
}}
>
-
+ return (
+
+
field.handleChange(event.target.value)}
+ autoComplete="email"
+ disabled={!isHostedMode || isSessionPending}
+ required
+ />
+ {error ? (
+
{error}
+ ) : null}
+
+ );
+ }}
+
-
-
-
-
- Forgot password?
-
-
+ return (
+
+
field.handleChange(event.target.value)}
+ autoComplete="current-password"
+ disabled={!isHostedMode || isSessionPending}
+ required
+ />
+ {error ? (
+
{error}
+ ) : null}
+
+ );
+ }}
+
{verificationEmail ? (
@@ -251,7 +231,7 @@ function SignInPage() {
{errorMessage}
) : null}
void handleResend()}
disabled={isResending}
>
@@ -205,7 +204,7 @@ function VerifyEmailPage() {
Sign in to continue
diff --git a/src/server/lib/dataforseoClient.test.ts b/src/server/lib/dataforseoClient.test.ts
index 5e40b04..a27216d 100644
--- a/src/server/lib/dataforseoClient.test.ts
+++ b/src/server/lib/dataforseoClient.test.ts
@@ -4,10 +4,17 @@ import {
AUTUMN_SEO_DATA_TOPUP_BALANCE_FEATURE_ID,
} from "@/shared/billing";
+interface TrackCallArg {
+ customerId: string;
+ featureId: string;
+ value: number;
+ properties?: { balanceFeatureId: string };
+}
+
const { checkMock, trackMock, getOrCreateMock, isHostedServerAuthModeMock } =
vi.hoisted(() => ({
checkMock: vi.fn(),
- trackMock: vi.fn(),
+ trackMock: vi.fn<(arg: TrackCallArg) => void>(),
getOrCreateMock: vi.fn(),
isHostedServerAuthModeMock: vi.fn(),
}));
@@ -218,23 +225,17 @@ describe("meterDataforseoCall with split balances", () => {
await client.backlinks.summary(backlinksInput);
const monthlyCall = trackMock.mock.calls.find(
- (call: unknown[]) =>
- (call[0] as { featureId: string }).featureId ===
- AUTUMN_SEO_DATA_BALANCE_FEATURE_ID,
+ ([arg]) => arg.featureId === AUTUMN_SEO_DATA_BALANCE_FEATURE_ID,
);
const topupCall = trackMock.mock.calls.find(
- (call: unknown[]) =>
- (call[0] as { featureId: string }).featureId ===
- AUTUMN_SEO_DATA_TOPUP_BALANCE_FEATURE_ID,
+ ([arg]) => arg.featureId === AUTUMN_SEO_DATA_TOPUP_BALANCE_FEATURE_ID,
);
- expect(
- (monthlyCall?.[0] as { properties: { balanceFeatureId: string } })
- .properties.balanceFeatureId,
- ).toBe(AUTUMN_SEO_DATA_BALANCE_FEATURE_ID);
- expect(
- (topupCall?.[0] as { properties: { balanceFeatureId: string } })
- .properties.balanceFeatureId,
- ).toBe(AUTUMN_SEO_DATA_TOPUP_BALANCE_FEATURE_ID);
+ expect(monthlyCall![0].properties?.balanceFeatureId).toBe(
+ AUTUMN_SEO_DATA_BALANCE_FEATURE_ID,
+ );
+ expect(topupCall![0].properties?.balanceFeatureId).toBe(
+ AUTUMN_SEO_DATA_TOPUP_BALANCE_FEATURE_ID,
+ );
});
});
diff --git a/src/shared/billing.ts b/src/shared/billing.ts
index 27e65bf..f857ab9 100644
--- a/src/shared/billing.ts
+++ b/src/shared/billing.ts
@@ -6,7 +6,6 @@ export const AUTUMN_MANAGED_SERVICE_ACCESS_FEATURE_ID =
"managed_service_access";
export const AUTUMN_SEO_DATA_BALANCE_FEATURE_ID = "usage_credits";
export const AUTUMN_SEO_DATA_TOPUP_BALANCE_FEATURE_ID = "topup_credits";
-export const AUTUMN_SEO_DATA_USAGE_FEATURE_ID = "seo_data_usage";
export const AUTUMN_SEO_DATA_CREDITS_PER_USD = 1000;
export const MINIMUM_SEO_DATA_BALANCE_USD = 0.15;