Merge branch 'main' of github.com:formbricks/formbricks into toggle-multi-and-single-select

This commit is contained in:
Johannes
2023-08-05 15:29:39 +02:00
12 changed files with 1418 additions and 1290 deletions
File diff suppressed because it is too large Load Diff
+7 -1
View File
@@ -29,7 +29,9 @@ export default function Onboarding({ session }: OnboardingProps) {
error: isErrorEnvironment,
isLoading: isLoadingEnvironment,
} = useSWR(`/api/v1/environments/find-first`, fetcher);
const { profile } = useProfile();
const { triggerProfileMutate } = useProfileMutation();
const [formbricksResponseId, setFormbricksResponseId] = useState<ResponseId | undefined>();
const [currentStep, setCurrentStep] = useState(1);
@@ -56,28 +58,32 @@ export default function Onboarding({ session }: OnboardingProps) {
setCurrentStep(currentStep + 1);
};
const doLater = () => {
const doLater = async () => {
setCurrentStep(4);
};
const next = () => {
if (currentStep < MAX_STEPS) {
setCurrentStep((value) => value + 1);
return;
}
};
const done = async () => {
setIsLoading(true);
try {
const updatedProfile = { ...profile, onboardingCompleted: true };
await triggerProfileMutate(updatedProfile);
if (environment) {
router.push(`/environments/${environment.id}/surveys`);
return;
}
} catch (e) {
toast.error("An error occured saving your settings.");
setIsLoading(false);
console.error(e);
}
};
+6 -1
View File
@@ -57,6 +57,11 @@ const Product: React.FC<Product> = ({ done, isLoading, environmentId }) => {
toast.error("An error occured saving your settings");
console.error(e);
}
done();
};
const handleLaterClick = async () => {
done();
};
@@ -138,7 +143,7 @@ const Product: React.FC<Product> = ({ done, isLoading, environmentId }) => {
</div>
</div>
<div className="flex items-center justify-end">
<Button size="lg" className="mr-2" variant="minimal" id="product-skip" onClick={done}>
<Button size="lg" className="mr-2" variant="minimal" id="product-skip" onClick={handleLaterClick}>
I&apos;ll do it later
</Button>
<Button
@@ -2,6 +2,7 @@ import { env } from "@/env.mjs";
import { verifyPassword } from "@/lib/auth";
import { verifyToken } from "@/lib/jwt";
import { prisma } from "@formbricks/database";
import { INTERNAL_SECRET, WEBAPP_URL } from "@formbricks/lib/constants";
import type { IdentityProvider } from "@prisma/client";
import type { NextAuthOptions } from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
@@ -254,7 +255,7 @@ export const authOptions: NextAuthOptions = {
return "/auth/login?error=A%20user%20with%20this%20email%20exists%20already.";
}
await prisma.user.create({
const createdUser = await prisma.user.create({
data: {
name: user.name,
email: user.email,
@@ -362,8 +363,21 @@ export const authOptions: NextAuthOptions = {
],
},
},
include: {
memberships: true,
},
});
const teamId = createdUser.memberships?.[0]?.teamId;
if (teamId) {
fetch(`${WEBAPP_URL}/api/v1/teams/${teamId}/add_demo_product`, {
method: "POST",
headers: {
"x-api-key": INTERNAL_SECRET,
},
});
}
return true;
}
@@ -0,0 +1,25 @@
import { INTERNAL_SECRET } from "@formbricks/lib/constants";
import { createDemoProduct } from "@formbricks/lib/services/team";
import { NextResponse } from "next/server";
import { headers } from "next/headers";
import { responses } from "@/lib/api/response";
export async function POST(_: Request, { params }: { params: { teamId: string } }) {
// Check Authentication
if (headers().get("x-api-key") !== INTERNAL_SECRET) {
return responses.notAuthenticatedResponse();
}
const teamId = params.teamId;
if (teamId === undefined) {
return responses.badRequestResponse("Missing teamId");
}
try {
const demoProduct = await createDemoProduct(teamId);
return NextResponse.json(demoProduct);
} catch (err) {
throw new Error(err);
}
}
+23 -2
View File
@@ -4,6 +4,8 @@ import { populateEnvironment } from "@/lib/populate";
import { prisma } from "@formbricks/database";
import { NextResponse } from "next/server";
import { env } from "@/env.mjs";
import { Prisma } from "@prisma/client";
import { INTERNAL_SECRET, WEBAPP_URL } from "@formbricks/lib/constants";
export async function POST(request: Request) {
let { inviteToken, ...user } = await request.json();
@@ -15,7 +17,7 @@ export async function POST(request: Request) {
let inviteId;
try {
let data;
let data: Prisma.UserCreateArgs;
let invite;
if (inviteToken) {
@@ -89,7 +91,26 @@ export async function POST(request: Request) {
};
}
const userData = await prisma.user.create(data);
type UserWithMemberships = Prisma.UserGetPayload<{ include: { memberships: true } }>;
const userData = (await prisma.user.create({
...data,
include: {
memberships: true,
},
// TODO: This is a hack to get the correct types (casting), we should find a better way to do this
})) as UserWithMemberships;
const teamId = userData.memberships[0].teamId;
if (teamId) {
fetch(`${WEBAPP_URL}/api/v1/teams/${teamId}/add_demo_product`, {
method: "POST",
headers: {
"x-api-key": INTERNAL_SECRET,
},
});
}
if (inviteId) {
sendInviteAcceptedEmail(invite.creator.name, user.name, invite.creator.email);
+2
View File
@@ -27,7 +27,9 @@ export const SignupForm = () => {
if (!isValid) {
return;
}
setSigningUp(true);
try {
await createUser(
e.target.elements.name.value,
@@ -25,6 +25,7 @@ export default function CreateTeamModal({ open, setOpen }: CreateTeamModalProps)
const submitTeam = async (data) => {
setLoading(true);
const newTeam = await createTeam(data.name, (profile as any).id);
const newMemberships = await mutateMemberships();
changeEnvironmentByTeam(newTeam.id, newMemberships, router);
toast.success("Team created successfully!");