1.0.2 • Published 3 years ago

@keegpt/zedit v1.0.2

Weekly downloads
1
License
MIT
Repository
github
Last release
3 years ago

Zedit

Transform your react.js websites in live editors!

What is zedit

Zedit is designed to people that build websites with react.js. Usually we create our span, headings, and other elements to build a website. The goal is to allow to create super elements that are able to transform themselfs in editable fields, allowing to edit content directly in the website.

Roadmap

  • Build components for all HTML tags (for now you have to build your own)

How to use

import { Scope, Zedit } from '@keegpt/zedit';
import { useRef } from 'react';
import Span from './Span';

function App() {
  const formRef = useRef();
  return (
    <Zedit
      ref={formRef}
      initialData={
        {
          section1: {
            text1: 'Hello, world!'
          }
        }}
      onSubmit={(data) => console.log(data)}
    >
      <Scope path="section1">
        <Span name="text1">Default text</Span>
      </Scope>
      <button onClick={() => { console.log(formRef.current.getData()) }}>SAVE</button>
    </Zedit>
  );
}

export default App;

Component Example

import React, { useEffect, useRef, useState } from 'react';
import { useComponent } from '@keegpt/zedit';
import Modal from './Modal';

export default function Span({ name, children }) {
    const { componentName, defaultValue = "", registerComponent } = useComponent(name);

    const valueRef = useRef(defaultValue);
    const [value, setValue] = useState(defaultValue);
    const [isModalOpen, setIsModalOpen] = useState(false);

    useEffect(() => {
        valueRef.current = value;
    }, [value]);

    useEffect(() => {
        registerComponent({
            name: componentName,
            getValue: () => {
                return valueRef.current;
            },
            setValue: (value) => {
                setValue(value);
            },
            clearValue: (value = "") => {
                setValue(value);
            },
        })
    }, [componentName, registerComponent]);

    return (
        <>
            <span onClick={() => setIsModalOpen(true)}>{value || children}</span><br />
            <Modal isOpen={isModalOpen}>
                <input value={value} onChange={(e) => setValue(e.target.value)} />
                <button onClick={() => setIsModalOpen(false)}>Close</button>
            </Modal>
        </>
    );
}