lemmy-ui/src/shared/components/home/instances.tsx

159 lines
4.3 KiB
TypeScript
Raw Normal View History

2021-02-22 02:39:04 +00:00
import { Component } from "inferno";
import {
GetFederatedInstancesResponse,
GetSiteResponse,
Instance,
UserOperation,
wsJsonToRes,
wsUserOp,
} from "lemmy-js-client";
import { Subscription } from "rxjs";
import { i18n } from "../../i18next";
import { InitialFetchRequest } from "../../interfaces";
import { WebSocketService } from "../../services";
import {
2023-05-30 00:40:00 +00:00
WithPromiseKeys,
isBrowser,
relTags,
setIsoData,
toast,
wsClient,
wsSubscribe,
} from "../../utils";
import { HtmlTags } from "../common/html-tags";
2023-05-30 00:40:00 +00:00
interface InstancesData {
federatedInstancesResponse: GetFederatedInstancesResponse;
}
interface InstancesState {
siteRes: GetSiteResponse;
instancesRes?: GetFederatedInstancesResponse;
loading: boolean;
}
export class Instances extends Component<any, InstancesState> {
2023-05-30 00:40:00 +00:00
private isoData = setIsoData<InstancesData>(this.context);
state: InstancesState = {
2020-12-24 01:58:27 +00:00
siteRes: this.isoData.site_res,
loading: true,
};
private subscription?: Subscription;
constructor(props: any, context: any) {
super(props, context);
this.parseMessage = this.parseMessage.bind(this);
this.subscription = wsSubscribe(this.parseMessage);
// Only fetch the data if coming from another route
if (this.isoData.path == this.context.router.route.match.url) {
this.state = {
...this.state,
2023-05-30 00:40:00 +00:00
instancesRes: this.isoData.routeData.federatedInstancesResponse,
loading: false,
};
} else {
WebSocketService.Instance.send(wsClient.getFederatedInstances({}));
}
}
2023-05-30 00:40:00 +00:00
static fetchInitialData({
client,
}: InitialFetchRequest): WithPromiseKeys<InstancesData> {
return {
federatedInstancesResponse: client.getFederatedInstances(
{}
) as Promise<GetFederatedInstancesResponse>,
};
}
get documentTitle(): string {
2022-11-09 19:53:07 +00:00
return `${i18n.t("instances")} - ${this.state.siteRes.site_view.site.name}`;
}
componentWillUnmount() {
if (isBrowser()) {
this.subscription?.unsubscribe();
}
}
render() {
let federated_instances = this.state.instancesRes?.federated_instances;
return federated_instances ? (
<div className="container-lg">
<HtmlTags
title={this.documentTitle}
path={this.context.router.route.match.url}
/>
<div className="row">
<div className="col-md-6">
<h5>{i18n.t("linked_instances")}</h5>
{this.itemList(federated_instances.linked)}
2021-02-01 18:08:45 +00:00
</div>
{federated_instances.allowed &&
federated_instances.allowed.length > 0 && (
<div className="col-md-6">
<h5>{i18n.t("allowed_instances")}</h5>
{this.itemList(federated_instances.allowed)}
</div>
)}
{federated_instances.blocked &&
federated_instances.blocked.length > 0 && (
<div className="col-md-6">
<h5>{i18n.t("blocked_instances")}</h5>
{this.itemList(federated_instances.blocked)}
</div>
)}
</div>
</div>
) : (
<></>
);
2021-02-01 18:08:45 +00:00
}
itemList(items: Instance[]) {
2021-02-01 18:08:45 +00:00
return items.length > 0 ? (
<div className="table-responsive">
<table id="instances_table" className="table table-sm table-hover">
<thead className="pointer">
<tr>
<th>{i18n.t("name")}</th>
<th>{i18n.t("software")}</th>
<th>{i18n.t("version")}</th>
</tr>
</thead>
<tbody>
{items.map(i => (
<tr key={i.domain}>
<td>
<a href={`https://${i.domain}`} rel={relTags}>
{i.domain}
</a>
</td>
<td>{i.software}</td>
<td>{i.version}</td>
</tr>
))}
</tbody>
</table>
</div>
2021-02-01 18:08:45 +00:00
) : (
<div>{i18n.t("none_found")}</div>
);
}
parseMessage(msg: any) {
let op = wsUserOp(msg);
console.log(msg);
if (msg.error) {
toast(i18n.t(msg.error), "danger");
this.context.router.history.push("/");
this.setState({ loading: false });
return;
} else if (op == UserOperation.GetFederatedInstances) {
let data = wsJsonToRes<GetFederatedInstancesResponse>(msg);
this.setState({ loading: false, instancesRes: data });
}
}
}