diff --git a/web/components/action-buttons/ActionButtonMenu/ActionButtonMenu.module.scss b/web/components/action-buttons/ActionButtonMenu/ActionButtonMenu.module.scss new file mode 100644 index 000000000..783fafc9f --- /dev/null +++ b/web/components/action-buttons/ActionButtonMenu/ActionButtonMenu.module.scss @@ -0,0 +1,15 @@ +.item { + display: flex; + align-items: center; +} + +.icon { + height: 15px; + margin-right: 5px; +} + +.menu { + border: none; + background-color: transparent; + margin: 8px; +} diff --git a/web/components/action-buttons/ActionButtonMenu/ActionButtonMenu.stories.tsx b/web/components/action-buttons/ActionButtonMenu/ActionButtonMenu.stories.tsx new file mode 100644 index 000000000..0df61f881 --- /dev/null +++ b/web/components/action-buttons/ActionButtonMenu/ActionButtonMenu.stories.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; +import { ActionButtonMenu } from './ActionButtonMenu'; + +export default { + title: 'owncast/Components/Action Buttons/Action Menu', + component: ActionButtonMenu, + parameters: {}, +} as ComponentMeta; + +const itemSelected = a => { + console.log('itemSelected', a); + action(a.title); +}; + +const Template: ComponentStory = args => ( + itemSelected(a)} /> +); + +const actions = [ + { + url: 'https://owncast.online/docs', + title: 'Documentation', + description: 'Owncast Documentation', + icon: 'https://owncast.online/images/logo.svg', + color: '#5232c8', + openExternally: false, + }, + { + url: 'https://opencollective.com/embed/owncast/donate', + title: 'Support Owncast', + description: 'Contribute to Owncast', + icon: 'https://opencollective.com/static/images/opencollective-icon.svg', + color: '#2b4863', + openExternally: false, + }, +]; + +export const Example = Template.bind({}); +Example.args = { + actions, +}; diff --git a/web/components/action-buttons/ActionButtonMenu/ActionButtonMenu.tsx b/web/components/action-buttons/ActionButtonMenu/ActionButtonMenu.tsx new file mode 100644 index 000000000..7dad682fb --- /dev/null +++ b/web/components/action-buttons/ActionButtonMenu/ActionButtonMenu.tsx @@ -0,0 +1,43 @@ +import { FC } from 'react'; +import { Dropdown, Menu, Space } from 'antd'; +import { DownOutlined, StarOutlined } from '@ant-design/icons'; +import styles from './ActionButtonMenu.module.scss'; +import { ExternalAction } from '../../../interfaces/external-action'; + +export type ActionButtonMenuProps = { + actions: ExternalAction[]; + externalActionSelected: (action: ExternalAction) => void; +}; + +export const ActionButtonMenu: FC = ({ + actions, + externalActionSelected, +}) => { + const onMenuClick = a => { + const action = actions.find(x => x.url === a.key); + externalActionSelected(action); + }; + + const items = actions.map(action => ({ + key: action.url, + label: ( + + {action.icon && {action.title}}{' '} + {action.title} + + ), + })); + + const menu = ; + + return ( + + + + ); +}; diff --git a/web/components/ui/Content/Content.tsx b/web/components/ui/Content/Content.tsx index ad8ef7388..3fea01798 100644 --- a/web/components/ui/Content/Content.tsx +++ b/web/components/ui/Content/Content.tsx @@ -36,6 +36,7 @@ import { ChatMessage } from '../../../interfaces/chat-message.model'; import { FollowerCollection } from '../followers/FollowerCollection/FollowerCollection'; import { ExternalAction } from '../../../interfaces/external-action'; import { Modal } from '../Modal/Modal'; +import { ActionButtonMenu } from '../../action-buttons/ActionButtonMenu/ActionButtonMenu'; const { Content: AntContent } = Layout; @@ -113,6 +114,8 @@ const MobileContent = ({ messages, currentUser, showChat, + actions, + setExternalActionToDisplay, }) => { if (!currentUser) { return null; @@ -147,16 +150,23 @@ const MobileContent = ({ const followersTabContent = ; const items = [ - { label: 'Chat', key: '1', children: chatContent }, + showChat && { label: 'Chat', key: '0', children: chatContent }, { label: 'About', key: '2', children: aboutTabContent }, { label: 'Followers', key: '3', children: followersTabContent }, ]; const height = `${useHeight(mobileContentRef)}px`; + const replacementTabBar = (props, DefaultTabBar) => ( +
+ + +
+ ); + return (
- +
); }; @@ -293,17 +303,19 @@ export const Content: FC = () => {
- - {externalActionButtons} - - setShowNotifyPopup(true)} - notificationClosed={() => disableNotifyReminderPopup()} - > - setShowNotifyPopup(true)} /> - - + {!isMobile && ( + + {externalActionButtons} + + setShowNotifyPopup(true)} + notificationClosed={() => disableNotifyReminderPopup()} + > + setShowNotifyPopup(true)} /> + + + )} {
- {isMobile && isChatVisible ? ( + {isMobile ? ( { messages={messages} currentUser={currentUser} showChat={showChat} + actions={externalActions} + setExternalActionToDisplay={externalActionSelected} /> ) : (