Skip to content

Commit c5a4d58

Browse files
author
Marcos Alves
committed
feat: improve isKernelSession prop naming (#273)
1 parent 617dccc commit c5a4d58

File tree

4 files changed

+57
-32
lines changed

4 files changed

+57
-32
lines changed

packages/react/src/components/cell/Cell.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export const Cell = (props: ICellProps) => {
7979
adapter.sessionContext.kernelChanged.connect(() => {
8080
void adapter.sessionContext.session?.kernel?.info.then(info => {
8181
// Set that session/kernel is ready for this cell when the kernel is guaranteed to be connected
82-
cellStore.setKernelAvailable(id, true);
82+
cellStore.setIsKernelSessionAvailable(id, true);
8383
})
8484
});
8585
}

packages/react/src/components/cell/CellState.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,33 +12,33 @@ export interface ICellState {
1212
source?: string;
1313
outputsCount?: number;
1414
adapter?: CellAdapter;
15-
kernelAvailable?: boolean;
15+
isKernelSessionAvailable?: boolean; // Individual, for cell
1616
}
1717

1818
export interface ICellsState {
1919
cells: Map<string, ICellState>;
20-
areAllCellsReady: boolean;
20+
areAllKernelSessionsReady: boolean; // Control the state for all cells
2121
}
2222

2323
export type CellState = ICellsState & {
2424
setCells: (cells: Map<string, ICellState>) => void;
2525
setSource: (id: string, source: string) => void;
2626
setOutputsCount: (id: string, outputsCount: number) => void;
27-
setKernelAvailable: (id: string, kernelAvailable: boolean) => void;
27+
setIsKernelSessionAvailable: (id: string, kernelAvailable: boolean) => void;
2828
setAdapter: (id: string, adapter?: CellAdapter) => void;
2929
getAdapter: (id: string) => CellAdapter | undefined;
3030
getSource: (id: string) => string | undefined;
3131
getOutputsCount: (id: string) => number | undefined;
32-
getIsKernelAvailable: (id: string) => boolean | undefined;
32+
getIsKernelSessionAvailable: (id: string) => boolean | undefined;
3333
execute: (id?: string) => void;
3434
};
3535

3636
/**
3737
* Iterate over all cells map and check if all cells/sessions are ready
3838
*/
39-
const areAllSessionsAvailable = (cells: Map<string, ICellState>): boolean => {
39+
const areAllKernelSessionsAvailable = (cells: Map<string, ICellState>): boolean => {
4040
for (const cell of cells.values()) {
41-
if (!cell.kernelAvailable) {
41+
if (!cell.isKernelSessionAvailable) {
4242
return false;
4343
}
4444
}
@@ -49,8 +49,8 @@ export const cellStore = createStore<CellState>((set, get) => ({
4949
cells: new Map<string, ICellState>(),
5050
source: '',
5151
outputsCount: 0,
52-
kernelAvailable: false,
53-
areAllCellsReady: false,
52+
isKernelSessionAvailable: false,
53+
areAllKernelSessionsReady: false,
5454
adapter: undefined,
5555
setCells: (cells: Map<string, ICellState>) => set((cell: CellState) => ({ cells })),
5656

@@ -74,16 +74,16 @@ export const cellStore = createStore<CellState>((set, get) => ({
7474
}
7575
set((state: CellState) => ({ cells }))
7676
},
77-
setKernelAvailable: (id: string, kernelAvailable: boolean) => {
77+
setIsKernelSessionAvailable: (id: string, isKernelSessionAvailable: boolean) => {
7878
const cells = get().cells;
7979
const cell = cells.get(id);
8080
if (cell) {
81-
cell.kernelAvailable = kernelAvailable;
81+
cell.isKernelSessionAvailable = isKernelSessionAvailable;
8282
} else {
83-
cells.set(id, {kernelAvailable});
83+
cells.set(id, {isKernelSessionAvailable});
8484
}
85-
const areAllCellsReady = areAllSessionsAvailable(cells);
86-
set((cell: CellState) => ({ cells, areAllCellsReady }));
85+
const areAllKernelSessionsReady = areAllKernelSessionsAvailable(cells);
86+
set((cell: CellState) => ({ cells, areAllKernelSessionsReady }));
8787
},
8888
setAdapter: (id: string, adapter?: CellAdapter) => {
8989
const cells = get().cells;
@@ -104,8 +104,8 @@ export const cellStore = createStore<CellState>((set, get) => ({
104104
getOutputsCount: (id: string): number | undefined => {
105105
return get().cells.get(id)?.outputsCount;
106106
},
107-
getIsKernelAvailable: (id: string): boolean | undefined => {
108-
return get().cells.get(id)?.kernelAvailable;
107+
getIsKernelSessionAvailable: (id: string): boolean | undefined => {
108+
return get().cells.get(id)?.isKernelSessionAvailable;
109109
},
110110
execute: (id: string) => {
111111
const cells = get().cells;

packages/react/src/examples/All.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const CellPreview = (props: ICellToolProps) => {
5858
return (
5959
<>
6060
<>source: {cellStore.getSource(props.id)}</>
61-
<>kernel available: {String(cellStore.getIsKernelAvailable(props.id))}</>
61+
<>kernel available: {String(cellStore.getIsKernelSessionAvailable(props.id))}</>
6262
</>
6363
);
6464
};

packages/react/src/examples/Notebook.tsx

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,52 @@
66
import { createRoot } from 'react-dom/client';
77
import Jupyter from '../jupyter/Jupyter';
88
import Notebook from '../components/notebook/Notebook';
9+
import Cell from '../components/cell/Cell';
910
import NotebookToolbar from './toolbars/NotebookToolbar';
1011
import CellSidebar from '../components/notebook/cell/sidebar/CellSidebarButton';
12+
import React, {useRef, useEffect} from 'react';
13+
import { cellStore } from '../components/cell/CellState';
1114

1215
const NOTEBOOK_UID = 'notebook-uid';
1316

1417
const div = document.createElement('div');
1518
document.body.appendChild(div);
1619
const root = createRoot(div);
1720

18-
root.render(
19-
<Jupyter
20-
jupyterServerUrl="https://oss.datalayer.run/api/jupyter-server"
21-
jupyterServerToken="60c1661cc408f978c309d04157af55c9588ff9557c9380e4fb50785750703da6"
22-
>
23-
<Notebook
24-
path="ipywidgets.ipynb"
25-
uid={NOTEBOOK_UID}
26-
height="calc(100vh - 2.6rem)" // (Height - Toolbar Height).
27-
cellSidebarMargin={60}
28-
CellSidebar={CellSidebar}
29-
Toolbar={NotebookToolbar}
30-
/>
31-
</Jupyter>
32-
);
21+
22+
const CellComp: React.FC<any> = () => {
23+
24+
const isExecutingRef = useRef(false);
25+
useEffect(() => {
26+
const handleChange = (newState: any) => {
27+
console.log('CHANGED', newState);
28+
if (newState.areAllKernelSessionsReady && !isExecutingRef.current) {
29+
isExecutingRef.current = true;
30+
cellStore.getState().execute('1');
31+
cellStore.getState().execute('2');
32+
}
33+
};
34+
35+
// Subscribe to cellStore changes
36+
const unsubscribe = cellStore.subscribe(handleChange);
37+
38+
// Cleanup function to unsubscribe on unmount
39+
return () => {
40+
unsubscribe();
41+
};
42+
}, []);
43+
44+
return (
45+
<Jupyter
46+
jupyterServerUrl="https://oss.datalayer.run/api/jupyter-server"
47+
jupyterServerToken="60c1661cc408f978c309d04157af55c9588ff9557c9380e4fb50785750703da6"
48+
>
49+
<Cell id={'1'} type={'code'} autoStart={false} showToolbar={false} source={'x = 5'}></Cell>
50+
<Cell id={'2'} type={'code'} autoStart={false} showToolbar={false} source={'x + 5'}></Cell>
51+
</Jupyter>
52+
)
53+
}
54+
55+
root.render(<>
56+
<CellComp></CellComp>
57+
</>);

0 commit comments

Comments
 (0)