* Initial commit post input * Fix message posting, add create direct channel and minor fixes * Fix "is typing" and "react to last post" behaviour * Some reordering, better handling of upload error, properly clear draft on send message, and fix minor progress bar misbehavior * Add keyboard listener for shift-enter, add selection between video or photo while attaching, add alert when trying to attach more than you are allowed, add paste functionality, minor fixes and reordering * Add library patch * Fix lint * Address feedback * Address feedback * Add missing negation * Check for group name and fix typo on draft comparisons * Address feedback * Address feedback * Address feedback * Address feedback * Fix several bugs * Remove @app imports * Address feedback * fix post list & post draft layout on iOS * Fix post draft cursor position * Fix file upload route * Allow to pick multiple images using the image picker * accurately get the channel member count * remove android cursor workaround * Remove local const INPUT_LINE_HEIGHT * move getPlaceHolder out of the component * use substring instead of legacy substr for hardward keyboard * Move onAppStateChange above the effects * Fix camera action bottom sheet * no need to memo SendButton * properly use memberCount in sender handler * Refactor how to get memberCount * Fix queryRecentPostsInThread * Remove unused isDirectChannelVisible && isGroupChannelVisible util functions * rename errorBadUser to errorUnkownUser * extract localized strings * use ClientErrorProps instead of ClientError * Minor improvements Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
64 lines
2.7 KiB
TypeScript
64 lines
2.7 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import {General, Permissions} from '@constants';
|
|
import {DEFAULT_LOCALE} from '@i18n';
|
|
import {hasPermission} from '@utils/role';
|
|
|
|
import type ChannelModel from '@typings/database/models/servers/channel';
|
|
|
|
export function getDirectChannelName(id: string, otherId: string): string {
|
|
let handle;
|
|
|
|
if (otherId > id) {
|
|
handle = id + '__' + otherId;
|
|
} else {
|
|
handle = otherId + '__' + id;
|
|
}
|
|
|
|
return handle;
|
|
}
|
|
|
|
export function selectDefaultChannelForTeam<T extends Channel|ChannelModel>(channels: T[], memberships: ChannelMembership[], teamId: string, roles?: Role[], locale = DEFAULT_LOCALE) {
|
|
let channel: T|undefined;
|
|
let canIJoinPublicChannelsInTeam = false;
|
|
|
|
if (roles) {
|
|
canIJoinPublicChannelsInTeam = hasPermission(roles, Permissions.JOIN_PUBLIC_CHANNELS, true);
|
|
}
|
|
const defaultChannel = channels?.find((c) => c.name === General.DEFAULT_CHANNEL);
|
|
const iAmMemberOfTheTeamDefaultChannel = Boolean(defaultChannel && memberships?.find((m) => m.channel_id === defaultChannel.id));
|
|
const myFirstTeamChannel = channels?.filter((c) =>
|
|
(('team_id' in c) ? c.team_id : c.teamId) === teamId &&
|
|
c.type === General.OPEN_CHANNEL &&
|
|
Boolean(memberships?.find((m) => c.id === m.channel_id),
|
|
)).sort(sortChannelsByDisplayName.bind(null, locale))[0];
|
|
|
|
if (iAmMemberOfTheTeamDefaultChannel || canIJoinPublicChannelsInTeam) {
|
|
channel = defaultChannel;
|
|
} else {
|
|
channel = myFirstTeamChannel || defaultChannel;
|
|
}
|
|
|
|
return channel;
|
|
}
|
|
|
|
export function sortChannelsByDisplayName<T extends Channel|ChannelModel>(locale: string, a: T, b: T): number {
|
|
// if both channels have the display_name defined
|
|
const aDisplayName = 'display_name' in a ? a.display_name : a.displayName;
|
|
const bDisplayName = 'display_name' in b ? b.display_name : b.displayName;
|
|
if (aDisplayName && bDisplayName && aDisplayName !== bDisplayName) {
|
|
return aDisplayName.toLowerCase().localeCompare(bDisplayName.toLowerCase(), locale, {numeric: true});
|
|
}
|
|
|
|
return a.name.toLowerCase().localeCompare(b.name.toLowerCase(), locale, {numeric: true});
|
|
}
|
|
|
|
export function sortChannelsModelByDisplayName(locale: string, a: ChannelModel, b: ChannelModel): number {
|
|
// if both channels have the display_name defined
|
|
if (a.displayName && b.displayName && a.displayName !== b.displayName) {
|
|
return a.displayName.toLowerCase().localeCompare(b.displayName.toLowerCase(), locale, {numeric: true});
|
|
}
|
|
|
|
return a.name.toLowerCase().localeCompare(b.name.toLowerCase(), locale, {numeric: true});
|
|
}
|