| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import { useState, useCallback } from 'react'; |
| import { ModelMappingUtils } from '../utils/modelMappingUtils'; |
|
|
| |
| |
| |
| |
| export const useModelMapping = (initialMapping = {}) => { |
| |
| const [modelOriginalMapping, setModelOriginalMapping] = useState(initialMapping); |
|
|
| |
| |
| |
| |
| |
| |
| const updateModelsList = useCallback((newModels, newMapping, updateModelsCallback) => { |
| const uniqueModels = ModelMappingUtils.filterAndDedupeModels(newModels); |
| |
| if (updateModelsCallback) { |
| updateModelsCallback(uniqueModels); |
| } |
| |
| setModelOriginalMapping(newMapping); |
| }, []); |
|
|
| |
| |
| |
| |
| |
| |
| const syncModelMappingToModels = useCallback((mappingValue, currentModels, updateModelsCallback) => { |
| const mapping = ModelMappingUtils.parseModelMapping(mappingValue); |
|
|
| if (!mapping || Object.keys(mapping).length === 0) { |
| |
| if (!currentModels || currentModels.length === 0) { |
| return; |
| } |
|
|
| |
| if (!modelOriginalMapping || Object.keys(modelOriginalMapping).length === 0) { |
| updateModelsList(currentModels, {}, updateModelsCallback); |
| return; |
| } |
|
|
| |
| const restoredModels = ModelMappingUtils.restoreModelsToOriginal( |
| currentModels, |
| modelOriginalMapping |
| ); |
|
|
| |
| updateModelsList(restoredModels, {}, updateModelsCallback); |
| return; |
| } |
|
|
| |
| const restoredModels = ModelMappingUtils.restoreModelsToOriginal( |
| currentModels, |
| modelOriginalMapping |
| ); |
|
|
| const { updatedModels, newMapping, hasChanges } = ModelMappingUtils.applyModelMapping( |
| mapping, |
| restoredModels, |
| {} |
| ); |
|
|
| if (hasChanges || !ModelMappingUtils.areModelsEqual(currentModels, updatedModels)) { |
| updateModelsList(updatedModels, newMapping, updateModelsCallback); |
| } |
| }, [modelOriginalMapping, updateModelsList]); |
|
|
| |
| |
| |
| |
| |
| const initializeModelMapping = useCallback((mappingValue, models) => { |
| const mapping = ModelMappingUtils.parseModelMapping(mappingValue); |
| |
| if (mapping && Object.keys(mapping).length > 0) { |
| const initialMapping = Object.create(null); |
| const DANGEROUS_KEYS = new Set(['__proto__', 'prototype', 'constructor']); |
| |
| |
| Object.entries(mapping).forEach(([displayName, originalName]) => { |
| const displayNameTrimmed = displayName.trim(); |
| const originalNameTrimmed = typeof originalName === 'string' ? originalName.trim() : null; |
| |
| if (displayNameTrimmed && originalNameTrimmed && !DANGEROUS_KEYS.has(displayNameTrimmed) && models.includes(displayNameTrimmed)) { |
| initialMapping[displayNameTrimmed] = originalNameTrimmed; |
| } |
| }); |
| |
| setModelOriginalMapping(initialMapping); |
| } else { |
| setModelOriginalMapping({}); |
| } |
| }, []); |
|
|
| |
| |
| |
| const resetModelMapping = useCallback(() => { |
| setModelOriginalMapping({}); |
| }, []); |
|
|
| return { |
| modelOriginalMapping, |
| updateModelsList, |
| syncModelMappingToModels, |
| initializeModelMapping, |
| resetModelMapping, |
| setModelOriginalMapping |
| }; |
| }; |