jaehyuk-jang

Apply componenets for header loader

1 +import { useEffect, useState } from 'react';
2 +import Link from 'next/link';
3 +import { useRouter } from 'next/dist/client/router';
4 +import { Layout, Menu } from 'antd';
5 +import { MenuOutlined } from '@ant-design/icons';
6 +import { useQuery } from '@apollo/client';
7 +import { GET_ALL_POSTS } from '@src/gql/get-all-posts';
8 +
9 +const { Header: HeaderContainer } = Layout;
10 +
11 +export default function Header() {
12 + const [selected, setSelected] = useState(null);
13 + const { query } = useRouter();
14 +
15 + const { error, data } = useQuery(GET_ALL_POSTS);
16 + if (error) console.log(JSON.stringify(error, null, 2));
17 +
18 + let list = [];
19 + let getAllPosts = data?.getAllPosts || [];
20 +
21 + getAllPosts.forEach((post) => {
22 + if (!list.find((category) => post.category === category)) {
23 + list.push(post.category);
24 + }
25 + });
26 +
27 + useEffect(() => {
28 + setSelected(query.name || '/');
29 + }, [query]);
30 +
31 + return (
32 + <HeaderContainer className={'app-header'}>
33 + <Menu
34 + overflowedIndicator={<MenuOutlined className={'header-hbg-menu'} />}
35 + theme={'dark'}
36 + mode={'horizontal'}
37 + selectedKeys={[selected]}
38 + >
39 + {/* logo */}
40 + <Menu.Item key={'/'}>
41 + <Link href={'/'}>
42 + <a
43 + style={{
44 + float: 'left',
45 + width: '120px',
46 + height: '31px',
47 + margin: '16px 24px 16px 0',
48 + background: 'rgba(255, 255, 255, 0.3)',
49 + }}
50 + />
51 + </Link>
52 + </Menu.Item>
53 + {list.map((item) => (
54 + <Menu.Item key={item} className={'header-item'}>
55 + <Link href={`/category/${item}`}>
56 + <a>{item}</a>
57 + </Link>
58 + </Menu.Item>
59 + ))}
60 + </Menu>
61 + </HeaderContainer>
62 + );
63 +}
1 +import { Spin, Space } from 'antd';
2 +
3 +export const startLoading = () => {
4 + const element = document.getElementById('app-loader');
5 +
6 + element.style.display = 'flex';
7 +};
8 +
9 +export const finishLoading = () => {
10 + const element = document.getElementById('app-loader');
11 +
12 + element.style.display = 'none';
13 +};
14 +
15 +export default function Loader() {
16 + return (
17 + <Space
18 + id={'app-loader'}
19 + size="middle"
20 + style={{
21 + position: 'fixed',
22 + top: 0,
23 + left: 0,
24 + width: '100vw',
25 + height: '100vh',
26 + display: 'none',
27 + alignItems: 'center',
28 + justifyContent: 'center',
29 + zIndex: 2,
30 + }}
31 + >
32 + <Spin size="large" />
33 + </Space>
34 + );
35 +}