useAutoSave.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import {
  2. useState, useRef, useEffect,
  3. } from 'react';
  4. import { interval } from 'rxjs';
  5. import { take } from 'rxjs/operators';
  6. import useStore from '../store';
  7. import { saveFile } from '../apis';
  8. const useAutoSave = (): [boolean, boolean] => {
  9. const [{ info, annotations, isInit }] = useStore();
  10. const [isSaved, setSaved] = useState(false);
  11. const [isSaving, setSaving] = useState(false);
  12. const subscription = useRef<any>(null);
  13. useEffect(() => {
  14. if (info.id && isInit) {
  15. if (subscription.current) subscription.current.unsubscribe();
  16. setSaved(false);
  17. const observable = interval(1000);
  18. const data = {
  19. transaction_id: info.id,
  20. append_objects: annotations,
  21. };
  22. subscription.current = observable.pipe(
  23. take(6),
  24. ).subscribe((x: number) => {
  25. if (x === 5) {
  26. setSaving(true);
  27. saveFile(info.token, data).then(() => {
  28. setSaving(false);
  29. setSaved(true);
  30. });
  31. }
  32. });
  33. }
  34. return (): void => {
  35. if (subscription.current) subscription.current.unsubscribe();
  36. };
  37. }, [info, annotations, isInit]);
  38. return [isSaved, isSaving];
  39. };
  40. export default useAutoSave;