Skip to content

Commit dd7316b

Browse files
committed
feat: improve primary color load performance
1 parent 2ec6b35 commit dd7316b

File tree

11 files changed

+51
-46
lines changed

11 files changed

+51
-46
lines changed

src/components/Customizer/index.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { useState, useRef, useCallback } from 'react';
22
import { Setting, CloseSquare } from 'react-iconly';
3-
import { useOnClickOutside, useBodyScroll } from '@hooks';
3+
import { useOnClickOutside, useBodyScroll, useChangeRootColor } from '@hooks';
44
import { useForm } from 'react-hook-form';
55
import { Input, Switch } from '@components';
66
import { isEmpty } from 'lodash';
77
import { useToasts } from '@contexts/toasts';
88
import { useUserDataContext } from '@contexts/user-data';
9-
import { useCustomizerContext } from '@contexts/customizer';
109
import rules from '@common/rules';
1110
import { upsertUser } from '@services/user';
11+
1212
import ColorPicker from './color-picker';
1313
import { CustomizerContainer, CustomizerToggle } from './styles';
1414

@@ -19,8 +19,7 @@ const Customizer = () => {
1919
const [, setBodyHidden] = useBodyScroll(null, { scrollLayer: true });
2020
const { ToastsType, addToastWithTimeout } = useToasts();
2121
const { user, updateValue: updateUserData } = useUserDataContext();
22-
const { primaryColor, updateValue } = useCustomizerContext();
23-
const [localColor, setLocalColor] = useState(() => primaryColor);
22+
const [localColor, setLocalColor] = useState(user.primaryColor);
2423

2524
const { register, handleSubmit, formState, errors } = useForm({
2625
mode: 'onBlur',
@@ -50,7 +49,7 @@ const Customizer = () => {
5049
(color) => {
5150
setLocalColor(color);
5251
setTimeout(() => {
53-
updateValue({ primaryColor: color });
52+
useChangeRootColor(color);
5453
}, 100);
5554
},
5655
[localColor],

src/components/Toasts/styles.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ export const ErrorToast = styled(Toast)`
6363
`;
6464

6565
export const SuccessToast = styled(Toast)`
66-
background-color: ${prop('theme.brand.success')};
67-
color: ${prop('theme.genericColors.black')};
66+
background-color: ${prop('theme.brand.primary')};
67+
color: ${prop('theme.genericColors.white')};
68+
box-shadow: ${prop('theme.shadows.small')};
6869
`;
6970

7071
export const NeutralToast = styled(Toast)`

src/hooks/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ export { default as useScrollDirection } from './use-scroll-direction';
33
export { default as useNearScreen } from './use-near-screen';
44
export { useInputValue } from './use-input-value';
55
export { useBodyScroll } from './use-body-scroll';
6+
export { useChangeRootColor } from './use-change-root-color';
67
export { useMediaQuery, useIsMobile } from './use-media-query';

src/hooks/use-change-root-color.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export const useChangeRootColor = (color, rootColor = 'primary') => {
2+
if (typeof document !== 'undefined' && color) {
3+
const root = document.documentElement;
4+
root.style.setProperty(`--colors-${rootColor}`, color);
5+
}
6+
};

src/layouts/portfolio.js

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@ import { useEffect } from 'react';
33
import { Toasts } from '@components';
44
import { withRouter } from 'next/router';
55
import dynamic from 'next/dynamic';
6-
import { ThemeProvider } from 'styled-components';
7-
import theme from '@themes/dark';
86
import { IS_GENERATOR } from '@lib/constants';
97
import { useUIContext } from '@contexts/ui';
10-
import { useCustomizerContext } from '@contexts/customizer';
118
import { useUserDataContext } from '@contexts/user-data';
129
import { isEmpty } from 'lodash';
1310
import { SkipToContentLink } from './styles';
@@ -23,18 +20,8 @@ const PorfolioLayout = ({ children, router }) => {
2320
const isBrowser = typeof window !== `undefined`;
2421
const isHome = router.pathname === '/';
2522
const { showNavbar, showDeployButton, mainFullHeight, showCustomizer } = useUIContext();
26-
const { primaryColor, updateValue } = useCustomizerContext();
2723
const { user } = useUserDataContext();
2824

29-
const primary = user.primaryColor ? user.primaryColor : primaryColor;
30-
const customTheme = { ...theme, brand: { ...theme.brand, primary } };
31-
32-
if (primary !== primaryColor) {
33-
updateValue({ primaryColor: primary });
34-
} else if (primary === 'transparent') {
35-
updateValue({ primaryColor: '#1ee0e0' });
36-
}
37-
3825
useEffect(() => {
3926
if (!isBrowser) {
4027
return;
@@ -55,19 +42,17 @@ const PorfolioLayout = ({ children, router }) => {
5542
}, []);
5643

5744
return (
58-
<ThemeProvider theme={customTheme}>
59-
<BaseLayout isPortfolio>
60-
<SkipToContentLink href="#content">Skip to Content</SkipToContentLink>
61-
{showNavbar && <Navbar isHome={isHome} />}
62-
<Main id="content" fullHeight={mainFullHeight} className="fillHeight">
63-
{children}
64-
</Main>
65-
{IS_GENERATOR && showDeployButton && <VercelButton />}
66-
{IS_GENERATOR && showCustomizer && <Customizer />}
67-
{IS_GENERATOR && <Toasts />}
68-
<Footer simple={isEmpty(user.username)} user={user} />
69-
</BaseLayout>
70-
</ThemeProvider>
45+
<BaseLayout isPortfolio>
46+
<SkipToContentLink href="#content">Skip to Content</SkipToContentLink>
47+
{showNavbar && <Navbar isHome={isHome} />}
48+
<Main id="content" fullHeight={mainFullHeight} className="fillHeight">
49+
{children}
50+
</Main>
51+
{IS_GENERATOR && showDeployButton && <VercelButton />}
52+
{IS_GENERATOR && showCustomizer && <Customizer />}
53+
{IS_GENERATOR && <Toasts />}
54+
<Footer simple={isEmpty(user.username)} user={user} />
55+
</BaseLayout>
7156
);
7257
};
7358

src/pages/_app.js

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,30 @@ import GlobalStyles from '@styles/globals';
55
import * as gtag from '@lib/gtag';
66
import UserDataContext from '@contexts/user-data';
77
import UIContext from '@contexts/ui';
8+
import theme from '@themes/dark';
89
import CustomizerContext from '@contexts/customizer';
910
import ToastsContext from '@contexts/toasts';
1011
import 'react-tippy/dist/tippy.css';
12+
import { ThemeProvider } from 'styled-components';
1113
// Notice how we track pageview when route is changed
1214
Router.events.on('routeChangeComplete', (url) => gtag.pageview(url));
1315

1416
export default function App({ Component, pageProps }) {
1517
const Layout = Component.Layout || PortfolioLayout;
1618
return (
17-
<CustomizerContext.Provider>
18-
<UserDataContext.Provider>
19-
<ToastsContext.Provider>
20-
<UIContext.Provider>
21-
<Layout>
22-
<GlobalStyles />
23-
<Component {...pageProps} />
24-
</Layout>
25-
</UIContext.Provider>
26-
</ToastsContext.Provider>
27-
</UserDataContext.Provider>
28-
</CustomizerContext.Provider>
19+
<ThemeProvider theme={theme}>
20+
<CustomizerContext.Provider>
21+
<UserDataContext.Provider>
22+
<ToastsContext.Provider>
23+
<UIContext.Provider>
24+
<Layout>
25+
<GlobalStyles />
26+
<Component {...pageProps} />
27+
</Layout>
28+
</UIContext.Provider>
29+
</ToastsContext.Provider>
30+
</UserDataContext.Provider>
31+
</CustomizerContext.Provider>
32+
</ThemeProvider>
2933
);
3034
}

src/pages/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { StyledMainContainer } from '@common/styles';
33
import PortfolioLayout from '@layouts/portfolio';
44
import HomeLayout from '@layouts/home';
55
import buildUser from '@lib/user-builder';
6+
import { useChangeRootColor } from '@hooks';
67
import { isEnabledUser } from '@utils/user-mapping';
78
import { IS_PORTFOLIO } from '@lib/constants';
89
import PropTypes from 'prop-types';
@@ -30,6 +31,7 @@ const IndexPage = ({ user }) => {
3031
if (!isEnabledUser(user)) {
3132
return <UserNotFoundView username={user?.username} />;
3233
}
34+
useChangeRootColor(user.primaryColor);
3335
return <PortfolioView user={user} />;
3436
}
3537
return (

src/pages/portfolio/[username].js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useState, useEffect } from 'react';
22
import { UserNotFoundView, PortfolioView } from '@views';
33
import { withRouter } from 'next/router';
44
import PropTypes from 'prop-types';
5+
import { useChangeRootColor } from '@hooks';
56
import { LoaderContainer, Loader } from '@common/styles';
67
import buildUser from '@lib/user-builder';
78
import { isEnabledUser } from '@utils/user-mapping';
@@ -51,6 +52,7 @@ const PortfolioPage = ({ router, user }) => {
5152
if (!router.isFallback && !isEnabledUser(user)) {
5253
return <UserNotFoundView username={user?.username} />;
5354
}
55+
useChangeRootColor(user.primaryColor);
5456
return <PortfolioView user={user} />;
5557
};
5658

src/pages/preview/[username].js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { LoaderContainer, Loader } from '@common/styles';
55
import buildUser from '@lib/user-builder';
66
import { isEnabledUser } from '@utils/user-mapping';
77
import { IS_PORTFOLIO } from '@lib/constants';
8+
import { useChangeRootColor } from '@hooks';
89

910
export async function getStaticPaths() {
1011
return { paths: [], fallback: true };
@@ -40,6 +41,7 @@ const PreviewPage = ({ router, user }) => {
4041
if (!router.isFallback && !isEnabledUser(user)) {
4142
return <UserNotFoundView username={user?.username} />;
4243
}
44+
useChangeRootColor(user.primaryColor);
4345
return <PortfolioView isPreview user={user} />;
4446
};
4547

src/styles/globals.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ export default createGlobalStyle`
77
1. Base styles
88
-------------------------------------------------------------------------------
99
*/
10+
:root {
11+
--colors-primary: #1ee0e0;
12+
}
1013
* {
1114
border: 0;
1215
box-sizing: inherit;

src/themes/common.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default {
1414
lg: '3rem',
1515
},
1616
brand: {
17-
primary: '#1ee0e0',
17+
primary: 'var(--colors-primary)',
1818
success: '#79FFE1',
1919
danger: '#ff4d4f',
2020
warning: '#F5A623',

0 commit comments

Comments
 (0)