Выбор перегрузки Javascript/Typescript с помощью SendBird

В настоящее время я пытаюсь использовать SDK SendBird и пытаюсь вызвать эту функцию, но при этом получаю сообщения об ошибках. Ниже приведен метод, который они дают в своей документации.

channel.sendUserMessage(message, data, customType, function(message, error){
    if (error) {
        console.error(error);
        return;
    }

    console.log(message);
});

Вот что я использую:

channelList[i].sendUserMessage(message, function (message, error) {

    if (error) {
        console.error(error);
        return;
    }

    console.log(message);
    document.getElementById(url + "ChatInput").value = "";

});

Ошибка, которую я возвращаю, такова:

I {name: "SendBirdException", code: 900025, message: "Message is blocked due to invalid type of 'mentioned_user_ids'"}
code: 900025
message: "Message is blocked due to invalid type of 'mentioned_user_ids'"
name: "SendBirdException"

Теперь я загружаю только строку и сначала очень запутался, откуда взялись упомянутые_пользователи_ids, но я понял, почему. Я считаю, что в SDK SendBird они используют Typescript и несколько перегрузок для разных параметров на основе этого файла:

https://github.com/smilefam/SendBird-SDK-JavaScript/blob/master/SendBird.d.ts

и конкретно эта часть в этом файле:

sendUserMessage(userMessageParams: UserMessageParams, callback: messageCallback): UserMessage;
sendUserMessage(message: string, callback: messageCallback): UserMessage;
sendUserMessage(message: string, data: string, callback: messageCallback): UserMessage; // DEPRECATED
sendUserMessage(message: string, data: string, customType: string, callback: messageCallback): UserMessage; // DEPRECATED
sendUserMessage(
   message: string,
   data: string,
   customType: string,
   targetLanguages: Array<string>,
   callback: messageCallback
): UserMessage;

Я считаю, что, поскольку я не использую Typescript, я считаю, что по умолчанию используется первая функция в этом списке, которая использует userMessageParams, которая состоит из:

interface UserMessageParams {
    message: string;
    data: string;
    customType: string;
    targetLanguages: Array<string>;
    mentionType: 'users' | 'channel';
    mentionedUserIds: Array<string>;
    mentionedUsers: Array<User>;
    pushNotificationDeliveryOption: 'default' | 'suppress';
}

Что включает в себя свойство, которое ранее упоминалось в ошибке как «упомянутый_пользователь_ид».

Мой вопрос в том, можно ли по умолчанию использовать простую перегрузку только строки и функции обратного вызова:

sendUserMessage(message: string, callback: messageCallback): UserMessage;

вместо:

sendUserMessage(userMessageParams: UserMessageParams, callback: messageCallback): UserMessage;

без использования машинописного текста.

Что я пробовал

Я попытался просто сделать объект самостоятельно, выполнив:

var userMessageParams = new sb.UserMessageParams();
userMessageParams.message = message;
userMessageParams.mentionType = "channel";

channelList[i].sendUserMessage(userMessageParams, function (message, error) {
    if (error) {
        console.error(error);
        return;
    }

    console.log(message);
    document.getElementById(url + "ChatInput").value = "";
});

Но я все еще получаю ту же ошибку, что и упомянутая выше.

null_data:null
_mentionType:"channel"
_mentionedIds:["d155d9e51f3e4897988e39a8f33c89a6"]
_mentionedUserIds:["d155d9e51f3e4897988e39a8f33c89a6"]
_mentionedUsers:[]
_message:"message"
_pushNotificationDeliveryOption:null
_targetLanguages:null

Я вручную устанавливаю значения свойства внутри userMessageParams:

userMessageParams.mentionedUserIds = [ channelList[0].members[1].userId, channelList[0].members[0].userId];

_customType:null
_data:null
_mentionType:"channel"
_mentionedIds:["d155d9e51f3e4897988e39a8f33c89a6"]
_mentionedUserIds:["d155d9e51f3e4897988e39a8f33c89a6"]
_mentionedUsers:[]
_message:"message"
_pushNotificationDeliveryOption:null
_targetLanguages:null

//Inside console in Chrome
channelList[0].members[1].userId
"d155d9e51f3e4897988e39a8f33c89a6"

channelList[0].members[0].userId
"1924c64299284da6b8e6366a7f0b7a7c"

(Я не знаю, почему он добавил только один из них в идентификаторы пользователей, я проверил, что оба имеют значения в консоли до и после его добавления. Вероятно, не добавляет значения, если они совпадают с senderId в фоновом режиме или это Лучшее предположение, которое у меня есть) И я все еще получаю те же ошибки.

Я не хочу упоминать некоторых пользователей, потому что это просто используется для чата 1 на 1, поэтому мне это не нужно.

Решения

Два возможных решения, которые я вижу прямо сейчас:

  • Выясните, кто по умолчанию использует перегрузку строки (я никогда не использовал Typescript и не знаю, как его транскомпилировать в java-script, поэтому я не знаю, возможно ли это).
  • Выясните, где я напортачил с созданием userMessageParams, а там я даже не хочу упоминать ни одного пользователя.

Извините за эссе, если у кого-то есть какая-либо информация, которая может помочь мне, или если вам нужно больше разъяснений, чтобы помочь мне, все будет очень признательно, спасибо!

Транскомпилированный код

... если кто-то достаточно сумасшедший, чтобы посмотреть на это (или то, что я думаю), расположенное в SendBird.min.js):

this.sendUserMessage = function(e, n, t, r, i) {
                var a = this
                  , s = le.MentionType.USERS
                  , o = []
                  , l = ue.PushNotificationDeliveryOption.DEFAULT;
                if ("function" == typeof n && (i = n,
                n = "",
                t = "",
                r = [],
                e instanceof ue)) {
                    var u = e;
                    e = u.message,
                    n = u.data,
                    t = u.customType,
                    r = u.targetLanguages,
                    s = u._mentionType,
                    o = u._mentionedIds,
                    l = u.pushNotificationDeliveryOption ? u.pushNotificationDeliveryOption : ue.PushNotificationDeliveryOption.DEFAULT
                }
                if ("function" == typeof t && (i = t,
                t = "",
                r = []),
                "function" == typeof r && (i = r,
                r = []),
                r || (r = []),
                "string" == typeof r && (r = [r]),
                null === n && (n = ""),
                null === t && (t = ""),
                "string" != typeof e || "string" != typeof n || "string" != typeof t || !Array.isArray(r) || [ue.PushNotificationDeliveryOption.DEFAULT, ue.PushNotificationDeliveryOption.SUPPRESS].indexOf(l) < 0)
                    return void U(null, new I("Invalid parameter.",C.INVALID_PARAMETER), i);
                var c = null;
                if (!he.getInstance() || !he.getInstance().currentUser)
                    return i && U(null, new I("Connection should be made first.",C.CONNECTION_REQUIRED), i),
                    c;
                var d = q.bMessage(this.url, e, n, t, s, o, r, l)
                  , h = M.build(d.requestId, 0, he.getInstance().currentUser, this, e, n, t, r, (new Date).getTime(), null, s, null, o);
                return c = new M(h),
                he.getInstance().sendCommand(d, function(e, n) {
                    if (n)
                        return void U(null, new I(n.message,n.code), i);
                    var t = new M(e.getJsonElement())
                      , r = he.getInstance().currentUser;
                    r && t._sender && r.userId === t._sender.userId && (r.nickname !== t._sender.nickname && (r.nickname = t._sender.nickname),
                    r.profileUrl !== t._sender.profileUrl && (r.profileUrl = t._sender.profileUrl)),
                    a.isGroupChannel() && F.getChannel(a.url, function(e, n) {
                        if (R) {
                            var r = e;
                            e = n,
                            n = r
                        }
                        if (n)
                            return void U(null, n, i);
                        e.lastMessage = t;
                        for (var a in he.getInstance().channelHandlers) {
                            he.getInstance().channelHandlers[a].onChannelChanged(e)
                        }
                    }),
                    U(t, null, i)
                }),
                c
            }

person molinamos    schedule 26.09.2018    source источник
comment
Я пробовал другие версии SendBird, и мой код работал с версией 3.0.54 до добавления sendUserParams. Это единственное, что было добавлено в SDK SendBird, что может вызвать эту ошибку. Я также использовал версию 3.0.78 и тоже получил ту же ошибку.   -  person molinamos    schedule 26.09.2018


Ответы (1)


SendBird не использует TypeScript. Файл интерфейса как раз написан с этим. https://github.com/smilefam/SendBird-SDK-JavaScript/blob/master/SendBird.d.ts Внутри это ванильный JS.

Код, который вы упомянули выше, должен работать без необходимости определять UserMessageParam.

    channelList[i].sendUserMessage(message, function (message, error) {

        if (error) {
            console.error(error);
            return;
        }

        console.log(message);
        document.getElementById(url + "ChatInput").value = "";

    });

Пожалуйста, попробуйте выполнить отладку пошагово. Кроме того, проверьте пример кода с аналогичной реализацией. https://github.com/smilefam/SendBird-JavaScript

person Imju    schedule 28.09.2018
comment
В более новых версиях SDK SendBird, начиная с 3.0.54, он продолжал выдавать мне ошибку UserMessageParam, когда я вставлял строку для сообщения. Я пробовал это на 3.0.78 и 3.0.81, я думаю, и все еще получаю сообщение об ошибке, говорящее о том, что упомянутый идентификатор пользователя недействителен. Я выполнил отладку, чтобы убедиться, что сообщение имеет строковое значение до вызова sendUserMessage. Я даже жестко закодировал сообщение и все равно получил ту же ошибку. - person molinamos; 28.09.2018
comment
Пожалуйста, ознакомьтесь с примером проекта, github.com/smilefam/SendBird-JavaScript. SendUserMessage без UserMessageParam успешно используется. - person Imju; 29.09.2018
comment
Веб-виджет javascript SDK использует версию 3.0.45. Я просто говорю, что в новой v3.0.81 это не работало. - person molinamos; 30.09.2018
comment
Используете ли вы образец веб-виджета? Вот когда вы видите эту проблему? Вы можете это прояснить? Вопрос был о конкретном вызове, но если эта проблема связана с образцом веб-виджета, то это другая тема. Можете ли вы указать, к какому файлу образца веб-виджета? - person Imju; 01.10.2018
comment
Нет, это не пример веб-виджета, я сделал свой собственный проект, используя более новые версии SDK. Образец веб-виджета использует старый SDK и слова. Я вижу проблему, когда использую сообщение отправки в своем собственном проекте. Он отлично работает в старых версиях JS SDK, но не в новых, как в v3.0.81. Теперь все работает, когда я вернулся к старому SDK. Мне было просто любопытно в новых версиях, v3.0.81, почему вы все еще не можете просто использовать строку в качестве ввода сообщения. - person molinamos; 03.10.2018