* added lockedSMS to future routes * add orgMigrations routes to future * correct metadata * small fix * add orgMigrations to future * Move components to client components * Remove tRPC element from edit user RSC * Get username for meta * Remove suspense query * Remove orgMigrations from app router * Type fix * Revert "Remove suspense query" This reverts commit eadd814f6e4a5d6856d9218342b7909c22fe62c6. * Handle suspenseQuery in app router * User edit page, fetch data server side * Update yarn.lock * Export getFixedT * Set PageWrapper as root layout for settings * Settings Layout accepts strings for shell heading * Add OOO to app router settings * Refactor layout for my-account pages * Remove instances of pages router from my-account * Refactor security pages * Add billing to app router * Add admin API link to layout * Add api keys page * Webhooks WIP * Refactor SettingsHeader to client component * Add webhook pages * Refactor API keys page * Add admin app page * Type fix * fix types * fix developer/webhooks/[id] param value type error * remove unnecessary code * do not pass t prop to CreateNewWebhookButton * fix type errors in webhook-edit-view * fix the remaining type errors * do not use prisma directly in generateMetadata * remove use client if unnecessary * Remove unused shell heading from SettingsLayoutAppDir * improve metadata * fix billing page * fix import in settings/teams * Use next `notFound()` * fix type check * fix type check * remove unused code * Fix calendar setting page * Separate settings pages into route groups * Refactor admin settings pages * Remove meta instance from billing page route * Update settings layoutAppDir * Refactor developer settings pages * Refactor out of office * Refactor my account settings * Refactor admin api page * Refactor security pages * Type fix * fix styling in settings layout --------- Co-authored-by: Somay Chauhan <somaychauhan98@gmail.com> Co-authored-by: Omar López <zomars@me.com> Co-authored-by: Benny Joo <sldisek783@gmail.com>
74 lines
2.3 KiB
TypeScript
74 lines
2.3 KiB
TypeScript
"use client";
|
|
|
|
import { usePathname, useRouter } from "next/navigation";
|
|
import { z } from "zod";
|
|
|
|
import NoSSR from "@calcom/core/components/NoSSR";
|
|
import { useParamsWithFallback } from "@calcom/lib/hooks/useParamsWithFallback";
|
|
import { getParserWithGeneric } from "@calcom/prisma/zod-utils";
|
|
import { trpc } from "@calcom/trpc/react";
|
|
import { showToast } from "@calcom/ui";
|
|
|
|
import LicenseRequired from "../../common/components/LicenseRequired";
|
|
import { UserForm } from "../components/UserForm";
|
|
import { userBodySchema } from "../schemas/userBodySchema";
|
|
import type { UserAdminRouterOutputs } from "../server/trpc-router";
|
|
|
|
type User = UserAdminRouterOutputs["get"]["user"];
|
|
const userIdSchema = z.object({ id: z.coerce.number() });
|
|
|
|
const UsersEditPage = () => {
|
|
const params = useParamsWithFallback();
|
|
const input = userIdSchema.safeParse(params);
|
|
|
|
if (!input.success) return <div>Invalid input</div>;
|
|
|
|
const [data] = trpc.viewer.users.get.useSuspenseQuery({ userId: input.data.id });
|
|
const { user } = data;
|
|
|
|
return (
|
|
<LicenseRequired>
|
|
<NoSSR>
|
|
<UsersEditView user={user} />
|
|
</NoSSR>
|
|
</LicenseRequired>
|
|
);
|
|
};
|
|
|
|
export const UsersEditView = ({ user }: { user: User }) => {
|
|
const pathname = usePathname();
|
|
const router = useRouter();
|
|
|
|
const utils = trpc.useUtils();
|
|
const mutation = trpc.viewer.users.update.useMutation({
|
|
onSuccess: async () => {
|
|
Promise.all([utils.viewer.users.list.invalidate(), utils.viewer.users.get.invalidate()]);
|
|
showToast("User updated successfully", "success");
|
|
router.replace(`${pathname?.split("/users/")[0]}/users`);
|
|
},
|
|
onError: (err) => {
|
|
console.error(err.message);
|
|
showToast("There has been an error updating this user.", "error");
|
|
},
|
|
});
|
|
return (
|
|
<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}
|
|
/>
|
|
);
|
|
};
|
|
|
|
export default UsersEditView;
|