UNPKG

react-relay

Version:

A framework for building data-driven React applications.

125 lines (106 loc) 4.11 kB
/** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule RelayMutationTracker * * @typechecks */ // Maintains a map from the client id to the server id of // optimistically added nodes 'use strict'; var GraphQLStoreDataHandler = require('./GraphQLStoreDataHandler'); var clientIDToServerIDMap = {}; // For node-create mutations, maintains an index of the mutation to the // client ID of an optimistically created node (if it exists). var mutationIDToClientNodeIDMap = {}; // For mutations that have errors, maintains a two-directional index of the // mutation and node with an error. var clientMutationIDToErrorNodeID = {}; var clientNodeIDToErrorMutationID = {}; /** * @internal * * Records the client ID and error status of mutations as well as maintaining * a mapping of optimistic client IDs to server IDs. */ var RelayMutationTracker = { /** * Checks if the given id represents an object only known on the client side * or not. In this case, it is both a client id and does not have a * corresponding mapping in the client server id map. */ isClientOnlyID: function isClientOnlyID(dataID) { return GraphQLStoreDataHandler.isClientID(dataID) && !clientIDToServerIDMap[dataID]; }, /** * Updates the map from the client id to the server id for optimistically * added nodes. */ updateClientServerIDMap: function updateClientServerIDMap(clientID, serverID) { clientIDToServerIDMap[clientID] = serverID; }, /** * Gets the serverID (if one exists) for a given clientID */ getServerIDForClientID: function getServerIDForClientID(clientID) { return clientIDToServerIDMap[clientID] || null; }, /** * Record the root node ID associated with the mutation. */ putClientIDForMutation: function putClientIDForMutation(clientID, clientMutationID) { mutationIDToClientNodeIDMap[clientMutationID] = clientID; // if an error exists for this mutation ID, remove the error on the previous // client ID and 'move' the error on the new client ID var errorNodeID = RelayMutationTracker.getErrorNodeForMutation(clientMutationID); if (errorNodeID) { RelayMutationTracker.deleteMutationForErrorNode(errorNodeID); RelayMutationTracker.putErrorNodeForMutation(clientID, clientMutationID); } }, /** * Get the root record ID associated with the muation. */ getClientIDForMutation: function getClientIDForMutation(clientMutationID) { return mutationIDToClientNodeIDMap[clientMutationID]; }, /** * Delete the root record ID associated with the mutation. */ deleteClientIDForMutation: function deleteClientIDForMutation(clientMutationID) { delete mutationIDToClientNodeIDMap[clientMutationID]; }, /** * Record that an error occurred while creating the given (client) record ID. */ putErrorNodeForMutation: function putErrorNodeForMutation(clientID, clientMutationID) { clientNodeIDToErrorMutationID[clientID] = clientMutationID; clientMutationIDToErrorNodeID[clientMutationID] = clientID; }, /** * Find the failed mutation that created the given (client) record ID, * if any. */ getMutationForErrorNode: function getMutationForErrorNode(clientID) { return clientNodeIDToErrorMutationID[clientID]; }, /** * Find the (client) ID of the record associated with the given mutation, * if any. */ getErrorNodeForMutation: function getErrorNodeForMutation(clientMutationID) { return clientMutationIDToErrorNodeID[clientMutationID]; }, deleteMutationForErrorNode: function deleteMutationForErrorNode(clientID) { delete clientNodeIDToErrorMutationID[clientID]; }, deleteErrorNodeForMutation: function deleteErrorNodeForMutation(clientMutationID) { delete clientMutationIDToErrorNodeID[clientMutationID]; } }; module.exports = RelayMutationTracker;