import { h } from 'preact';
import { useRef, useLayoutEffect } from 'preact/hooks';
import ColorHash from 'color-hash';
import { formatRelative } from 'date-fns';
import cn from 'classnames';
import css from './css';
import { Attachment } from './Attachment';
const now = new Date();
const Time = ({ time }) => {
const dt = new Date(time);
return formatRelative(dt, now);
};
css`
.flex-space {
flex: 1;
margin: 0;
}
`;
const Space = (props) =>
;
css`
section > header {
display: flex;
flex-direction: row;
height: 1.75rem;
color: var(--theme-header-fg);
background: var(--theme-header-bg);
}
section > header.small {
height: 0.5rem;
}
section > header > * {
margin: 0 0.35rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.75rem;
}
section > header > .avatar {
height: 1.25rem;
width: 1.25rem;
flex: 0 0 auto;
margin: 0.25rem;
border-radius: 0.2rem;
font-size: 1.25rem;
font-weight: bold;
line-height: 1.25rem;
text-align: center;
text-decoration: none;
background: white;
color: black;
}
section > header > .avatar img {
width: inherit;
height: inherit;
}
section > header > .collapse {
height: 1rem;
width: 1rem;
flex: 0 0 auto;
margin: 0.3rem;
border-radius: 0.2rem;
border: 0.05rem solid var(--theme-header-fg);
line-height: 0.8rem;
text-align: center;
text-decoration: none;
text-weight: bold;
transition: background 0.3s;
}
section > header > .collapse:hover {
background: var(--theme-note-bg);
}
section > header > .user {
flex: 0 0.5 auto;
}
section > header > .time {
flex: 0 0 auto;
font-size: 0.8em;
color: #363636;
}
`;
const Header = ({ id, user, published, collapsed, onCollapse }) => {
const username = user.name || user.preferredUsername;
const onClick = onCollapse && ((e) => {
e.preventDefault();
onCollapse(id);
});
return (
);
};
css`
section {
display: flex;
flex-direction: column;
justify-content: space-between;
width: 15rem;
overflow: hidden;
color: var(--theme-note-fg);
background: var(--theme-note-bg);
box-shadow: rgba(0,0,0, 0.7) 2px 4px 5px;
border-radius: 0.3rem;
}
section.type-Tombstone {
color: var(--theme-note-bg);
background: var(--theme-note-fg);
}
section > main {
position: relative;
padding: 0.5rem;
overflow: hidden;
font-family: serif;
}
section > main > p:first-child {
margin-top: 0;
}
section > main > p:last-child {
margin-bottom: 0;
}
section.tombstone > main {
font-family: inherit;
}
section.hidden {
display: none;
}
section.ellipsis > main {
max-height: 7em;
}
section.ellipsis > .attachment {
display: none;
}
section.ellipsis > main::after {
position: absolute;
display: block;
content: '';
pointer-events: none;
left: 0;
right: 0;
bottom: 0;
height: 1.25em;
background: linear-gradient(0deg, var(--theme-note-bg) 5%, var(--theme-note-bg-trans) 100%);
}
section.type-Tombstone.ellipsis > main::after {
background: linear-gradient(0deg, var(--theme-note-fg) 5%, var(--theme-note-fg-trans) 100%);
}
section.collapsed > main {
max-height: 2em;
}
`;
const colors = new ColorHash({ lightness: 0.8 });
export const Note = ({
id, type, attributedTo, published, content, attachment,
smallHeader = false, collapsed = false, ellipsis = false, position,
onCollapse, onSelect, onSize,
}) => {
ellipsis ||= collapsed;
attachment ||= [];
if (!Array.isArray(attachment))
attachment = [attachment];
const backgroundColor = attributedTo.color || colors.hex(attributedTo.id);
const onClick = onSelect && ((e) => {
e.preventDefault();
onSelect(id);
});
const root = useRef(null);
onSize && useLayoutEffect(() => {
onSize(id, root.current.offsetWidth, root.current.offsetHeight);
});
return (
{smallHeader
?
:
}
{attachment.map(a => )}
);
};