SendBird создает групповой канал с файлом в качестве обложки

Я пытаюсь создать групповой канал с обложкой,

this.sendBirdInstance.GroupChannel.createChannelWithUserIds(userIds, true, this.groupName, this.groupPhotoFile, '', function (createdChannel, error) {
...
}

Согласно документации я могу добавить URL или файл

coverUrl: файл или URL-адрес изображения обложки, который можно извлечь для визуализации в пользовательском интерфейсе.

Но при добавлении файла я всегда получаю: "SendBirdException", code: 800110, message: "Invalid arguments."

Есть ли способ создать группу с файлом вместо URL (так как я хочу, чтобы пользователь загрузил файл)?

Спасибо,

1 ответ

Решение

Как вы уже испытали (я видел, что вы создали проблему в GitHub несколько дней назад), поддержка SendBird довольно ненадежна.

Помогает и тот факт, что они предлагают только уменьшенную версию своего JavaScript SDK (который лично я считаю очень плохим).

Во всяком случае, я мог бы изолировать createChannelWithUserIds функция:

! function (e, n) {
    // ... 
}(this, function () {
    // ... 
    var h = function (e) {
        for (var n in e) if (e.hasOwnProperty(n)) return !1;
        return Array.isArray(e) ? JSON.stringify(e) === JSON.stringify([]) : JSON.stringify(e) === JSON.stringify({})
    },
    // ... 
    A = function () { // it returns SendBird function
        // ... 
        var w = function (e) { // w is this.GroupChannel
            // ... 
            w.createChannelWithUserIds = function () {
                // ...
                // here comes the param validation (I've added spaces for a better lecture):
                if (!Array.isArray(e) || "boolean" != typeof n || "string" != typeof t && null !== t && void 0 !== t || "string" != typeof r && h(r) && null !== r && void 0 !== r || "string" != typeof a && null !== a && void 0 !== a || "string" != typeof i && null !== i && void 0 !== i) return void U(null, new p("Invalid arguments.", J.INVALID_PARAMETER), s);
                // It will return "Invalid arguments." if any of the conditions evaluates to true       
                // ... 
            }
        }
    }
    return function () {
        // ... 
    }().SendBird
});

Вы используете функцию как это:

createChannelWithUserIds(o, n, t, r, a, s); 

Итак, четвертый параметр (r) является coverURL: файл с изображением обложки (this.groupPhotoFile);

Его проверка в основном говорит о том, что:

"string" != typeof r    // if `r` is not a string (a URL)
&& h(r)                 // and the returned value of function h(r) is true
&& null !== r           // and it is not null
&& void 0 !== r         // and it is not undefined

этот параметр недействителен.

Ваш файл не является строкой, не нулевым и не неопределенным, поэтому все сводится к h() функция:

var h = function (e) {
    for (var n in e) if (e.hasOwnProperty(n)) return !1;
    return Array.isArray(e) ? JSON.stringify(e) === JSON.stringify([]) : JSON.stringify(e) === JSON.stringify({})
}

Вышеприведенная функция в первую очередь проверяет, имеет ли объект какое-либо свойство, являющееся членом самого объекта (т. Е. Не свойства, принадлежащие цепочке прототипов). Затем, если у него нет собственного свойства, он проверяет, равен ли объект / массив stringify пустому объекту / массиву.

Я не могу сказать, каковы намерения разработчиков при проверке файлов через эту функцию, но стандартный объект FILE:

  • имеет свойства в своей цепочке прототипов, но не привязаны непосредственно к экземпляру, поэтому первое условие true,
  • когда stringify возвращает пустой объект во всех основных браузерах в наше время ( это было не всегда так), поэтому второе условие также true,

Как мы уже видели, нам нужно h() возвращать false: проверка не пройдена, если она вернется true,

Чтобы исправить это поведение, вы можете изменить h() функционировать что-то вроде:

var h = function( e ){
    return !(e instanceof File);
    // or return e.constructor != File;
    // or return Object.getPrototypeOf( e ) != File.prototype );
    // or return e.__proto__ != File.prototype )
    // or return e.constructor.prototype != File.prototype )
}

но я не буду связываться с этим. Это может быть использовано в будущих версиях с другой целью.

Так что лучше всего поменять createChannelWithUserIds() функция для:

  • убрать звонок на h() функция от проверки.
  • замените его вызовом для проверки собственного файла

Для этого вы можете переопределить функцию в экземпляре SendBird:

var sb = new SendBird( { appId: ... } );

sb.GroupChannel.createChannelWithUserIds = function(){ ... };

Но это не гарантирует работоспособность и может сломаться в будущих выпусках, поэтому я бы просто отредактировал файл SendBird.min.js. Другими словами, заменить:

if(!Array.isArray(e)||"boolean"!=typeof n||"string"!=typeof t&&null!==t&&void 0!==t||"string"!=typeof r&&h(r)&&null!==r&&void 0!==r||"string"!=typeof a&&null!==a&&void 0!==a||"string"!=typeof i&&null!==i&&void 0!==i)return void U(null,new p("Invalid arguments.",J.INVALID_PARAMETER),s);

с:

if(!Array.isArray(e)||"boolean"!=typeof n||"string"!=typeof t&&null!==t&&void 0!==t||"string"!=typeof a&&null!==a&&void 0!==a||"string"!=typeof i&&null!==i&&void 0!==i)return void U(null,new p("Invalid arguments.",J.INVALID_PARAMETER),s);

В текущей версии (v3.0.41) вы найдете два совпадения кода выше: одно для createChannel и другое для createChannelWithUserIds Вы можете заменить оба.

Конечно, редактирование файла.js раздражает, потому что вам нужно будет позаботиться о замене кода при каждом обновлении SendGrid. "Вы можете создать автоматическое задание внутри конвейера CI, чтобы сделать это для вас", - подумал.

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

Другие вопросы по тегам