From 436fe821b81675f1aa6d03c30dc3a3604f8d2781 Mon Sep 17 00:00:00 2001
From: Jamie Kyle <me@thejameskyle.com>
Date: Wed, 1 May 2019 12:17:21 -0700
Subject: init commit

---
 src/unstated-next.tsx | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 src/unstated-next.tsx

(limited to 'src/unstated-next.tsx')

diff --git a/src/unstated-next.tsx b/src/unstated-next.tsx
new file mode 100644
index 0000000..b19f8ba
--- /dev/null
+++ b/src/unstated-next.tsx
@@ -0,0 +1,33 @@
+import React from "react"
+
+interface ContainerProviderProps {
+	children: React.ReactNode
+}
+
+interface Container<Value> {
+	Provider: React.ComponentType<ContainerProviderProps>
+	useContainer: () => Value
+}
+
+export function createContainer<Value>(useHook: () => Value): Container<Value> {
+	let Context = React.createContext<Value | null>(null)
+
+	function Provider(props: ContainerProviderProps) {
+		let value = useHook()
+		return <Context.Provider value={value}>{props.children}</Context.Provider>
+	}
+
+	function useContainer(): Value {
+		let value = React.useContext(Context)
+		if (value === null) {
+			throw new Error("Component must be wrapped with <Container.Provider>")
+		}
+		return value
+	}
+
+	return { Provider, useContainer }
+}
+
+export function useContainer<Value>(container: Container<Value>): Value {
+	return container.useContainer()
+}
-- 
cgit v1.2.3

