# Join Zoom meetings and open Slack channels

Canonical HTML: https://p-hatan.com/deeplink-x/use-cases/meeting-community/

DeeplinkX 1.5.8.

An event or community screen can offer a meeting join action and a workspace channel destination. DeeplinkX builds the actions; the provider controls authentication, membership, admission, and access to the destination.

## Reusable Flutter example

```dart
import 'package:deeplink_x/deeplink_x.dart';

Future<bool> joinZoomMeeting({
  required String meetingId,
  String? password,
  String? displayName,
}) {
  final id = meetingId.trim();
  if (id.isEmpty) return Future.value(false);

  final cleanPassword = password?.trim();
  final cleanDisplayName = displayName?.trim();

  return DeeplinkX().launchAction(
    Zoom.joinMeeting(
      meetingId: id,
      password: cleanPassword == null || cleanPassword.isEmpty
          ? null
          : cleanPassword,
      displayName: cleanDisplayName == null || cleanDisplayName.isEmpty
          ? null
          : cleanDisplayName,
    ),
  );
}

Future<bool> openSlackChannel({
  required String teamId,
  required String channelId,
}) {
  final workspace = teamId.trim();
  final channel = channelId.trim();
  if (workspace.isEmpty || channel.isEmpty) return Future.value(false);

  return DeeplinkX().launchAction(
    Slack.openChannel(teamId: workspace, channelId: channel),
  );
}
```

Show validation messages in the host UI so invalid input is distinguishable from a failed handoff.

## Current example inputs and behavior

- Zoom meeting ID and password start empty; display name defaults to `DeeplinkX Guest`.
- The meeting field's `0000000000` is a placeholder to replace before launching, not a working meeting.
- Slack workspace and channel fields start empty. `T00000000` and `C00000000` are placeholder formats, not working destinations.
- Trim required fields. Reject an empty meeting ID or either missing Slack identifier. Convert empty optional password/display name to null.
- The screen prevents simultaneous launch requests and shows the final Boolean outcome.

## Configuration and limits

- Consult the [Zoom guide](/deeplink-x/apps/zoom/) and [Slack guide](/deeplink-x/apps/slack/), plus the example [Android manifest](https://github.com/DeepLinkX/DeeplinkX/blob/00d9d2c7c1affe4e2ee459a01afeba82a1480eac/example/android/app/src/main/AndroidManifest.xml) and [iOS Info.plist](https://github.com/DeepLinkX/DeeplinkX/blob/00d9d2c7c1affe4e2ee459a01afeba82a1480eac/example/ios/Runner/Info.plist).
- Use a real meeting or channel only when you have access. Do not publish private credentials or actual meeting passwords in the public hub.
- Use valid meeting IDs and a workspace/channel the user can access.
- A successful launch request does not establish that the user joined a meeting, was admitted, or viewed a channel. The destination app manages admission and channel access.

## UI behavior

- Empty required values are rejected before constructing a launch request.
- Trimmed IDs reach `ZoomJoinMeetingAction` and `SlackOpenChannelAction`.
- Empty optional Zoom values become null; a supplied display name and password are preserved after trimming.
- Placeholder destinations are clearly labeled and never advertised as live demo access.
- Pending requests prevent repeat taps; failure feedback does not claim a network or permission diagnosis that the Boolean cannot provide.

## Source code

- [MeetingCommunityPage, `_joinMeeting`, `_openChannel`](https://github.com/DeepLinkX/DeeplinkX/blob/00d9d2c7c1affe4e2ee459a01afeba82a1480eac/example/lib/use_cases/meeting_community_page.dart)
- [Launch/fallback behavior](https://github.com/DeepLinkX/DeeplinkX/blob/00d9d2c7c1affe4e2ee459a01afeba82a1480eac/lib/src/core/deeplink_x.dart)

[All use cases](/deeplink-x/use-cases/) · [Sharing and messaging](/deeplink-x/use-cases/share-message/) · [Social support links](/deeplink-x/use-cases/about-support/)

