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
2 changes: 1 addition & 1 deletion .github/composite-actions/install/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ runs:
# pnpm for our dependencies
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
with:
version: 9
version: 9.11.0
- name: Setup Node.js
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
Expand Down
5 changes: 5 additions & 0 deletions apps/dashboard/src/app/account/settings/getAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ export async function getRawAccount() {
},
});

if (!res.ok) {
console.error("Error fetching account", res.status, res.statusText);
return undefined;
}

const json = await res.json();

if (json.error) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import {} from "@/components/ui/breadcrumb";
import { getAuthToken } from "../../../../../../../../../api/lib/getAuthToken";
import { loginRedirect } from "../../../../../../../../../login/loginRedirect";
import { AddPartnerForm } from "../components/client/add-partner-form.client";
import { fetchEcosystem } from "../hooks/fetchEcosystem";

export default async function AddPartnerPage({
params,
}: {
params: Promise<{ slug: string; team_slug: string }>;
}) {
const { slug, team_slug } = await params;
const authToken = await getAuthToken();

if (!authToken) {
loginRedirect(`/team/${team_slug}/~/ecosystem/${slug}`);
}

const teamSlug = team_slug;
const ecosystemSlug = slug;

try {
const ecosystem = await fetchEcosystem({
teamIdOrSlug: teamSlug,
slug: ecosystemSlug,
authToken,
});

return (
<div className="flex flex-col">
<div className="container">
<h1 className="mb-6 font-semibold text-2xl tracking-tight">
Add New Partner
</h1>
<AddPartnerForm ecosystem={ecosystem} authToken={authToken} />
</div>
</div>
);
} catch (error) {
console.error("Error fetching ecosystem:", error);
return (
<div className="container py-8">
<div className="mx-auto max-w-3xl">
<h1 className="mb-6 font-semibold text-2xl tracking-tight">Error</h1>
<p>Could not load ecosystem. Please try again.</p>
</div>
</div>
);
}
}
Original file line number Diff line number Diff line change
@@ -1,43 +1,23 @@
"use client";

import { Button } from "@/components/ui/button";
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog";
import { PlusIcon } from "lucide-react";
import { useState } from "react";
import Link from "next/link";
import type { Ecosystem } from "../../../../../types";
import { AddPartnerForm } from "./add-partner-form.client";

export function AddPartnerDialogButton(props: {
teamSlug: string;
ecosystem: Ecosystem;
authToken: string;
}) {
const [open, setOpen] = useState(false);
const addPartnerUrl = `/team/${props.teamSlug}/~/ecosystem/${props.ecosystem.slug}/configuration/add-partner`;

return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger asChild>
<Button className="gap-2 max-sm:w-full" variant="outline" size="sm">
<PlusIcon className="size-4" />
Add Partner
</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader className="mb-2">
<DialogTitle className="font-semibold text-2xl tracking-tight">
Add Partner
</DialogTitle>
</DialogHeader>
<AddPartnerForm
ecosystem={props.ecosystem}
onPartnerAdded={() => setOpen(false)}
authToken={props.authToken}
/>
</DialogContent>
</Dialog>
<Link href={addPartnerUrl} passHref>
<Button className="gap-2 max-sm:w-full" variant="outline" size="sm">
<PlusIcon className="size-4" />
Add Partner
</Button>
</Link>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ export function EcosystemPermissionsPage({
/>
<AuthOptionsSection ecosystem={ecosystem} authToken={authToken} />
{ecosystem?.permission === "PARTNER_WHITELIST" && (
<EcosystemPartnersSection ecosystem={ecosystem} authToken={authToken} />
<EcosystemPartnersSection
teamSlug={params.team_slug}
ecosystem={ecosystem}
authToken={authToken}
/>
)}
</div>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,36 @@
"use client";
import { useDashboardRouter } from "@/lib/DashboardRouter";
import { useParams } from "next/navigation";
import { toast } from "sonner";
import type { Ecosystem, Partner } from "../../../../../types";
import { useAddPartner } from "../../hooks/use-add-partner";
import { PartnerForm, type PartnerFormValues } from "./partner-form.client";

export function AddPartnerForm({
ecosystem,
onPartnerAdded,
authToken,
}: {
authToken: string;
ecosystem: Ecosystem;
onPartnerAdded: () => void;
authToken: string;
}) {
const router = useDashboardRouter();
const params = useParams();
const teamSlug = params.team_slug as string;
const ecosystemSlug = params.slug as string;

const { mutateAsync: addPartner, isPending } = useAddPartner(
{
authToken,
},
{
onSuccess: () => {
onPartnerAdded();
toast.success("Partner added successfully", {
description: "The partner has been added to your ecosystem.",
});

// Redirect to the redirect page that will take us back to the configuration page
const redirectPath = `/team/${teamSlug}/~/ecosystem/${ecosystemSlug}`;
router.push(redirectPath);
},
onError: (error) => {
const message =
Expand Down
Loading