/*
This file is part of the Notesnook project (https://notesnook.com/)
Copyright (C) 2023 Streetwriters (Private) Limited
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
import {
ContentBlock,
Note,
VirtualizedGrouping,
createInternalLink
} from "@notesnook/core";
import { useThemeColors } from "@notesnook/theme";
import React, { useEffect, useRef, useState } from "react";
import { TextInput, View } from "react-native";
import { FlatList } from "react-native-actions-sheet";
import { db } from "../../../common/database";
import { useDBItem } from "../../../hooks/use-db-item";
import { presentSheet } from "../../../services/event-manager";
import { SIZE } from "../../../utils/size";
import { Button } from "../../ui/button";
import Input from "../../ui/input";
import { PressableButton } from "../../ui/pressable";
import Paragraph from "../../ui/typography/paragraph";
import type { LinkAttributes } from "@notesnook/editor/dist/extensions/link";
import { editorController } from "../../../screens/editor/tiptap/utils";
const ListNoteItem = ({
id,
items,
onSelectNote
}: {
id: any;
items: VirtualizedGrouping | undefined;
onSelectNote: any;
}) => {
const [item] = useDBItem(id, "note", items);
return (
{
if (!item) return;
onSelectNote(item as Note);
}}
type={"transparent"}
customStyle={{
paddingVertical: 12,
flexDirection: "row",
width: "100%",
justifyContent: "flex-start",
height: 50
}}
>
{item?.title}
);
};
const ListBlockItem = ({
item,
onSelectBlock
}: {
item: ContentBlock;
onSelectBlock: any;
}) => {
const { colors } = useThemeColors();
return (
{
onSelectBlock(item);
}}
type={"transparent"}
customStyle={{
flexDirection: "row",
width: "100%",
justifyContent: "flex-start",
minHeight: 45
}}
>
{item.type.toUpperCase()}
{item?.content.length > 200
? item?.content.slice(0, 200) + "..."
: item.content}
);
};
export default function LinkNote(props: {
attributes: LinkAttributes;
resolverId: string;
onLinkCreated: () => void;
close?: (ctx?: string) => void;
}) {
const { colors } = useThemeColors();
const query = useRef();
const [notes, setNotes] = useState>();
const nodesRef = useRef([]);
const [nodes, setNodes] = useState([]);
const inputRef = useRef();
const [selectedNote, setSelectedNote] = useState();
const [selectedNodeId, setSelectedNodeId] = useState();
useEffect(() => {
db.notes.all.sorted(db.settings.getGroupOptions("notes")).then((notes) => {
setNotes(notes);
});
}, []);
console.log(new URL("https://google.com").protocol);
const onChange = async (value: string) => {
query.current = value;
if (!selectedNote) {
const notes = await db.lookup.notes(value).sorted();
setNotes(notes);
} else {
if (value.startsWith("#")) {
const headingNodes = nodesRef.current.filter((n) =>
n.type.match(/(h1|h2|h3|h4|h5|h6)/g)
);
setNodes(
headingNodes.filter((n) => n.content.includes(value.slice(1)))
);
} else {
setNodes(nodesRef.current.filter((n) => n.content.includes(value)));
}
}
};
const onCreateLink = (blockId?: string) => {
if (!selectedNote) return;
const link = createInternalLink(
"note",
selectedNote.id,
blockId
? {
blockId: blockId
}
: undefined
);
editorController.current.commands.createInternalLink(
{
href: link,
title: selectedNote.title
},
props.resolverId
);
};
const onSelectNote = async (note: Note) => {
setSelectedNote(note);
inputRef.current?.clear();
setTimeout(async () => {
nodesRef.current = await db.notes.getBlocks(note.id);
setNodes(nodesRef.current);
});
// Fetch and set note's nodes.
};
const onSelectBlock = (block: ContentBlock) => {
onCreateLink(block.id);
props.onLinkCreated();
props.close?.();
};
return (
{
onChange(value);
}}
/>
{selectedNote ? (
SELECTED NOTE
{
setSelectedNote(undefined);
setSelectedNodeId(undefined);
setNodes([]);
}}
customStyle={{
flexDirection: "row",
width: "100%",
justifyContent: "flex-start",
height: 45,
borderWidth: 1,
borderColor: colors.primary.accent,
paddingHorizontal: 12
}}
type="grayAccent"
>
{selectedNote?.title}
Tap to deselect
{nodes?.length > 0 ? (
LINK TO A SECTION
) : null}
) : null}
{selectedNote ? (
(
)}
style={{
marginTop: 10
}}
keyExtractor={(item) => item.id}
data={nodes}
/>
) : (
(
)}
style={{
marginTop: 10
}}
data={notes?.placeholders}
/>
)}
{selectedNote ? (
);
}
LinkNote.present = (attributes: LinkAttributes, resolverId: string) => {
let didCreateLink = false;
presentSheet({
component: (ref, close) => (
{
didCreateLink = true;
}}
close={close}
/>
),
onClose: () => {
if (!didCreateLink) {
editorController?.current.commands.dismissCreateInternalLinkRequest(
resolverId
);
}
}
});
};