Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 10 additions & 21 deletions src/app/[org]/env-new/page.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,14 @@
"use client";

import { EnvironmentCreationForm } from "@/components/env/env-creation-form";
import { authClient } from "@/lib/auth-client";
import { useRouter } from "next/navigation";
import { useEffect } from "react";

import { TakingABreak } from "@/components/taking-a-break";

/**
* humanlog.io is taking a break, so no new environments — creating one used to
* open a Stripe subscription (OrganizationService.CreateEnvironment). The
* backend refuses that RPC independently; this is the front door only.
*
* See https://www.webscale.lol/blog/humanlog-retro
*/
export default function NewEnvironmentPage() {
const router = useRouter();
const { useActiveOrganization } = authClient;
const { data: activeOrganization } = useActiveOrganization();

useEffect(() => {
if (!activeOrganization) return;
const url = `/${activeOrganization.slug}/env-new`;
router.replace(url);
}, [activeOrganization]);

return (
<div className="container py-6">
<h1 className="mb-6 text-3xl font-bold">Create a new environment</h1>
<EnvironmentCreationForm orgId={activeOrganization?.id} />
</div>
<TakingABreak description="The hosted app is closed, so there are no new environments to create. The free subscriptions created at signup are being cancelled and there is nothing owed." />
);
}
25 changes: 7 additions & 18 deletions src/app/create-org/page.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,12 @@
"use client";

import { CreateOrg } from "@/components/organization/create-org";
import { toast } from "sonner";
import { useRouter } from "next/navigation";
import { authClient } from "@/lib/auth-client";
import { TakingABreak } from "@/components/taking-a-break";

/**
* humanlog.io is taking a break, so organization creation is closed.
*
* See https://www.webscale.lol/blog/humanlog-retro
*/
export default function CreateOrgPage() {
const router = useRouter();
const { useActiveOrganization } = authClient;
const { data: activeOrganization } = useActiveOrganization();

const onSuccess = () => {
toast.success("Organization created successfully");
router.push(`/${activeOrganization?.slug}/localhost/query`);
};

return (
<div className="flex h-full w-full items-center justify-center">
<CreateOrg title="Create your organization" onSuccess={onSuccess} />
</div>
<TakingABreak description="The hosted app is closed, so there are no new organizations to create. The log parser is being open-sourced, and the observability tool is moving to a new project called minitape." />
);
}
6 changes: 4 additions & 2 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { OTELProvider } from "@/context/otel-provider";
import { PostHogProvider } from "@/context/posthog-provider";
import { TooltipProvider } from "@/components/ui/tooltip";
import { Header } from "@/components/header";
import { BreakBanner } from "@/components/break-banner";
import { Suspense } from "react";

export const metadata: Metadata = {
Expand Down Expand Up @@ -51,9 +52,10 @@ export default function RootLayout({
<div className="flex-none">
<Header />
</div>
<div className="mt-12 flex flex-1 flex-col">
{children}
<div className="mt-12 flex-none">
<BreakBanner />
</div>
<div className="flex flex-1 flex-col">{children}</div>
<PageFooter />
</div>
</Suspense>
Expand Down
27 changes: 7 additions & 20 deletions src/app/onboarding/create-org/page.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,12 @@
"use client";

import { toast } from "sonner";
import { useRouter } from "next/navigation";
import { CreateOrg } from "@/components/organization/create-org";
import { authClient } from "@/lib/auth-client";
import { TakingABreak } from "@/components/taking-a-break";

/**
* humanlog.io is taking a break, so onboarding is closed.
*
* See https://www.webscale.lol/blog/humanlog-retro
*/
export default function OnboardingCreateOrgPage() {
const { useActiveOrganization } = authClient;
const { data: activeOrganization } = useActiveOrganization();
const router = useRouter();

const onSuccess = () => {
toast.success("Organization created successfully");
router.push(`/${activeOrganization?.slug}/localhost/query`);

// TODO
// router.push("/onboarding/pricing");
};
return (
<div className="flex h-full w-full items-center justify-center">
<CreateOrg title="Create your first organization" onSuccess={onSuccess} />
</div>
<TakingABreak description="The hosted app is closed, so there’s no onboarding to finish. The log parser is being open-sourced, and the observability tool is moving to a new project called minitape." />
);
}
19 changes: 8 additions & 11 deletions src/app/onboarding/pricing/page.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
"use client";
import { TakingABreak } from "@/components/taking-a-break";

import OnboardingPricing from "@/components/onboarding/pricing";

export default function OnboardingPage() {
/**
* humanlog.io is taking a break, so there is no plan to pick.
*
* See https://www.webscale.lol/blog/humanlog-retro
*/
export default function OnboardingPricingPage() {
return (
<div className="fixed inset-0 z-50 flex items-center justify-center p-4">
<div className="absolute inset-0 bg-black/50 dark:bg-black/70" />

<div className="relative w-full max-w-md space-y-8 rounded-xl bg-white p-8 shadow-2xl dark:border dark:border-gray-700 dark:bg-black">
<OnboardingPricing />
</div>
</div>
<TakingABreak description="There’s nothing to buy — the hosted app is winding down and the free subscriptions created at signup are being cancelled." />
);
}
23 changes: 10 additions & 13 deletions src/app/pricing/page.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
"use client";

import { useQuery } from "@connectrpc/connect-query";
import { listProduct } from "api/js/svc/product/v1/service-ProductService_connectquery";
import Pricing from "@/components/pricing";

export default function Page() {
const { isLoading, data } = useQuery(listProduct, { category: "logging" });
import { TakingABreak } from "@/components/taking-a-break";

/**
* humanlog.io is taking a break, so there are no plans to show and no checkout
* to enter. The pricing components are left in the tree for whenever the lights
* come back on.
*
* See https://www.webscale.lol/blog/humanlog-retro
*/
export default function PricingPage() {
return (
<Pricing
isLoading={isLoading}
defaultProduct={data?.defaultProduct}
products={data?.items}
/>
<TakingABreak description="There’s nothing to buy — the hosted app is winding down and the free subscriptions created at signup are being cancelled. The log parser is being open-sourced, and the observability tool is moving to a new project called minitape." />
);
}
46 changes: 12 additions & 34 deletions src/app/sign-in/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,16 @@
"use client";

import { useFeatureFlag } from "@/hooks/useFeatureFlag";
import { ChevronLeft } from "lucide-react";
import { useRouter } from "next/navigation";
import { useEffect } from "react";

export default function SignInLayout({
children,
}: {
children: React.ReactNode;
}) {
const router = useRouter();

const { flagEnabled: isAuthMigrationReady, isLoading } =
useFeatureFlag("release_auth_temp");

useEffect(() => {
if (!isLoading && !isAuthMigrationReady) {
router.replace("/");
}
}, [isLoading, isAuthMigrationReady, router]);

if (isLoading || !isAuthMigrationReady) return null;
import { TakingABreak } from "@/components/taking-a-break";

/**
* humanlog.io is taking a break, so there is nothing to sign in to.
*
* The notice replaces `children` entirely rather than gating it, so every route
* under /sign-in (including the password-reset flow) lands on it. The
* underlying pages are left in place for whenever the lights come back on.
*
* See https://www.webscale.lol/blog/humanlog-retro
*/
export default function SignInLayout() {
return (
<div className="relative flex h-full w-full flex-col items-center justify-center">
<button
className="text-muted-foreground absolute top-5 left-6 flex items-center gap-1 text-xs"
onClick={() => router.back()}
>
<ChevronLeft size={15} />
Back
</button>
<div className="w-[320px]">{children}</div>
</div>
<TakingABreak description="Sign-in is closed — the hosted app is winding down. The log parser is being open-sourced, and the observability tool is moving to a new project called minitape." />
);
}
46 changes: 12 additions & 34 deletions src/app/sign-up/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,16 @@
"use client";

import { useFeatureFlag } from "@/hooks/useFeatureFlag";
import { ChevronLeft } from "lucide-react";
import { useRouter } from "next/navigation";
import { useEffect } from "react";

export default function SignUpLayout({
children,
}: {
children: React.ReactNode;
}) {
const router = useRouter();

const { flagEnabled: isAuthMigrationReady, isLoading } =
useFeatureFlag("release_auth_temp");

useEffect(() => {
if (!isLoading && !isAuthMigrationReady) {
router.replace("/");
}
}, [isLoading, isAuthMigrationReady, router]);

if (isLoading || !isAuthMigrationReady) return null;
import { TakingABreak } from "@/components/taking-a-break";

/**
* humanlog.io is taking a break, so we're not accepting new signups.
*
* The notice replaces `children` entirely rather than gating it, so every route
* under /sign-up lands on it. The underlying pages are left in place for
* whenever the lights come back on.
*
* See https://www.webscale.lol/blog/humanlog-retro
*/
export default function SignUpLayout() {
return (
<div className="relative flex h-full w-full flex-col items-center justify-center">
<button
className="text-muted-foreground absolute top-5 left-6 flex items-center gap-1 text-xs"
onClick={() => router.back()}
>
<ChevronLeft size={15} />
Back
</button>
{children}
</div>
<TakingABreak description="We're not accepting new signups — the hosted app is winding down. The log parser is being open-sourced, and the observability tool is moving to a new project called minitape." />
);
}
Loading
Loading