diff --git a/packages/core/upload/admin/src/hooks/useFolderStructure.js b/packages/core/upload/admin/src/hooks/useFolderStructure.js index ad5684433a..e801969c29 100644 --- a/packages/core/upload/admin/src/hooks/useFolderStructure.js +++ b/packages/core/upload/admin/src/hooks/useFolderStructure.js @@ -2,21 +2,13 @@ import { useQuery } from 'react-query'; import pluginId from '../pluginId'; import { axiosInstance, getRequestUrl } from '../utils'; +import { recursiveRenameKeys } from './utils/rename-keys'; const FIELD_MAPPING = { name: 'label', id: 'value', }; -const renameKeys = (obj, fn) => - Object.fromEntries( - Object.entries(obj).map(([key, value]) => { - const getValue = v => (typeof v === 'object' && v !== null ? renameKeys(v, fn) : v); - - return [fn(key), Array.isArray(value) ? value.map(val => getValue(val)) : getValue(value)]; - }) - ); - export const useFolderStructure = ({ enabled = true } = {}) => { const dataRequestURL = getRequestUrl('folder-structure'); @@ -25,7 +17,7 @@ export const useFolderStructure = ({ enabled = true } = {}) => { data: { data }, } = await axiosInstance.get(dataRequestURL); - return data.map(f => renameKeys(f, key => FIELD_MAPPING?.[key] ?? key)); + return data.map(f => recursiveRenameKeys(f, key => FIELD_MAPPING?.[key] ?? key)); }; const { data, error, isLoading } = useQuery( diff --git a/packages/core/upload/admin/src/hooks/utils/rename-keys.js b/packages/core/upload/admin/src/hooks/utils/rename-keys.js new file mode 100644 index 0000000000..7b94e3925d --- /dev/null +++ b/packages/core/upload/admin/src/hooks/utils/rename-keys.js @@ -0,0 +1,8 @@ +export const recursiveRenameKeys = (obj, fn) => + Object.fromEntries( + Object.entries(obj).map(([key, value]) => { + const getValue = v => (typeof v === 'object' && v !== null ? recursiveRenameKeys(v, fn) : v); + + return [fn(key), Array.isArray(value) ? value.map(val => getValue(val)) : getValue(value)]; + }) + ); diff --git a/packages/core/upload/admin/src/hooks/utils/tests/rename-keys.test.js b/packages/core/upload/admin/src/hooks/utils/tests/rename-keys.test.js new file mode 100644 index 0000000000..d382e6dffa --- /dev/null +++ b/packages/core/upload/admin/src/hooks/utils/tests/rename-keys.test.js @@ -0,0 +1,45 @@ +import { recursiveRenameKeys } from '../rename-keys'; + +const FIXTURE = { + foo: 'bar', + bar: 'foo', + + nested: { + foo: 'baz', + baz: 'bar', + + deeper: { + foo: false, + bam: true, + }, + }, +}; + +describe('recursiveRenameKeys', () => { + test('does rename keys', () => { + expect( + recursiveRenameKeys(FIXTURE, key => { + switch (key) { + case 'foo': + return 'bam'; + + case 'baz': + return 'bar'; + + default: + return key; + } + }) + ).toStrictEqual({ + bam: 'bar', + bar: 'foo', + nested: { + bam: 'baz', + bar: 'bar', + deeper: { + bam: true, + }, + }, + }); + }); +});