index.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { redirect } from "@/i18n";
  2. import { Response } from "@/types";
  3. import { cookies } from "next/headers";
  4. import { ServerOptions } from "./type";
  5. import { locales } from "@/i18n";
  6. const requestInterceptor = (options: ServerOptions) => {
  7. // 判断token
  8. if (options.checkToken) {
  9. const token = cookies().has("Token");
  10. if (!token) {
  11. redirect("/login");
  12. }
  13. }
  14. return options;
  15. };
  16. const responseInterceptor = <T = any, R = unknown>(
  17. response: Response<T> & R,
  18. options: ServerOptions
  19. ): Promise<Response<T> & R> => {
  20. return new Promise((resolve, reject) => {
  21. const { code, msg } = response;
  22. switch (code) {
  23. case 200:
  24. resolve(response);
  25. break;
  26. case 401:
  27. console.log(`🚀🚀🚀🚀🚀->server-code: 401`, options.url);
  28. redirect("/login");
  29. break;
  30. default:
  31. console.log({
  32. ...response,
  33. message: `please check api ${options.url}`,
  34. });
  35. reject(response);
  36. }
  37. });
  38. };
  39. class Server {
  40. private static instance: Server;
  41. private BASE_URL: string;
  42. constructor() {
  43. this.BASE_URL = process.env.NEXT_PUBLIC_BASE_URL as string;
  44. }
  45. async request<T, R = unknown>(options: ServerOptions): Promise<Response<T> & R> {
  46. options = requestInterceptor(options);
  47. const { method = "GET", url, headers = {}, data = {}, body, ...other } = options;
  48. const params = JSON.stringify(data);
  49. try {
  50. const response = await fetch(`${this.BASE_URL}${url}`, {
  51. method: method,
  52. headers: {
  53. Token: cookies().get("Token")?.value || "",
  54. "Content-Type": "application/json",
  55. language:
  56. cookies().get("language")?.value === "br"
  57. ? "pt"
  58. : cookies().get("language")?.value || locales.at(2)!,
  59. ...headers,
  60. },
  61. body: params,
  62. ...other,
  63. }).then((res) => res.json());
  64. return responseInterceptor<T, R>(response, options);
  65. } catch (error) {
  66. return Promise.reject(error);
  67. }
  68. }
  69. }
  70. export const server = new Server();