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