Store objects to IndexedDB (#6826)
This commit is contained in:
		
				
					committed by
					
						
						Eugen Rochko
					
				
			
			
				
	
			
			
			
						parent
						
							28384c1771
						
					
				
				
					commit
					fe398a098e
				
			@@ -1,7 +1,10 @@
 | 
			
		||||
import api from '../api';
 | 
			
		||||
import asyncDB from '../db/async';
 | 
			
		||||
import { evictStatus } from '../db/modifier';
 | 
			
		||||
 | 
			
		||||
import { deleteFromTimelines } from './timelines';
 | 
			
		||||
import { fetchStatusCard } from './cards';
 | 
			
		||||
import { importFetchedStatus, importFetchedStatuses, importAccount, importStatus } from './importer';
 | 
			
		||||
 | 
			
		||||
export const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
 | 
			
		||||
export const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS';
 | 
			
		||||
@@ -34,6 +37,48 @@ export function fetchStatusRequest(id, skipLoading) {
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function getFromDB(dispatch, getState, accountIndex, index, id) {
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    const request = index.get(id);
 | 
			
		||||
 | 
			
		||||
    request.onerror = reject;
 | 
			
		||||
 | 
			
		||||
    request.onsuccess = () => {
 | 
			
		||||
      const promises = [];
 | 
			
		||||
 | 
			
		||||
      if (!request.result) {
 | 
			
		||||
        reject();
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      dispatch(importStatus(request.result));
 | 
			
		||||
 | 
			
		||||
      if (getState().getIn(['accounts', request.result.account], null) === null) {
 | 
			
		||||
        promises.push(new Promise((accountResolve, accountReject) => {
 | 
			
		||||
          const accountRequest = accountIndex.get(request.result.account);
 | 
			
		||||
 | 
			
		||||
          accountRequest.onerror = accountReject;
 | 
			
		||||
          accountRequest.onsuccess = () => {
 | 
			
		||||
            if (!request.result) {
 | 
			
		||||
              accountReject();
 | 
			
		||||
              return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            dispatch(importAccount(accountRequest.result));
 | 
			
		||||
            accountResolve();
 | 
			
		||||
          };
 | 
			
		||||
        }));
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (request.result.reblog && getState().getIn(['statuses', request.result.reblog], null) === null) {
 | 
			
		||||
        promises.push(getFromDB(dispatch, getState, accountIndex, index, request.result.reblog));
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      resolve(Promise.all(promises));
 | 
			
		||||
    };
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function fetchStatus(id) {
 | 
			
		||||
  return (dispatch, getState) => {
 | 
			
		||||
    const skipLoading = getState().getIn(['statuses', id], null) !== null;
 | 
			
		||||
@@ -47,18 +92,26 @@ export function fetchStatus(id) {
 | 
			
		||||
 | 
			
		||||
    dispatch(fetchStatusRequest(id, skipLoading));
 | 
			
		||||
 | 
			
		||||
    api(getState).get(`/api/v1/statuses/${id}`).then(response => {
 | 
			
		||||
      dispatch(fetchStatusSuccess(response.data, skipLoading));
 | 
			
		||||
    }).catch(error => {
 | 
			
		||||
    asyncDB.then(db => {
 | 
			
		||||
      const transaction = db.transaction(['accounts', 'statuses'], 'read');
 | 
			
		||||
      const accountIndex = transaction.objectStore('accounts').index('id');
 | 
			
		||||
      const index = transaction.objectStore('statuses').index('id');
 | 
			
		||||
 | 
			
		||||
      return getFromDB(dispatch, getState, accountIndex, index, id);
 | 
			
		||||
    }).then(() => {
 | 
			
		||||
      dispatch(fetchStatusSuccess(skipLoading));
 | 
			
		||||
    }, () => api(getState).get(`/api/v1/statuses/${id}`).then(response => {
 | 
			
		||||
      dispatch(importFetchedStatus(response.data));
 | 
			
		||||
      dispatch(fetchStatusSuccess(skipLoading));
 | 
			
		||||
    })).catch(error => {
 | 
			
		||||
      dispatch(fetchStatusFail(id, error, skipLoading));
 | 
			
		||||
    });
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export function fetchStatusSuccess(status, skipLoading) {
 | 
			
		||||
export function fetchStatusSuccess(skipLoading) {
 | 
			
		||||
  return {
 | 
			
		||||
    type: STATUS_FETCH_SUCCESS,
 | 
			
		||||
    status,
 | 
			
		||||
    skipLoading,
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
@@ -78,6 +131,7 @@ export function deleteStatus(id) {
 | 
			
		||||
    dispatch(deleteStatusRequest(id));
 | 
			
		||||
 | 
			
		||||
    api(getState).delete(`/api/v1/statuses/${id}`).then(() => {
 | 
			
		||||
      evictStatus(id);
 | 
			
		||||
      dispatch(deleteStatusSuccess(id));
 | 
			
		||||
      dispatch(deleteFromTimelines(id));
 | 
			
		||||
    }).catch(error => {
 | 
			
		||||
@@ -113,6 +167,7 @@ export function fetchContext(id) {
 | 
			
		||||
    dispatch(fetchContextRequest(id));
 | 
			
		||||
 | 
			
		||||
    api(getState).get(`/api/v1/statuses/${id}/context`).then(response => {
 | 
			
		||||
      dispatch(importFetchedStatuses(response.data.ancestors.concat(response.data.descendants)));
 | 
			
		||||
      dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants));
 | 
			
		||||
 | 
			
		||||
    }).catch(error => {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user