1 import { None, Option } from "@sniptt/monads";
2 import { Component, linkEvent } from "inferno";
3 import { Link } from "inferno-router";
4 import { PersonViewSafe, Site, SiteAggregates } from "lemmy-js-client";
5 import { i18n } from "../../i18next";
6 import { mdToHtml, numToSI } from "../../utils";
7 import { BannerIconHeader } from "../common/banner-icon-header";
8 import { Icon } from "../common/icon";
9 import { PersonListing } from "../person/person-listing";
11 interface SiteSidebarProps {
14 counts: Option<SiteAggregates>;
15 admins: Option<PersonViewSafe[]>;
16 online: Option<number>;
19 interface SiteSidebarState {
23 export class SiteSidebar extends Component<SiteSidebarProps, SiteSidebarState> {
24 private emptyState: SiteSidebarState = {
28 constructor(props: any, context: any) {
29 super(props, context);
30 this.state = this.emptyState;
35 <div className="card border-secondary mb-3">
36 <div className="card-body">
38 <div className="mb-2">{this.siteName()}</div>
39 {!this.state.collapsed && (
41 <BannerIconHeader banner={this.props.site.banner} icon={None} />
53 <h5 className="mb-0 d-inline">
54 {this.props.site.name}
56 className="btn btn-sm text-muted"
57 onClick={linkEvent(this, this.handleCollapseSidebar)}
58 aria-label={i18n.t("collapse")}
59 data-tippy-content={i18n.t("collapse")}
61 {this.state.collapsed ? (
62 <Icon icon="plus-square" classes="icon-inline" />
64 <Icon icon="minus-square" classes="icon-inline" />
72 let site = this.props.site;
75 {site.description.match({
76 some: description => <h6>{description}</h6>,
80 some: sidebar => this.siteSidebar(sidebar),
83 {this.props.counts.match({
84 some: counts => this.badges(counts),
87 {this.props.admins.match({
88 some: admins => this.admins(admins),
95 siteSidebar(sidebar: string) {
97 <div className="md-div" dangerouslySetInnerHTML={mdToHtml(sidebar)} />
101 admins(admins: PersonViewSafe[]) {
103 <ul className="mt-1 list-inline small mb-0">
104 <li className="list-inline-item">{i18n.t("admins")}:</li>
106 <li key={av.person.id} className="list-inline-item">
107 <PersonListing person={av.person} />
114 badges(siteAggregates: SiteAggregates) {
115 let counts = siteAggregates;
116 let online = this.props.online.unwrapOr(1);
118 <ul className="my-2 list-inline">
119 <li className="list-inline-item badge badge-secondary">
120 {i18n.t("number_online", {
122 formattedCount: numToSI(online),
126 className="list-inline-item badge badge-secondary pointer"
127 data-tippy-content={i18n.t("active_users_in_the_last_day", {
128 count: counts.users_active_day,
129 formattedCount: numToSI(counts.users_active_day),
132 {i18n.t("number_of_users", {
133 count: counts.users_active_day,
134 formattedCount: numToSI(counts.users_active_day),
139 className="list-inline-item badge badge-secondary pointer"
140 data-tippy-content={i18n.t("active_users_in_the_last_week", {
141 count: counts.users_active_week,
142 formattedCount: counts.users_active_week,
145 {i18n.t("number_of_users", {
146 count: counts.users_active_week,
147 formattedCount: numToSI(counts.users_active_week),
152 className="list-inline-item badge badge-secondary pointer"
153 data-tippy-content={i18n.t("active_users_in_the_last_month", {
154 count: counts.users_active_month,
155 formattedCount: counts.users_active_month,
158 {i18n.t("number_of_users", {
159 count: counts.users_active_month,
160 formattedCount: numToSI(counts.users_active_month),
165 className="list-inline-item badge badge-secondary pointer"
166 data-tippy-content={i18n.t("active_users_in_the_last_six_months", {
167 count: counts.users_active_half_year,
168 formattedCount: counts.users_active_half_year,
171 {i18n.t("number_of_users", {
172 count: counts.users_active_half_year,
173 formattedCount: numToSI(counts.users_active_half_year),
175 / {i18n.t("number_of_months", { count: 6, formattedCount: 6 })}
177 <li className="list-inline-item badge badge-secondary">
178 {i18n.t("number_of_users", {
180 formattedCount: numToSI(counts.users),
183 <li className="list-inline-item badge badge-secondary">
184 {i18n.t("number_of_communities", {
185 count: counts.communities,
186 formattedCount: numToSI(counts.communities),
189 <li className="list-inline-item badge badge-secondary">
190 {i18n.t("number_of_posts", {
192 formattedCount: numToSI(counts.posts),
195 <li className="list-inline-item badge badge-secondary">
196 {i18n.t("number_of_comments", {
197 count: counts.comments,
198 formattedCount: numToSI(counts.comments),
201 <li className="list-inline-item">
202 <Link className="badge badge-primary" to="/modlog">
210 handleCollapseSidebar(i: SiteSidebar) {
211 i.setState({ collapsed: !i.state.collapsed });