feat(dashboard-v2): add ProgressBar component

This commit is contained in:
Michał Leszczyk 2022-03-01 16:49:42 +01:00
parent 901d2b4ba8
commit ec8119fecf
No known key found for this signature in database
GPG Key ID: FA123CA8BAA2FBF4
2 changed files with 108 additions and 0 deletions

View File

@ -0,0 +1,71 @@
import cn from "classnames";
import PropTypes from "prop-types";
import styled, { css, keyframes } from "styled-components";
const moveAnimation = keyframes`
0% {
background-position: 0 0;
}
100% {
background-position: 15px 0;
}
`;
const Container = styled.div.attrs(({ $status }) => ({
className: cn("flex relative rounded-sm h-1", { "bg-palette-200": $status === "uploading" }),
}))``;
const Indicator = styled.div.attrs(({ $status }) => ({
className: cn(
`
rounded-sm bg-[length:15px_10px]
`,
{
"bg-primary": $status === "uploading" || $status === "complete",
"text-primary": $status !== "error",
"text-error": $status === "error",
"bg-dashed": $status === "error" || $status === "enqueued" || $status === "processing",
}
),
}))`
width: ${({ $status, $percentage }) => ($status === "uploading" ? $percentage : 100)}%;
&.bg-dashed {
opacity: 0.4;
background-image: linear-gradient(
-60deg,
transparent,
transparent 30%,
currentColor 30%,
currentColor 70%,
transparent 70%,
transparent
);
animation: ${css`
${moveAnimation} 1s linear infinite
`};
}
`;
/**
* Primary UI component for indicating progress of a given task
*/
export const ProgressBar = ({ status, percentage, ...props }) => (
<Container $status={status} {...props}>
<Indicator $status={status} $percentage={percentage} />
</Container>
);
ProgressBar.propTypes = {
/**
* Status of the task
*/
status: PropTypes.oneOf(["complete", "enqueued", "error", "uploading", "processing"]),
/**
* Progress of the task (in case status is "uploading")
*/
percentage: PropTypes.number,
};
ProgressBar.defaultProps = {
status: "enqueued",
percentage: 0,
};

View File

@ -0,0 +1,37 @@
import React from "react";
import { ProgressBar } from "./ProgressBar";
// More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
export default {
title: "SkynetLibrary/ProgressBar",
component: ProgressBar,
// More on argTypes: https://storybook.js.org/docs/react/api/argtypes
};
// More on component templates: https://storybook.js.org/docs/react/writing-stories/introduction#using-args
const Template = (args) => <ProgressBar {...args} />;
export const Uploading = Template.bind({});
// More on args: https://storybook.js.org/docs/react/writing-stories/args
Uploading.args = {
status: "uploading",
percentage: 65,
};
export const Complete = Template.bind({});
// More on args: https://storybook.js.org/docs/react/writing-stories/args
Complete.args = {
status: "complete",
};
export const Enqueued = Template.bind({});
// More on args: https://storybook.js.org/docs/react/writing-stories/args
Enqueued.args = {
status: "enqueued",
};
export const Error = Template.bind({});
// More on args: https://storybook.js.org/docs/react/writing-stories/args
Error.args = {
status: "error",
};