---
id: user_presence
sidebar_position: 5
title: User Presence
---

User presence allows you to show when a user was last active and if they are online right now.
Whenever you read a user the data will look like this:

```json
{
    id: 'unique_user_id',
    online: true,
    status: 'Eating a veggie burger...',
    last_active: '2019-01-07T13:17:42.375Z'
}
```

Notes:

1. The online field indicates if the user is online. The status field stores text indicating the current user status.
2. The last_active field is updated when a user connects and then refreshed every 15 minutes.

### Invisible

To mark a user invisible simply set the invisible property to true. You can also set a custom status message at the same time:

```dart
await client.connectUser(
    User(
      id: 'super-band-9',
      extraData: {
        'invisible': true,
      },
    ),
    'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic3VwZXItYmFuZC05In0.0L6lGoeLwkz0aZRUcpZKsvaXtNEDHBcezVTZ0oPq40A',
  );
```

Notes:

1. When invisible is set to true, the current user will appear as offline to other users.

### Listening to Presence Changes

Of course, you want to listen to the user presence changes. This allows you to show a user as offline when they leave and update their status in real time.
These 3 endpoints allow you to watch user presence:

```dart
// If you pass presence: true to channel.watch it will watch the list of user presence changes.
// Note that you can listen to at most 10 users using this API call
final channel = client.channel(
  'messaging',
  id: 'flutterdevs',
  extraData: {
    'name': 'Flutter devs',
  },
);


await channel.watch({
  'presence': true,
});

// queryChannels allows you to listen to the members of the channels that are returned
// so this does the same thing as above and listens to online status changes for john and jack

final filter = Filter.in_('members', ['john']);

final sort = [SortOption("last_message_at", direction: SortOption.DESC)];

final channels = await client.queryChannels(
  filter: filter,
  sort: sort,
  options: {
    'presence': true,
  },
);

// queryUsers allows you to listen to user presence changes for john and jack
final result = await client.queryUsers(
  filter: Filter.in_('id', ['john', 'jack', 'jessie']),
  sort: [SortOption('last_active')],
  pagination: PaginationParams(
    offset: 0,
    limit: 20,
  ),
  options: {
    'presence': true,
  },
);
```