> ## Documentation Index
> Fetch the complete documentation index at: https://cometchat-22654f5b-docs-rn-guide-message-privately.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# User Management

> Create and update CometChat users with the JavaScript SDK and REST API.

When a user logs into your app, you need to programmatically login the user into CometChat. But before you log in the user to CometChat, you need to create the user.

Summing up-

**When a user registers in your app**

1. You add the user details in your database
2. You create a user in CometChat

**When a user logs into your app**

1. You log in the user to your app
2. You [log in the user in CometChat](/sdk/javascript/authentication-overview) (programmatically)

## Creating a User

Ideally, user creation should take place at your backend. You can refer our Rest API to learn more about [creating a user](https://api-explorer.cometchat.com/reference/creates-user) and use the appropriate code sample based on your backend language.

However, if you wish to create users on the fly, you can use the `createUser()` method. This method takes a `User` object and the `Auth Key` as input parameters and returns the created `User` object if the request is successful.

<Tabs>
  <Tab title="TypeScript">
    ```typescript theme={null}
    let authKey: string = "AUTH_KEY";
    let uid: string = "user1";
    let name: string = "Kevin";

    let user: CometChat.User = new CometChat.User(uid);

    user.setName(name);

    CometChat.createUser(user, authKey).then(
    (user: CometChat.User) => {
    console.log("user created", user);
    }, (error: CometChat.CometChatException) => {
    console.log("error", error);
    }
    );

    ```
  </Tab>
</Tabs>

<Warning>
  UID can be alphanumeric with underscore and hyphen. Spaces, punctuation and other special characters are not allowed.
</Warning>

## Updating a user

Updating a user similar to creating a user should ideally be achieved at your backend using the Restful APIs. For more information, you can check the [update a user](https://api-explorer.cometchat.com/reference/update-user) section. However, this can be achieved on the fly as well as using the `updateUser()` method. This method takes a `User` object and the `Auth Key` as inputs and returns the updated `User` object on the successful execution of the request.

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={null}
    let authKey = "AUTH_KEY";
    let uid = "user1";
    let name = "Kevin";

    let user = new CometChat.User(uid);

    user.setName(name);

    CometChat.createUser(user, authKey).then(
      user => {
        console.log("user created", user);
      }, error => {
        console.log("error", error);
      }
    )
    ```
  </Tab>
</Tabs>

Returns a [`User`](/sdk/reference/entities#user) object. See [User Class](#user-class) for all available fields.

<Warning>
  UID can be alphanumeric with underscore and hyphen. Spaces, punctuation and other special characters are not allowed.
</Warning>

## Updating a User

Like creation, user updates should ideally happen on your backend via the [REST API](https://api-explorer.cometchat.com/reference/update-user).

For client-side updates (development only), use `updateUser()`:

<Tabs>
  <Tab title="TypeScript">
    ```typescript theme={null}
    let authKey: string = "AUTH_KEY";
    let uid: string = "user1";
    let name: string = "Kevin Fernandez";

    let user: CometChat.User = new CometChat.User(uid);

    user.setName(name);

    CometChat.updateUser(user, authKey).then(
    (user: CometChat.User) => {
    console.log("user updated", user);
    }, (error: CometChat.CometChatException) => {
    console.log("error", error);
    }
    )

    ```
  </Tab>

  <Tab title="JavaScript">
    ```javascript theme={null}
    let authKey = "AUTH_KEY";
    let uid = "user1";
    let name = "Kevin Fernandez";

    let user = new CometChat.User(uid);

    user.setName(name);

    CometChat.updateUser(user, authKey).then(
      user => {
        console.log("user updated", user);
      }, error => {
        console.log("error", error);
      }
    )
    ```
  </Tab>
</Tabs>

Ensure the [`User`](/sdk/reference/entities#user) object has the correct `UID` set.

Returns a [`User`](/sdk/reference/entities#user) object. See [User Class](#user-class) for all available fields.

## Updating Logged-in User

Use `updateCurrentUserDetails()` to update the current user without an Auth Key. Note: You cannot update the user's role with this method.

<Tabs>
  <Tab title="TypeScript">
    ```typescript theme={null}
    let uid: string = "user1";
    let name: string = "Kevin Fernandez";

    let user: CometChat.User = new CometChat.User(uid);

    user.setName(name);

    CometChat.updateCurrentUserDetails(user).then(
    (user: CometChat.User) => {
    console.log("user updated", user);
    }, (error: CometChat.CometChatException) => {
    console.log("error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript">
    ```javascript theme={null}
    let uid = "user1";
    let name = "Kevin Fernandez";

    let user = new CometChat.User(uid);

    user.setName(name);

    CometChat.updateCurrentUserDetails(user).then(
      user => {
        console.log("user updated", user);
      }, error => {
        console.log("error", error);
      }
    )
    ```
  </Tab>
</Tabs>

The method returns a [`User`](/sdk/reference/entities#user) object.

## Deleting a user

Deleting a user can only be achieved via the Restful APIs. For more information please check the [delete a user](https://api-explorer.cometchat.com/reference/delete-user) section.

## User Class

| Field         | Editable                                            | Information                                                          |
| ------------- | --------------------------------------------------- | -------------------------------------------------------------------- |
| uid           | specified on user creation. Not editable after that | Unique identifier of the user                                        |
| name          | Yes                                                 | Display name of the user                                             |
| avatar        | Yes                                                 | URL to profile picture of the user                                   |
| link          | Yes                                                 | URL to profile page                                                  |
| role          | Yes                                                 | User role of the user for role based access control                  |
| metadata      | Yes                                                 | Additional information about the user as JSON                        |
| status        | No                                                  | Status of the user. Could be either online/offline                   |
| statusMessage | Yes                                                 | Any custom status message that needs to be set for a user            |
| lastActiveAt  | No                                                  | The unix timestamp of the time the user was last active.             |
| hasBlockedMe  | No                                                  | A boolean that determines if the user has blocked the logged in user |
| blockedByMe   | No                                                  | A boolean that determines if the logged in user has blocked the user |
| tags          | Yes                                                 | A list of tags to identify specific users                            |

## Next Steps

<CardGroup cols={2}>
  <Card title="Retrieve Users" icon="users" href="/sdk/javascript/retrieve-users">
    Fetch and filter user lists with pagination.
  </Card>

  <Card title="User Presence" icon="circle-dot" href="/sdk/javascript/user-presence">
    Monitor real-time online/offline status.
  </Card>

  <Card title="Block Users" icon="ban" href="/sdk/javascript/block-users">
    Block and unblock users.
  </Card>

  <Card title="Authentication" icon="key" href="/sdk/javascript/authentication-overview">
    Log users into CometChat.
  </Card>
</CardGroup>
