Coder Social home page Coder Social logo

seungdeng17 / react-simple-modal-provider Goto Github PK

View Code? Open in Web Editor NEW
27.0 2.0 3.0 175 KB

React simple modal and Modal provider

Home Page: https://www.npmjs.com/package/react-simple-modal-provider

HTML 0.76% JavaScript 34.02% TypeScript 57.07% SCSS 8.02% CSS 0.13%

react-simple-modal-provider's Introduction

react-simple-modal-provider

Simple Modal Manager for React Projects


react-simple-modal-provider-144


Contents


Demo

โญ๏ธ Codesandbox

Installation

$ npm install react-simple-modal-provider
$ yarn add react-simple-modal-provider

Examples

// BasicModal Component
import Modal, { useModalState } from "react-simple-modal-provider";

export default ({ children }) => {
  const [isOpen, setOpen] = useModalState();
  /* const onCloseHandler = () => setOpen(false); */

  return (
    <Modal
      id={"BasicModal"}
      consumer={children}
      isOpen={isOpen}
      setOpen={setOpen}
    >
      <span>๐Ÿ˜†</span>
    </Modal>
  );
};

Pass unique ID to the id props. It is, then, used to load modals.
Keeping eye on the four required props of the "Modal" module, you should create a modal in the child area.


// App Component
import { ModalProvider } from "react-simple-modal-provider";
import BasicModal from "./BasicModal";
import ConsumePage from "./ConsumePage";

export default () => {
  return (
    <ModalProvider value={[BasicModal, ...]}>
      <ConsumePage />
      <ConsumePage />
      ...
    </ModalProvider>
  );
};

Register a modal array through the "value" props of the "ModalProvider" module and wrap it around the application.


// ConsumePage Component
import { useModal } from "react-simple-modal-provider";

export default () => {
  const { open: openModal } = useModal("BasicModal");

  return <button onClick={openModal}>Open</button>;
};

"useModal" takes the modal ID as an argument and provides the open, close function of the modal.
It is recommended to name variables using destructuring assignment.


API

Modal Module

- Required props

Prop Type Default Description
id string - Identifier for a modal
consumer children props - Components to use modals for
isOpen boolean state - Returned by useModalState hooks
setOpen state function - Returned by useModalState hooks

- Optional props

Prop Type Default Description
asyncOpen async function - Called when modal opened
draggable boolean false Drag usable
allowClickOutside boolean true Allow click outside
spinner false | JSX Built-in spinner Async loading spinner
spinnerColor string rgba(45, 52, 54, 0.6) Built-in spinner color
overlayColor string rgba(0, 0, 0, 0.6) Overlay color
backgroundColor string transparent Modal background color
animation object - Open/Close animation
duration number 0 Animation duration
vertical number 0 Vertical position (px)
horizontal number 0 Horizontal position (px)
width number 0 Modal width (px)
height number 0 Modal height (px)
radius number 0 Border radius (px)

Async

// AsyncModal Component
import { useState } from "react";
import Modal, { useModalState } from "react-simple-modal-provider";
import ModalBody from "./ModalBody";

export default ({ children }) => {
  const [isOpen, setOpen] = useModalState();
  const [data, setData] = useState(null);

  const asyncOpen = async () => {
    const response = await fetch("https://jsonplaceholder.typicode.com/todos/1");
    const json = await response.json();
    setData(json);
  };

  return (
    <Modal
      id={"AsyncModal"}
      consumer={children}
      isOpen={isOpen}
      setOpen={setOpen}
      asyncOpen={asyncOpen}
    >
      <ModalBody data={data} />
    </Modal>
  );
};
// ModalBody Component
export default ({ data }) => {
  return <h1>{data.title}</h1>;
};

A spinner is built-in. If you don't want to, specify false in "spinner" props.
Custom spinners in "JSX" format can also be specified.


Animation

- Built-in animation

  • Import "modalAnimation" module and pass the value to the animation props.
    • scaleUp
    • slideDown
    • slideUp
import Modal, { modalAnimation } from "react-simple-modal-provider";

export default ({ children }) => {
  return (
    <Modal animation={modalAnimation.scaleUp}>
      ...
    </Modal>
  );
};

- Custom animation examples

top, bottom, left, right type cannot be used.

{
  type: "transform, opacity",
  base: "transform: translateY(-50px); opacity: 0;",
  before: "transform: translateY(50px); opacity: 0;",
  after: "transform: translateY(0px); opacity: 1;",
}
{
  type: "transform, opacity",
  base: "transform: rotate(0deg) scale(0.3); opacity: 0;",
  before: "transform: rotate(0deg) scale(0.3); opacity: 0;",
  after: "transform: rotate(360deg) scale(1); opacity: 1;"
}

ETC

- useModalProps (forward props when opening modals)

// ConsumePage Component
import { useModal } from "react-simple-modal-provider";

export default () => {
  const { open } = useModal("ETCModal");

  return <button onClick={() => open({ title: "Hello World" })}>Open</button>;
};
// ModalBody Component
import { useModalProps } from "react-simple-modal-provider";

export default () => {
  const { title } = useModalProps("ETCModal");

  return <h1>{title}</h1>;  // Hello World
};

- Provider overlap (differentiate global / local modal)

// App Component
import { ModalProvider } from "react-simple-modal-provider";

import GlobalModal from "./GlobalModal";
import GlobalConsumePage from "./GlobalConsumePage";

import LocalModal from "./LocalModal";
import LocalConsumePage from "./LocalConsumePage";

export default () => {
  return (
    <ModalProvider value={[GlobalModal, ...]}>
      {/* Available Modals: GlobalModal */}
      <GlobalConsumePage />
      <GlobalConsumePage />
      ...

      <ModalProvider value={[LocalModal, ...]}>
        {/* Available Modals: GlobalModal, LocalModal */}
        <LocalConsumePage />
        <LocalConsumePage />
        ...
      </ModalProvider>
    </ModalProvider>
  );
};

Top



Github โ€ข NPM

react-simple-modal-provider's People

Contributors

seungdeng17 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

react-simple-modal-provider's Issues

1.6.0

  • Modal, Portal, ProtalBody optimization
  • doc update (ETC - Provider overlap)
  • change default spinner style
  • change default spinnerColor (rgba(45, 52, 54, 0.6))

Getting "TypeError: Object is not a function Modal node_modules/react-simple-modal-provider/dist/Modal.js:25" when trying to implement the example code

I am an absolute beginner so I am probably missing something really simple.

App.js

import logo from './logo.svg';
import './App.css';
import { ModalProvider } from 'react-simple-modal-provider';
import Feed from './components/feed';
import BasicModal from './components/BasicModal';
import ConsumePage from './components/ConsumePage';

function App() {
  return (
    <ModalProvider value={[BasicModal]}>
      <Feed />
      <ConsumePage />
    </ModalProvider>
  );
}

export default App;

BasicModal.jsx

import Modal, { useModalState } from "react-simple-modal-provider";

export default ({ children }) => {
    const { isOpen, setOpen } = useModalState();

    return (
        <Modal
            id={"BasicModal"}
            consumer={children}
            isOpen={isOpen}
            setOpen={setOpen}
        >
            <span>๐Ÿ˜†</span>
        </Modal>
    );
};

ConsumePage.jsx

import { useModal } from "react-simple-modal-provider";

export default () => {
    const { open: openModal } = useModal("BasicModal");

    return <button onClick={openModal}>Open</button>;
};

Thank you in advance. Sorry if this post is not detailed enough, let me know what else to include.

drag

  • radius prop ๋ฌด์‹œ ๋จ
  • width, height props ์ง€์ • ์‹œ modal-draggable ์˜์—ญ drag ์ด๋ฒคํŠธ ๋ฒ„๊ทธ
  • slide ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ด๋ฒคํŠธ ๋ฒ„๊ทธ (ํ˜„์žฌ scaleUp์œผ๋กœ ๊ฐ•์ œ ์น˜ํ™˜ ํ•จ)
  • ๋น„๋™๊ธฐ ์ค‘ (์Šค์ผˆ๋ ˆํ†ค ui ๋…ธ์ถœ ์ค‘) ๋“œ๋ž˜๊ทธ ์‹œ width, height fix

SSR ReferenceError: document is not defined

The following error occurs when using the portal in NextJS: ReferenceError: document is not defined

Looks like the Portal.ts defines head and body constants - is there a way to move that to the useEffect() so that SSR will not be affected?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.