Generics

The stream-chat-js library takes advantage of TypeScript generics to make it possible to define custom file ids on the following entities:

  1. Attachment
  2. ChannelResponse
  3. CommandVariants
  4. Event
  5. MessageBase
  6. Reaction
  7. User

Those 7 overrides are combined to a single generic parameter called DefaultGenerics.

The Angular SDK extends the DefaultGenerics with custom fields creating the DefaultStreamChatGenerics type.

You can further extend the DefaultStreamChatGenerics type with your own custom fields, both the ChatClientService and ChannelService accepts a generic parameter.

Here is an example about custom fields with generics:

import { Component, OnInit } from "@angular/core";
import {
  ChatClientService,
  ChannelService,
  StreamI18nService,
  DefaultStreamChatGenerics,
} from "stream-chat-angular";
import { environment } from "../environments/environment";

type MyStreamGenerics = DefaultStreamChatGenerics & {
  attachmentType: { lat?: string; lon?: string };
  channelType: {
    color: string;
    topic: "gardening" | "cats" | "f1";
  };
  userType: {
    nickname: string;
  };
  messageType: {
    isSecret: boolean;
  };
  reactionType: {
    onlyVisibleToSender: boolean;
  };
};

@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.scss"],
})
export class AppComponent implements OnInit {
  constructor(
    private chatService: ChatClientService<MyStreamGenerics>,
    private channelService: ChannelService<MyStreamGenerics>,
    private streamI18nService: StreamI18nService,
  ) {
    void this.chatService.init(
      environment.apiKey,
      { id: environment.userId, nickname: "Zizi" },
      environment.userToken,
    );
    this.streamI18nService.setTranslation();
  }

  async ngOnInit() {
    await this.channelService.init({
      type: "messaging",
      topic: "cats",
    });
    const channel = this.chatService.chatClient.channel(
      "messaging",
      "cat-photos",
      { color: "blue", topic: "cats", name: "The bes cat photos" },
    );

    await channel.create();
    await this.channelService.sendMessage(
      "This is a secret message",
      [{ type: "geolocation", lat: "40.7128", lon: "74.0060" }],
      [],
      undefined,
      undefined,
      { isSecret: true },
    );
    const message = channel.state.messages[0];
    this.channelService.addReaction(message.id, "like", {
      onlyVisibleToSender: true,
    });
  }
}
© Getstream.io, Inc. All Rights Reserved.