SendGifMessageUseCase
Sends a downloaded GIF the way web and the old iOS app do: an optional caption text message, then the GIF as an image/gif asset. Receivers need nothing new. Both messages follow the conversation's self-deleting timer.
SendGifMessageResult.Success means both messages are stored in the conversation. Like any message, they then send in the background, and a failed delivery shows in the conversation with a retry. That includes a caption that was stored but not delivered, for example while offline: the GIF still follows it.
What the other results leave in the conversation:
SendGifMessageResult.DisabledByTeam and SendGifMessageResult.RestrictedFileType: nothing, unless the team changed its file sharing settings while the caption was sending; then only the caption.
SendGifMessageResult.Failure with LegalHoldEnabledForConversationFailure: only the caption, stored under that failure's message ID and failed because sending it found the conversation under legal hold. The GIF was not sent. Once the user accepts, retry the caption by that ID and send the GIF again without a caption.
Any other SendGifMessageResult.Failure: no GIF. Usually no caption either; only when storing the GIF itself failed is a caption already in the conversation.