@mica/sdk (SDK contract v1)
    Preparing search index...

    Function useMessages

    • OS Service Hook for accessing SMS messaging.

      Returns {
          addReceivedMessage: (message: IncomingMessage) => void;
          conversationsStore: {
              activeConversationId: {
                  subscribe: (
                      this: void,
                      run: Subscriber<number | null>,
                      invalidate?: () => void,
                  ) => Unsubscriber;
              };
              addReceivedMessage: (incoming: IncomingMessage) => void;
              archiveConversation: (
                  conversationId: number,
                  archive?: boolean,
              ) => Promise<void>;
              deleteConversation: (conversationId: number) => Promise<void>;
              deleteMessage: (
                  conversationId: number,
                  messageId: number,
              ) => Promise<boolean>;
              editMessage: (
                  conversationId: number,
                  messageId: number,
                  message: string,
              ) => Promise<{ edited?: boolean; message: string } | null>;
              hasMore: {
                  subscribe: (
                      this: void,
                      run: Subscriber<boolean>,
                      invalidate?: () => void,
                  ) => Unsubscriber;
              };
              hasOlderMessages: {
                  subscribe: (
                      this: void,
                      run: Subscriber<Record<number, boolean>>,
                      invalidate?: () => void,
                  ) => Unsubscriber;
              };
              loadConversations: () => Promise<void>;
              loaded: {
                  subscribe: (
                      this: void,
                      run: Subscriber<boolean>,
                      invalidate?: () => void,
                  ) => Unsubscriber;
              };
              loadMessages: (conversationId: number) => Promise<void>;
              loadMoreConversations: () => Promise<boolean>;
              loadOlderMessages: (conversationId: number) => Promise<boolean>;
              markAsRead: (conversationId: number) => Promise<void>;
              messages: {
                  subscribe: (
                      this: void,
                      run: Subscriber<Record<number, UIMessage[]>>,
                      invalidate?: () => void,
                  ) => Unsubscriber;
              };
              renameConversation: (
                  conversationId: number,
                  name: string,
              ) => Promise<void>;
              sendMessage: (
                  conversationId: number,
                  message: string,
                  attachments?: { attachment?: string; photo_id: number }[],
                  replyToId?: number | null,
              ) => Promise<Message | null>;
              setActiveConversationId: (id: number | null) => void;
              startConversation: (
                  phone: string,
                  isGroup?: boolean,
              ) => Promise<UIConversation | null>;
              subscribe: (
                  this: void,
                  run: Subscriber<UIConversation[]>,
                  invalidate?: () => void,
              ) => Unsubscriber;
          };
          loadMessageReactions: (ids: number[]) => Promise<void>;
          messageReactions: ReactionStore;
          sendMessage: (
              conversationId: number,
              text: string,
          ) => Promise<Message | null>;
          startText: (phone: string) => void;
          toggleMessageReaction: (messageId: number, emoji: string) => Promise<void>;
          unreadMessagesCount: Readable<number>;
      }

      • addReceivedMessage: (message: IncomingMessage) => void
      • conversationsStore: {
            activeConversationId: {
                subscribe: (
                    this: void,
                    run: Subscriber<number | null>,
                    invalidate?: () => void,
                ) => Unsubscriber;
            };
            addReceivedMessage: (incoming: IncomingMessage) => void;
            archiveConversation: (
                conversationId: number,
                archive?: boolean,
            ) => Promise<void>;
            deleteConversation: (conversationId: number) => Promise<void>;
            deleteMessage: (
                conversationId: number,
                messageId: number,
            ) => Promise<boolean>;
            editMessage: (
                conversationId: number,
                messageId: number,
                message: string,
            ) => Promise<{ edited?: boolean; message: string } | null>;
            hasMore: {
                subscribe: (
                    this: void,
                    run: Subscriber<boolean>,
                    invalidate?: () => void,
                ) => Unsubscriber;
            };
            hasOlderMessages: {
                subscribe: (
                    this: void,
                    run: Subscriber<Record<number, boolean>>,
                    invalidate?: () => void,
                ) => Unsubscriber;
            };
            loadConversations: () => Promise<void>;
            loaded: {
                subscribe: (
                    this: void,
                    run: Subscriber<boolean>,
                    invalidate?: () => void,
                ) => Unsubscriber;
            };
            loadMessages: (conversationId: number) => Promise<void>;
            loadMoreConversations: () => Promise<boolean>;
            loadOlderMessages: (conversationId: number) => Promise<boolean>;
            markAsRead: (conversationId: number) => Promise<void>;
            messages: {
                subscribe: (
                    this: void,
                    run: Subscriber<Record<number, UIMessage[]>>,
                    invalidate?: () => void,
                ) => Unsubscriber;
            };
            renameConversation: (conversationId: number, name: string) => Promise<void>;
            sendMessage: (
                conversationId: number,
                message: string,
                attachments?: { attachment?: string; photo_id: number }[],
                replyToId?: number | null,
            ) => Promise<Message | null>;
            setActiveConversationId: (id: number | null) => void;
            startConversation: (
                phone: string,
                isGroup?: boolean,
            ) => Promise<UIConversation | null>;
            subscribe: (
                this: void,
                run: Subscriber<UIConversation[]>,
                invalidate?: () => void,
            ) => Unsubscriber;
        }
        • activeConversationId: {
              subscribe: (
                  this: void,
                  run: Subscriber<number | null>,
                  invalidate?: () => void,
              ) => Unsubscriber;
          }
        • addReceivedMessage: (incoming: IncomingMessage) => void
        • archiveConversation: (conversationId: number, archive?: boolean) => Promise<void>
        • deleteConversation: (conversationId: number) => Promise<void>
        • deleteMessage: (conversationId: number, messageId: number) => Promise<boolean>
        • editMessage: (
              conversationId: number,
              messageId: number,
              message: string,
          ) => Promise<{ edited?: boolean; message: string } | null>
        • hasMore: {
              subscribe: (
                  this: void,
                  run: Subscriber<boolean>,
                  invalidate?: () => void,
              ) => Unsubscriber;
          }

          Whether the server said there is another page of threads behind the one held (MICA-204).

          Declared beside loaded because they answer adjacent questions and a list that has one without the other cannot render honestly: loaded separates "still arriving" from "there is nothing here", and this separates "that is all of it" from "there is more, ask". Without it the inbox could only ever show its first page and would look complete doing it.

        • hasOlderMessages: {
              subscribe: (
                  this: void,
                  run: Subscriber<Record<number, boolean>>,
                  invalidate?: () => void,
              ) => Unsubscriber;
          }

          Whether an older page of a held thread exists behind what is loaded, keyed by conversation id (MICA-212). Absent means nothing is known, which the app reads as false.

        • loadConversations: () => Promise<void>
        • loaded: {
              subscribe: (
                  this: void,
                  run: Subscriber<boolean>,
                  invalidate?: () => void,
              ) => Unsubscriber;
          }
        • loadMessages: (conversationId: number) => Promise<void>
        • loadMoreConversations: () => Promise<boolean>

          Append the next page of threads, walking the cursor conversations:get accepts (MICA-197/MICA-204). Resolves to whether anything arrived.

          Paired with hasMore rather than usable on its own: it is a no-op once the cursor has run out, so a caller with no way to ask whether a page exists can only find out by asking for one.

        • loadOlderMessages: (conversationId: number) => Promise<boolean>

          Prepend the next older page of a held thread, walking the cursor messages:get hands back (MICA-212). Resolves to whether anything arrived, and is a no-op for a thread that is not held or has no page left — pair it with hasOlderMessages.

        • markAsRead: (conversationId: number) => Promise<void>
        • messages: {
              subscribe: (
                  this: void,
                  run: Subscriber<Record<number, UIMessage[]>>,
                  invalidate?: () => void,
              ) => Unsubscriber;
          }
        • renameConversation: (conversationId: number, name: string) => Promise<void>
        • sendMessage: (
              conversationId: number,
              message: string,
              attachments?: { attachment?: string; photo_id: number }[],
              replyToId?: number | null,
          ) => Promise<Message | null>
        • setActiveConversationId: (id: number | null) => void
        • startConversation: (phone: string, isGroup?: boolean) => Promise<UIConversation | null>
        • subscribe: (
              this: void,
              run: Subscriber<UIConversation[]>,
              invalidate?: () => void,
          ) => Unsubscriber
      • loadMessageReactions: (ids: number[]) => Promise<void>
      • messageReactions: ReactionStore

        Reactions on a message (MICA-143), on the shared primitive — see conversations.ts.

      • sendMessage: (conversationId: number, text: string) => Promise<Message | null>
      • startText: (phone: string) => void

        Open Messages and start (or resume) a conversation with a bare phone number — no saved Contact required. See MICA-15.

      • toggleMessageReaction: (messageId: number, emoji: string) => Promise<void>
      • unreadMessagesCount: Readable<number>