aboutsummaryrefslogtreecommitdiffhomepage
path: root/templates/note.php
blob: 736d5f9c3def0a524e42a0d600ccb4a13998e776 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
use Digitigrade\Model\Actor;
use Digitigrade\Model\InteractionKind;
use Digitigrade\Model\NotePrivacyScope;
use Digitigrade\Model\UserAccount;
use Digitigrade\UserSettings;

$user = UserAccount::findByCurrentSession();
$prefs = $user ? new UserSettings($user) : null;
$interKinds = [];
$actionsDisabled = $user == null;
if ($user != null) {
    $interactions = $note->getInteractionsWithAuthor($user->actor);
    $interKinds = array_map(fn($inter) => $inter->kind, $interactions);
}
?>
<article class="note <?= ($selected ?? false) ? 'selected' : '' ?>">

    <a href="/@/<?= $note->author->getFullHandle() ?>">
        <?php call_template('actor_avatar', ['actor' => $note->author]); ?>
    </a>

    <div>

        <div class="infoLine">
            <a class="authorName"
                href="/@/<?= htmlspecialchars($note->author->getFullHandle()) ?>"><?= htmlspecialchars($note->author->displayName) ?></a>
            <span class="authorHandle">@<?= htmlspecialchars($note->author->getFullHandle()) ?></span>
            <a class="timestamp"
                href="/@/<?= htmlspecialchars($note->author->getFullHandle()) ?>/note/<?= $note->id ?>">
                <?= format_datetime($note->created, $prefs?->get('locale.timezone'))
                    . (isset($note->modified) && $note->modified != $note->created
                        ? ' (' . format_datetime($note->modified, $prefs?->get('locale.timezone')) . ')'
                        : ''
                    ) ?>
            </a>
            <span class="privacyScope inlineIcon material-symbols <?= match ($note->privacy->scope) {
                NotePrivacyScope::NONE => 'lock',
                NotePrivacyScope::MUTUALS => 'group',
                NotePrivacyScope::FOLLOWERS => 'groups',
                NotePrivacyScope::PUBLIC => 'public'
            } ?>" title="<?= match ($note->privacy->scope) {
                 NotePrivacyScope::NONE => __('note.privacy.scope.none'),
                 NotePrivacyScope::MUTUALS => __('note.privacy.scope.mutuals'),
                 NotePrivacyScope::FOLLOWERS => __('note.privacy.scope.followers'),
                 NotePrivacyScope::PUBLIC => __('note.privacy.scope.public')
             } ?>"></span>
        </div>

        <?php if (isset($note->inReplyTo)): ?>
            <div class="replyInfo">
                <span class="material-symbols reply inlineIcon"></span>
                <a
                    href="/@/<?= htmlspecialchars($note->inReplyTo->author->getFullHandle()) ?>/note/<?= $note->inReplyTo->id ?>">
                    <?= sprintf(__('note.info.replyTo'),
                        '<b>' . htmlspecialchars($note->inReplyTo->author->displayName)) . '</b>' ?>
                </a>
            </div>
        <?php elseif (count($note->mentions) > 0): ?>
            <div class="replyInfo">
                <span class="material-symbols alternate-email inlineIcon"></span>
                <span>
                    <?= sprintf(__('note.info.mentions'), implode(', ', array_map(
                        fn(Actor $m) => '<b><a href="/@/' . htmlspecialchars($m->getFullHandle()) . '">' . htmlspecialchars($m->displayName) . '</a></b>',
                        $note->mentions
                    ))) ?>
                </span>
            </div>
        <?php endif; ?>

        <?php if (isset($note->summary)): ?>
            <details>
                <summary><?= htmlspecialchars($note->summary) ?></summary>
            <?php endif; ?>
            <div class="content">
                <?= $note->getBestContentAsHtml() ?>
            </div>

            <?php if (count($note->attachments) > 0): ?>
                <div class="attachments">
                    <?php foreach ($note->attachments as $attachment) {
                        call_template('note_attachment', ['attachment' => $attachment]);
                    } ?>
                </div>
            <?php endif; ?>

            <?php if (isset($note->summary)): ?>
            </details>
        <?php endif; ?>

        <div class="buttons">
            <?php foreach (['like', 'dislike', 'reshare'] as $action) {
                $kind = InteractionKind::from($action);
                call_template('interaction_button', [
                    'action' => $action,
                    'note' => $note,
                    'active' => in_array($kind, $interKinds),
                    'count' => $note->countInteractionsOfKind($kind),
                    'disabled' => $actionsDisabled
                ]);
            }
            call_template('reply_button', [
                'note' => $note,
                'count' => $note->countReplies(),
                'disabled' => $actionsDisabled
            ]);
            ?>
            <div class="right">
                <?php call_template('menu_button', [], function () {
                    global $note;
                    $user = UserAccount::findByCurrentSession();
                    ?>
                    <?php if ($note->author->isLocal && ($note->author == $user?->actor || $user?->isAdmin)): ?>
                        <li>
                            <button hx-delete="/fragment/note/<?= $note->id ?>"
                                hx-confirm="<?= __('note.action.delete.confirmation') ?>" hx-target="closest .note"
                                hx-swap="delete">
                                <span class="material-symbols delete-outline"></span>
                                <span><?= __('note.action.delete') ?></span>
                            </button>
                        </li>
                    <?php endif; ?>
                <?php }); ?>
            </div>
        </div>

        <?php call_template('reply_form', ['note' => $note]); ?>
    </div>
</article>