react-clone-trello

Форк
0
163 строки · 4.2 Кб
1
import { createAsyncThunk } from "@reduxjs/toolkit";
2
import Cookies from "universal-cookie";
3
import {
4
  IUserLogin,
5
  IUserLogout,
6
  IUserRegister,
7
  IUserResponse,
8
  IUserResetPassword,
9
  IUserAuth,
10
} from "../../../types/userTypes";
11
import { request } from "../../../utils/requests";
12
import { API } from "../../../utils/constants";
13
import { fetchWithRefresh } from "../../../utils/requests";
14
import { IProfileForm } from "../../../pages/ProfilePage/ProfilePage";
15

16
export const cookies = new Cookies();
17

18
export const userLogin = createAsyncThunk<IUserResponse, IUserLogin>(
19
  "user/userLogin",
20
  async (form) => {
21
    const response = await request<IUserResponse>(
22
      `${API.baseUrl}${API.endpoints.login}`,
23
      {
24
        method: "POST",
25
        headers: {
26
          "Content-type": "application/json",
27
        },
28
        body: JSON.stringify(form),
29
      }
30
    );
31

32
    if (response.success) {
33
      cookies.set("accessToken", response.accessToken.split("Bearer ")[1], {
34
        path: "/",
35
      });
36
      cookies.set("refreshToken", response.refreshToken, {
37
        path: "/",
38
      });
39
      return response as IUserResponse;
40
    } else {
41
      throw new Error("user login failed");
42
    }
43
  }
44
);
45

46
export const userRegister = createAsyncThunk<IUserResponse, IUserRegister>(
47
  "user/userRegister",
48
  async (form) => {
49
    const response = await request<IUserResponse>(
50
      `${API.baseUrl}${API.endpoints.register}`,
51
      {
52
        method: "POST",
53
        headers: {
54
          "Content-type": "application/json",
55
        },
56
        body: JSON.stringify(form),
57
      }
58
    );
59
    if (response.success) {
60
      cookies.set("accessToken", response.accessToken.split("Bearer ")[1], {
61
        path: "/",
62
      });
63
      cookies.set("refreshToken", response.refreshToken, {
64
        path: "/",
65
      });
66
      return response as IUserResponse;
67
    } else {
68
      throw new Error("user register failed");
69
    }
70
  }
71
);
72

73
export const userLogout = createAsyncThunk("user/userLogout", async () => {
74
  const response = await request<IUserLogout>(
75
    `${API.baseUrl}${API.endpoints.logout}`,
76
    {
77
      method: "POST",
78
      headers: {
79
        "Content-type": "application/json",
80
      },
81
      body: JSON.stringify({ token: cookies.get("refreshToken") }),
82
    }
83
  );
84
  if (response.success) {
85
    cookies.remove("accessToken");
86
    cookies.remove("refreshToken");
87
  }
88
});
89

90
export const forgotPassword = async (data: string) => {
91
  const response = await request<{
92
    success: true;
93
    message: "Reset email sent";
94
  }>(`${API.baseUrl}${API.endpoints.forgotPassword}`, {
95
    method: "POST",
96
    headers: {
97
      "Content-type": "application/json",
98
    },
99
    body: JSON.stringify({ email: data }),
100
  });
101

102
  return response;
103
};
104

105
export const resetPassword = async (form: IUserResetPassword) => {
106
  const response = await request<{
107
    success: true;
108
    message: "Password successfully reset";
109
  }>(`${API.baseUrl}${API.endpoints.resetPassword}`, {
110
    method: "POST",
111
    headers: {
112
      "Content-type": "application/json",
113
    },
114
    body: JSON.stringify({ password: form.password, token: form.token }),
115
  });
116

117
  if (response.success) {
118
    return response;
119
  }
120
};
121

122
export const checkUserAuth = createAsyncThunk<IUserAuth, undefined>(
123
  "user/getAuthUserData",
124
  async () => {
125
    const response = await fetchWithRefresh<IUserAuth>(
126
      `${API.baseUrl}${API.endpoints.userData}`,
127
      {
128
        method: "GET",
129
        headers: {
130
          "Content-Type": "application/json",
131
          authorization: "Bearer " + cookies.get("accessToken"),
132
        },
133
      }
134
    );
135
    if (response.success) {
136
      return response;
137
    } else {
138
      throw new Error("User check failed");
139
    }
140
  }
141
);
142

143
export const editUser = createAsyncThunk<IUserAuth, IProfileForm>(
144
  "user/editUserData",
145
  async (data) => {
146
    const response = await fetchWithRefresh<IUserAuth>(
147
      `${API.baseUrl}${API.endpoints.userData}`,
148
      {
149
        method: "PATCH",
150
        headers: {
151
          "Content-type": "application/json",
152
          authorization: "Bearer " + cookies.get("accessToken"),
153
        },
154
        body: JSON.stringify(data),
155
      }
156
    );
157
    if (response.success) {
158
      return response;
159
    } else {
160
      throw new Error("Edit user info failed");
161
    }
162
  }
163
);
164

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.