import styled from "@emotion/styled" import type { ItemSection, ItemField } from "opvault.js" import { FieldType } from "opvault.js" import { useCallback, useMemo, useState } from "react" import { parseMonthYear } from "../utils" import { BigTextView } from "./BigTextView" import { ErrorBoundary } from "./ErrorBoundary" import { useItemFieldContextMenu } from "./ItemFieldContextMenu" const Container = styled.div`` const Password: React.FC<{ field: ItemSection.Concealed }> = ({ field }) => { const [show, setShow] = useState(false) const [bigText, showBigText] = useState(false) const { onRightClick, ContextMenuContainer, Item } = useItemFieldContextMenu() const onToggle = useCallback(() => setShow(x => !x), []) const onCopy = useCallback(() => { navigator.clipboard.writeText(field.v) }, [field.v]) const onOpenBigText = useCallback(() => { showBigText(true) }, []) const onCloseBigText = useCallback(() => { showBigText(false) }, []) return ( <> setShow(x => !x)} style={{ fontFamily: "var(--monospace)", ...(!show && { userSelect: "none" }), }} > {show ? field.v : "·".repeat(10)} {bigText && {field.v}} Copier {show ? "Cacher" : "Afficher"} {!bigText && Afficher en gros caractères} ) } const MonthYear: React.FC<{ field: ItemSection.MonthYear }> = ({ field }) => { const { year, month } = parseMonthYear(field.v) return ( {month.toString().padStart(2, "0")}/{year.toString().padStart(4, "0")} ) } const DateView: React.FC<{ field: ItemSection.Date }> = ({ field }) => { const date = useMemo(() => new Date(field.v * 1000), [field.v]) return {date.toLocaleDateString()} } const TextView: React.FC<{ value: string }> = ({ value }) => { const { onRightClick, ContextMenuContainer, Item } = useItemFieldContextMenu() const onCopy = useCallback(() => { navigator.clipboard.writeText(value) }, [value]) return ( <> {value} Copier ) } export const ItemFieldValue: React.FC<{ field: ItemSection.Any }> = ({ field }) => { if (field.v == null) { return null } switch (field.k) { case "concealed": return case "monthYear": return case "date": return case "address": return (
{field.v.street}
{field.v.city}, {field.v.state} ({field.v.zip})
{field.v.country}
) } return ( ) } export const ItemDetailsFieldValue: React.FC<{ field: ItemField }> = ({ field }) => { if ( field.type === FieldType.Password || (field.type === FieldType.Text && field.designation === "password") ) { return } return ( {field.value} ) }