2023-08-02 09:35:48 +00:00
|
|
|
import { usePathname, useRouter } from "next/navigation";
|
2023-04-15 00:04:48 +00:00
|
|
|
import { z } from "zod";
|
|
|
|
|
|
|
|
import NoSSR from "@calcom/core/components/NoSSR";
|
2023-08-02 09:35:48 +00:00
|
|
|
import { useParamsWithFallback } from "@calcom/lib/hooks/useParamsWithFallback";
|
2023-04-15 00:04:48 +00:00
|
|
|
import { getParserWithGeneric } from "@calcom/prisma/zod-utils";
|
|
|
|
import { trpc } from "@calcom/trpc/react";
|
|
|
|
import { Meta, showToast } from "@calcom/ui";
|
|
|
|
|
|
|
|
import { getLayout } from "../../../settings/layouts/SettingsLayout";
|
2023-04-19 14:15:08 +00:00
|
|
|
import LicenseRequired from "../../common/components/LicenseRequired";
|
2023-04-15 00:04:48 +00:00
|
|
|
import { UserForm } from "../components/UserForm";
|
|
|
|
import { userBodySchema } from "../schemas/userBodySchema";
|
|
|
|
|
|
|
|
const userIdSchema = z.object({ id: z.coerce.number() });
|
|
|
|
|
|
|
|
const UsersEditPage = () => {
|
2023-08-02 09:35:48 +00:00
|
|
|
const params = useParamsWithFallback();
|
|
|
|
const input = userIdSchema.safeParse(params);
|
2023-04-15 00:04:48 +00:00
|
|
|
|
|
|
|
if (!input.success) return <div>Invalid input</div>;
|
|
|
|
|
|
|
|
return <UsersEditView userId={input.data.id} />;
|
|
|
|
};
|
|
|
|
|
|
|
|
const UsersEditView = ({ userId }: { userId: number }) => {
|
2023-08-02 09:35:48 +00:00
|
|
|
const pathname = usePathname();
|
2023-04-15 00:04:48 +00:00
|
|
|
const router = useRouter();
|
|
|
|
const [data] = trpc.viewer.users.get.useSuspenseQuery({ userId });
|
|
|
|
const { user } = data;
|
|
|
|
const utils = trpc.useContext();
|
|
|
|
const mutation = trpc.viewer.users.update.useMutation({
|
|
|
|
onSuccess: async () => {
|
2023-08-02 09:35:48 +00:00
|
|
|
Promise.all([utils.viewer.users.list.invalidate(), utils.viewer.users.get.invalidate()]);
|
2023-04-15 00:04:48 +00:00
|
|
|
showToast("User updated successfully", "success");
|
2023-08-02 09:35:48 +00:00
|
|
|
router.replace(`${pathname?.split("/users/")[0]}/users`);
|
2023-04-15 00:04:48 +00:00
|
|
|
},
|
|
|
|
onError: (err) => {
|
|
|
|
console.error(err.message);
|
|
|
|
showToast("There has been an error updating this user.", "error");
|
|
|
|
},
|
|
|
|
});
|
|
|
|
return (
|
|
|
|
<LicenseRequired>
|
|
|
|
<Meta title={`Editing user: ${user.username}`} description="Here you can edit a current user." />
|
|
|
|
<NoSSR>
|
|
|
|
<UserForm
|
|
|
|
key={JSON.stringify(user)}
|
|
|
|
onSubmit={(values) => {
|
|
|
|
const parser = getParserWithGeneric(userBodySchema);
|
|
|
|
const parsedValues = parser(values);
|
|
|
|
const data: Partial<typeof parsedValues & { userId: number }> = {
|
|
|
|
...parsedValues,
|
|
|
|
userId: user.id,
|
|
|
|
};
|
|
|
|
// Don't send username if it's the same as the current one
|
|
|
|
if (user.username === data.username) delete data.username;
|
|
|
|
mutation.mutate(data);
|
|
|
|
}}
|
|
|
|
defaultValues={user}
|
|
|
|
/>
|
|
|
|
</NoSSR>
|
|
|
|
</LicenseRequired>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
UsersEditPage.getLayout = getLayout;
|
|
|
|
|
|
|
|
export default UsersEditPage;
|