this repo has no description
1import { Trans } from '@lingui/react/macro';
2import { useContext } from 'preact/hooks';
3import { useSnapshot } from 'valtio';
4
5import FilterContext from '../utils/filter-context';
6import { isFiltered } from '../utils/filters';
7import states, { getStatus, statusKey } from '../utils/states';
8import statusPeek from '../utils/status-peek';
9import { getCurrentAccID } from '../utils/store-utils';
10
11import Avatar from './avatar';
12
13function StatusCompact({ sKey }) {
14 const snapStates = useSnapshot(states);
15 const statusReply = snapStates.statusReply[sKey];
16 if (!statusReply) return null;
17
18 const { id, instance } = statusReply;
19 const status = getStatus(id, instance);
20 if (!status) return null;
21
22 const {
23 account: { id: accountId },
24 sensitive,
25 spoilerText,
26 account: { avatar, avatarStatic, bot } = {},
27 visibility,
28 content,
29 language,
30 filtered,
31 } = status;
32 if (sensitive || spoilerText) return null;
33 if (!content) return null;
34
35 const srKey = statusKey(id, instance);
36 const statusPeekText = statusPeek(status);
37
38 const currentAccount = getCurrentAccID();
39 const isSelf = currentAccount && currentAccount === accountId;
40
41 const filterContext = useContext(FilterContext);
42 let filterInfo = !isSelf && isFiltered(filtered, filterContext);
43
44 // This is fine. Images are converted to emojis so they are
45 // in a way, already "obscured"
46 if (filterInfo?.action === 'blur') filterInfo = null;
47
48 if (filterInfo?.action === 'hide') return null;
49
50 const filterTitleStr = filterInfo?.titlesStr || '';
51
52 return (
53 <article
54 class={`status compact-reply shazam ${
55 visibility === 'direct' ? 'visibility-direct' : ''
56 }`}
57 tabindex="-1"
58 data-state-post-id={srKey}
59 >
60 <Avatar url={avatarStatic || avatar} squircle={bot} />
61 <div
62 class="content-compact"
63 title={statusPeekText}
64 lang={language}
65 dir="auto"
66 >
67 {filterInfo ? (
68 <b class="status-filtered-badge badge-meta" title={filterTitleStr}>
69 <span>
70 <Trans>Filtered</Trans>
71 </span>
72 <span>{filterTitleStr}</span>
73 </b>
74 ) : (
75 <span>{statusPeekText}</span>
76 )}
77 </div>
78 </article>
79 );
80}
81
82export default StatusCompact;