{"version":3,"file":"note.cjs","sources":["../../src/notes/note.ts"],"sourcesContent":["import { useContext, useMemo, useEffect, useRef, useState } from \"react\";\nimport h from \"../hyper\";\nimport { useNoteLayout } from \"./layout\";\nimport { NoteEditorContext } from \"./editor\";\nimport type { NoteData } from \"./types\";\nimport {\n  NotePositioner,\n  NoteConnector,\n  NodeConnectorOptions,\n} from \"./connector\";\nimport { useColumn } from \"../context\";\n\ntype NoteListProps = NodeConnectorOptions & {\n  onClickNote?: (note: NoteData) => void;\n};\n\nexport function NotesList(props: NoteListProps) {\n  let { onClickNote, ...rest } = props;\n\n  const {\n    notes,\n    nodes: nodeIndex,\n    updateHeight,\n    noteComponent,\n    scale,\n  } = useNoteLayout();\n\n  const { pixelHeight: columnHeight } = useColumn();\n\n  const notesInfo = useMemo(() => {\n    let notes1 = notes.map((note) => {\n      const node = nodeIndex[note.id];\n      const pixelHeight = node?.width ?? 10;\n      const pixelOffset = node?.currentPos ?? scale(note.top_height);\n      return {\n        note,\n        node,\n        pixelOffset,\n        pixelHeight,\n        spacing: {\n          above: pixelOffset - pixelHeight,\n          below: columnHeight - pixelOffset,\n        },\n      };\n    });\n\n    // Adjust spacing to account for nearby nodes\n    for (let i = 0; i < notes1.length; i++) {\n      const { spacing, pixelOffset } = notes1[i];\n      if (i > 0) {\n        const prevNote = notes1[i - 1];\n        // Get distance from the previous note's bottom\n        // to the current note's top\n        spacing.above =\n          pixelOffset - prevNote.pixelOffset - prevNote.pixelHeight;\n        prevNote.spacing.below = spacing.above;\n      }\n    }\n\n    return notes1;\n  }, [notes, nodeIndex, scale]);\n\n  return h(\n    \"g.notes-list\",\n    notesInfo.map(({ note, pixelOffset, pixelHeight, spacing }) => {\n      // If the note has a bad pixelOffset, skip it\n\n      if (pixelOffset == null || pixelHeight == null) {\n        return null;\n      }\n\n      return h(Note, {\n        key: note.id,\n        note,\n        pixelOffset,\n        pixelHeight,\n        updateHeight,\n        onClick: onClickNote,\n        noteBodyComponent: noteComponent,\n        spacing,\n        ...rest,\n      });\n    }),\n  );\n}\n\ntype NodeSpacing = {\n  above: number;\n  below: number;\n};\n\ninterface NoteProps {\n  note: NoteData;\n  style?: object;\n  deltaConnectorAttachment?: number;\n  pixelOffset?: number;\n  pixelHeight?: number;\n  updateHeight?: (id: string | number, height: number) => void;\n  onClick?: (note: NoteData) => void;\n  noteBodyComponent: (props: { note: NoteData; spacing?: NodeSpacing }) => any;\n  spacing?: NodeSpacing;\n}\n\nfunction Note(props: NoteProps) {\n  const {\n    note,\n    pixelOffset,\n    pixelHeight,\n    updateHeight,\n    deltaConnectorAttachment,\n    noteBodyComponent,\n    spacing,\n    onClick,\n  } = props;\n  const ref = useRef<HTMLElement>(null);\n\n  useEffect(() => {\n    if (ref.current) {\n      const newHeight = ref.current.offsetHeight;\n      if (newHeight !== pixelHeight) {\n        updateHeight(note.id, newHeight);\n      }\n    }\n  }, [note, pixelHeight, updateHeight]);\n\n  const offsetY = pixelOffset;\n  const noteHeight = pixelHeight;\n\n  const { setEditingNote, editingNote } = useContext(NoteEditorContext) as any;\n  const onClick_ = onClick ?? setEditingNote;\n  const _onClickHandler = useMemo(() => {\n    if (!onClick_) return undefined;\n    return (evt) => {\n      onClick_(note);\n    };\n  }, [onClick_]);\n\n  if (editingNote === note) {\n    return null;\n  }\n  return h(\"g.note\", [\n    h(NoteConnector, { note, deltaConnectorAttachment }),\n    h(\n      NotePositioner,\n      {\n        offsetY,\n        noteHeight,\n        ref,\n        onClick: _onClickHandler,\n      },\n      h(noteBodyComponent, { note, spacing }),\n    ),\n  ]);\n}\n\nexport { NotePositioner, NoteConnector };\n"],"names":["useNoteLayout","useColumn","useMemo","h","useRef","useEffect","useContext","NoteEditorContext","NoteConnector","NotePositioner"],"mappings":";;;;;;;;AAgBO,SAAS,UAAU,OAAsB;AAC9C,MAAI,EAAE,aAAa,GAAG,KAAA,IAAS;AAE/B,QAAM;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACEA,qBAAA;AAEJ,QAAM,EAAE,aAAa,aAAA,IAAiBC,iBAAA;AAEtC,QAAM,YAAYC,MAAAA,QAAQ,MAAM;AAC9B,QAAI,SAAS,MAAM,IAAI,CAAC,SAAS;AAC/B,YAAM,OAAO,UAAU,KAAK,EAAE;AAC9B,YAAM,cAAc,MAAM,SAAS;AACnC,YAAM,cAAc,MAAM,cAAc,MAAM,KAAK,UAAU;AAC7D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,UACP,OAAO,cAAc;AAAA,UACrB,OAAO,eAAe;AAAA,QAAA;AAAA,MACxB;AAAA,IAEJ,CAAC;AAGD,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,EAAE,SAAS,gBAAgB,OAAO,CAAC;AACzC,UAAI,IAAI,GAAG;AACT,cAAM,WAAW,OAAO,IAAI,CAAC;AAG7B,gBAAQ,QACN,cAAc,SAAS,cAAc,SAAS;AAChD,iBAAS,QAAQ,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,WAAW,KAAK,CAAC;AAE5B,SAAOC;AAAAA,IACL;AAAA,IACA,UAAU,IAAI,CAAC,EAAE,MAAM,aAAa,aAAa,cAAc;AAG7D,UAAI,eAAe,QAAQ,eAAe,MAAM;AAC9C,eAAO;AAAA,MACT;AAEA,aAAOA,MAAE,MAAM;AAAA,QACb,KAAK,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,mBAAmB;AAAA,QACnB;AAAA,QACA,GAAG;AAAA,MAAA,CACJ;AAAA,IACH,CAAC;AAAA,EAAA;AAEL;AAmBA,SAAS,KAAK,OAAkB;AAC9B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,MAAMC,MAAAA,OAAoB,IAAI;AAEpCC,QAAAA,UAAU,MAAM;AACd,QAAI,IAAI,SAAS;AACf,YAAM,YAAY,IAAI,QAAQ;AAC9B,UAAI,cAAc,aAAa;AAC7B,qBAAa,KAAK,IAAI,SAAS;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,aAAa,YAAY,CAAC;AAEpC,QAAM,UAAU;AAChB,QAAM,aAAa;AAEnB,QAAM,EAAE,gBAAgB,gBAAgBC,MAAAA,WAAWC,OAAAA,iBAAiB;AACpE,QAAM,WAAW,WAAW;AAC5B,QAAM,kBAAkBL,MAAAA,QAAQ,MAAM;AACpC,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO,CAAC,QAAQ;AACd,eAAS,IAAI;AAAA,IACf;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AACA,SAAOC,MAAE,UAAU;AAAA,IACjBA,MAAEK,UAAAA,eAAe,EAAE,MAAM,0BAA0B;AAAA,IACnDL;AAAAA,MACEM,UAAAA;AAAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,MAAA;AAAA,MAEXN,MAAE,mBAAmB,EAAE,MAAM,SAAS;AAAA,IAAA;AAAA,EACxC,CACD;AACH;;;;"}