feishin/src/renderer/features/shared/components/library-header-bar.tsx

74 lines
1.6 KiB
TypeScript
Raw Normal View History

2023-01-02 17:03:33 -08:00
import { ReactNode } from 'react';
2023-03-31 05:22:51 -07:00
import { Box } from '@mantine/core';
import { Paper, PaperProps, SpinnerIcon, TextTitle } from '/@/renderer/components';
2023-01-02 17:03:33 -08:00
import { PlayButton as PlayBtn } from '/@/renderer/features/shared/components/play-button';
2023-03-31 05:22:51 -07:00
import styled from 'styled-components';
2023-01-02 17:03:33 -08:00
interface LibraryHeaderBarProps {
2023-07-01 19:10:05 -07:00
children: ReactNode;
2023-01-02 17:03:33 -08:00
}
2023-03-31 05:22:51 -07:00
const HeaderContainer = styled.div`
2023-07-01 19:10:05 -07:00
display: flex;
flex-wrap: nowrap;
gap: 1rem;
align-items: center;
width: 100%;
height: 100%;
padding: 0 1rem;
2023-03-31 05:22:51 -07:00
`;
2023-01-02 17:03:33 -08:00
export const LibraryHeaderBar = ({ children }: LibraryHeaderBarProps) => {
2023-07-01 19:10:05 -07:00
return <HeaderContainer>{children}</HeaderContainer>;
2023-01-02 17:03:33 -08:00
};
interface TitleProps {
2023-07-01 19:10:05 -07:00
children: ReactNode;
2023-01-02 17:03:33 -08:00
}
const Title = ({ children }: TitleProps) => {
2023-07-01 19:10:05 -07:00
return (
<TextTitle
order={1}
overflow="hidden"
weight={700}
>
{children}
</TextTitle>
);
2023-01-02 17:03:33 -08:00
};
interface PlayButtonProps {
2023-07-01 19:10:05 -07:00
onClick: () => void;
2023-01-02 17:03:33 -08:00
}
const PlayButton = ({ onClick }: PlayButtonProps) => {
2023-07-01 19:10:05 -07:00
return (
<Box>
<PlayBtn
h="45px"
w="45px"
onClick={onClick}
/>
</Box>
);
2023-01-02 17:03:33 -08:00
};
2023-03-31 05:22:51 -07:00
const Badge = styled(Paper)`
2023-07-01 19:10:05 -07:00
padding: 0.3rem 1rem;
font-weight: 600;
border-radius: 0.3rem;
2023-03-31 05:22:51 -07:00
`;
interface HeaderBadgeProps extends PaperProps {
2023-07-01 19:10:05 -07:00
isLoading?: boolean;
2023-03-31 05:22:51 -07:00
}
const HeaderBadge = ({ children, isLoading, ...props }: HeaderBadgeProps) => {
2023-07-01 19:10:05 -07:00
return <Badge {...props}>{isLoading ? <SpinnerIcon /> : children}</Badge>;
2023-03-31 05:22:51 -07:00
};
2023-01-02 17:03:33 -08:00
LibraryHeaderBar.Title = Title;
LibraryHeaderBar.PlayButton = PlayButton;
2023-03-31 05:22:51 -07:00
LibraryHeaderBar.Badge = HeaderBadge;