diff --git a/packages/bruno-app/src/components/Preferences/StyledWrapper.js b/packages/bruno-app/src/components/Preferences/StyledWrapper.js new file mode 100644 index 000000000..9cb6e7f7e --- /dev/null +++ b/packages/bruno-app/src/components/Preferences/StyledWrapper.js @@ -0,0 +1,36 @@ +import styled from 'styled-components'; + +const StyledWrapper = styled.div` + div.tabs { + margin-top: -0.5rem; + + div.tab { + padding: 6px 0px; + border: none; + border-bottom: solid 2px transparent; + margin-right: 1.25rem; + color: var(--color-tab-inactive); + cursor: pointer; + + &:focus, + &:active, + &:focus-within, + &:focus-visible, + &:target { + outline: none !important; + box-shadow: none !important; + } + + &.active { + color: ${(props) => props.theme.tabs.active.color} !important; + border-bottom: solid 2px ${(props) => props.theme.tabs.active.border} !important; + } + } + } + + section.tab-panel { + min-height: 300px; + } +`; + +export default StyledWrapper; diff --git a/packages/bruno-app/src/components/SwitchTheme/StyledWrapper.js b/packages/bruno-app/src/components/Preferences/Support/StyledWrapper.js similarity index 84% rename from packages/bruno-app/src/components/SwitchTheme/StyledWrapper.js rename to packages/bruno-app/src/components/Preferences/Support/StyledWrapper.js index b919eda20..336e962e1 100644 --- a/packages/bruno-app/src/components/SwitchTheme/StyledWrapper.js +++ b/packages/bruno-app/src/components/Preferences/Support/StyledWrapper.js @@ -1,8 +1,8 @@ import styled from 'styled-components'; const StyledWrapper = styled.div` - color: var(--color-text); - .collection-options { + color: ${(props) => props.theme.text}; + .rows { svg { position: relative; top: -1px; diff --git a/packages/bruno-app/src/components/Preferences/Support/index.js b/packages/bruno-app/src/components/Preferences/Support/index.js new file mode 100644 index 000000000..c4b612cec --- /dev/null +++ b/packages/bruno-app/src/components/Preferences/Support/index.js @@ -0,0 +1,44 @@ +import React from 'react'; +import { IconSpeakerphone, IconBrandTwitter, IconBrandGithub, IconBrandDiscord, IconBook } from '@tabler/icons'; +import StyledWrapper from './StyledWrapper'; + +const Support = () => { + return ( + +
+
+ + + Documentation + +
+
+ + + Report Issues + +
+
+ + + Discord + +
+
+ + + Github + +
+
+ + + Twitter + +
+
+
+ ); +}; + +export default Support; diff --git a/packages/bruno-app/src/components/Preferences/Theme/StyledWrapper.js b/packages/bruno-app/src/components/Preferences/Theme/StyledWrapper.js new file mode 100644 index 000000000..6a7e186ab --- /dev/null +++ b/packages/bruno-app/src/components/Preferences/Theme/StyledWrapper.js @@ -0,0 +1,7 @@ +import styled from 'styled-components'; + +const StyledWrapper = styled.div` + color: var(--color-text); +`; + +export default StyledWrapper; diff --git a/packages/bruno-app/src/components/Preferences/Theme/index.js b/packages/bruno-app/src/components/Preferences/Theme/index.js new file mode 100644 index 000000000..e49599016 --- /dev/null +++ b/packages/bruno-app/src/components/Preferences/Theme/index.js @@ -0,0 +1,64 @@ +import React from 'react'; +import { useFormik } from 'formik'; +import * as Yup from 'yup'; +import StyledWrapper from './StyledWrapper'; +import { useTheme } from 'providers/Theme'; + +const Theme = () => { + const { storedTheme, setStoredTheme } = useTheme(); + + const formik = useFormik({ + enableReinitialize: true, + initialValues: { + theme: storedTheme + }, + validationSchema: Yup.object({ + theme: Yup.string().oneOf(['light', 'dark']).required('theme is required') + }), + onSubmit: (values) => { + setStoredTheme(values.theme); + } + }); + + return ( + +
+
+ { + formik.handleChange(e); + formik.handleSubmit() + }} + value="light" + checked={formik.values.theme === 'light'} + /> + + + { + formik.handleChange(e); + formik.handleSubmit() + }} + value="dark" + checked={formik.values.theme === 'dark'} + /> + +
+
+
+ ); +}; + +export default Theme; diff --git a/packages/bruno-app/src/components/Preferences/index.js b/packages/bruno-app/src/components/Preferences/index.js new file mode 100644 index 000000000..fe6d9c475 --- /dev/null +++ b/packages/bruno-app/src/components/Preferences/index.js @@ -0,0 +1,53 @@ +import Modal from 'components/Modal/index'; +import classnames from 'classnames'; +import React, { useState } from 'react'; +import Support from './Support'; +import Theme from './Theme'; +import StyledWrapper from './StyledWrapper'; + +const Preferences = ({ onClose }) => { + const [tab, setTab] = useState('general'); + + const getTabClassname = (tabName) => { + return classnames(`tab select-none ${tabName}`, { + active: tabName === tab + }); + }; + + const getTabPanel = (tab) => { + switch (tab) { + case 'general': { + return
General
; + } + + case 'theme': { + return ; + } + + case 'support': { + return ; + } + } + }; + + return ( + + +
+
setTab('general')}> + General +
+
setTab('theme')}> + Theme +
+
setTab('support')}> + Support +
+
+
{getTabPanel(tab)}
+
+
+ ); +}; + +export default Preferences; diff --git a/packages/bruno-app/src/components/Sidebar/MenuBar/StyledWrapper.js b/packages/bruno-app/src/components/Sidebar/MenuBar/StyledWrapper.js deleted file mode 100644 index aed4aa441..000000000 --- a/packages/bruno-app/src/components/Sidebar/MenuBar/StyledWrapper.js +++ /dev/null @@ -1,19 +0,0 @@ -import styled from 'styled-components'; - -const Wrapper = styled.div` - background-color: ${(props) => props.theme.menubar.bg}; - color: rgba(255, 255, 255, 0.4); - min-height: 100vh; - - .menu-item { - padding: 0.6rem; - cursor: pointer; - - &:hover, - &.active { - color: rgba(255, 255, 255); - } - } -`; - -export default Wrapper; diff --git a/packages/bruno-app/src/components/Sidebar/MenuBar/index.js b/packages/bruno-app/src/components/Sidebar/MenuBar/index.js deleted file mode 100644 index 1cd2245d6..000000000 --- a/packages/bruno-app/src/components/Sidebar/MenuBar/index.js +++ /dev/null @@ -1,60 +0,0 @@ -import { useState } from 'react'; -import { useRouter } from 'next/router'; -import { useDispatch } from 'react-redux'; -import { isElectron } from 'utils/common/platform'; -import { toggleLeftMenuBar } from 'providers/ReduxStore/slices/app'; -import { IconCode, IconFiles, IconMoon, IconChevronsLeft, IconLifebuoy } from '@tabler/icons'; - -import Link from 'next/link'; -import StyledWrapper from './StyledWrapper'; -import BrunoSupport from 'components/BrunoSupport'; -import SwitchTheme from 'components/SwitchTheme'; - -const MenuBar = () => { - const router = useRouter(); - const dispatch = useDispatch(); - const [openTheme, setOpenTheme] = useState(false); - const [openBrunoSupport, setOpenBrunoSupport] = useState(false); - const isPlatformElectron = isElectron(); - - const getClassName = (menu) => { - return router.pathname === menu ? 'active menu-item' : 'menu-item'; - }; - - return ( - - {openBrunoSupport && setOpenBrunoSupport(false)} />} - {openTheme && setOpenTheme(false)} />} - -
- {/* Todo: Fix this: Clicking on this crashes the app */} - {/* -
- -
- */} - {/*
- -
*/} -
-
- {/* -
- -
- */} -
setOpenBrunoSupport(true)}> - -
-
setOpenTheme(true)}> - -
-
dispatch(toggleLeftMenuBar())}> - -
-
-
- ); -}; - -export default MenuBar; diff --git a/packages/bruno-app/src/components/Sidebar/index.js b/packages/bruno-app/src/components/Sidebar/index.js index 712ba6b88..378277149 100644 --- a/packages/bruno-app/src/components/Sidebar/index.js +++ b/packages/bruno-app/src/components/Sidebar/index.js @@ -1,13 +1,13 @@ -import MenuBar from './MenuBar'; import TitleBar from './TitleBar'; import Collections from './Collections'; -import StyledWrapper, { BottomWrapper, VersionNumber } from './StyledWrapper'; -import GitHubButton from 'react-github-btn' +import StyledWrapper from './StyledWrapper'; +import GitHubButton from 'react-github-btn'; +import Preferences from 'components/Preferences'; import { useState, useEffect } from 'react'; import { useSelector, useDispatch } from 'react-redux'; -import { IconChevronsRight } from '@tabler/icons'; -import { updateLeftSidebarWidth, updateIsDragging, toggleLeftMenuBar } from 'providers/ReduxStore/slices/app'; +import { IconSettings } from '@tabler/icons'; +import { updateLeftSidebarWidth, updateIsDragging } from 'providers/ReduxStore/slices/app'; import { useTheme } from 'providers/Theme'; const MIN_LEFT_SIDEBAR_WIDTH = 222; @@ -15,7 +15,7 @@ const MAX_LEFT_SIDEBAR_WIDTH = 600; const Sidebar = () => { const leftSidebarWidth = useSelector((state) => state.app.leftSidebarWidth); - const leftMenuBarOpen = useSelector((state) => state.app.leftMenuBarOpen); + const [ preferencesOpen, setPreferencesOpen ] = useState(false); const [asideWidth, setAsideWidth] = useState(leftSidebarWidth); @@ -76,16 +76,14 @@ const Sidebar = () => { setAsideWidth(leftSidebarWidth); }, [leftSidebarWidth]); - const leftMenuBarWidth = leftMenuBarOpen ? 48 : 0; - const collectionsWidth = asideWidth - leftMenuBarWidth; return (