diff --git a/.changeset/user-connection-status-requested-event.md b/.changeset/user-connection-status-requested-event.md new file mode 100644 index 000000000..d442e1033 --- /dev/null +++ b/.changeset/user-connection-status-requested-event.md @@ -0,0 +1,5 @@ +--- +"@slack/types": minor +--- + +feat(types): add the [`user_connection`](https://docs.slack.dev/reference/events/user_connection) and [`user_connection_status_requested`](https://docs.slack.dev/reference/events/user_connection_status_requested) event interfaces diff --git a/packages/types/src/events/index.ts b/packages/types/src/events/index.ts index a3dddebe2..1810f5402 100644 --- a/packages/types/src/events/index.ts +++ b/packages/types/src/events/index.ts @@ -87,7 +87,14 @@ import type { TeamRenameEvent, } from './team'; import type { TokensRevokedEvent } from './token'; -import type { UserChangeEvent, UserHuddleChangedEvent, UserProfileChangedEvent, UserStatusChangedEvent } from './user'; +import type { + UserChangeEvent, + UserConnectionEvent, + UserConnectionStatusRequestedEvent, + UserHuddleChangedEvent, + UserProfileChangedEvent, + UserStatusChangedEvent, +} from './user'; export * from './agent'; export * from './app'; @@ -205,6 +212,8 @@ export type SlackEvent = // TODO: url_verification event is missing, but maybe we don't need it? // NOTE: url_verification does not use the envelope, but it's also not interesting for an app developer. it's omitted. | UserChangeEvent + | UserConnectionEvent + | UserConnectionStatusRequestedEvent | UserHuddleChangedEvent | UserProfileChangedEvent | UserStatusChangedEvent diff --git a/packages/types/src/events/user.ts b/packages/types/src/events/user.ts index 3c5b61f2f..ece2d67db 100644 --- a/packages/types/src/events/user.ts +++ b/packages/types/src/events/user.ts @@ -82,6 +82,30 @@ export interface UserChangeEvent { event_ts: string; } +export type UserConnectionEvent = UserConnectionConnectEvent | UserConnectionDisconnectEvent; + +export interface UserConnectionConnectEvent { + type: 'user_connection'; + subtype: 'connect'; + user: string; + trigger_id: string; + event_ts: string; +} + +export interface UserConnectionDisconnectEvent { + type: 'user_connection'; + subtype: 'disconnect'; + user: string; + enterprise_id?: string; + event_ts: string; +} + +export interface UserConnectionStatusRequestedEvent { + type: 'user_connection_status_requested'; + user: string; + event_ts: string; +} + export interface UserHuddleChangedEvent { type: 'user_huddle_changed'; user: { diff --git a/packages/types/test/events/user.test-d.ts b/packages/types/test/events/user.test-d.ts new file mode 100644 index 000000000..d730cb5f4 --- /dev/null +++ b/packages/types/test/events/user.test-d.ts @@ -0,0 +1,43 @@ +import { expectAssignable, expectError, expectType } from 'tsd'; +import type { SlackEvent, UserConnectionEvent, UserConnectionStatusRequestedEvent } from '../../src/index'; + +const connect: UserConnectionEvent = { + type: 'user_connection', + subtype: 'connect', + user: 'U0123456789', + trigger_id: '1293638028594.1249184885746.0d121a0e01d2e7a795ecc7a62880a406', + event_ts: '1764264284.841251', +}; +expectAssignable(connect); + +const disconnect: UserConnectionEvent = { + type: 'user_connection', + subtype: 'disconnect', + enterprise_id: 'E0123456789', + user: 'U0123456789', + event_ts: '1764264317.061589', +}; +expectAssignable(disconnect); + +expectError({ + type: 'user_connection', + subtype: 'connect', + user: 'U0123456789', + event_ts: '1764264284.841251', +}); + +declare const userConnection: UserConnectionEvent; +if (userConnection.subtype === 'connect') { + expectType(userConnection.trigger_id); +} + +const statusRequested: UserConnectionStatusRequestedEvent = { + type: 'user_connection_status_requested', + user: 'U0123456789', + event_ts: '1764264284.841251', +}; +expectAssignable(statusRequested); + +expectError({ + type: 'user_connection_status_requested', +});