repo_description: A full-featured, hackable Next.js AI chatbot built by Vercel
repo_topics: ai chatgpt nextjs react redis shadcn-ui vercel
code: import { textblockTypeInputRule } from "prosemirror-inputrules";
  import { Schema } from "prosemirror-model";
  import { schema } from "prosemirror-schema-basic";
  import { addListNodes } from "prosemirror-schema-list";
  import type { Transaction } from "prosemirror-state";
  import type { EditorView } from "prosemirror-view";
  import type { MutableRefObject } from "react";
  
  import { buildContentFromDocument } from "./functions";
  
  export const documentSchema = new Schema({
    nodes: addListNodes(schema.spec.nodes, "paragraph block*", "block"),
    marks: schema.spec.marks,
  });
  
  export function headingRule(level: number) {
    return textblockTypeInputRule(
      new RegExp(`^(#{1,${level}})\\s$`),
      documentSchema.nodes.heading,
      () => ({ level })
    );
  }
  
  export const handleTransaction = ({
    transaction,
    editorRef,
    onSaveContent,
  }: {
    transaction: Transaction;
    editorRef: MutableRefObject<EditorView | null>;
    onSaveContent: (updatedContent: string, debounce: boolean) => void;
  }) => {
    if (!editorRef?.current) {
      return;
    }
  
    const newState = editorRef.current.state.apply(transaction);
    editorRef.current.updateState(newState);
  
    if (transaction.docChanged && !transaction.getMeta("no-save")) {
      const updatedContent = buildContentFromDocument(newState.doc);
  
      if (transaction.getMeta("no-debounce")) {
        onSaveContent(updatedContent, false);
      } else {
        onSaveContent(updatedContent, true);
      }
    }
  };
  