summaryrefslogtreecommitdiffstats
path: root/ui/src/services/WebSocketService.ts
blob: d89d0128cd8e4d1da7f2c28c94251312960ba4a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import { wsUri } from '../env';
import { LoginForm, RegisterForm, UserOperation, CommunityForm, PostForm, CommentForm, CommentLikeForm, GetPostsForm, CreatePostLikeForm } from '../interfaces';
import { webSocket } from 'rxjs/webSocket';
import { Subject } from 'rxjs';
import { retryWhen, delay, take } from 'rxjs/operators';
import { UserService } from './';

export class WebSocketService {
  private static _instance: WebSocketService;
  public subject: Subject<any>;

  private constructor() {
    this.subject = webSocket(wsUri);

    // Even tho this isn't used, its necessary to not keep reconnecting
    this.subject
      .pipe(retryWhen(errors => errors.pipe(delay(60000), take(999))))
      .subscribe();

    console.log(`Connected to ${wsUri}`);
  }

  public static get Instance(){
    return this._instance || (this._instance = new this());
  }
   
  public login(loginForm: LoginForm) {
    this.subject.next(this.wsSendWrapper(UserOperation.Login, loginForm));
  }

  public register(registerForm: RegisterForm) {
    this.subject.next(this.wsSendWrapper(UserOperation.Register, registerForm));
  }

  public createCommunity(communityForm: CommunityForm) {
    this.setAuth(communityForm);
    this.subject.next(this.wsSendWrapper(UserOperation.CreateCommunity, communityForm));
  }

  public editCommunity(communityForm: CommunityForm) {
    this.setAuth(communityForm);
    this.subject.next(this.wsSendWrapper(UserOperation.EditCommunity, communityForm));
  }

  public listCommunities() {
    this.subject.next(this.wsSendWrapper(UserOperation.ListCommunities, undefined));
  }

  public listCategories() {
    this.subject.next(this.wsSendWrapper(UserOperation.ListCategories, undefined));
  }

  public createPost(postForm: PostForm) {
    this.setAuth(postForm);
    this.subject.next(this.wsSendWrapper(UserOperation.CreatePost, postForm));
  }

  public getPost(postId: number) {
    let data = {id: postId, auth: UserService.Instance.auth };
    this.subject.next(this.wsSendWrapper(UserOperation.GetPost, data));
  }

  public getCommunity(communityId: number) {
    this.subject.next(this.wsSendWrapper(UserOperation.GetCommunity, {id: communityId}));
  }

  public createComment(commentForm: CommentForm) {
    this.setAuth(commentForm);
    this.subject.next(this.wsSendWrapper(UserOperation.CreateComment, commentForm));
  }

  public editComment(commentForm: CommentForm) {
    this.setAuth(commentForm);
    this.subject.next(this.wsSendWrapper(UserOperation.EditComment, commentForm));
  }

  public likeComment(form: CommentLikeForm) {
    this.setAuth(form);
    this.subject.next(this.wsSendWrapper(UserOperation.CreateCommentLike, form));
  }

  public getPosts(form: GetPostsForm) {
    this.setAuth(form, false);
    this.subject.next(this.wsSendWrapper(UserOperation.GetPosts, form));
  }

  public likePost(form: CreatePostLikeForm) {
    this.setAuth(form);
    this.subject.next(this.wsSendWrapper(UserOperation.CreatePostLike, form));
  }

  public editPost(postForm: PostForm) {
    this.setAuth(postForm);
    this.subject.next(this.wsSendWrapper(UserOperation.EditPost, postForm));
  }

  private wsSendWrapper(op: UserOperation, data: any) {
    let send = { op: UserOperation[op], data: data };
    console.log(send);
    return send;
  }

  private setAuth(obj: any, throwErr: boolean = true) {
    obj.auth = UserService.Instance.auth;
    if (obj.auth == null && throwErr) {
      alert("Not logged in.");
      throw "Not logged in";
    }
  }

}

window.onbeforeunload = (e => {
  WebSocketService.Instance.subject.unsubscribe();
  WebSocketService.Instance.subject = null;
});