From 5d9dba09b783b862df7f5e1db7fcd0add396c8f3 Mon Sep 17 00:00:00 2001 From: Tiago Evangelista Pinto Date: Thu, 18 Mar 2021 17:01:33 -0300 Subject: [PATCH 01/24] team channels button on header --- client/main.js | 1 + client/views/room/lib/Toolbox/index.tsx | 2 +- client/views/room/providers/ToolboxProvider.tsx | 3 ++- .../views/teams/contextualBar/TeamChannels.tsx | 5 +++++ client/views/teams/contextualBar/index.ts | 17 +++++++++++++++++ client/views/teams/index.js | 1 + definition/IRoom.ts | 1 + 7 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 client/views/teams/contextualBar/TeamChannels.tsx create mode 100644 client/views/teams/contextualBar/index.ts diff --git a/client/main.js b/client/main.js index 0557c789eba6..9ee80d00c408 100644 --- a/client/main.js +++ b/client/main.js @@ -21,4 +21,5 @@ import './startup'; import './views/admin'; import './views/login'; import './views/room/adapters'; +import './views/teams'; import './adapters'; diff --git a/client/views/room/lib/Toolbox/index.tsx b/client/views/room/lib/Toolbox/index.tsx index 62ce552917ad..abdd6072e286 100644 --- a/client/views/room/lib/Toolbox/index.tsx +++ b/client/views/room/lib/Toolbox/index.tsx @@ -28,7 +28,7 @@ export type ToolboxActionConfig = { full?: true; renderOption?: OptionRenderer; order?: number; - groups: Array<'group' | 'channel' | 'live' | 'direct' | 'direct_multiple'>; + groups: Array<'group' | 'channel' | 'live' | 'direct' | 'direct_multiple' | 'team'>; hotkey?: string; action?: (e: MouseEvent) => void; template?: string | FC | LazyExoticComponent>; diff --git a/client/views/room/providers/ToolboxProvider.tsx b/client/views/room/providers/ToolboxProvider.tsx index a9f246f24c26..904e84406d1d 100644 --- a/client/views/room/providers/ToolboxProvider.tsx +++ b/client/views/room/providers/ToolboxProvider.tsx @@ -21,7 +21,8 @@ const groupsDict = { const VirtualAction = React.memo(({ handleChange, room, action, id }: { id: string; action: ToolboxAction; room: IRoom; handleChange: Function}): null => { const config = typeof action === 'function' ? action({ room }) : action; - const group = groupsDict[room.t]; + const group = room.teamMain ? 'team' : groupsDict[room.t]; + const visible = config && (!config.groups || (groupsDict[room.t] && config.groups.includes(group as any))); useLayoutEffect(() => { diff --git a/client/views/teams/contextualBar/TeamChannels.tsx b/client/views/teams/contextualBar/TeamChannels.tsx new file mode 100644 index 000000000000..74ca9d696fa1 --- /dev/null +++ b/client/views/teams/contextualBar/TeamChannels.tsx @@ -0,0 +1,5 @@ +import React, { memo } from 'react'; + +export const TeamChannel = () =>

; + +export default memo(TeamChannel); diff --git a/client/views/teams/contextualBar/index.ts b/client/views/teams/contextualBar/index.ts new file mode 100644 index 000000000000..d59b1a88d30f --- /dev/null +++ b/client/views/teams/contextualBar/index.ts @@ -0,0 +1,17 @@ +import { lazy, LazyExoticComponent, FC, useMemo } from 'react'; + +import { addAction } from '../../room/lib/Toolbox'; + +addAction('team-channels', () => { + const t = true; + return useMemo(() => (t ? { + groups: ['team'], + id: 'team-channels', + anonymous: true, + title: 'Team-Channels', + icon: 'hash', + template: lazy(() => import('./TeamChannels')) as LazyExoticComponent, + full: true, + order: 8, + } : null), [t]); +}); diff --git a/client/views/teams/index.js b/client/views/teams/index.js index e69de29bb2d1..e1e22a859ebb 100644 --- a/client/views/teams/index.js +++ b/client/views/teams/index.js @@ -0,0 +1 @@ +import './contextualBar'; diff --git a/definition/IRoom.ts b/definition/IRoom.ts index 7955a7eda6be..733b803daead 100644 --- a/definition/IRoom.ts +++ b/definition/IRoom.ts @@ -16,6 +16,7 @@ export interface IRoom extends IRocketChatRecord { broadcast?: true; featured?: true; encrypted?: boolean; + teamMain?: boolean; u: Pick; From 8007011a33f82cd7856e3afc7ebe5514991d59e0 Mon Sep 17 00:00:00 2001 From: Tiago Evangelista Pinto Date: Sat, 20 Mar 2021 00:16:11 -0300 Subject: [PATCH 02/24] TeamChannels component --- .../views/room/providers/ToolboxProvider.tsx | 12 +- .../teams/contextualBar/TeamChannelItem.js | 51 ++++++ .../views/teams/contextualBar/TeamChannels.js | 163 ++++++++++++++++++ .../teams/contextualBar/TeamChannels.tsx | 5 - packages/rocketchat-i18n/i18n/en.i18n.json | 3 + 5 files changed, 228 insertions(+), 6 deletions(-) create mode 100644 client/views/teams/contextualBar/TeamChannelItem.js create mode 100644 client/views/teams/contextualBar/TeamChannels.js delete mode 100644 client/views/teams/contextualBar/TeamChannels.tsx diff --git a/client/views/room/providers/ToolboxProvider.tsx b/client/views/room/providers/ToolboxProvider.tsx index 904e84406d1d..1d8f66a84a01 100644 --- a/client/views/room/providers/ToolboxProvider.tsx +++ b/client/views/room/providers/ToolboxProvider.tsx @@ -17,11 +17,21 @@ const groupsDict = { c: 'channel', }; +const getGroup = (room: IRoom): string => { + console.log(room.t); + + return 'team'; + // if (room.teamMain) { + // return 'team'; + // } + + // return groupsDict[room.t]; +}; const VirtualAction = React.memo(({ handleChange, room, action, id }: { id: string; action: ToolboxAction; room: IRoom; handleChange: Function}): null => { const config = typeof action === 'function' ? action({ room }) : action; - const group = room.teamMain ? 'team' : groupsDict[room.t]; + const group = getGroup(room); const visible = config && (!config.groups || (groupsDict[room.t] && config.groups.includes(group as any))); diff --git a/client/views/teams/contextualBar/TeamChannelItem.js b/client/views/teams/contextualBar/TeamChannelItem.js new file mode 100644 index 000000000000..cc75738dc318 --- /dev/null +++ b/client/views/teams/contextualBar/TeamChannelItem.js @@ -0,0 +1,51 @@ +import React, { useState } from 'react'; +import { ActionButton, Icon, /* Menu,*/ Option } from '@rocket.chat/fuselage'; +import { usePrefersReducedMotion } from '@rocket.chat/fuselage-hooks'; + +// import { useUserInfoActions, useUserInfoActionsSpread } from '../../../hooks/useUserInfoActions'; +import RoomAvatar from '../../../components/avatar/RoomAvatar'; + +// const UserActions = ({ room }) => { +// const { menu: menuOptions } = useUserInfoActionsSpread(useUserInfoActions({ _id, username }, rid), 0); +// if (!menuOptions) { +// return null; +// } +// return + ); +}; + +TeamChannelItem.Skeleton = Option.Skeleton; diff --git a/client/views/teams/contextualBar/TeamChannels.js b/client/views/teams/contextualBar/TeamChannels.js new file mode 100644 index 000000000000..5d88945fc377 --- /dev/null +++ b/client/views/teams/contextualBar/TeamChannels.js @@ -0,0 +1,163 @@ +import React, { memo, useCallback, useMemo, useState } from 'react'; +import { Box, Icon, TextInput, Margins, Select, Throbber, ButtonGroup, Button } from '@rocket.chat/fuselage'; +import { Virtuoso } from 'react-virtuoso'; +import { useMutableCallback, useLocalStorage, useAutoFocus } from '@rocket.chat/fuselage-hooks'; + +import { useTranslation } from '../../../contexts/TranslationContext'; +import { useEndpoint } from '../../../contexts/ServerContext'; +import { useSetModal } from '../../../contexts/ModalContext'; +import { useScrollableRecordList } from '../../../hooks/lists/useScrollableRecordList'; +import { useRecordList } from '../../../hooks/lists/useRecordList'; +import { RecordList } from '../../../lib/lists/RecordList.ts'; +import ScrollableContentWrapper from '../../../components/ScrollableContentWrapper'; +import VerticalBar from '../../../components/VerticalBar'; +import AddExistingModal from '../modals/AddExistingModal'; +import { TeamChannelItems } from './TeamChannelItem'; + +const Row = memo(({ room }) => { + if (!room) { + return ; + } + + return ; +}); + +export const TeamChannels = ({ + loading, + channels = [], + text, + type, + setText, + setType, + onClickClose, + onClickAddExisting, + onClickCreateNew, + total, + loadMoreItems, +}) => { + const t = useTranslation(); + const inputRef = useAutoFocus(true); + + const options = useMemo(() => [ + ['all', t('All')], + ['autoJoin', t('Auto-join')], + ], [t]); + + const lm = useMutableCallback((start) => loadMoreItems(start + 1, Math.min(50, start + 1 - channels.length))); + + return ( + <> + + + {t('Channels')} + { onClickClose && } + + + + + + + }/> +