@morioh/r-resource
TypeScript icon, indicating that this package has built-in type declarations

1.0.2 • Public • Published

useResource: use script, css hook react

React hook to dynamically load multiple external script, css and know when its loaded

Install

npm i @morioh/r-resource
import useResource from "@morioh/r-resource";

const [loading] = useResource([      

        {
            tag: 'link',
            id: 'flatpickr-css',
            rel: 'stylesheet',
            href: 'https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.9/flatpickr.min.css',
        },
        {
            tag: 'script',
            id: 'flatpickr-js',
            src: 'https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.9/flatpickr.min.js'
        }
    ]);

Full example

import { useEffect, useRef } from "react";
import useResource from "@morioh/r-resource";

declare const window: any;

type PlatpickrProps = {
    config?: object,
    onChange?: any,
    onOpen?: any,
    onClose?: any,
    onMonthChange?: any,
    onYearChange?: any,
    onReady?: any,
    onValueUpdate?: any,
    onDayCreate?: any,
    onCreate?: any,
    onDestroy?: any,
    value?: string | any | object | number,
    className?: string
}


export default function Flatpickr(props: PlatpickrProps) {

    const hooks = ['onChange', 'onOpen', 'onClose', 'onMonthChange', 'onYearChange', 'onReady', 'onValueUpdate', 'onDayCreate'];

    const root = useRef(null);
    const instance = useRef<any>();

    const [loading] = useResource([      

        {
            tag: 'link',
            id: 'flatpickr-css',
            rel: 'stylesheet',
            href: 'https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.9/flatpickr.min.css',
        },
        {
            tag: 'script',
            id: 'flatpickr-js',
            src: 'https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.6.9/flatpickr.min.js'
        }
    ]);


    useEffect(() => {

        if (loading) return;

        const config = {
            dateFormat: 'U',
            altFormat: 'Y-m-d G:i K',
            altInput: true,
            enableTime: true,
            minDate: new Date(),
            ...props.config,
            defaultDate: props.config?.defaultDate || props.value || null
        };

        hooks.forEach(hook => {
            if (props.hasOwnProperty(hook)) {
                config[hook] = props[hook]
            }
        })

        instance.current = window.flatpickr(root.current, config);


        return () => {
            // Clean up the subscription
            if (instance.current) {
                instance.current.destroy();
                instance.current = null;
            }

        };

    }, [loading]);


    if (loading) return null;


    return <input type="text" ref={root} {...props} />;


}

Readme

Keywords

none

Package Sidebar

Install

npm i @morioh/r-resource

Weekly Downloads

0

Version

1.0.2

License

MIT

Unpacked Size

8.8 kB

Total Files

7

Last publish

Collaborators

  • nasa8x
  • jotarox