Files
mattermost-mobile/app/components/channel_item/index.ts
2023-01-27 18:11:18 +02:00

109 lines
3.4 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {withDatabase} from '@nozbe/watermelondb/DatabaseProvider';
import withObservables from '@nozbe/with-observables';
import React from 'react';
import {of as of$} from 'rxjs';
import {switchMap, distinctUntilChanged} from 'rxjs/operators';
import {observeChannelsWithCalls} from '@calls/state';
import {General} from '@constants';
import {withServerUrl} from '@context/server';
import {observeChannelSettings, observeMyChannel, queryChannelMembers} from '@queries/servers/channel';
import {queryDraft} from '@queries/servers/drafts';
import {observeCurrentChannelId, observeCurrentUserId} from '@queries/servers/system';
import {observeTeam} from '@queries/servers/team';
import ChannelItem from './channel_item';
import type {WithDatabaseArgs} from '@typings/database/database';
import type ChannelModel from '@typings/database/models/servers/channel';
import type MyChannelModel from '@typings/database/models/servers/my_channel';
type EnhanceProps = WithDatabaseArgs & {
channel: ChannelModel;
showTeamName?: boolean;
serverUrl?: string;
}
const observeIsMutedSetting = (mc: MyChannelModel) => observeChannelSettings(mc.database, mc.id).pipe(switchMap((s) => of$(s?.notifyProps?.mark_unread === General.MENTION)));
const enhance = withObservables(['channel', 'showTeamName'], ({
channel,
database,
showTeamName,
serverUrl,
}: EnhanceProps) => {
const currentUserId = observeCurrentUserId(database);
const myChannel = observeMyChannel(database, channel.id);
const hasDraft = queryDraft(database, channel.id).observeWithColumns(['message', 'files']).pipe(
switchMap((draft) => of$(draft.length > 0)),
distinctUntilChanged(),
);
const isActive = observeCurrentChannelId(database).pipe(
switchMap((id) => of$(id ? id === channel.id : false)),
distinctUntilChanged(),
);
const isMuted = myChannel.pipe(
switchMap((mc) => {
if (!mc) {
return of$(false);
}
return observeIsMutedSetting(mc);
}),
);
let teamDisplayName = of$('');
if (channel.teamId && showTeamName) {
teamDisplayName = observeTeam(database, channel.teamId).pipe(
switchMap((team) => of$(team?.displayName || '')),
distinctUntilChanged(),
);
}
let membersCount = of$(0);
if (channel.type === General.GM_CHANNEL) {
membersCount = queryChannelMembers(database, channel.id).observeCount(false);
}
const isUnread = myChannel.pipe(
switchMap((mc) => of$(mc?.isUnread)),
distinctUntilChanged(),
);
const mentionsCount = myChannel.pipe(
switchMap((mc) => of$(mc?.mentionsCount)),
distinctUntilChanged(),
);
const hasMember = myChannel.pipe(
switchMap((mc) => of$(Boolean(mc))),
distinctUntilChanged(),
);
const hasCall = observeChannelsWithCalls(serverUrl || '').pipe(
switchMap((calls) => of$(Boolean(calls[channel.id]))),
distinctUntilChanged(),
);
return {
channel: channel.observe(),
currentUserId,
hasDraft,
isActive,
isMuted,
membersCount,
isUnread,
mentionsCount,
teamDisplayName,
hasMember,
hasCall,
};
});
export default React.memo(withDatabase(withServerUrl(enhance(ChannelItem))));