51 lines
1.2 KiB
JavaScript
51 lines
1.2 KiB
JavaScript
import { useState, useEffect, useCallback } from 'react';
|
|
import * as notebooksApi from '../api/notebooks.js';
|
|
|
|
export function useNotebook() {
|
|
const [notebooks, setNotebooks] = useState([]);
|
|
const [activeNotebook, setActiveNotebook] = useState(null);
|
|
|
|
useEffect(() => {
|
|
notebooksApi.listNotebooks().then(setNotebooks).catch(console.error);
|
|
}, []);
|
|
|
|
const selectNotebook = useCallback(
|
|
(id) => {
|
|
const nb = notebooks.find((n) => n.id === id) || null;
|
|
setActiveNotebook(nb);
|
|
},
|
|
[notebooks],
|
|
);
|
|
|
|
const createNotebook = useCallback(async (name) => {
|
|
if (!name) return;
|
|
const nb = await notebooksApi.createNotebook(name);
|
|
setNotebooks((prev) => [...prev, nb]);
|
|
setActiveNotebook(nb);
|
|
}, []);
|
|
|
|
const deleteNotebook = useCallback(
|
|
async (id) => {
|
|
try {
|
|
await notebooksApi.deleteNotebook(id);
|
|
} catch (err) {
|
|
console.error('Failed to delete notebook', err);
|
|
return;
|
|
}
|
|
setNotebooks((prev) => prev.filter((n) => n.id !== id));
|
|
if (activeNotebook?.id === id) {
|
|
setActiveNotebook(null);
|
|
}
|
|
},
|
|
[activeNotebook],
|
|
);
|
|
|
|
return {
|
|
notebooks,
|
|
activeNotebook,
|
|
selectNotebook,
|
|
createNotebook,
|
|
deleteNotebook,
|
|
};
|
|
}
|