("");
+
+ useEffect(() => {
+ setInviteLink(
+ `${window.location.origin}/invite/${currentUser.workspace.inviteCode}`,
+ );
+ }, [currentUser.workspace.inviteCode]);
+
+ return (
+ <>
+
+
+ Invite link
+
+
+ Anyone with this link can join this workspace.
+
+
+
+
+
+
+
+
+ {({ copied, copy }) => (
+
+ )}
+
+
+ >
+ );
+}
diff --git a/apps/client/src/features/workspace/components/members/components/workspace-members-table.tsx b/apps/client/src/features/workspace/components/members/components/workspace-members-table.tsx
new file mode 100644
index 0000000..d85da11
--- /dev/null
+++ b/apps/client/src/features/workspace/components/members/components/workspace-members-table.tsx
@@ -0,0 +1,50 @@
+import { Group, Table, Avatar, Text, Badge } from "@mantine/core";
+import { useWorkspaceMembersQuery } from "@/features/workspace/queries/workspace-query";
+import { UserAvatar } from "@/components/ui/user-avatar.tsx";
+import React from "react";
+
+export default function WorkspaceMembersTable() {
+ const { data, isLoading } = useWorkspaceMembersQuery();
+
+ return (
+ <>
+ {data && (
+
+
+
+ User
+ Status
+ Role
+
+
+
+
+ {data?.items.map((user, index) => (
+
+
+
+
+
+
+ {user.name}
+
+
+ {user.email}
+
+
+
+
+
+
+ Active
+
+
+ {user.role}
+
+ ))}
+
+
+ )}
+ >
+ );
+}
diff --git a/apps/client/src/features/workspace/components/settings/components/workspace-name-form.tsx b/apps/client/src/features/workspace/components/settings/components/workspace-name-form.tsx
new file mode 100644
index 0000000..ce06b4a
--- /dev/null
+++ b/apps/client/src/features/workspace/components/settings/components/workspace-name-form.tsx
@@ -0,0 +1,65 @@
+import { currentUserAtom } from "@/features/user/atoms/current-user-atom";
+import { useAtom } from "jotai";
+import * as z from "zod";
+import { useState } from "react";
+import { focusAtom } from "jotai-optics";
+import { updateWorkspace } from "@/features/workspace/services/workspace-service";
+import { IWorkspace } from "@/features/workspace/types/workspace.types";
+import { TextInput, Button } from "@mantine/core";
+import { useForm, zodResolver } from "@mantine/form";
+import { notifications } from "@mantine/notifications";
+
+const formSchema = z.object({
+ name: z.string().nonempty("Workspace name cannot be blank"),
+});
+
+type FormValues = z.infer;
+
+const workspaceAtom = focusAtom(currentUserAtom, (optic) =>
+ optic.prop("workspace"),
+);
+
+export default function WorkspaceNameForm() {
+ const [isLoading, setIsLoading] = useState(false);
+ const [currentUser] = useAtom(currentUserAtom);
+ const [, setWorkspace] = useAtom(workspaceAtom);
+
+ const form = useForm({
+ validate: zodResolver(formSchema),
+ initialValues: {
+ name: currentUser?.workspace?.name,
+ },
+ });
+
+ async function handleSubmit(data: Partial) {
+ setIsLoading(true);
+
+ try {
+ const updatedWorkspace = await updateWorkspace(data);
+ setWorkspace(updatedWorkspace);
+ notifications.show({ message: "Updated successfully" });
+ } catch (err) {
+ console.log(err);
+ notifications.show({
+ message: "Failed to update data",
+ color: "red",
+ });
+ }
+ setIsLoading(false);
+ }
+
+ return (
+
+ );
+}