UNPKG

@sendbird/uikit-react-native

Version:

Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.

395 lines 19.2 kB
import { getThreadParentMessageTimeFormat } from '@sendbird/uikit-utils'; import { getDateSeparatorFormat, getGroupChannelPreviewTime, getGroupChannelTitle, getMessagePreviewBody, getMessagePreviewTime, getMessagePreviewTitle, getMessageTimeFormat, getMessageType, getOpenChannelParticipants, getOpenChannelTitle, getReplyCountFormat, isVoiceMessage } from '@sendbird/uikit-utils'; import { UNKNOWN_USER_ID } from '../constants'; /** * Create string set * You can create localized String set, you should provide locale for date and string as a parameters * * @param {StringSetCreateOptions.dateLocale} dateLocale Date locale (from date-fns) * @param {StringSetCreateOptions.overrides} [overrides] Localized strings * */ export const createBaseStringSet = ({ dateLocale, overrides }) => { var _overrides$LABELS, _overrides$LABELS2, _overrides$PLACEHOLDE; const USER_NO_NAME = (overrides === null || overrides === void 0 || (_overrides$LABELS = overrides.LABELS) === null || _overrides$LABELS === void 0 ? void 0 : _overrides$LABELS.USER_NO_NAME) ?? '(No name)'; const CHANNEL_NO_MEMBERS = (overrides === null || overrides === void 0 || (_overrides$LABELS2 = overrides.LABELS) === null || _overrides$LABELS2 === void 0 ? void 0 : _overrides$LABELS2.CHANNEL_NO_MEMBERS) ?? '(No members)'; return { OPEN_CHANNEL: { HEADER_TITLE: channel => getOpenChannelTitle(channel), HEADER_SUBTITLE: channel => getOpenChannelParticipants(channel), LIST_DATE_SEPARATOR: (date, locale) => getDateSeparatorFormat(date, locale ?? dateLocale), MESSAGE_BUBBLE_TIME: (message, locale) => getMessageTimeFormat(new Date(message.createdAt), locale ?? dateLocale), MESSAGE_BUBBLE_FILE_TITLE: message => message.name, MESSAGE_BUBBLE_EDITED_POSTFIX: ' (edited)', MESSAGE_BUBBLE_UNKNOWN_TITLE: () => '(Unknown message type)', MESSAGE_BUBBLE_UNKNOWN_DESC: () => 'Cannot read this message.', ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL) }, OPEN_CHANNEL_PARTICIPANTS: { HEADER_TITLE: 'Participants', ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL_PARTICIPANTS) }, OPEN_CHANNEL_SETTINGS: { HEADER_TITLE: 'Channel information', HEADER_RIGHT: 'Edit', INFO_URL: 'URL', MENU_MODERATION: 'Moderation', MENU_PARTICIPANTS: 'Participants', MENU_DELETE_CHANNEL: 'Delete channel', DIALOG_CHANNEL_DELETE_CONFIRM_TITLE: 'Delete channel?', DIALOG_CHANNEL_DELETE_CONFIRM_OK: 'Delete', DIALOG_CHANNEL_DELETE_CONFIRM_CANCEL: 'Cancel', DIALOG_CHANGE_NAME: 'Change channel name', DIALOG_CHANGE_NAME_PROMPT_TITLE: 'Change channel name', DIALOG_CHANGE_NAME_PROMPT_PLACEHOLDER: 'Enter name', DIALOG_CHANGE_NAME_PROMPT_OK: 'Save', DIALOG_CHANGE_NAME_PROMPT_CANCEL: 'Cancel', DIALOG_CHANGE_IMAGE: 'Change channel image', DIALOG_CHANGE_IMAGE_MENU_TITLE: 'Change channel image', DIALOG_CHANGE_IMAGE_MENU_CAMERA: 'Take photo', DIALOG_CHANGE_IMAGE_MENU_PHOTO_LIBRARY: 'Choose photo', ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL_SETTINGS) }, OPEN_CHANNEL_LIST: { HEADER_TITLE: 'Channels', CHANNEL_PREVIEW_TITLE: channel => getOpenChannelTitle(channel), ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL_LIST) }, OPEN_CHANNEL_CREATE: { HEADER_TITLE: 'New channel', HEADER_RIGHT: 'Create', PLACEHOLDER: 'Enter channel name', DIALOG_IMAGE_MENU_REMOVE: 'Remove photo', DIALOG_IMAGE_MENU_CAMERA: 'Take photo', DIALOG_IMAGE_MENU_PHOTO_LIBRARY: 'Choose photo', ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL_CREATE) }, OPEN_CHANNEL_MODERATION: { HEADER_TITLE: 'Moderation', MENU_OPERATORS: 'Operators', MENU_MUTED_PARTICIPANTS: 'Muted participants', MENU_BANNED_USERS: 'Banned users', ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL_MODERATION) }, OPEN_CHANNEL_BANNED_USERS: { HEADER_TITLE: 'Banned users', ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL_BANNED_USERS) }, OPEN_CHANNEL_MUTED_PARTICIPANTS: { HEADER_TITLE: 'Muted participants', ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL_MUTED_PARTICIPANTS) }, OPEN_CHANNEL_OPERATORS: { HEADER_TITLE: 'Operators', ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL_OPERATORS) }, OPEN_CHANNEL_REGISTER_OPERATOR: { HEADER_TITLE: 'Set as operators', HEADER_RIGHT: ({ selectedUsers }) => { const len = selectedUsers.length; if (len === 0) return 'Add'; return `Add (${len})`; }, ...(overrides === null || overrides === void 0 ? void 0 : overrides.OPEN_CHANNEL_REGISTER_OPERATOR) }, GROUP_CHANNEL: { HEADER_TITLE: (uid, channel) => getGroupChannelTitle(uid, channel, USER_NO_NAME, CHANNEL_NO_MEMBERS), LIST_DATE_SEPARATOR: (date, locale) => getDateSeparatorFormat(date, locale ?? dateLocale), LIST_BUTTON_NEW_MSG: newMessages => `${newMessages.length} new messages`, MESSAGE_BUBBLE_TIME: (message, locale) => getMessageTimeFormat(new Date(message.createdAt), locale ?? dateLocale), MESSAGE_BUBBLE_FILE_TITLE: message => message.name, MESSAGE_BUBBLE_EDITED_POSTFIX: ' (edited)', MESSAGE_BUBBLE_UNKNOWN_TITLE: () => '(Unknown message type)', MESSAGE_BUBBLE_UNKNOWN_DESC: () => 'Cannot read this message.', MENTION_LIMITED: mentionLimit => `You can have up to ${mentionLimit} mentions per message.`, ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL) }, GROUP_CHANNEL_THREAD: { HEADER_TITLE: 'Thread', HEADER_SUBTITLE: (uid, channel) => getGroupChannelTitle(uid, channel, USER_NO_NAME, CHANNEL_NO_MEMBERS), LIST_DATE_SEPARATOR: (date, locale) => getDateSeparatorFormat(date, locale ?? dateLocale), LIST_BUTTON_NEW_MSG: newMessages => `${newMessages.length} new messages`, MESSAGE_BUBBLE_TIME: (message, locale) => getMessageTimeFormat(new Date(message.createdAt), locale ?? dateLocale), MESSAGE_BUBBLE_FILE_TITLE: message => message.name, MESSAGE_BUBBLE_EDITED_POSTFIX: ' (edited)', MESSAGE_BUBBLE_UNKNOWN_TITLE: () => '(Unknown message type)', MESSAGE_BUBBLE_UNKNOWN_DESC: () => 'Cannot read this message.', PARENT_MESSAGE_TIME: (message, locale) => getThreadParentMessageTimeFormat(new Date(message.createdAt), locale ?? dateLocale), REPLY_COUNT: (replyCount, maxReplyCount) => getReplyCountFormat(replyCount, maxReplyCount), MENTION_LIMITED: mentionLimit => `You can have up to ${mentionLimit} mentions per message.`, ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_THREAD) }, GROUP_CHANNEL_SETTINGS: { HEADER_TITLE: 'Channel information', HEADER_RIGHT: 'Edit', MENU_MODERATION: 'Moderation', MENU_MEMBERS: 'Members', MENU_SEARCH: 'Search in channel', MENU_LEAVE_CHANNEL: 'Leave channel', MENU_NOTIFICATION: 'Notifications', MENU_NOTIFICATION_LABEL_ON: 'On', MENU_NOTIFICATION_LABEL_OFF: 'Off', MENU_NOTIFICATION_LABEL_MENTION_ONLY: 'Mentions only', DIALOG_CHANGE_NAME: 'Change channel name', DIALOG_CHANGE_NAME_PROMPT_TITLE: 'Change channel name', DIALOG_CHANGE_NAME_PROMPT_PLACEHOLDER: 'Enter name', DIALOG_CHANGE_NAME_PROMPT_OK: 'Save', DIALOG_CHANGE_NAME_PROMPT_CANCEL: 'Cancel', DIALOG_CHANGE_IMAGE: 'Change channel image', DIALOG_CHANGE_IMAGE_MENU_TITLE: 'Change channel image', DIALOG_CHANGE_IMAGE_MENU_CAMERA: 'Take photo', DIALOG_CHANGE_IMAGE_MENU_PHOTO_LIBRARY: 'Choose photo', ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_SETTINGS) }, GROUP_CHANNEL_NOTIFICATIONS: { HEADER_TITLE: 'Notifications', MENU_NOTIFICATIONS: 'Notifications', MENU_NOTIFICATIONS_DESC: 'Turn on push notifications if you wish to be notified when messages are delivered to this channel.', MENU_NOTIFICATIONS_OPTION_ALL: 'All new messages', MENU_NOTIFICATIONS_OPTION_MENTION_ONLY: 'Mentions only', ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_NOTIFICATIONS) }, GROUP_CHANNEL_MODERATION: { HEADER_TITLE: 'Moderation', MENU_OPERATORS: 'Operators', MENU_MUTED_MEMBERS: 'Muted members', MENU_BANNED_USERS: 'Banned users', MENU_FREEZE_CHANNEL: 'Freeze channel', ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_MODERATION) }, GROUP_CHANNEL_OPERATORS: { HEADER_TITLE: 'Operators', ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_OPERATORS) }, GROUP_CHANNEL_REGISTER_OPERATOR: { HEADER_TITLE: 'Set as operators', HEADER_RIGHT: ({ selectedUsers }) => { const len = selectedUsers.length; if (len === 0) return 'Add'; return `Add (${len})`; }, ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_OPERATORS) }, GROUP_CHANNEL_MUTED_MEMBERS: { HEADER_TITLE: 'Muted members', ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_MUTED_MEMBERS) }, GROUP_CHANNEL_BANNED_USERS: { HEADER_TITLE: 'Banned users', ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_BANNED_USERS) }, GROUP_CHANNEL_LIST: { HEADER_TITLE: 'Channels', CHANNEL_PREVIEW_TITLE: (currentUserId, channel) => getGroupChannelTitle(currentUserId, channel, USER_NO_NAME, CHANNEL_NO_MEMBERS), CHANNEL_PREVIEW_TITLE_CAPTION: (channel, locale) => getGroupChannelPreviewTime(channel, locale ?? dateLocale), CHANNEL_PREVIEW_BODY: channel => { if (!channel.lastMessage) return ''; if (isVoiceMessage(channel.lastMessage)) return 'Voice message'; return getMessagePreviewBody(channel.lastMessage); }, TYPE_SELECTOR_HEADER_TITLE: 'Channel type', TYPE_SELECTOR_GROUP: 'Group', TYPE_SELECTOR_SUPER_GROUP: 'Super group', TYPE_SELECTOR_BROADCAST: 'Broadcast', DIALOG_CHANNEL_TITLE: (currentUserId, channel) => getGroupChannelTitle(currentUserId, channel, USER_NO_NAME, CHANNEL_NO_MEMBERS), DIALOG_CHANNEL_NOTIFICATION: channel => { if (!channel) return ''; if (channel.myPushTriggerOption === 'off') return 'Turn on notifications'; return 'Turn off notifications'; }, DIALOG_CHANNEL_LEAVE: 'Leave channel', ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_LIST) }, GROUP_CHANNEL_MEMBERS: { HEADER_TITLE: 'Members', ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_MEMBERS) }, GROUP_CHANNEL_CREATE: { HEADER_TITLE: 'New channel', HEADER_RIGHT: ({ selectedUsers }) => { const len = selectedUsers.length; if (len === 0) return 'Create'; return `Create (${len})`; }, ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_CREATE) }, GROUP_CHANNEL_INVITE: { HEADER_TITLE: 'Invite users', HEADER_RIGHT: ({ selectedUsers }) => { const len = selectedUsers.length; if (len === 0) return 'Invite'; return `Invite (${len})`; }, ...(overrides === null || overrides === void 0 ? void 0 : overrides.GROUP_CHANNEL_INVITE) }, MESSAGE_SEARCH: { HEADER_INPUT_PLACEHOLDER: 'Search', HEADER_RIGHT: 'Search', SEARCH_RESULT_ITEM_TITLE: message => getMessagePreviewTitle(message), SEARCH_RESULT_ITEM_BODY: message => { if (isVoiceMessage(message)) return 'Voice message'; return getMessagePreviewBody(message); }, SEARCH_RESULT_ITEM_TITLE_CAPTION: (message, locale) => { return getMessagePreviewTime(message.createdAt, locale ?? dateLocale); } }, LABELS: { PERMISSION_APP_NAME: 'Application', PERMISSION_CAMERA: 'camera', PERMISSION_DEVICE_STORAGE: 'device storage', PERMISSION_MICROPHONE: 'microphone', USER_NO_NAME, CHANNEL_NO_MEMBERS, TYPING_INDICATOR_TYPINGS: (users, NO_NAME = USER_NO_NAME) => { const userNames = users.map(u => u.nickname || NO_NAME); if (userNames.length === 0) return; if (userNames.length === 1) return `${userNames[0]} is typing...`; if (users.length === 2) return `${userNames.join(' and ')} are typing...`; return 'Several people are typing...'; }, REPLY_FROM_SENDER_TO_RECEIVER: (reply, parent, currentUserId = UNKNOWN_USER_ID) => { const replySenderNickname = reply.sender.userId === currentUserId ? 'You' : reply.sender.nickname || USER_NO_NAME; const parentSenderNickname = parent.sender.userId === currentUserId ? 'You' : parent.sender.nickname || USER_NO_NAME; return `${replySenderNickname} replied to ${parentSenderNickname}`; }, MESSAGE_UNAVAILABLE: 'Message unavailable', USER_BAR_ME_POSTFIX: ' (You)', USER_BAR_OPERATOR: 'Operator', REGISTER_AS_OPERATOR: 'Register as operator', UNREGISTER_OPERATOR: 'Unregister operator', MUTE: 'Mute', UNMUTE: 'Unmute', BAN: 'Ban', UNBAN: 'Unban', CHANNEL_MESSAGE_LIST_FROZEN: 'Channel is frozen', CHANNEL_MESSAGE_COPY: 'Copy', CHANNEL_MESSAGE_EDIT: 'Edit', CHANNEL_MESSAGE_SAVE: 'Save', CHANNEL_MESSAGE_DELETE: 'Delete', CHANNEL_MESSAGE_REPLY: 'Reply', CHANNEL_MESSAGE_THREAD: 'Reply in thread', CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE: 'Delete message?', CHANNEL_MESSAGE_DELETE_CONFIRM_OK: 'Delete', CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL: 'Cancel', CHANNEL_MESSAGE_FAILED_RETRY: 'Retry', CHANNEL_MESSAGE_FAILED_REMOVE: 'Remove', CHANNEL_INPUT_ATTACHMENT_CAMERA_PHOTO: 'Take a photo', CHANNEL_INPUT_ATTACHMENT_CAMERA_VIDEO: 'Take a video', CHANNEL_INPUT_ATTACHMENT_PHOTO_LIBRARY: 'Photo library', CHANNEL_INPUT_ATTACHMENT_FILES: 'Files', CHANNEL_INPUT_PLACEHOLDER_ACTIVE: 'Enter message', CHANNEL_INPUT_PLACEHOLDER_DISABLED: 'Chat not available in this channel.', CHANNEL_INPUT_PLACEHOLDER_MUTED: "You're muted by the operator.", CHANNEL_INPUT_PLACEHOLDER_REPLY: 'Reply to message', CHANNEL_INPUT_PLACEHOLDER_REPLY_IN_THREAD: 'Reply in thread', CHANNEL_INPUT_PLACEHOLDER_REPLY_TO_THREAD: 'Reply to thread', CHANNEL_INPUT_EDIT_OK: 'Save', CHANNEL_INPUT_EDIT_CANCEL: 'Cancel', CHANNEL_INPUT_REPLY_PREVIEW_TITLE: user => `Reply to ${user.nickname || USER_NO_NAME}`, CHANNEL_INPUT_REPLY_PREVIEW_BODY: message => { if (message.isFileMessage()) { const messageType = getMessageType(message); switch (messageType) { case 'file.image': return message.type.toLowerCase().includes('gif') ? 'GIF' : 'Photo'; case 'file.video': return 'Video'; case 'file.audio': return 'Audio'; case 'file.voice': return 'Voice message'; default: return message.name; } } else if (message.isUserMessage()) { return message.message; } return 'Unknown message'; }, VOICE_MESSAGE: 'Voice message', VOICE_MESSAGE_INPUT_CANCEL: 'Cancel', ...(overrides === null || overrides === void 0 ? void 0 : overrides.LABELS) }, REACTION: { MORE_USERS: userCountDifference => `And ${userCountDifference} others` }, FILE_VIEWER: { TITLE: message => { var _message$sender; return ((_message$sender = message.sender) === null || _message$sender === void 0 ? void 0 : _message$sender.nickname) || USER_NO_NAME; }, SUBTITLE: message => getMessageTimeFormat(new Date(message.createdAt), dateLocale) }, PLACEHOLDER: { NO_BANNED_USERS: 'No banned users', NO_USERS: 'No users', NO_CHANNELS: 'No channels', NO_MESSAGES: 'No messages', NO_MUTED_MEMBERS: 'No muted members', NO_MUTED_PARTICIPANTS: 'No muted participants', NO_RESULTS_FOUND: 'No results found', ...(overrides === null || overrides === void 0 ? void 0 : overrides.PLACEHOLDER), ERROR: { MESSAGE: 'Something went wrong', RETRY_LABEL: 'Retry', ...(overrides === null || overrides === void 0 || (_overrides$PLACEHOLDE = overrides.PLACEHOLDER) === null || _overrides$PLACEHOLDE === void 0 ? void 0 : _overrides$PLACEHOLDE.ERROR) } }, DIALOG: { ALERT_DEFAULT_OK: 'OK', ALERT_PERMISSIONS_TITLE: 'Allow access?', ALERT_PERMISSIONS_MESSAGE: (permission, appName = 'Application') => { return `${appName} needs permission to access your ${permission}.`; }, ALERT_PERMISSIONS_OK: 'Go to settings', PROMPT_DEFAULT_OK: 'Submit', PROMPT_DEFAULT_CANCEL: 'Cancel', PROMPT_DEFAULT_PLACEHOLDER: 'Enter', ...(overrides === null || overrides === void 0 ? void 0 : overrides.DIALOG) }, TOAST: { COPY_OK: 'Copied', DOWNLOAD_START: 'Downloading...', DOWNLOAD_OK: 'File saved', DOWNLOAD_ERROR: "Couldn't download file.", OPEN_CAMERA_ERROR: "Couldn't open camera.", OPEN_FILES_ERROR: "Couldn't open files.", OPEN_PHOTO_LIBRARY_ERROR: "Couldn't open photo library.", DELETE_MSG_ERROR: "Couldn't delete message.", RESEND_MSG_ERROR: "Couldn't send message.", SEND_MSG_ERROR: "Couldn't send message.", USER_MUTED_ERROR: "You're muted by the operator.", CHANNEL_FROZEN_ERROR: 'Channel is frozen.', UPDATE_MSG_ERROR: "Couldn't edit message.", TURN_ON_NOTIFICATIONS_ERROR: "Couldn't turn on notifications.", TURN_OFF_NOTIFICATIONS_ERROR: "Couldn't turn off notifications.", LEAVE_CHANNEL_ERROR: "Couldn't leave channel.", UNKNOWN_ERROR: 'Something went wrong.', GET_CHANNEL_ERROR: "Couldn't retrieve channel.", FIND_PARENT_MSG_ERROR: "Couldn't find the original message for this reply.", THREAD_PARENT_MESSAGE_DELETED_ERROR: "The thread doesn't exist because the parent message was deleted.", FILE_UPLOAD_SIZE_LIMIT_EXCEEDED_ERROR: uploadSizeLimit => { return `The maximum size per file is ${uploadSizeLimit}.`; }, ...(overrides === null || overrides === void 0 ? void 0 : overrides.TOAST) }, PROFILE_CARD: { BUTTON_MESSAGE: 'Message', BODY_LABEL: 'User ID', BODY: user => user.userId, ...(overrides === null || overrides === void 0 ? void 0 : overrides.PROFILE_CARD) } }; }; //# sourceMappingURL=createBaseStringSet.js.map