Application Android et IOS pour l'amicale des élèves https://play.google.com/store/apps/details?id=fr.amicaleinsat.application
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.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // @flow
  2. import * as Keychain from 'react-native-keychain';
  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 SERVER_NAME = "amicale-insat.fr";
  15. const AUTH_PATH = "password";
  16. export default class ConnectionManager {
  17. static instance: ConnectionManager | null = null;
  18. #email: string;
  19. #token: string | null;
  20. listeners: Array<Function>;
  21. constructor() {
  22. this.#token = null;
  23. this.listeners = [];
  24. }
  25. /**
  26. * Get this class instance or create one if none is found
  27. * @returns {ConnectionManager}
  28. */
  29. static getInstance(): ConnectionManager {
  30. return ConnectionManager.instance === null ?
  31. ConnectionManager.instance = new ConnectionManager() :
  32. ConnectionManager.instance;
  33. }
  34. getToken() {
  35. return this.#token;
  36. }
  37. onLoginStateChange(newState: boolean) {
  38. for (let i = 0; i < this.listeners.length; i++) {
  39. if (this.listeners[i] !== undefined)
  40. this.listeners[i](newState);
  41. }
  42. }
  43. addLoginStateListener(listener: Function) {
  44. this.listeners.push(listener);
  45. }
  46. async recoverLogin() {
  47. return new Promise((resolve, reject) => {
  48. if (this.getToken() !== null)
  49. resolve(this.getToken());
  50. else {
  51. Keychain.getInternetCredentials(SERVER_NAME)
  52. .then((data) => {
  53. if (data) {
  54. this.#token = data.password;
  55. this.onLoginStateChange(true);
  56. resolve(this.#token);
  57. } else
  58. reject(false);
  59. })
  60. .catch(() => {
  61. reject(false);
  62. });
  63. }
  64. });
  65. }
  66. isLoggedIn() {
  67. return this.getToken() !== null;
  68. }
  69. async saveLogin(email: string, token: string) {
  70. return new Promise((resolve, reject) => {
  71. Keychain.setInternetCredentials(SERVER_NAME, 'token', token)
  72. .then(() => {
  73. this.#token = token;
  74. this.#email = email;
  75. this.onLoginStateChange(true);
  76. resolve(true);
  77. })
  78. .catch(() => {
  79. reject(false);
  80. });
  81. });
  82. }
  83. async disconnect() {
  84. return new Promise((resolve, reject) => {
  85. Keychain.resetInternetCredentials(SERVER_NAME)
  86. .then(() => {
  87. this.#token = null;
  88. this.onLoginStateChange(false);
  89. resolve(true);
  90. })
  91. .catch(() => {
  92. reject(false);
  93. });
  94. });
  95. }
  96. async connect(email: string, password: string) {
  97. return new Promise((resolve, reject) => {
  98. const data = {
  99. email: email,
  100. password: password,
  101. };
  102. apiRequest(AUTH_PATH, 'POST', data)
  103. .then((response) => {
  104. this.saveLogin(email, response.token)
  105. .then(() => {
  106. resolve(true);
  107. })
  108. .catch(() => {
  109. reject(ERROR_TYPE.UNKNOWN);
  110. });
  111. })
  112. .catch((error) => reject(error));
  113. });
  114. }
  115. isConnectionResponseValid(response: Object) {
  116. let valid = isResponseValid(response);
  117. if (valid && response.error === ERROR_TYPE.SUCCESS)
  118. valid = valid
  119. && response.data.token !== undefined
  120. && response.data.token !== ''
  121. && typeof response.data.token === "string";
  122. return valid;
  123. }
  124. async authenticatedRequest(path: string, params: Object) {
  125. return new Promise((resolve, reject) => {
  126. if (this.getToken() !== null) {
  127. // console.log(data);
  128. let data = {
  129. token: this.getToken(),
  130. ...params
  131. };
  132. apiRequest(path, 'POST', data)
  133. .then((response) => resolve(response))
  134. .catch((error) => reject(error));
  135. } else
  136. reject(ERROR_TYPE.UNKNOWN);
  137. });
  138. }
  139. }