Application Android et IOS pour l'amicale des élèves
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ConnectionManager.js 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // @flow
  2. import * as SecureStore from 'expo-secure-store';
  3. import {apiRequest, ERROR_TYPE, isResponseValid} from "../utils/WebData";
  4. /**
  5. * champ: error
  6. *
  7. * 0 : SUCCESS -> pas d'erreurs
  8. * 1 : BAD_CREDENTIALS -> email ou mdp invalide
  9. * 2 : BAD_TOKEN -> session expirée
  10. * 3 : NO_CONSENT
  11. * 403 : FORBIDDEN -> accès a la ressource interdit
  12. * 500 : SERVER_ERROR -> pb coté serveur
  13. */
  14. const AUTH_PATH = "password";
  15. export default class ConnectionManager {
  16. static instance: ConnectionManager | null = null;
  17. #email: string;
  18. #token: string | null;
  19. listeners: Array<Function>;
  20. constructor() {
  21. this.#token = null;
  22. this.listeners = [];
  23. }
  24. /**
  25. * Get this class instance or create one if none is found
  26. * @returns {ConnectionManager}
  27. */
  28. static getInstance(): ConnectionManager {
  29. return ConnectionManager.instance === null ?
  30. ConnectionManager.instance = new ConnectionManager() :
  31. ConnectionManager.instance;
  32. }
  33. getToken() {
  34. return this.#token;
  35. }
  36. onLoginStateChange(newState: boolean) {
  37. for (let i = 0; i < this.listeners.length; i++) {
  38. if (this.listeners[i] !== undefined)
  39. this.listeners[i](newState);
  40. }
  41. }
  42. addLoginStateListener(listener: Function) {
  43. this.listeners.push(listener);
  44. }
  45. async recoverLogin() {
  46. return new Promise((resolve, reject) => {
  47. if (this.getToken() !== null)
  48. resolve(this.getToken());
  49. else {
  50. SecureStore.getItemAsync('token')
  51. .then((token) => {
  52. this.#token = token;
  53. if (token !== null) {
  54. this.onLoginStateChange(true);
  55. resolve(token);
  56. } else
  57. reject(false);
  58. })
  59. .catch(error => {
  60. reject(false);
  61. });
  62. }
  63. });
  64. }
  65. isLoggedIn() {
  66. return this.getToken() !== null;
  67. }
  68. async saveLogin(email: string, token: string) {
  69. return new Promise((resolve, reject) => {
  70. SecureStore.setItemAsync('token', token)
  71. .then(() => {
  72. this.#token = token;
  73. this.#email = email;
  74. this.onLoginStateChange(true);
  75. resolve(true);
  76. })
  77. .catch(error => {
  78. reject(false);
  79. });
  80. });
  81. }
  82. async disconnect() {
  83. return new Promise((resolve, reject) => {
  84. SecureStore.deleteItemAsync('token')
  85. .then(() => {
  86. this.#token = null;
  87. this.onLoginStateChange(false);
  88. resolve(true);
  89. })
  90. .catch((error) => {
  91. reject(false);
  92. });
  93. });
  94. }
  95. async connect(email: string, password: string) {
  96. return new Promise((resolve, reject) => {
  97. const data = {
  98. email: email,
  99. password: password,
  100. };
  101. apiRequest(AUTH_PATH, 'POST', data)
  102. .then((response) => {
  103. this.saveLogin(email, response.token)
  104. .then(() => {
  105. resolve(true);
  106. })
  107. .catch(() => {
  108. reject(ERROR_TYPE.UNKNOWN);
  109. });
  110. })
  111. .catch((error) => reject(error));
  112. });
  113. }
  114. isConnectionResponseValid(response: Object) {
  115. let valid = isResponseValid(response);
  116. if (valid && response.error === ERROR_TYPE.SUCCESS)
  117. valid = valid
  118. && response.data.token !== undefined
  119. && response.data.token !== ''
  120. && typeof response.data.token === "string";
  121. return valid;
  122. }
  123. async authenticatedRequest(path: string, params: Object) {
  124. return new Promise((resolve, reject) => {
  125. if (this.getToken() !== null) {
  126. // console.log(data);
  127. let data = {
  128. token: this.getToken(),
  129. ...params
  130. };
  131. apiRequest(path, 'POST', data)
  132. .then((response) => resolve(response))
  133. .catch((error) => reject(error));
  134. } else
  135. reject(ERROR_TYPE.UNKNOWN);
  136. });
  137. }
  138. }