mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-20 09:20:16 +00:00
TabsManager in react (#500)
This commit is contained in:
13
src/hooks/useObservable.ts
Normal file
13
src/hooks/useObservable.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { Observable } from "knockout";
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
export function useObservable<T>(observable: Pick<Observable<T>, "subscribe" | "peek">): T {
|
||||
const [, setValue] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
const subscription = observable.subscribe(() => setValue((n) => 1 + n), undefined, "change");
|
||||
return () => subscription.dispose();
|
||||
}, [observable]);
|
||||
|
||||
return observable.peek();
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
import { isObservableArray, Observable, ObservableArray } from "knockout";
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
export function useObservableState<T>(observable: Observable<T>): [T, (s: T) => void];
|
||||
export function useObservableState<T>(observable: ObservableArray<T>): [T[], (s: T[]) => void];
|
||||
export function useObservableState<T>(observable: ObservableArray<T> | Observable<T>): [T | T[], (s: T | T[]) => void] {
|
||||
const [value, setValue] = useState(observable());
|
||||
|
||||
useEffect(() => {
|
||||
isObservableArray(observable)
|
||||
? observable.subscribe((values) => setValue([...values]))
|
||||
: observable.subscribe(setValue);
|
||||
}, [observable]);
|
||||
|
||||
return [value, observable];
|
||||
}
|
||||
@@ -1,16 +1,18 @@
|
||||
import { useState } from "react";
|
||||
import TabsBase from "../Explorer/Tabs/TabsBase";
|
||||
import { TabsManager } from "../Explorer/Tabs/TabsManager";
|
||||
import { useObservableState } from "./useObservableState";
|
||||
import { useObservable } from "./useObservable";
|
||||
|
||||
export type UseTabs = {
|
||||
tabs: readonly TabsBase[];
|
||||
activeTab: TabsBase;
|
||||
tabsManager: TabsManager;
|
||||
};
|
||||
|
||||
export function useTabs(): UseTabs {
|
||||
const [tabsManager] = useState(() => new TabsManager());
|
||||
const [tabs] = useObservableState(tabsManager.openedTabs);
|
||||
const tabs = useObservable(tabsManager.openedTabs);
|
||||
const activeTab = useObservable(tabsManager.activeTab);
|
||||
|
||||
return { tabs, tabsManager };
|
||||
return { tabs, activeTab, tabsManager };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user