]> Untitled Git - lemmy.git/blob - ui/src/services/WebSocketService.ts
Merge branch 'master' into email
[lemmy.git] / ui / src / services / WebSocketService.ts
1 import { wsUri } from '../env';
2 import {
3   LoginForm,
4   RegisterForm,
5   UserOperation,
6   CommunityForm,
7   PostForm,
8   SavePostForm,
9   CommentForm,
10   SaveCommentForm,
11   CommentLikeForm,
12   GetPostsForm,
13   CreatePostLikeForm,
14   FollowCommunityForm,
15   GetUserDetailsForm,
16   ListCommunitiesForm,
17   GetModlogForm,
18   BanFromCommunityForm,
19   AddModToCommunityForm,
20   TransferCommunityForm,
21   AddAdminForm,
22   TransferSiteForm,
23   BanUserForm,
24   SiteForm,
25   Site,
26   UserView,
27   GetRepliesForm,
28   GetUserMentionsForm,
29   EditUserMentionForm,
30   SearchForm,
31   UserSettingsForm,
32   DeleteAccountForm,
33   PasswordResetForm,
34   PasswordChangeForm,
35 } from '../interfaces';
36 import { webSocket } from 'rxjs/webSocket';
37 import { Subject } from 'rxjs';
38 import { retryWhen, delay, take } from 'rxjs/operators';
39 import { UserService } from './';
40 import { i18n } from '../i18next';
41
42 export class WebSocketService {
43   private static _instance: WebSocketService;
44   public subject: Subject<any>;
45
46   public site: Site;
47   public admins: Array<UserView>;
48   public banned: Array<UserView>;
49
50   private constructor() {
51     this.subject = webSocket(wsUri);
52
53     // Necessary to not keep reconnecting
54     this.subject
55       .pipe(
56         retryWhen(errors =>
57           errors.pipe(
58             delay(1000)
59             // take(999)
60           )
61         )
62       )
63       .subscribe();
64
65     console.log(`Connected to ${wsUri}`);
66   }
67
68   public static get Instance() {
69     return this._instance || (this._instance = new this());
70   }
71
72   public login(loginForm: LoginForm) {
73     this.subject.next(this.wsSendWrapper(UserOperation.Login, loginForm));
74   }
75
76   public register(registerForm: RegisterForm) {
77     this.subject.next(this.wsSendWrapper(UserOperation.Register, registerForm));
78   }
79
80   public createCommunity(communityForm: CommunityForm) {
81     this.setAuth(communityForm);
82     this.subject.next(
83       this.wsSendWrapper(UserOperation.CreateCommunity, communityForm)
84     );
85   }
86
87   public editCommunity(communityForm: CommunityForm) {
88     this.setAuth(communityForm);
89     this.subject.next(
90       this.wsSendWrapper(UserOperation.EditCommunity, communityForm)
91     );
92   }
93
94   public followCommunity(followCommunityForm: FollowCommunityForm) {
95     this.setAuth(followCommunityForm);
96     this.subject.next(
97       this.wsSendWrapper(UserOperation.FollowCommunity, followCommunityForm)
98     );
99   }
100
101   public listCommunities(form: ListCommunitiesForm) {
102     this.setAuth(form, false);
103     this.subject.next(this.wsSendWrapper(UserOperation.ListCommunities, form));
104   }
105
106   public getFollowedCommunities() {
107     let data = { auth: UserService.Instance.auth };
108     this.subject.next(
109       this.wsSendWrapper(UserOperation.GetFollowedCommunities, data)
110     );
111   }
112
113   public listCategories() {
114     this.subject.next(
115       this.wsSendWrapper(UserOperation.ListCategories, undefined)
116     );
117   }
118
119   public createPost(postForm: PostForm) {
120     this.setAuth(postForm);
121     this.subject.next(this.wsSendWrapper(UserOperation.CreatePost, postForm));
122   }
123
124   public getPost(postId: number) {
125     let data = { id: postId, auth: UserService.Instance.auth };
126     this.subject.next(this.wsSendWrapper(UserOperation.GetPost, data));
127   }
128
129   public getCommunity(communityId: number) {
130     let data = { id: communityId, auth: UserService.Instance.auth };
131     this.subject.next(this.wsSendWrapper(UserOperation.GetCommunity, data));
132   }
133
134   public getCommunityByName(name: string) {
135     let data = { name: name, auth: UserService.Instance.auth };
136     this.subject.next(this.wsSendWrapper(UserOperation.GetCommunity, data));
137   }
138
139   public createComment(commentForm: CommentForm) {
140     this.setAuth(commentForm);
141     this.subject.next(
142       this.wsSendWrapper(UserOperation.CreateComment, commentForm)
143     );
144   }
145
146   public editComment(commentForm: CommentForm) {
147     this.setAuth(commentForm);
148     this.subject.next(
149       this.wsSendWrapper(UserOperation.EditComment, commentForm)
150     );
151   }
152
153   public likeComment(form: CommentLikeForm) {
154     this.setAuth(form);
155     this.subject.next(
156       this.wsSendWrapper(UserOperation.CreateCommentLike, form)
157     );
158   }
159
160   public saveComment(form: SaveCommentForm) {
161     this.setAuth(form);
162     this.subject.next(this.wsSendWrapper(UserOperation.SaveComment, form));
163   }
164
165   public getPosts(form: GetPostsForm) {
166     this.setAuth(form, false);
167     this.subject.next(this.wsSendWrapper(UserOperation.GetPosts, form));
168   }
169
170   public likePost(form: CreatePostLikeForm) {
171     this.setAuth(form);
172     this.subject.next(this.wsSendWrapper(UserOperation.CreatePostLike, form));
173   }
174
175   public editPost(postForm: PostForm) {
176     this.setAuth(postForm);
177     this.subject.next(this.wsSendWrapper(UserOperation.EditPost, postForm));
178   }
179
180   public savePost(form: SavePostForm) {
181     this.setAuth(form);
182     this.subject.next(this.wsSendWrapper(UserOperation.SavePost, form));
183   }
184
185   public banFromCommunity(form: BanFromCommunityForm) {
186     this.setAuth(form);
187     this.subject.next(this.wsSendWrapper(UserOperation.BanFromCommunity, form));
188   }
189
190   public addModToCommunity(form: AddModToCommunityForm) {
191     this.setAuth(form);
192     this.subject.next(
193       this.wsSendWrapper(UserOperation.AddModToCommunity, form)
194     );
195   }
196
197   public transferCommunity(form: TransferCommunityForm) {
198     this.setAuth(form);
199     this.subject.next(
200       this.wsSendWrapper(UserOperation.TransferCommunity, form)
201     );
202   }
203
204   public transferSite(form: TransferSiteForm) {
205     this.setAuth(form);
206     this.subject.next(this.wsSendWrapper(UserOperation.TransferSite, form));
207   }
208
209   public banUser(form: BanUserForm) {
210     this.setAuth(form);
211     this.subject.next(this.wsSendWrapper(UserOperation.BanUser, form));
212   }
213
214   public addAdmin(form: AddAdminForm) {
215     this.setAuth(form);
216     this.subject.next(this.wsSendWrapper(UserOperation.AddAdmin, form));
217   }
218
219   public getUserDetails(form: GetUserDetailsForm) {
220     this.setAuth(form, false);
221     this.subject.next(this.wsSendWrapper(UserOperation.GetUserDetails, form));
222   }
223
224   public getReplies(form: GetRepliesForm) {
225     this.setAuth(form);
226     this.subject.next(this.wsSendWrapper(UserOperation.GetReplies, form));
227   }
228
229   public getUserMentions(form: GetUserMentionsForm) {
230     this.setAuth(form);
231     this.subject.next(this.wsSendWrapper(UserOperation.GetUserMentions, form));
232   }
233
234   public editUserMention(form: EditUserMentionForm) {
235     this.setAuth(form);
236     this.subject.next(this.wsSendWrapper(UserOperation.EditUserMention, form));
237   }
238
239   public getModlog(form: GetModlogForm) {
240     this.subject.next(this.wsSendWrapper(UserOperation.GetModlog, form));
241   }
242
243   public createSite(siteForm: SiteForm) {
244     this.setAuth(siteForm);
245     this.subject.next(this.wsSendWrapper(UserOperation.CreateSite, siteForm));
246   }
247
248   public editSite(siteForm: SiteForm) {
249     this.setAuth(siteForm);
250     this.subject.next(this.wsSendWrapper(UserOperation.EditSite, siteForm));
251   }
252
253   public getSite() {
254     this.subject.next(this.wsSendWrapper(UserOperation.GetSite, undefined));
255   }
256
257   public search(form: SearchForm) {
258     this.subject.next(this.wsSendWrapper(UserOperation.Search, form));
259   }
260
261   public markAllAsRead() {
262     let form = {};
263     this.setAuth(form);
264     this.subject.next(this.wsSendWrapper(UserOperation.MarkAllAsRead, form));
265   }
266
267   public saveUserSettings(userSettingsForm: UserSettingsForm) {
268     this.setAuth(userSettingsForm);
269     this.subject.next(
270       this.wsSendWrapper(UserOperation.SaveUserSettings, userSettingsForm)
271     );
272   }
273
274   public deleteAccount(form: DeleteAccountForm) {
275     this.setAuth(form);
276     this.subject.next(this.wsSendWrapper(UserOperation.DeleteAccount, form));
277   }
278
279   public passwordReset(form: PasswordResetForm) {
280     this.subject.next(this.wsSendWrapper(UserOperation.PasswordReset, form));
281   }
282
283   public passwordChange(form: PasswordChangeForm) {
284     this.subject.next(this.wsSendWrapper(UserOperation.PasswordChange, form));
285   }
286
287   private wsSendWrapper(op: UserOperation, data: any) {
288     let send = { op: UserOperation[op], data: data };
289     console.log(send);
290     return send;
291   }
292
293   private setAuth(obj: any, throwErr: boolean = true) {
294     obj.auth = UserService.Instance.auth;
295     if (obj.auth == null && throwErr) {
296       alert(i18n.t('not_logged_in'));
297       throw 'Not logged in';
298     }
299   }
300 }
301
302 window.onbeforeunload = () => {
303   WebSocketService.Instance.subject.unsubscribe();
304   WebSocketService.Instance.subject = null;
305 };