1 import { Component } from 'inferno';
2 import { Helmet } from 'inferno-helmet';
3 import { Subscription } from 'rxjs';
4 import { retryWhen, delay, take } from 'rxjs/operators';
5 import { WebSocketService } from '../services';
11 } from '../interfaces';
12 import { i18n } from '../i18next';
13 import { T } from 'inferno-i18next';
14 import { repoUrl, wsJsonToRes, toast } from '../utils';
16 interface SilverUser {
38 let highlighted = ['DQW', 'DiscountFuneral', 'Oskenso Kashi', 'Alex Benishek'];
39 let silver: Array<SilverUser> = [
42 link: 'https://iww.org',
48 interface SponsorsState {
52 export class Sponsors extends Component<any, SponsorsState> {
53 private subscription: Subscription;
54 private emptyState: SponsorsState = {
57 constructor(props: any, context: any) {
58 super(props, context);
59 this.state = this.emptyState;
60 this.subscription = WebSocketService.Instance.subject
61 .pipe(retryWhen(errors => errors.pipe(delay(3000), take(10))))
63 msg => this.parseMessage(msg),
64 err => console.error(err),
65 () => console.log('complete')
68 WebSocketService.Instance.getSite();
72 window.scrollTo(0, 0);
75 componentWillUnmount() {
76 this.subscription.unsubscribe();
79 get documentTitle(): string {
80 if (this.state.site) {
81 return `${i18n.t('sponsors')} - ${this.state.site.name}`;
89 <div class="container text-center">
90 <Helmet title={this.documentTitle} />
103 <h5>{i18n.t('donate_to_lemmy')}</h5>
105 <T i18nKey="sponsor_message">
106 #<a href={repoUrl}>#</a>
109 <a class="btn btn-secondary" href="https://liberapay.com/Lemmy/">
110 {i18n.t('support_on_liberapay')}
113 class="btn btn-secondary ml-2"
114 href="https://www.patreon.com/dessalines"
116 {i18n.t('support_on_patreon')}
119 class="btn btn-secondary ml-2"
120 href="https://opencollective.com/lemmy"
122 {i18n.t('support_on_open_collective')}
129 <div class="container">
130 <h5>{i18n.t('sponsors')}</h5>
131 <p>{i18n.t('silver_sponsors')}</p>
132 <div class="row justify-content-md-center card-columns">
134 <div class="card col-12 col-md-2">
137 <a href={s.link} target="_blank" rel="noopener">
141 <div>💎 {s.name}</div>
147 <p>{i18n.t('general_sponsors')}</p>
148 <div class="row justify-content-md-center card-columns">
149 {highlighted.map(s => (
150 <div class="card bg-primary col-12 col-md-2 font-weight-bold">
155 <div class="card col-12 col-md-2">
167 <h5>{i18n.t('crypto')}</h5>
168 <div class="table-responsive">
169 <table class="table table-hover text-center">
172 <td>{i18n.t('bitcoin')}</td>
174 <code>1Hefs7miXS5ff5Ck5xvmjKjXf5242KzRtK</code>
178 <td>{i18n.t('ethereum')}</td>
180 <code>0x400c96c96acbC6E7B3B43B1dc1BB446540a88A01</code>
184 <td>{i18n.t('monero')}</td>
187 41taVyY6e1xApqKyMVDRVxJ76sPkfZhALLTjRvVKpaAh2pBd4wv9RgYj1tSPrx8wc6iE1uWUfjtQdTmTy2FGMeChGVKPQuV
198 parseMessage(msg: WebSocketJsonResponse) {
200 let res = wsJsonToRes(msg);
202 toast(i18n.t(msg.error), 'danger');
204 } else if (res.op == UserOperation.GetSite) {
205 let data = res.data as GetSiteResponse;
206 this.state.site = data.site;
207 this.setState(this.state);