index.ts 2.4 KB

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