/* This file is part of the Notesnook project (https://notesnook.com/) Copyright (C) 2022 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 React, { useCallback, useEffect, useState } from "react"; import { Text, View } from "react-native"; import { FlatList } from "react-native-gesture-handler"; import Icon from "react-native-vector-icons/MaterialCommunityIcons"; import { db } from "../../common/database"; import { presentSheet } from "../../services/event-manager"; import { useThemeStore } from "../../stores/use-theme-store"; import { openLinkInBrowser } from "../../utils/functions"; import { SIZE } from "../../utils/size"; import { timeConverter, timeSince } from "../../utils/time"; import DialogHeader from "../dialog/dialog-header"; import SheetProvider from "../sheet-provider"; import { PressableButton } from "../ui/pressable"; import Seperator from "../ui/seperator"; import Paragraph from "../ui/typography/paragraph"; import NotePreview from "./preview"; export default function NoteHistory({ note, fwdRef }) { const [history, setHistory] = useState([]); const [_loading, setLoading] = useState(true); const colors = useThemeStore((state) => state.colors); useEffect(() => { (async () => { setHistory([...(await db.noteHistory.get(note.id))]); setLoading(false); })(); }, [note.id]); const preview = useCallback(async (item) => { let content = await db.noteHistory.content(item.id); presentSheet({ component: ( ), context: "note_history" }); }, []); const getDate = (start, end) => { let _start = timeConverter(start); let _end = timeConverter(end + 60000); if (_start === _end) return _start; let final = _end.lastIndexOf(","); let part = _end.slice(0, final + 1); if (_start.includes(part)) { return _start + " —" + _end.replace(part, ""); } return _start + " — " + _end; }; const renderItem = useCallback( ({ item }) => ( preview(item)} customStyle={{ justifyContent: "space-between", alignItems: "center", paddingHorizontal: 12, height: 45, marginBottom: 10, flexDirection: "row" }} > {getDate(item.dateCreated, item.dateModified)} {timeSince(item.dateModified)} ), [colors.icon, preview] ); return ( { fwdRef?.current?.handleChildScrollEnd(); }} style={{ paddingHorizontal: 12 }} keyExtractor={(item) => item.id} data={history} ListEmptyComponent={ No note history found on this device. } renderItem={renderItem} /> Note version history is local only.{" "} { openLinkInBrowser( "https://docs.notesnook.com/versionhistory", colors ); }} style={{ color: colors.accent, textDecorationLine: "underline" }} > Learn how this works. ); }