diff --git a/src/state/messages/convo/index.tsx b/src/state/messages/convo/index.tsx index 4c854efab8..768b731ce4 100644 --- a/src/state/messages/convo/index.tsx +++ b/src/state/messages/convo/index.tsx @@ -39,7 +39,7 @@ export function useConvoActive() { } if (!isConvoActive(ctx)) { throw new Error( - `useConvoActive must only be rendered when the Convo is ready. Current status: ${ctx.status}`, + `useConvoActive must only be rendered when the Convo is ready.`, ) } return ctx diff --git a/src/state/messages/convo/types.ts b/src/state/messages/convo/types.ts index 4615acc2d9..6ce4d40bd6 100644 --- a/src/state/messages/convo/types.ts +++ b/src/state/messages/convo/types.ts @@ -107,82 +107,88 @@ export type ConvoItem = retry: () => void } +type DeleteMessage = (messageId: string) => Promise +type SendMessage = ( + message: ChatBskyConvoSendMessage.InputSchema['message'], +) => Promise +type FetchMessageHistory = () => Promise + +export type ConvoStateUninitialized = { + status: ConvoStatus.Uninitialized + items: [] + convo: undefined + error: undefined + sender: undefined + recipients: undefined + isFetchingHistory: false + deleteMessage: undefined + sendMessage: undefined + fetchMessageHistory: undefined +} +export type ConvoStateInitializing = { + status: ConvoStatus.Initializing + items: [] + convo: undefined + error: undefined + sender: undefined + recipients: undefined + isFetchingHistory: boolean + deleteMessage: undefined + sendMessage: undefined + fetchMessageHistory: undefined +} +export type ConvoStateReady = { + status: ConvoStatus.Ready + items: ConvoItem[] + convo: ChatBskyConvoDefs.ConvoView + error: undefined + sender: AppBskyActorDefs.ProfileViewBasic + recipients: AppBskyActorDefs.ProfileViewBasic[] + isFetchingHistory: boolean + deleteMessage: DeleteMessage + sendMessage: SendMessage + fetchMessageHistory: FetchMessageHistory +} +export type ConvoStateBackgrounded = { + status: ConvoStatus.Backgrounded + items: ConvoItem[] + convo: ChatBskyConvoDefs.ConvoView + error: undefined + sender: AppBskyActorDefs.ProfileViewBasic + recipients: AppBskyActorDefs.ProfileViewBasic[] + isFetchingHistory: boolean + deleteMessage: DeleteMessage + sendMessage: SendMessage + fetchMessageHistory: FetchMessageHistory +} +export type ConvoStateSuspended = { + status: ConvoStatus.Suspended + items: ConvoItem[] + convo: ChatBskyConvoDefs.ConvoView + error: undefined + sender: AppBskyActorDefs.ProfileViewBasic + recipients: AppBskyActorDefs.ProfileViewBasic[] + isFetchingHistory: boolean + deleteMessage: DeleteMessage + sendMessage: SendMessage + fetchMessageHistory: FetchMessageHistory +} +export type ConvoStateError = { + status: ConvoStatus.Error + items: [] + convo: undefined + error: any + sender: undefined + recipients: undefined + isFetchingHistory: false + deleteMessage: undefined + sendMessage: undefined + fetchMessageHistory: undefined +} export type ConvoState = - | { - status: ConvoStatus.Uninitialized - items: [] - convo: undefined - error: undefined - sender: undefined - recipients: undefined - isFetchingHistory: false - deleteMessage: undefined - sendMessage: undefined - fetchMessageHistory: undefined - } - | { - status: ConvoStatus.Initializing - items: [] - convo: undefined - error: undefined - sender: undefined - recipients: undefined - isFetchingHistory: boolean - deleteMessage: undefined - sendMessage: undefined - fetchMessageHistory: undefined - } - | { - status: ConvoStatus.Ready - items: ConvoItem[] - convo: ChatBskyConvoDefs.ConvoView - error: undefined - sender: AppBskyActorDefs.ProfileViewBasic - recipients: AppBskyActorDefs.ProfileViewBasic[] - isFetchingHistory: boolean - deleteMessage: (messageId: string) => Promise - sendMessage: ( - message: ChatBskyConvoSendMessage.InputSchema['message'], - ) => void - fetchMessageHistory: () => void - } - | { - status: ConvoStatus.Suspended - items: ConvoItem[] - convo: ChatBskyConvoDefs.ConvoView - error: undefined - sender: AppBskyActorDefs.ProfileViewBasic - recipients: AppBskyActorDefs.ProfileViewBasic[] - isFetchingHistory: boolean - deleteMessage: (messageId: string) => Promise - sendMessage: ( - message: ChatBskyConvoSendMessage.InputSchema['message'], - ) => Promise - fetchMessageHistory: () => Promise - } - | { - status: ConvoStatus.Backgrounded - items: ConvoItem[] - convo: ChatBskyConvoDefs.ConvoView - error: undefined - sender: AppBskyActorDefs.ProfileViewBasic - recipients: AppBskyActorDefs.ProfileViewBasic[] - isFetchingHistory: boolean - deleteMessage: (messageId: string) => Promise - sendMessage: ( - message: ChatBskyConvoSendMessage.InputSchema['message'], - ) => Promise - fetchMessageHistory: () => Promise - } - | { - status: ConvoStatus.Error - items: [] - convo: undefined - error: any - sender: undefined - recipients: undefined - isFetchingHistory: false - deleteMessage: undefined - sendMessage: undefined - fetchMessageHistory: undefined - } + | ConvoStateUninitialized + | ConvoStateInitializing + | ConvoStateReady + | ConvoStateBackgrounded + | ConvoStateSuspended + | ConvoStateError diff --git a/src/state/messages/convo/util.ts b/src/state/messages/convo/util.ts index d03ec878b8..ffaa4104a7 100644 --- a/src/state/messages/convo/util.ts +++ b/src/state/messages/convo/util.ts @@ -1,11 +1,19 @@ -import {ConvoState, ConvoStatus} from './types' +import { + ConvoState, + ConvoStateBackgrounded, + ConvoStateReady, + ConvoStateSuspended, + ConvoStatus, +} from './types' /** * Checks if a `Convo` has a `status` that is "active", meaning the chat is * loaded and ready to be used, or its in a suspended or background state, and * ready for resumption. */ -export function isConvoActive(convo: ConvoState) { +export function isConvoActive( + convo: ConvoState, +): convo is ConvoStateReady | ConvoStateBackgrounded | ConvoStateSuspended { return ( convo.status === ConvoStatus.Ready || convo.status === ConvoStatus.Backgrounded ||