uiwjs / uiwjs/react-codemirror

onDeletion event ?

Open
#625 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
2.3k
Forks
161
PR merge metrics
No merged PRs in 30d

Description

Hi !

I'm trying to create a "bookmark" feature for my app but i'm stuck with event handling.
The feature should work this way :
-When the user type "#" in the beginning of the line it implement the useReducer state with an object (with the content of this line and the position in the editor)
-A button is created by rerendering with an action of focus on the specific line when the user click on it
-The position stored in the object should evolve as the editor is modified
-The object should be deleted if the line is deleted

I'm struggling to find an event to listen for deletion of content (in order to update the position if it's affected)

Thanks for your help 😄

import "./App.css";
import CodeMirror from "@uiw/react-codemirror";
import { useReducer, useRef } from "react";
import SceneList from "./components/SceneList";
import CharacterList from "./components/CharacterList";

const initalState = {
  title: "En attendant Godot",
  value:
    "#Scène 1\n@Monsieur A\nBonjour madame.\n@Madame B\nBonjour à vous monsieur !",
  scenes: [{ name: "Scène 1", position: "0" }],
  characters: ["@Monsieur A"],
};

function App() {
  const CodeMirrorRef = useRef();

  function reducer(state, action) {
    const view = CodeMirrorRef.current.view;
    const currPostion = view.state.selection.main.head;
    state = {...state, scenes: state.scenes.map((scene) => {
       scene.position = scene.position > currPostion ? scene.position + 1 : scene.position
       return scene
    })}
    switch (action.type) {
      case "newEntry":
        if (action.payload[action.payload.length - 1] === "\n") {
          const array = action.payload.split("\n");
          const lastValue = array[array.length - 2];
          if (lastValue[0] === "#") {
            return {
              ...state,
              scenes: [
                ...state.scenes,
                { name: lastValue, position: currPostion - 1 },
              ],
            };
          }
          if (lastValue[0] === "@") {
            return { ...state, characters: [...state.characters, lastValue] };
          }
        }
        return state;

      case "focusPosition":
        view.dispatch({ selection: { anchor: action.payload } });
        view.focus();
        return state;

      case "insertCharacter":
        view.dispatch({
          changes: { from: currPostion, insert: action.payload },
          selection: { anchor: currPostion + action.payload.length + 1 },
          scrollIntoView: true,
        });
        return state;

      default:
        throw new Error("Undefined action");
    }
  }
  const [{ title, value, scenes, characters }, dispatch] = useReducer(
    reducer,
    initalState
  );

  return (
    <>
      <h1>{title}</h1>
      <CodeMirror
        ref={CodeMirrorRef}
        value={value}
        height="200px"
        onChange={(e, data) => {
          console.log(data);
          dispatch({ type: "newEntry", payload: e})}
        }
      />
      <SceneList scenes={scenes} dispatch={dispatch} />
      <CharacterList characters={characters} dispatch={dispatch} />
    </>
  );
}

export default App;

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the CodeMirror onChange callback and the CodeMirrorRef view state shown in the issue. Check the component's documented change payload and deletion-related APIs, then determine whether the requested bookmark updates are supported. Done means identifying a documented event or clearly scoping the missing capability.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, react
Domain
frontend
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.