0.1.2 • Published 4 years ago

@ssen/snackbar v0.1.2

Weekly downloads
10
License
MIT
Repository
github
Last release
4 years ago

Install

npm install @ssen/snackbar

API

1) Add the <SnackbarProvider> on your top node of App.

function App() {
  <SnackbarProvider>
    {children}
  </SnackbarProvider>
}

2) Assign the snackbarContainer ref object to some <div> to use as the snackbar container.

function Component({children}) {
  const {snackbarContainer} = useSnackbar();

  return (
    <Container>
      {children}
      <SnackbarContainer ref={snackbarContainer}/>
    </Container>
  ) 
}

const Container = styled.div`
  position: relative;
  width: 700px;
  height: 400px;
  background-color: #000000;
`;

const SnackbarContainer = styled.div`
  position: absolute;
  right: 10px;
  bottom: 10px;
  display: flex;
  flex-direction: column-reverse;
  justify-content: right;
  align-items: flex-end;
  
  > * {
    margin-top: 10px;
  }
`;

3) You can your addSnackbar() function anywhere in the <SnackbarProvider>

import { SnackbarContent } from '@material-ui/core';

function Component() {
  const {addSnackbar} = useSnackbar();

  const onClick = useCallback(() => {
    addSnackbar(<SnackbarContent message="HELLO SNACKBAR!"/>)
  }, [addSnackbar]);

  return (
    <button onClick={onClick}>
      Open a snackbar
    </button>
  )
}

Sample Codes

__stories__/Snackbar.stories.tsx

import { IconButton, SnackbarContent as MuiSnackbarContent, SnackbarContentProps } from '@material-ui/core';
import { Close } from '@material-ui/icons';
import { Snackbar, SnackbarProvider, useSnackbar } from '@ssen/snackbar';
import { storiesOf } from '@storybook/react';
import React from 'react';
import styled from 'styled-components';

let count: number = 0;

function Basic() {
  const { addSnackbar, snackbarContainer } = useSnackbar();

  return (
    <Container>
      <button
        onClick={() => {
          count++;

          addSnackbar(
            <Snackbar>
              <MuiSnackbarContent message={`${count} HELLO SNACKBAR!`} />
            </Snackbar>,
          );
        }}
      >
        Add a MUI Snackbar
      </button>

      <button
        onClick={() => {
          count++;

          addSnackbar(
            <Snackbar>
              <CustomElement>{count} HELLO SNACKBAR!</CustomElement>
            </Snackbar>,
          );
        }}
      >
        Add a Custom Snackbar
      </button>

      <button
        onClick={() => {
          count++;

          addSnackbar(
            <Snackbar>
              <ActionSnackbar message={`${count} HELLO SNACKBAR!`} />
            </Snackbar>,
          );
        }}
      >
        Add a Action Snackbar
      </button>

      <button
        onClick={() => {
          count++;

          addSnackbar(
            <Snackbar autoClose={false}>
              <ActionSnackbar message={`${count} HELLO SNACKBAR!`} />
            </Snackbar>,
          );
        }}
      >
        Add a Manual Close Snackbar
      </button>

      <SnackbarContainer ref={snackbarContainer} />
    </Container>
  );
}

storiesOf('<Snackbar>', module)
  .addDecorator((storyFn) => <SnackbarProvider>{storyFn()}</SnackbarProvider>)
  .add('Basic', () => <Basic />);

const Container = styled.div`
  position: relative;
  width: 700px;
  height: 400px;
  background-color: #000000;
`;

const SnackbarContainer = styled.div`
  position: absolute;
  right: 10px;
  bottom: 10px;
  display: flex;
  flex-direction: column-reverse;
  justify-content: right;
  align-items: flex-end;

  > * {
    margin-top: 10px;
  }
`;

const CustomElement = styled.div`
  display: inline-block;
  padding: 10px;
  border: 10px solid white;
  font-size: 16px;
  color: red;
`;

const ActionSnackbar = styled(({ onClose, ...props }: SnackbarContentProps & { onClose?: () => void }) => {
  return (
    <MuiSnackbarContent
      {...props}
      action={[
        <IconButton key="close" aria-label="close" color="inherit" onClick={onClose}>
          <Close />
        </IconButton>,
      ]}
    />
  );
})``;