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