@excentone/spfx-react
Version:
Contains custom ReactJs components and hooks intended to use when developing SharePoint Framework (SPFx) Web components.
47 lines (45 loc) • 2 kB
JavaScript
import { useSpClient } from "../useSpClient";
import { useCallback, useMemo } from "react";
import { useScopedService } from "../../contexts";
import { ConsoleLogger } from "@excentone/spfx-core-lib";
export const useSPFolder = ({ rootFolderName, subFolderNames }) => {
const sp = useSpClient();
const logger = useScopedService(ConsoleLogger.serviceKey);
const subFolders = useMemo(() => subFolderNames || [], subFolderNames);
const getOrCreateSPFolder = useCallback((getFolder, subDir) => getFolder
.then(async ({ folders }) => {
const folderName = typeof subDir === 'string' ? subDir : subDir();
const targetOrCreateFolder = folders.getByName(folderName);
const createFolder = async () => {
logger.debug(`Creating subfolder "${folderName}"`);
const result = await folders.add(folderName);
return result.folder;
};
try {
const existence = await targetOrCreateFolder();
if (existence && existence.Exists)
return targetOrCreateFolder;
return await createFolder();
}
catch (err) {
console.error(err);
return await createFolder();
}
}), [logger]);
const getSPFolder = useCallback(async (...subDirectories) => {
const root = sp.web.lists.getByTitle(rootFolderName).rootFolder;
const subPaths = [...subFolders, ...subDirectories];
if (subPaths && subPaths.length)
return await subPaths.reduce(getOrCreateSPFolder, Promise.resolve(root));
return root;
}, [subFolders]);
const getSPFileByName = useCallback(async (fileName, ...subDirectories) => {
const spFolder = await getSPFolder(...subDirectories);
return spFolder.files.getByName(fileName);
}, [getSPFolder]);
return useMemo(() => ({
getSPFolder,
getSPFileByName
}), [getSPFolder, getSPFileByName]);
};
//# sourceMappingURL=useSPFolder.js.map