27 lines
940 B
TypeScript
27 lines
940 B
TypeScript
import React, { ComponentType, ReactNode } from "react";
|
||
|
||
type Provider = ComponentType<{ children: ReactNode }>;
|
||
|
||
export const buildProvidersTree = (providers: Provider[]): Provider => {
|
||
if (!providers || providers.length === 0) {
|
||
throw new Error("ContextProviderが不足しています");
|
||
}
|
||
|
||
// 基本ケース:ContextProviderが1つしか残っていない場合、それを返して終了する
|
||
if (providers.length === 1) {
|
||
return providers[0];
|
||
}
|
||
|
||
// 配列から最初の2つのContextProviderを取り出す
|
||
const [FirstProvider, SecondProvider, ...restProviders] = providers;
|
||
|
||
// 最初の2つのContextProviderをネストした新しいContextProviderを作成し、再帰する
|
||
const CombinedProvider: Provider = ({ children }) => (
|
||
<FirstProvider>
|
||
<SecondProvider>{children}</SecondProvider>
|
||
</FirstProvider>
|
||
);
|
||
|
||
return buildProvidersTree([CombinedProvider, ...restProviders]);
|
||
};
|