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