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.

customHooks.tsx 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { DependencyList, useEffect, useRef, useState } from 'react';
  2. import { REQUEST_STATUS } from './Requests';
  3. export function useMountEffect(func: () => void) {
  4. // eslint-disable-next-line react-hooks/exhaustive-deps
  5. useEffect(func, []);
  6. }
  7. /**
  8. * Effect that does not run on first render
  9. *
  10. * @param effect
  11. * @param deps
  12. */
  13. export function useSubsequentEffect(effect: () => void, deps?: DependencyList) {
  14. const didMountRef = useRef(false);
  15. useEffect(
  16. () => {
  17. if (didMountRef.current) {
  18. effect();
  19. } else {
  20. didMountRef.current = true;
  21. }
  22. },
  23. // eslint-disable-next-line react-hooks/exhaustive-deps
  24. deps ? deps : []
  25. );
  26. }
  27. export function useRequestLogic<T>(
  28. request: () => Promise<T>,
  29. cache?: T,
  30. onCacheUpdate?: (newCache: T) => void,
  31. startLoading?: boolean,
  32. minRefreshTime?: number
  33. ) {
  34. const [response, setResponse] = useState<{
  35. loading: boolean;
  36. status: REQUEST_STATUS;
  37. code?: number;
  38. data: T | undefined;
  39. }>({
  40. loading: startLoading !== false && cache === undefined,
  41. status: REQUEST_STATUS.SUCCESS,
  42. code: undefined,
  43. data: undefined,
  44. });
  45. const [lastRefreshDate, setLastRefreshDate] = useState<Date | undefined>(
  46. undefined
  47. );
  48. const refreshData = (newRequest?: () => Promise<T>) => {
  49. let canRefresh;
  50. if (lastRefreshDate && minRefreshTime) {
  51. const last = lastRefreshDate;
  52. canRefresh = new Date().getTime() - last.getTime() > minRefreshTime;
  53. } else {
  54. canRefresh = true;
  55. }
  56. if (canRefresh) {
  57. if (!response.loading) {
  58. setResponse((prevState) => ({
  59. ...prevState,
  60. loading: true,
  61. }));
  62. }
  63. setLastRefreshDate(new Date());
  64. const r = newRequest ? newRequest : request;
  65. r()
  66. .then((requestResponse: T) => {
  67. setResponse({
  68. loading: false,
  69. status: REQUEST_STATUS.SUCCESS,
  70. code: undefined,
  71. data: requestResponse,
  72. });
  73. if (onCacheUpdate) {
  74. onCacheUpdate(requestResponse);
  75. }
  76. })
  77. .catch(() => {
  78. setResponse((prevState) => ({
  79. loading: false,
  80. status: REQUEST_STATUS.CONNECTION_ERROR,
  81. code: 0,
  82. data: prevState.data,
  83. }));
  84. });
  85. }
  86. };
  87. const value: [
  88. boolean,
  89. REQUEST_STATUS,
  90. number | undefined,
  91. T | undefined,
  92. (newRequest?: () => Promise<T>) => void
  93. ] = [
  94. response.loading,
  95. response.status,
  96. response.code,
  97. cache ? cache : response.data,
  98. refreshData,
  99. ];
  100. return value;
  101. }