refact: extract resources helpers to utils

This commit is contained in:
Jean-Philippe Sirois
2019-09-17 01:58:44 -04:00
parent fee748c67d
commit b6b4c9df61
3 changed files with 65 additions and 133 deletions
+2 -68
View File
@@ -1,71 +1,5 @@
import chain from "ramda/es/chain"
import partition from "ramda/es/partition"
import {
IAllResourcesQuery,
IFile,
IFileOrFolder,
IFileQuery,
IFolder,
} from "../../types"
import { traversePathsToFiles } from "../../utils"
function generateFolder({
title,
path,
targets,
}: {
title: IFolder["title"]
path: IFile["path"]
targets: IFolder[]
}): IFolder {
const children = join(chain(target => target.children, targets))
return {
title,
type: "folder",
path,
children: children.sort((a, b) =>
a.title.split("/").length > b.title.split("/").length
? -1
: a.title.localeCompare(b.title)
),
}
}
function generateFile({
title,
path,
}: {
title: IFile["title"]
path: IFile["path"]
}): IFile {
return {
title,
type: "file",
path,
}
}
function join([head, ...tail]: IFileOrFolder[]): IFileOrFolder[] {
if (!head) {
return []
}
const [similarFs, remaining] = partition(
obj => obj.title === head.title && obj.type === head.type,
tail
)
const targets = [head, ...similarFs]
const { title, path } = head
const current =
head.type === "folder"
? generateFolder({ title, path, targets: targets as IFolder[] })
: generateFile({ title, path })
return [current, ...join(remaining)]
}
import { IAllResourcesQuery, IFileQuery } from "../../types"
import { join, traversePathsToFiles } from "../../utils"
export default function useBuildTree(resources: IAllResourcesQuery) {
const objects = resources.allFile.edges.map(({ node: file }: IFileQuery) =>
@@ -1,67 +1,5 @@
import chain from "ramda/es/chain"
import partition from "ramda/es/partition"
import {
IAllResourcesQuery,
IFile,
IFileOrFolder,
IFileQuery,
IFolder,
} from "../../types"
import { traversePaths } from "../../utils"
function generateFolder({
title,
path,
targets,
}: {
title: IFolder["title"]
path: IFile["path"]
targets: IFolder[]
}): IFolder {
const children = join(chain(target => target.children, targets))
return {
title,
type: "folder",
path,
children,
}
}
function generateFile({
title,
path,
}: {
title: IFile["title"]
path: IFile["path"]
}): IFile {
return {
title,
type: "file",
path,
}
}
function join([head, ...tail]: IFileOrFolder[]): IFileOrFolder[] {
if (!head) {
return []
}
const [similarFs, remaining] = partition(
obj => obj.title === head.title && obj.type === head.type,
tail
)
const targets = [head, ...similarFs]
const { title, path } = head
const current =
head.type === "folder"
? generateFolder({ title, path, targets: targets as IFolder[] })
: generateFile({ title, path })
return [current, ...join(remaining)]
}
import { IAllResourcesQuery, IFileQuery } from "../../types"
import { join, traversePaths } from "../../utils"
export default function useBuildTree(resources: IAllResourcesQuery) {
const objects = resources.allFile.edges.map(({ node: file }: IFileQuery) =>
+61 -1
View File
@@ -1,4 +1,7 @@
import { IFileOrFolder } from "../types"
import chain from "ramda/es/chain"
import partition from "ramda/es/partition"
import { IFile, IFileOrFolder, IFolder } from "../types"
export function traversePaths(
[head, ...tail]: string[],
@@ -47,3 +50,60 @@ export function traversePathsToFiles(
children: [traversePathsToFiles(tail, path, 1)],
}
}
function generateFolder({
title,
path,
targets,
}: {
title: IFolder["title"]
path: IFile["path"]
targets: IFolder[]
}): IFolder {
const children = join(chain(target => target.children, targets))
return {
title,
type: "folder",
path,
children: children.sort((a, b) =>
a.title.split("/").length > b.title.split("/").length
? -1
: a.title.localeCompare(b.title)
),
}
}
function generateFile({
title,
path,
}: {
title: IFile["title"]
path: IFile["path"]
}): IFile {
return {
title,
type: "file",
path,
}
}
export function join([head, ...tail]: IFileOrFolder[]): IFileOrFolder[] {
if (!head) {
return []
}
const [similarFs, remaining] = partition(
obj => obj.title === head.title && obj.type === head.type,
tail
)
const targets = [head, ...similarFs]
const { title, path } = head
const current =
head.type === "folder"
? generateFolder({ title, path, targets: targets as IFolder[] })
: generateFile({ title, path })
return [current, ...join(remaining)]
}