Files
zulip/static/js/avatar.js
Steve Howell 7cf66b5bb8 Allow users to upload avatars on the Settings page.
We were using Gravatar for user avatars, but now users can
upload their avatars directly to Zulip, and we will store
their avatar for them.  This removes the old Gravatar-related
interface and polling code.

This commit does not attempt to update the avatars in
messages that have already been loaded, either for the user
making the change or other users.

(imported from commit 301dc48f96f83de0136c93de57055638c79e0961)
2013-10-29 10:59:41 -04:00

220 lines
6.1 KiB
JavaScript

var avatar = (function () {
var exports = {};
function is_image_format(file) {
var type = file.type;
if (!type) {
return false;
}
var supported_types = [
'image/jpeg',
'image/png',
'image/gif',
'image/svg+xml'
];
return _.indexOf(supported_types, type) >= 0;
}
exports.build_bot_create_widget = function () {
// We have to do strange gyrations with the file input to clear it,
// where we replace it wholesale, so we generalize the file input with
// a callback function.
var get_file_input = function () {
return $('#bot_avatar_file_input');
};
var file_name_field = $('#bot_avatar_file');
var input_error = $('#bot_avatar_file_input_error');
var clear_button = $('#bot_avatar_clear_button');
var upload_button = $('#bot_avatar_upload_button');
return exports.build_widget(
get_file_input,
file_name_field,
input_error,
clear_button,
upload_button
);
};
exports.build_bot_edit_widget = function (li) {
var get_file_input = function () {
return li.find('.edit_bot_avatar_file_input');
};
var file_name_field = li.find('.edit_bot_avatar_file');
var input_error = li.find('.edit_bot_avatar_error');
var clear_button = li.find('.edit_bot_avatar_clear_button');
var upload_button = li.find('.edit_bot_avatar_upload_button');
return exports.build_widget(
get_file_input,
file_name_field,
input_error,
clear_button,
upload_button
);
};
exports.build_widget = function (
get_file_input, // function returns a jQuery file input object
file_name_field, // jQuery object to show file name
input_error, // jQuery object for error text
clear_button, // jQuery button to clear last upload choice
upload_button // jQuery button to open file dialog
) {
function accept(file) {
file_name_field.text(file.name);
input_error.hide();
clear_button.show();
upload_button.hide();
}
function clear() {
var control = get_file_input();
var new_control = control.clone(true);
control.replaceWith(new_control);
file_name_field.text('');
clear_button.hide();
upload_button.show();
}
clear_button.on('click', function (e) {
clear();
e.preventDefault();
});
upload_button.on('drop', function (e) {
var files = e.dataTransfer.files;
if (files === null || files === undefined || files.length === 0) {
return false;
}
get_file_input().get(0).files = files;
e.preventDefault();
return false;
});
get_file_input().on('change', function (e) {
if (e.target.files.length === 0) {
input_error.hide();
} else if (e.target.files.length === 1) {
var file = e.target.files[0];
if (file.size > 5*1024*1024) {
input_error.text('File size must be < 5Mb.');
input_error.show();
clear();
}
else if (!is_image_format(file)) {
input_error.text('File type is not supported.');
input_error.show();
clear();
} else {
accept(file);
}
}
else {
input_error.text('Please just upload one file.');
}
});
upload_button.on('click', function (e) {
get_file_input().trigger('click');
e.preventDefault();
});
function close() {
clear();
clear_button.off('click');
upload_button.off('drop');
get_file_input().off('change');
upload_button.off('click');
}
return {
// Call back to clear() in situations like adding bots, when
// we want to use the same widget over and over again.
clear: clear,
// Call back to close() when you are truly done with the widget,
// so you can release handlers.
close: close
};
};
exports.build_user_avatar_widget = function (upload_function) {
var get_file_input = function () {
return $('#user_avatar_file_input').expectOne();
};
return exports.build_direct_upload_widget(
get_file_input,
$("#user_avatar_file_input_error").expectOne(),
$("#user_avatar_upload_button").expectOne(),
upload_function
);
};
exports.build_direct_upload_widget = function (
get_file_input, // function returns a jQuery file input object
input_error, // jQuery object for error text
upload_button, // jQuery button to open file dialog
upload_function
) {
function accept(file) {
input_error.hide();
upload_function(get_file_input());
}
function clear() {
var control = get_file_input();
var new_control = control.clone(true);
control.replaceWith(new_control);
}
upload_button.on('drop', function (e) {
var files = e.dataTransfer.files;
if (files === null || files === undefined || files.length === 0) {
return false;
}
get_file_input().get(0).files = files;
e.preventDefault();
return false;
});
get_file_input().on('change', function (e) {
if (e.target.files.length === 0) {
input_error.hide();
} else if (e.target.files.length === 1) {
var file = e.target.files[0];
if (file.size > 5*1024*1024) {
input_error.text('File size must be < 5Mb.');
input_error.show();
clear();
}
else if (!is_image_format(file)) {
input_error.text('File type is not supported.');
input_error.show();
clear();
} else {
accept(file);
}
}
else {
input_error.text('Please just upload one file.');
}
});
upload_button.on('click', function (e) {
get_file_input().trigger('click');
e.preventDefault();
});
};
return exports;
}());