Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

AuthContext.js 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import AsyncStorage from "@react-native-async-storage/async-storage";
  2. import * as Google from "expo-auth-session/providers/google";
  3. import React, { createContext, useEffect, useState } from "react";
  4. import { googleApi, loginApi, registerApi } from "../service/user";
  5. import { revokeAsync } from "expo-auth-session";
  6. export const AuthContext = createContext();
  7. export const AuthProvider = ({ children }) => {
  8. const [userInfo, setUserInfo] = useState({});
  9. const [isLoading, setIsLoading] = useState(false);
  10. // Google Auth
  11. const [request, response, promptAsync] = Google.useAuthRequest({
  12. androidClientId:
  13. "1032296921439-dpgvgkss3ggds0egvo6puf0r7un9em6c.apps.googleusercontent.com",
  14. iosClientId:
  15. "1032296921439-j7jfahhm7q3l07aj04qvdblmcns77oul.apps.googleusercontent.com",
  16. expoClientId:
  17. "1032296921439-vfs9k28sn7kei4nft998ck3067m8ksiq.apps.googleusercontent.com",
  18. });
  19. useEffect(() => {
  20. if (response?.type === "success") {
  21. googleApi(response.authentication.accessToken)
  22. .then((res) => {
  23. if (res.user) {
  24. setUserInfo(res);
  25. AsyncStorage.setItem("userInfo", JSON.stringify(res));
  26. setIsLoading(false);
  27. } else {
  28. callback(res);
  29. setIsLoading(false);
  30. }
  31. })
  32. .catch((e) => {
  33. console.log("error", e);
  34. setIsLoading(false);
  35. });
  36. }
  37. }, [response]);
  38. const login = (email, password, callback) => {
  39. setIsLoading(true);
  40. loginApi({ identifier: email, password })
  41. .then((res) => {
  42. if (res.user) {
  43. setUserInfo(res);
  44. AsyncStorage.setItem("userInfo", JSON.stringify(res));
  45. AsyncStorage.setItem("jwt-token", res.jwt);
  46. setIsLoading(false);
  47. } else {
  48. callback(res);
  49. setIsLoading(false);
  50. }
  51. })
  52. .catch((e) => {
  53. console.log("error", e);
  54. setIsLoading(false);
  55. });
  56. };
  57. const googleAuth = () => {
  58. promptAsync({ useProxy: true, showInRecents: true });
  59. };
  60. const register = (username, email, password, callback) => {
  61. setIsLoading(true);
  62. registerApi({ username, email, password })
  63. .then((res) => {
  64. if (res.user) {
  65. setUserInfo(res);
  66. AsyncStorage.setItem("userInfo", JSON.stringify(res));
  67. AsyncStorage.setItem("jwt-token", res.jwt);
  68. setIsLoading(false);
  69. } else {
  70. callback(res);
  71. setIsLoading(false);
  72. }
  73. })
  74. .catch((e) => {
  75. console.log("error", e);
  76. setIsLoading(false);
  77. });
  78. };
  79. const logout = async () => {
  80. setIsLoading(true);
  81. AsyncStorage.removeItem("userInfo");
  82. AsyncStorage.removeItem("jwt-token");
  83. setUserInfo({});
  84. if (userInfo.user.provider === "google") {
  85. await revokeAsync(
  86. { token: response.authentication.accessToken },
  87. { revocationEndpoint: "https://oauth2.googleapis.com/revoke" }
  88. );
  89. }
  90. setIsLoading(false);
  91. };
  92. const isLoggedIn = async () => {
  93. try {
  94. let userInfo = await AsyncStorage.getItem("userInfo");
  95. userInfo = JSON.parse(userInfo);
  96. if (userInfo) {
  97. setUserInfo(userInfo);
  98. }
  99. } catch (e) {
  100. console.log(e);
  101. }
  102. };
  103. useEffect(() => {
  104. isLoggedIn();
  105. }, []);
  106. return (
  107. <AuthContext.Provider
  108. value={{ isLoading, login, logout, userInfo, register, googleAuth }}
  109. >
  110. {children}
  111. </AuthContext.Provider>
  112. );
  113. };